From: Stefan Pluecken Date: Thu, 26 Jan 2006 04:38:04 +0000 (+0000) Subject: some work on the timer sanity check (overlapping timers solver) X-Git-Tag: 2.6.0~4281 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/b38677078a8882dfecd87533291863bbf76d1d63 some work on the timer sanity check (overlapping timers solver) --- diff --git a/data/skin.xml b/data/skin.xml index dc1d86b9..b3490bf5 100644 --- a/data/skin.xml +++ b/data/skin.xml @@ -147,6 +147,15 @@ + + + + + + + + + diff --git a/lib/python/Components/TimerSanityCheck.py b/lib/python/Components/TimerSanityCheck.py index a5b81ffc..a6af1412 100644 --- a/lib/python/Components/TimerSanityCheck.py +++ b/lib/python/Components/TimerSanityCheck.py @@ -6,22 +6,26 @@ class TimerSanityCheck: def __init__(self, timerlist, newtimer): self.timerlist = timerlist self.newtimer = newtimer - + self.simultimer = [] + def check(self): - simultimer = [ self.newtimer ] + self.simultimer = [ self.newtimer ] for timer in self.timerlist: if self.isSimultaneous(timer, self.newtimer): - simultimer.append(timer) - - if len(simultimer) > 1: - return self.checkRecordable(simultimer) + self.simultimer.append(timer) + + if len(self.simultimer) > 1: + return self.checkRecordable(self.simultimer) return True + + def getSimulTimerList(self): + return self.simultimer def isSimultaneous(self, timer1, timer2): # both timers are repeated if (timer1.repeated & timer2.repeated): - return True + return self.timeEquals(timer1, timer2) # one timer is repeated if not timer1.repeated: @@ -33,12 +37,24 @@ class TimerSanityCheck: dow2 = (localtime(timer2.begin).tm_wday - 1) % 7 if timer1.repeated & (2 ** dow2): - return True + return self.timeEquals(timer1, timer2) else: - if (timer1.begin < timer2.begin < timer1.end) or (timer2.begin < timer1.begin < timer2.end): + if (timer1.begin <= timer2.begin < timer1.end) or (timer2.begin <= timer1.begin < timer2.end): return True return False + + def timeEquals(self, timer1, timer2): + ltb1 = localtime(timer1.begin) + ltb2 = localtime(timer2.begin) + + begin1 = ltb1.tm_hour * 3600 + ltb1.tm_min * 60 + ltb1.tm_sec + begin2 = ltb2.tm_hour * 3600 + ltb2.tm_min * 60 + ltb2.tm_sec + + end1 = begin1 + timer1.end - timer1.begin + end2 = begin2 + timer2.end - timer2.begin + + return (begin1 <= begin2 < end1) or (begin2 <= begin1 < end2) def checkRecordable(self, timerlist): # TODO: Add code here diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py index ee2920a0..965c35b6 100644 --- a/lib/python/Screens/TimerEdit.py +++ b/lib/python/Screens/TimerEdit.py @@ -1,5 +1,7 @@ from Screen import Screen from Components.TimerList import TimerList, TimerEntryComponent +from Components.ConfigList import ConfigList +from Components.MenuList import MenuList from Components.ActionMap import ActionMap from Components.TimeInput import TimeInput from Components.Label import Label @@ -138,7 +140,8 @@ class TimerEditList(Screen): if answer[0]: print "Edited timer" - if not TimerSanityCheck(self.session.nav.RecordTimer.timer_list, answer[1]).check(): + timersanitycheck = TimerSanityCheck(self.session.nav.RecordTimer.timer_list, answer[1]) + if not timersanitycheck.check(): print "Sanity check failed" else: print "Sanity check passed" @@ -150,16 +153,21 @@ class TimerEditList(Screen): def finishedAdd(self, answer): print "finished add" if answer[0]: - if not TimerSanityCheck(self.session.nav.RecordTimer.timer_list, answer[1]).check(): + timersanitycheck = TimerSanityCheck(self.session.nav.RecordTimer.timer_list, answer[1]) + if not timersanitycheck.check(): print "Sanity check failed" + self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, timersanitycheck.getSimulTimerList()) else: print "Sanity check passed" - entry = answer[1] - self.session.nav.RecordTimer.record(entry) - self.fillTimerList() + entry = answer[1] + self.session.nav.RecordTimer.record(entry) + self.fillTimerList() else: print "Timeredit aborted" + def finishSanityCorrection(self, answer): + self.finishedAdd(answer) + def leave(self): self.session.nav.RecordTimer.saveTimer() self.session.nav.RecordTimer.on_state_change.remove(self.onStateChange) @@ -167,3 +175,67 @@ class TimerEditList(Screen): def onStateChange(self, entry): self.refill() + +class TimerSanityConflict(Screen): + def __init__(self, session, timer): + Screen.__init__(self, session) + self.timer = timer + print timer + + self["timer1"] = TimerList(self.getTimerList(timer[0])) + if len(timer) > 1: + self["timer2"] = TimerList(self.getTimerList(timer[1])) + else: + self["timer2"] = Button("No conflict") + + self.list = [] + count = 0 + for x in timer: + if count != 0: + self.list.append((_("Conflicting timer") + " " + str(count), x)) + count += 1 + + self["list"] = MenuList(self.list) + + self["key_red"] = Button("Edit") + self["key_green"] = Button("Disable") + self["key_yellow"] = Button("Edit") + self["key_blue"] = Button("Disable") + + self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ShortcutActions", "TimerEditActions"], + { + "ok": self.close, + #"cancel": self.leave, + "red": self.editTimer1, + "green": self.disableTimer1, +# "yellow": self.editTimer2, +# "blue": self.disableTimer2, + #"log": self.showLog, + #"left": self.left, + #"right": self.right, + "up": self.up, + "down": self.down + }, -1) + + def getTimerList(self, timer): + return [TimerEntryComponent(timer, processed=False)] + + def editTimer1(self): + self.session.openWithCallback(self.finishedEdit, TimerEntry, self["timer1"].getCurrent()[0]) + + def disableTimer1(self): + self.timer[0].disabled = True + self.finishedEdit((True, self.timer[0])) + + def finishedEdit(self, answer): + self.close((True, self.timer[0])) + + def up(self): + self["list"].instance.moveSelection(self["list"].instance.moveUp) + self["timer2"].l.setList(self.getTimerList(self["list"].getCurrent()[1])) + + def down(self): + self["list"].instance.moveSelection(self["list"].instance.moveDown) + self["timer2"].l.setList(self.getTimerList(self["list"].getCurrent()[1])) + + \ No newline at end of file diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py index 752ace42..fef525f0 100644 --- a/lib/python/Screens/TimerEntry.py +++ b/lib/python/Screens/TimerEntry.py @@ -2,7 +2,7 @@ from Screen import Screen import ChannelSelection from ServiceReference import ServiceReference from Components.config import * -from Components.ActionMap import NumberActionMap +from Components.ActionMap import ActionMap, NumberActionMap from Components.ConfigList import ConfigList from Components.MenuList import MenuList from Components.Button import Button @@ -49,7 +49,7 @@ class TimerEntry(Screen): self.list = [] self["config"] = ConfigList(self.list) - self.createSetup() + self.createSetup("config") def createConfig(self): config.timerentry = ConfigSubsection() @@ -135,7 +135,7 @@ class TimerEntry(Screen): except: pass - def createSetup(self): + def createSetup(self, widget): self.list = [] self.list.append(getConfigListEntry(_("Name"), config.timerentry.name)) self.list.append(getConfigListEntry(_("Description"), config.timerentry.description)) @@ -180,15 +180,15 @@ class TimerEntry(Screen): self.channelEntry = getConfigListEntry(_("Channel"), config.timerentry.service) self.list.append(self.channelEntry) - self["config"].list = self.list - self["config"].l.setList(self.list) + self[widget].list = self.list + self[widget].l.setList(self.list) def newConfig(self): print self["config"].getCurrent() if self["config"].getCurrent() == self.timerTypeEntry: - self.createSetup() + self.createSetup("config") if self["config"].getCurrent() == self.frequencyEntry: - self.createSetup() + self.createSetup("config") def keyLeft(self): if self["config"].getCurrent() == self.channelEntry: @@ -282,7 +282,7 @@ class TimerEntry(Screen): def keyCancel(self): self.close((False,)) - + class TimerLog(Screen): def __init__(self, session, timer): Screen.__init__(self, session)