add timeroverlap detection made by adenin (thanks for the great work!)
[enigma2.git] / lib / python / Screens / EventView.py
index 498702e57386e4dce464db727319b893c9ef80f4..5d50d9bcb5aa60d85978bfe821edb32a8f3a5c11 100644 (file)
@@ -1,25 +1,33 @@
 from Screen import Screen
 from Screen import Screen
+from Screens.TimerEdit import TimerSanityConflict
 from Components.ActionMap import ActionMap
 from Components.Button import Button
 from Components.Label import Label
 from Components.ScrollLabel import ScrollLabel
 from Components.ActionMap import ActionMap
 from Components.Button import Button
 from Components.Label import Label
 from Components.ScrollLabel import ScrollLabel
-from enigma import eServiceEventPtr, eEPGCachePtr, eEPGCache
-from ServiceReference import ServiceReference
+from Components.TimerList import TimerList
+from enigma import eEPGCache, eTimer, eServiceReference
 from RecordTimer import RecordTimerEntry, parseEvent
 from TimerEntry import TimerEntry
 from RecordTimer import RecordTimerEntry, parseEvent
 from TimerEntry import TimerEntry
-from time import localtime, asctime
+from time import localtime
+from Components.config import config
 
 class EventViewBase:
 
 class EventViewBase:
-       def __init__(self, Event, Ref, callback=None):
+       def __init__(self, Event, Ref, callback=None, similarEPGCB=None):
+               self.similarEPGCB = similarEPGCB
                self.cbFunc = callback
                self.currentService=Ref
                self.cbFunc = callback
                self.currentService=Ref
-               self.isRecording = len(Ref.ref.getPath())
+               self.isRecording = (not Ref.ref.flags & eServiceReference.isGroup) and len(Ref.ref.getPath())
                self.event = Event
                self["epg_description"] = ScrollLabel()
                self["datetime"] = Label()
                self["channel"] = Label()
                self["duration"] = Label()
                self["key_red"] = Button("")
                self.event = Event
                self["epg_description"] = ScrollLabel()
                self["datetime"] = Label()
                self["channel"] = Label()
                self["duration"] = Label()
                self["key_red"] = Button("")
+               if similarEPGCB is not None:
+                       self.SimilarBroadcastTimer = eTimer()
+                       self.SimilarBroadcastTimer.callback.append(self.getSimilarEvents)
+               else:
+                       self.SimilarBroadcastTimer = None
                if self.isRecording:
                        self["key_green"] = Button("")
                else:
                if self.isRecording:
                        self["key_green"] = Button("")
                else:
@@ -34,13 +42,14 @@ class EventViewBase:
                                "pageDown": self.pageDown,
                                "prevEvent": self.prevEvent,
                                "nextEvent": self.nextEvent,
                                "pageDown": self.pageDown,
                                "prevEvent": self.prevEvent,
                                "nextEvent": self.nextEvent,
-                               "timerAdd": self.timerAdd
+                               "timerAdd": self.timerAdd,
+                               "openSimilarList": self.openSimilarList
                        })
                self.onShown.append(self.onCreate)
 
        def onCreate(self):
                        })
                self.onShown.append(self.onCreate)
 
        def onCreate(self):
-               self.setEvent(self.event)
                self.setService(self.currentService)
                self.setService(self.currentService)
+               self.setEvent(self.event)
 
        def prevEvent(self):
                if self.cbFunc is not None:
 
        def prevEvent(self):
                if self.cbFunc is not None:
@@ -52,14 +61,26 @@ class EventViewBase:
 
        def timerAdd(self):
                if not self.isRecording:
 
        def timerAdd(self):
                if not self.isRecording:
-                       newEntry = RecordTimerEntry(self.currentService, *parseEvent(self.event))
-                       self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry)
-
-       def timerEditFinished(self, answer):
-               if (answer[0]):
-                       self.session.nav.RecordTimer.record(answer[1])
+                       newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, *parseEvent(self.event))
+                       self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
+
+       def finishedAdd(self, answer):
+               print "finished add"
+               if answer[0]:
+                       entry = answer[1]
+                       simulTimerList = self.session.nav.RecordTimer.record(entry)
+                       if simulTimerList is not None:
+                               if (len(simulTimerList) == 2) and (simulTimerList[1].dontSave) and (simulTimerList[1].autoincrease):
+                                       simulTimerList[1].end = entry.begin - 30
+                                       self.session.nav.RecordTimer.timeChanged(simulTimerList[1])
+                                       self.session.nav.RecordTimer.record(entry)
+                               else:
+                                       self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList)
                else:
                else:
-                       print "Timeredit aborted"
+                       print "Timeredit aborted"               
+
+       def finishSanityCorrection(self, answer):
+               self.finishedAdd(answer)
 
        def setService(self, service):
                self.currentService=service
 
        def setService(self, service):
                self.currentService=service
@@ -82,10 +103,8 @@ class EventViewBase:
 
        def setEvent(self, event):
                self.event = event
 
        def setEvent(self, event):
                self.event = event
