add possibility to remove timers in epglist
authorghost <andreas.monzner@multimedia-labs.de>
Mon, 22 Dec 2008 19:53:34 +0000 (20:53 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Mon, 22 Dec 2008 19:53:34 +0000 (20:53 +0100)
TODO: this is not working for subtitles yet and not its working in graphical multi epg

RecordTimer.py
data/skin_default/icons/epgclock_add.png [new file with mode: 0644]
data/skin_default/icons/epgclock_post.png [new file with mode: 0644]
data/skin_default/icons/epgclock_pre.png [new file with mode: 0644]
lib/python/Components/EpgList.py
lib/python/Screens/EpgSelection.py
lib/python/Screens/TimerEdit.py

index 8449a2d25f306fb57284acf7be4babb5fae436cd..dcfdd578158fffc0007776922305a91471bf3a72 100644 (file)
@@ -577,6 +577,7 @@ class RecordTimer(timer.Timer):
                                print "ignore timer conflict"
                elif timersanitycheck.doubleCheck():
                        print "ignore double timer"
+                       return None
                entry.timeChanged()
                print "[Timer] Record " + str(entry)
                entry.Timer = self
@@ -584,15 +585,16 @@ class RecordTimer(timer.Timer):
                if dosave:
                        self.saveTimer()
                return None
-               
+
        def isInTimer(self, eventid, begin, duration, service):
                time_match = 0
                chktime = None
                chktimecmp = None
                chktimecmp_end = None
                end = begin + duration
+               refstr = str(service)
                for x in self.timer_list:
-                       check = x.service_ref.ref.toCompareString() == str(service)
+                       check = x.service_ref.ref.toString() == refstr
                        if not check:
                                sref = x.service_ref.ref
                                parent_sid = sref.getUnsignedData(5)
@@ -604,7 +606,7 @@ class RecordTimer(timer.Timer):
                                        sref.setUnsignedData(2, parent_tsid)
                                        sref.setUnsignedData(5, 0)
                                        sref.setUnsignedData(6, 0)
-                                       check = x.service_ref.ref.toCompareString() == str(service)
+                                       check = sref.toCompareString() == refstr
                                        num = 0
                                        if check:
                                                check = False
@@ -620,9 +622,6 @@ class RecordTimer(timer.Timer):
                                                        check = True
                                                        break
                        if check:
-                               #if x.eit is not None and x.repeated == 0:
-                               #       if x.eit == eventid:
-                               #               return duration
                                if x.repeated != 0:
                                        if chktime is None:
                                                chktime = localtime(begin)
@@ -645,6 +644,8 @@ class RecordTimer(timer.Timer):
                                                diff = x.end - begin
                                                if time_match < diff:
                                                        time_match = diff
+                               if time_match:
+                                       break
                return time_match
 
        def removeEntry(self, entry):
@@ -663,6 +664,18 @@ class RecordTimer(timer.Timer):
                print "state: ", entry.state
                print "in processed: ", entry in self.processed_timers
                print "in running: ", entry in self.timer_list
+               # autoincrease instanttimer if possible
+               if not entry.dontSave:
+                       for x in self.timer_list:
+                               if x.dontSave and x.autoincrease:
+                                       x.end = x.begin + (3600 * 24 * 356 * 1)
+                                       self.timeChanged(x)
+                                       timersanitycheck = TimerSanityCheck(self.timer_list,x)
+                                       if not timersanitycheck.check():
+                                               tsc_list = timersanitycheck.getSimulTimerList()
+                                               if len(tsc_list) > 1:
+                                                       x.end = tsc_list[1].begin - 30
+                                                       self.timeChanged(x)
                # now the timer should be in the processed_timers list. remove it from there.
                self.processed_timers.remove(entry)
                self.saveTimer()
diff --git a/data/skin_default/icons/epgclock_add.png b/data/skin_default/icons/epgclock_add.png
new file mode 100644 (file)
index 0000000..487ac48
Binary files /dev/null and b/data/skin_default/icons/epgclock_add.png differ
diff --git a/data/skin_default/icons/epgclock_post.png b/data/skin_default/icons/epgclock_post.png
new file mode 100644 (file)
index 0000000..5716d99
Binary files /dev/null and b/data/skin_default/icons/epgclock_post.png differ
diff --git a/data/skin_default/icons/epgclock_pre.png b/data/skin_default/icons/epgclock_pre.png
new file mode 100644 (file)
index 0000000..ff42463
Binary files /dev/null and b/data/skin_default/icons/epgclock_pre.png differ
index dbcd572b713a87095f431211869c0ef74b34504b..042abccbb7758bfc4eda6deba850f254e7d2d0ee 100644 (file)
@@ -52,6 +52,9 @@ class EPGList(HTMLComponent, GUIComponent):
                        self.l.setBuildFunc(self.buildSimilarEntry)
                self.epgcache = eEPGCache.getInstance()
                self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png'))
+               self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png'))
+               self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png'))
+               self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png'))
 
        def getEventFromId(self, service, eventid):
                event = None
@@ -135,8 +138,22 @@ class EPGList(HTMLComponent, GUIComponent):
                        self.datetime_rect = Rect(width/20*2, 0, width/20*5-15, height)
                        self.service_rect = Rect(width/20*7, 0, width/20*13, height)
 
+       def getClockPixmap(self, refstr, beginTime, duration, eventId):
+               endTime = beginTime + duration
+               for x in self.timer.timer_list:
+                       if x.service_ref.ref.toString() == refstr:
+                               beg = x.begin
+                               end = x.end
+                               if x.eit == eventId:
+                                       return self.clock_pixmap
+                               elif beginTime > beg and beginTime < end and endTime > end:
+                                       return self.clock_post_pixmap
+                               elif beginTime < beg and endTime > beg and endTime < end:
+                                       return self.clock_pre_pixmap
+               return self.clock_add_pixmap
+
        def buildSingleEntry(self, service, eventId, beginTime, duration, EventName):
-               rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service) > ((duration/10)*8)) 
+               rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service))
                r1=self.weekday_rect
                r2=self.datetime_rect
                r3=self.descr_rect