-               id = event.getEventId()
-
-               refstr = str(self.currentService)
-               epgcache = eEPGCache.getInstance()
+               if event is None:
+                       return
                text = event.getEventName()
                short = event.getShortDescription()
                ext = event.getExtendedDescription()
                text = event.getEventName()
                short = event.getShortDescription()
                ext = event.getExtendedDescription()
@@ -96,19 +115,13 @@ class EventViewBase:
                                text = text + '\n\n'
                        text = text + ext
 
                                text = text + '\n\n'
                        text = text + ext
 
-        # search similar broadcastings
-               ret = epgcache.search(('NB', 100, eEPGCache.SIMILAR_BROADCASTINGS_SEARCH, refstr, id))
-               if ret is not None:
-                       text += '\n\n' + _('Similar broadcasts:')
-                       ret.sort(self.sort_func)
-                       for x in ret:
-                               t = localtime(x[1])
-                               text += '\n%d.%d.%d, %02d:%02d  -  %s'%(t[2], t[1], t[0], t[3], t[4], x[0])
-
                self.setTitle(event.getEventName())
                self["epg_description"].setText(text)
                self["datetime"].setText(event.getBeginTimeString())
                self["duration"].setText(_("%d min")%(event.getDuration()/60))
                self.setTitle(event.getEventName())
                self["epg_description"].setText(text)
                self["datetime"].setText(event.getBeginTimeString())
                self["duration"].setText(_("%d min")%(event.getDuration()/60))
+               self["key_red"].setText("")
+               if self.SimilarBroadcastTimer is not None:
+                       self.SimilarBroadcastTimer.start(400,True)
 
        def pageUp(self):
                self["epg_description"].pageUp()
 
        def pageUp(self):
                self["epg_description"].pageUp()
@@ -116,21 +129,45 @@ class EventViewBase:
        def pageDown(self):
                self["epg_description"].pageDown()
 
        def pageDown(self):
                self["epg_description"].pageDown()
 
+       def getSimilarEvents(self):
+        # search similar broadcastings
+               refstr = str(self.currentService)
+               id = self.event.getEventId()
+               epgcache = eEPGCache.getInstance()
+               ret = epgcache.search(('NB', 100, eEPGCache.SIMILAR_BROADCASTINGS_SEARCH, refstr, id))
+               if ret is not None:
+                       descr = self["epg_description"]
+                       text = descr.getText()
+                       text += '\n\n' + _('Similar broadcasts:')
+                       ret.sort(self.sort_func)
+                       for x in ret:
+                               t = localtime(x[1])
+                               text += '\n%d.%d.%d, %02d:%02d  -  %s'%(t[2], t[1], t[0], t[3], t[4], x[0])
+                       descr.setText(text)
+                       self["key_red"].setText(_("Similar"))
+
+       def openSimilarList(self):
+               if self.similarEPGCB is not None and len(self["key_red"].getText()):
+                       id = self.event and self.event.getEventId()
+                       refstr = str(self.currentService)
+                       if id is not None:
+                               self.similarEPGCB(id, refstr)
+
 class EventViewSimple(Screen, EventViewBase):
 class EventViewSimple(Screen, EventViewBase):
-       def __init__(self, session, Event, Ref, callback=None):
+       def __init__(self, session, Event, Ref, callback=None, similarEPGCB=None):
                Screen.__init__(self, session)
                self.skinName = "EventView"
                Screen.__init__(self, session)
                self.skinName = "EventView"
-               EventViewBase.__init__(self, Event, Ref, callback)
+               EventViewBase.__init__(self, Event, Ref, callback, similarEPGCB)
 
 class EventViewEPGSelect(Screen, EventViewBase):
 
 class EventViewEPGSelect(Screen, EventViewBase):
-       def __init__(self, session, Event, Ref, callback=None, singleEPGCB=None, multiEPGCB=None):
+       def __init__(self, session, Event, Ref, callback=None, singleEPGCB=None, multiEPGCB=None, similarEPGCB=None):
                Screen.__init__(self, session)
                self.skinName = "EventView"
                Screen.__init__(self, session)
                self.skinName = "EventView"
-               EventViewBase.__init__(self, Event, Ref, callback)
+               EventViewBase.__init__(self, Event, Ref, callback, similarEPGCB)
                self["key_yellow"].setText(_("Single EPG"))
                self["key_blue"].setText(_("Multi EPG"))
                self["epgactions"] = ActionMap(["EventViewEPGActions"],
                        {
                                "openSingleServiceEPG": singleEPGCB,
                self["key_yellow"].setText(_("Single EPG"))
                self["key_blue"].setText(_("Multi EPG"))
                self["epgactions"] = ActionMap(["EventViewEPGActions"],
                        {
                                "openSingleServiceEPG": singleEPGCB,
-                               "openMultiServiceEPG": multiEPGCB
+                               "openMultiServiceEPG": multiEPGCB,
                        })
                        })