@@ -145,14 +162,15 @@ class EPGList(HTMLComponent, GUIComponent):
                res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]))
                res.append((eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4])))
                if rec:
-                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, self.clock_pixmap))
+                       clock_pic = self.getClockPixmap(service, beginTime, duration, eventId)
+                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, clock_pic))
                        res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 25, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, EventName))
                else:
                        res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, EventName))
                return res
 
        def buildSimilarEntry(self, service, eventId, beginTime, service_name, duration):
-               rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service) > ((duration/10)*8)) 
+               rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service))
                r1=self.weekday_rect
                r2=self.datetime_rect
                r3=self.service_rect
@@ -161,22 +179,24 @@ class EPGList(HTMLComponent, GUIComponent):
                res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]]))
                res.append((eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4])))
                if rec:
-                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, self.clock_pixmap))
+                       clock_pic = self.getClockPixmap(service, beginTime, duration, eventId)
+                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, clock_pic))
                        res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 25, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, service_name))
                else:
                        res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, service_name))
                return res
 
        def buildMultiEntry(self, changecount, service, eventId, begTime, duration, EventName, nowTime, service_name):
-               rec=begTime and (self.timer.isInTimer(eventId, begTime, duration, service) > ((duration/10)*8))
+               rec=beginTime and (self.timer.isInTimer(eventId, begTime, duration, service))
                r1=self.service_rect
                r2=self.progress_rect
                r3=self.descr_rect
                r4=self.start_end_rect
                res = [ None ] # no private data needed
                if rec:
+                       clock_pic = self.getClockPixmap(service, begTime, duration, eventId)
                        res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width()-21, r1.height(), 0, RT_HALIGN_LEFT, service_name))
-                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r1.left()+r1.width()-16, r1.top(), 21, 21, self.clock_pixmap))
+                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r1.left()+r1.width()-16, r1.top(), 21, 21, clock_pic))
                else:
                        res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_LEFT, service_name))
                if begTime is not None:
index 6740bfb6d6ea0da297f3834d5556708e9149c18a..b40f445f1022a2c821786e176db4774f63d6e3ab 100644 (file)
@@ -5,11 +5,13 @@ from Components.Pixmap import Pixmap
 from Components.Label import Label
 from Components.EpgList import EPGList, EPG_TYPE_SINGLE, EPG_TYPE_SIMILAR, EPG_TYPE_MULTI
 from Components.ActionMap import ActionMap
+from Components.TimerSanityCheck import TimerSanityCheck
 from Screens.TimerEdit import TimerSanityConflict
 from Screens.EventView import EventViewSimple
+from Screens.MessageBox import MessageBox
 from TimeDateInput import TimeDateInput
 from enigma import eServiceReference
-from RecordTimer import RecordTimerEntry, parseEvent
+from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
 from TimerEntry import TimerEntry
 from ServiceReference import ServiceReference
 from time import localtime, time
@@ -17,6 +19,9 @@ from time import localtime, time
 mepg_config_initialized = False
 
 class EPGSelection(Screen):
+       ADD_TIMER = 0
+       REMOVE_TIMER = 1
+
        def __init__(self, session, service, zapFunc=None, eventid=None, bouquetChangeCB=None):
                Screen.__init__(self, session)
                self.bouquetChangeCB = bouquetChangeCB
@@ -58,6 +63,7 @@ class EPGSelection(Screen):
                        self.zapFunc = zapFunc
 
                self["key_green"] = Button(_("Add timer"))
+               self.key_green_choice = self.ADD_TIMER
                self["list"] = EPGList(type = self.type, selChangedCB = self.onSelectionChanged, timer = self.session.nav.RecordTimer)
 
                self["actions"] = ActionMap(["EPGSelectActions", "OkCancelActions"],
@@ -179,14 +185,28 @@ class EPGSelection(Screen):
                if self.type == EPG_TYPE_MULTI:
                        self["list"].updateMultiEPG(1)
 
+       def removeTimer(self, timer):
+               timer.afterEvent = AFTEREVENT.NONE
+               self.session.nav.RecordTimer.removeEntry(timer)
+               self["key_green"].setText(_("Add timer"))
+               self.key_green_choice = self.ADD_TIMER
+
        def timerAdd(self):
                cur = self["list"].getCurrent()
                event = cur[0]
                serviceref = cur[1]
                if event is None:
                        return
-               newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event))
-               self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
+               eventid = event.getEventId()
+               refstr = serviceref.ref.toString()
+               for timer in self.session.nav.RecordTimer.timer_list:
+                       if timer.eit == eventid and timer.service_ref.ref.toString() == refstr:
+                               cb_func = lambda ret : not ret or self.removeTimer(timer)
+                               self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
+                               break
+               else:
+                       newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event))
+                       self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
 
        def finishedAdd(self, answer):
                print "finished add"
@@ -200,8 +220,12 @@ class EPGSelection(Screen):
                                        self.session.nav.RecordTimer.record(entry)
                                else:
                                        self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList)
+                       self["key_green"].setText(_("Remove timer"))
+                       self.key_green_choice = self.REMOVE_TIMER
                else:
-                       print "Timeredit aborted"               
+                       self["key_green"].setText(_("Add timer"))
+                       self.key_green_choice = self.ADD_TIMER
+                       print "Timeredit aborted"
        
        def finishSanityCorrection(self, answer):
                self.finishedAdd(answer)
@@ -211,7 +235,7 @@ class EPGSelection(Screen):
 
        def moveDown(self):
                self["list"].moveDown()
-
+       
        def applyButtonState(self, state):
                if state == 0:
                        self["now_button"].hide()
@@ -249,6 +273,7 @@ class EPGSelection(Screen):
                                self["more_button_sel"].hide()
 
        def onSelectionChanged(self):
+               cur = self["list"].getCurrent()
                if self.type == EPG_TYPE_MULTI:
                        count = self["list"].getCurrentChangeCount()
                        if self.ask_time != -1:
@@ -261,7 +286,7 @@ class EPGSelection(Screen):
                                self.applyButtonState(1)
                        days = [ _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ]
                        datastr = ""
-                       event = self["list"].getCurrent()[0]
+                       event = cur[0]
                        if event is not None:
                                now = time()
                                beg = event.getBeginTime()
@@ -272,3 +297,23 @@ class EPGSelection(Screen):
                                else:
                                        datestr = '%s %d.%d.'%(_("Today"), begTime[2], begTime[1])
                        self["date"].setText(datestr)
+               else:
+                       event = cur[0]
+
+               if event is None:
+                       return
+
+               serviceref = cur[1]
+               eventid = event.getEventId()
+               refstr = serviceref.ref.toString()
+
+               for timer in self.session.nav.RecordTimer.timer_list:
+                       if self.key_green_choice != self.REMOVE_TIMER:
+                               if timer.eit == eventid and timer.service_ref.ref.toString() == refstr:
+                                       self["key_green"].setText(_("Remove timer"))
+                                       self.key_green_choice = self.REMOVE_TIMER
+                                       break
+               else:
+                       if self.key_green_choice != self.ADD_TIMER:
+                               self["key_green"].setText(_("Add timer"))
+                               self.key_green_choice = self.ADD_TIMER
index 18ab2b79839c94d5f2e9cd1a662d5d406a8d9446..59e2bd03b3b7b5c7954af8a56fafe3b6144eecbc 100644 (file)
@@ -214,18 +214,6 @@ class TimerEditList(Screen):
                        timer = cur
                        timer.afterEvent = AFTEREVENT.NONE
                        self.session.nav.RecordTimer.removeEntry(timer)
-                       if not timer.dontSave:
-                               for timer in self.session.nav.RecordTimer.timer_list:
-                                       if timer.dontSave and timer.autoincrease:
-                                               timer.end = timer.begin + (3600 * 24 * 356 * 1)
-                                               self.session.nav.RecordTimer.timeChanged(timer)
-                                               timersanitycheck = TimerSanityCheck(self.session.nav.RecordTimer.timer_list,timer)
-                                               if not timersanitycheck.check():
-                                                       tsc_list = timersanitycheck.getSimulTimerList()
-                                                       if len(tsc_list) > 1:
-                                                               timer.end = tsc_list[1].begin - 30
-                                                               self.session.nav.RecordTimer.timeChanged(timer)
-
                        self.refill()
                        self.updateState()
 
@@ -261,6 +249,7 @@ class TimerEditList(Screen):
                
        def addTimer(self, timer):
                self.session.openWithCallback(self.finishedAdd, TimerEntry, timer)
+                       
                
        def finishedEdit(self, answer):
                print "finished edit"
@@ -335,6 +324,8 @@ class TimerSanityConflict(Screen):
                                self.list.append((_("Conflicting timer") + " " + str(count), x))
                                self.list2.append((timer[count], False))
                        count += 1
+               if count == 1:
+                       self.list.append((_("Channel not in services list")))
 
                self["list"] = MenuList(self.list)
                self["timer2"] = TimerList(self.list2)