Patch by Moritz Venn/Anders Holst: the long awaited 'setting tags from timer menu...
authorFelix Domke <tmbinc@elitedvb.net>
Sun, 16 Nov 2008 23:18:37 +0000 (00:18 +0100)
committerFelix Domke <tmbinc@elitedvb.net>
Sun, 16 Nov 2008 23:18:37 +0000 (00:18 +0100)
RecordTimer.py
lib/python/Components/MovieList.py
lib/python/Screens/InputBox.py
lib/python/Screens/MovieSelection.py
lib/python/Screens/TimerEntry.py

index 397ff8a..28b878a 100644 (file)
@@ -91,7 +91,7 @@ class RecordTimerEntry(timer.TimerEntry, object):
                        Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop, default_yes = default_yes)
 #################################################################
 
                        Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop, default_yes = default_yes)
 #################################################################
 
-       def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False, dirname = None):
+       def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False, dirname = None, tags = None):
                timer.TimerEntry.__init__(self, int(begin), int(end))
 
                if checkOldTimers == True:
                timer.TimerEntry.__init__(self, int(begin), int(end))
 
                if checkOldTimers == True:
@@ -117,6 +117,7 @@ class RecordTimerEntry(timer.TimerEntry, object):
                self.dirname = dirname
                self.dirnameHadToFallback = False
                self.autoincrease = False
                self.dirname = dirname
                self.dirnameHadToFallback = False
                self.autoincrease = False
+               self.tags = tags or []
 
                self.log_entries = []
                self.resetState()
 
                self.log_entries = []
                self.resetState()
@@ -192,6 +193,7 @@ class RecordTimerEntry(timer.TimerEntry, object):
                                f.write(self.name + "\n")
                                f.write(self.description + "\n")
                                f.write(str(self.begin) + "\n")
                                f.write(self.name + "\n")
                                f.write(self.description + "\n")
                                f.write(str(self.begin) + "\n")
+                               f.write(' '.join(self.tags))
                                f.close()
                        except IOError:
                                self.log(4, "failed to write meta information")
                                f.close()
                        except IOError:
                                self.log(4, "failed to write meta information")
@@ -368,10 +370,14 @@ def createTimer(xml):
                location = xml.getAttribute("location").encode("utf-8")
        else:
                location = None
                location = xml.getAttribute("location").encode("utf-8")
        else:
                location = None
+       if xml.hasAttribute("tags") and xml.getAttribute("tags"):
+               tags = xml.getAttribute("tags").encode("utf-8").split(' ')
+       else:
+               tags = None
 
        name = xml.getAttribute("name").encode("utf-8")
        #filename = xml.getAttribute("filename").encode("utf-8")
 
        name = xml.getAttribute("name").encode("utf-8")
        #filename = xml.getAttribute("filename").encode("utf-8")
-       entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent, dirname = location)
+       entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent, dirname = location, tags = tags)
        entry.repeated = int(repeated)
        
        for l in elementsWithTag(xml.childNodes, "log"):
        entry.repeated = int(repeated)
        
        for l in elementsWithTag(xml.childNodes, "log"):
@@ -492,6 +498,8 @@ class RecordTimer(timer.Timer):
                                list.append(' eit="' + str(timer.eit) + '"')
                        if timer.dirname is not None:
                                list.append(' location="' + str(stringToXML(timer.dirname)) + '"')
                                list.append(' eit="' + str(timer.eit) + '"')
                        if timer.dirname is not None:
                                list.append(' location="' + str(stringToXML(timer.dirname)) + '"')
+                       if timer.tags is not None:
+                               list.append(' tags="' + str(stringToXML(' '.join(timer.tags))) + '"')
                        list.append(' disabled="' + str(int(timer.disabled)) + '"')
                        list.append(' justplay="' + str(int(timer.justplay)) + '"')
                        list.append('>\n')
                        list.append(' disabled="' + str(int(timer.disabled)) + '"')
                        list.append(' justplay="' + str(int(timer.justplay)) + '"')
                        list.append('>\n')
index ace3601..8568f3d 100644 (file)
@@ -103,7 +103,8 @@ class MovieList(GUIComponent):
                txt = info.getName(serviceref)
                service = ServiceReference(info.getInfoString(serviceref, iServiceInformation.sServiceref))
                description = info.getInfoString(serviceref, iServiceInformation.sDescription)
                txt = info.getName(serviceref)
                service = ServiceReference(info.getInfoString(serviceref, iServiceInformation.sServiceref))
                description = info.getInfoString(serviceref, iServiceInformation.sDescription)
-               
+               tags = info.getInfoString(serviceref, iServiceInformation.sTags)
+
                begin_string = ""
                if begin > 0:
                        t = FuzzyTime(begin)
                begin_string = ""
                if begin > 0:
                        t = FuzzyTime(begin)
@@ -111,23 +112,33 @@ class MovieList(GUIComponent):
                
                if self.list_type == MovieList.LISTTYPE_ORIGINAL:
                        res.append(MultiContentEntryText(pos=(0, 0), size=(width-182, 30), font = 0, flags = RT_HALIGN_LEFT, text=txt))
                
                if self.list_type == MovieList.LISTTYPE_ORIGINAL:
                        res.append(MultiContentEntryText(pos=(0, 0), size=(width-182, 30), font = 0, flags = RT_HALIGN_LEFT, text=txt))
-                       if service is not None:
-                               res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
+                       if self.tags:
+                               res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = tags))
+                               if service is not None:
+                                       res.append(MultiContentEntryText(pos=(200, 50), size=(200, 20), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName()))
+                       else:
+                               if service is not None:
+                                       res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
                        res.append(MultiContentEntryText(pos=(0, 30), size=(width, 20), font=1, flags=RT_HALIGN_LEFT, text=description))
                        res.append(MultiContentEntryText(pos=(0, 30), size=(width, 20), font=1, flags=RT_HALIGN_LEFT, text=description))
-                       res.append(MultiContentEntryText(pos=(0, 50), size=(width-270, 20), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
-                       res.append(MultiContentEntryText(pos=(width-200, 50), size=(200, 20), font=1, flags=RT_HALIGN_RIGHT, text=len))
+                       res.append(MultiContentEntryText(pos=(0, 50), size=(200, 20), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
+                       res.append(MultiContentEntryText(pos=(width-200, 50), size=(198, 20), font=1, flags=RT_HALIGN_RIGHT, text=len))
                elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION:
                        res.append(MultiContentEntryText(pos=(0, 0), size=(width-120, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt))
                elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION:
                        res.append(MultiContentEntryText(pos=(0, 0), size=(width-120, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt))
-                       if service is not None:
-                               res.append(MultiContentEntryText(pos=(width-212, 20), size=(154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
                        res.append(MultiContentEntryText(pos=(0, 20), size=(width-212, 17), font=1, flags=RT_HALIGN_LEFT, text=description))
                        res.append(MultiContentEntryText(pos=(width-120, 6), size=(120, 20), font=1, flags=RT_HALIGN_RIGHT, text=begin_string))
                        res.append(MultiContentEntryText(pos=(0, 20), size=(width-212, 17), font=1, flags=RT_HALIGN_LEFT, text=description))
                        res.append(MultiContentEntryText(pos=(width-120, 6), size=(120, 20), font=1, flags=RT_HALIGN_RIGHT, text=begin_string))
+                       if service is not None:
+                               res.append(MultiContentEntryText(pos=(width-212, 20), size=(154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
                        res.append(MultiContentEntryText(pos=(width-58, 20), size=(58, 20), font=1, flags=RT_HALIGN_RIGHT, text=len))
                elif self.list_type == MovieList.LISTTYPE_COMPACT:
                        res.append(MultiContentEntryText(pos=(0, 0), size=(width-77, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt))
                        res.append(MultiContentEntryText(pos=(width-58, 20), size=(58, 20), font=1, flags=RT_HALIGN_RIGHT, text=len))
                elif self.list_type == MovieList.LISTTYPE_COMPACT:
                        res.append(MultiContentEntryText(pos=(0, 0), size=(width-77, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt))
-                       if service is not None:
-                               res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
-                       res.append(MultiContentEntryText(pos=(0, 20), size=(width-200, 17), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
+                       if self.tags:
+                               res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = tags))
+                               if service is not None:
+                                       res.append(MultiContentEntryText(pos=(200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName()))
+                       else:
+                               if service is not None:
+                                       res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
+                       res.append(MultiContentEntryText(pos=(0, 20), size=(200, 17), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
                        res.append(MultiContentEntryText(pos=(width-75, 0), size=(75, 20), font=0, flags=RT_HALIGN_RIGHT, text=len))
                else:
                        assert(self.list_type == MovieList.LISTTYPE_MINIMAL)
                        res.append(MultiContentEntryText(pos=(width-75, 0), size=(75, 20), font=0, flags=RT_HALIGN_RIGHT, text=len))
                else:
                        assert(self.list_type == MovieList.LISTTYPE_MINIMAL)
@@ -212,6 +223,7 @@ class MovieList(GUIComponent):
                        if this_tags == ['']:
                                this_tags = []
                        this_tags = set(this_tags)
                        if this_tags == ['']:
                                this_tags = []
                        this_tags = set(this_tags)
+                       tags |= this_tags
                
                        # filter_tags is either None (which means no filter at all), or 
                        # a set. In this case, all elements of filter_tags must be present,
                
                        # filter_tags is either None (which means no filter at all), or 
                        # a set. In this case, all elements of filter_tags must be present,
@@ -219,7 +231,6 @@ class MovieList(GUIComponent):
                        if filter_tags is not None and not this_tags.issuperset(filter_tags):
                                continue
                
                        if filter_tags is not None and not this_tags.issuperset(filter_tags):
                                continue
                
-                       tags |= this_tags
                        self.list.append((serviceref, info, begin, -1))
                
                if self.sort_type == MovieList.SORT_ALPHANUMERIC:
                        self.list.append((serviceref, info, begin, -1))
                
                if self.sort_type == MovieList.SORT_ALPHANUMERIC:
@@ -243,8 +254,9 @@ class MovieList(GUIComponent):
                for x in self.list:
                        if x[0] == serviceref:
                                self.instance.moveSelectionTo(count)
                for x in self.list:
                        if x[0] == serviceref:
                                self.instance.moveSelectionTo(count)
-                               break
+                               return True
                        count += 1
                        count += 1
-
+               return False
+       
        def moveDown(self):
                self.instance.moveSelection(self.instance.moveDown)
        def moveDown(self):
                self.instance.moveSelection(self.instance.moveDown)
index 43b8a8b..61ce356 100644 (file)
@@ -8,12 +8,14 @@ from Tools.BoundFunction import boundFunction
 from time import time
 
 class InputBox(Screen):
 from time import time
 
 class InputBox(Screen):
-       def __init__(self, session, title = "", windowTitle = _("Input"), **kwargs):
+       def __init__(self, session, title = "", windowTitle = _("Input"), useableChars = None, **kwargs):
                Screen.__init__(self, session)
 
                self["text"] = Label(title)
                self["input"] = Input(**kwargs)
                self.onShown.append(boundFunction(self.setTitle, windowTitle))
                Screen.__init__(self, session)
 
                self["text"] = Label(title)
                self["input"] = Input(**kwargs)
                self.onShown.append(boundFunction(self.setTitle, windowTitle))
+               if useableChars is not None:
+                       self["input"].setUseableChars(useableChars)
 
                self["actions"] = NumberActionMap(["WizardActions", "InputBoxActions", "InputAsciiActions", "KeyboardInputActions"], 
                {
 
                self["actions"] = NumberActionMap(["WizardActions", "InputBoxActions", "InputAsciiActions", "KeyboardInputActions"], 
                {
index c05f145..5951653 100644 (file)
@@ -29,6 +29,28 @@ config.movielist.description = ConfigInteger(default=MovieList.HIDE_DESCRIPTION)
 config.movielist.last_videodir = ConfigText(default=resolveFilename(SCOPE_HDD))
 config.movielist.last_timer_videodir = ConfigText(default=resolveFilename(SCOPE_HDD))
 config.movielist.videodirs = ConfigLocations(default=[resolveFilename(SCOPE_HDD)])
 config.movielist.last_videodir = ConfigText(default=resolveFilename(SCOPE_HDD))
 config.movielist.last_timer_videodir = ConfigText(default=resolveFilename(SCOPE_HDD))
 config.movielist.videodirs = ConfigLocations(default=[resolveFilename(SCOPE_HDD)])
+config.movielist.first_tags = ConfigText(default="")
+config.movielist.second_tags = ConfigText(default="")
+
+
+def setPreferredTagEditor(te):
+       global preferredTagEditor
+       try:
+               if preferredTagEditor == None:
+                       preferredTagEditor = te
+                       print "Preferred tag editor changed to ", preferredTagEditor
+               else:
+                       print "Preferred tag editor already set to ", preferredTagEditor
+                       print "ignoring ", te
+       except:
+               preferredTagEditor = te
+               print "Preferred tag editor set to ", preferredTagEditor
+
+def getPreferredTagEditor():
+       global preferredTagEditor
+       return preferredTagEditor
+
+setPreferredTagEditor(None)
 
 class MovieContextMenu(Screen):
        def __init__(self, session, csel, service):
 
 class MovieContextMenu(Screen):
        def __init__(self, session, csel, service):
@@ -71,10 +93,8 @@ class MovieContextMenu(Screen):
 
        def sortBy(self, newType):
                config.movielist.moviesort.value = newType
 
        def sortBy(self, newType):
                config.movielist.moviesort.value = newType
-               self.csel.selectedmovie = self.csel.getCurrent()
                self.csel.setSortType(newType)
                self.csel.reloadList()
                self.csel.setSortType(newType)
                self.csel.reloadList()
-               self.csel.moveTo()
                self.close()
 
        def listType(self, newType):
                self.close()
 
        def listType(self, newType):
@@ -123,7 +143,7 @@ class MovieContextMenu(Screen):
                        self.session.openWithCallback(self.close, MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR)
                else:
                        self.csel["list"].removeService(self.service)
                        self.session.openWithCallback(self.close, MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR)
                else:
                        self.csel["list"].removeService(self.service)
-                       self.csel["freeDiskSpace"].update()
+                       self.csel["freeDiskSpace"].update()
                        self.close()
 
 class SelectionEventInfo:
                        self.close()
 
 class SelectionEventInfo:
@@ -149,6 +169,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
 
                self.tags = [ ]
                self.selected_tags = None
 
                self.tags = [ ]
                self.selected_tags = None
+               self.selected_tags_ele = None
 
                self.movemode = False
                self.bouquet_mark_edit = False
 
                self.movemode = False
                self.bouquet_mark_edit = False
@@ -178,7 +199,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                # Need list for init
                SelectionEventInfo.__init__(self)
 
                # Need list for init
                SelectionEventInfo.__init__(self)
 
-               self["key_red"] = Button(_("All..."))
+               self["key_red"] = Button(_("All"))
                self["key_green"] = Button("")
                self["key_yellow"] = Button("")
                self["key_blue"] = Button("")
                self["key_green"] = Button("")
                self["key_yellow"] = Button("")
                self["key_blue"] = Button("")
@@ -201,9 +222,9 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                self["ColorActions"] = HelpableActionMap(self, "ColorActions",
                        {
                                "red": (self.showAll, _("show all")),
                self["ColorActions"] = HelpableActionMap(self, "ColorActions",
                        {
                                "red": (self.showAll, _("show all")),
-                               "green": (self.showTagsFirst, _("show first tag")),
-                               "yellow": (self.showTagsSecond, _("show second tag")),
-                               "blue": (self.showTagsMenu, _("show tag menu")),
+                               "green": (self.showTagsFirst, _("show first selected tag")),
+                               "yellow": (self.showTagsSecond, _("show second selected tag")),
+                               "blue": (self.showTagsSelect, _("show tag menu")),
                        })
 
                self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
                        })
 
                self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
@@ -246,11 +267,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                        self.updateDescription()
 
        def updateHDDData(self):
                        self.updateDescription()
 
        def updateHDDData(self):
-               self.reloadList()
-               if self.selectedmovie is not None:
-                       self.moveTo()
+               self.reloadList(self.selectedmovie)
                self["waitingtext"].visible = False
                self["waitingtext"].visible = False
-               self.updateTags()
 
        def moveTo(self):
                self["list"].moveTo(self.selectedmovie)
 
        def moveTo(self):
                self["list"].moveTo(self.selectedmovie)
@@ -285,26 +303,29 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
        def updateTags(self):
                # get a list of tags available in this list
                self.tags = list(self["list"].tags)
        def updateTags(self):
                # get a list of tags available in this list
                self.tags = list(self["list"].tags)
-               
-               # by default, we do not display any filtering options
-               self.tag_first = ""
-               self.tag_second = ""
-               
-               # when tags are present, however, the first two are 
-               # directly mapped to the second, third ("green", "yellow") buttons
-               if len(self.tags) > 0:
-                       self.tag_first = self.getTagDescription(self.tags[0])
-               
-               if len(self.tags) > 1:
-                       self.tag_second = self.getTagDescription(self.tags[1])
-               
+
+               if not self.tags:
+                       # by default, we do not display any filtering options
+                       self.tag_first = ""
+                       self.tag_second = ""
+               else:
+                       tmp = config.movielist.first_tags.value
+                       if tmp in self.tags:
+                               self.tag_first = tmp
+                       else:
+                               self.tag_first = "<"+_("Tag 1")+">"
+                       tmp = config.movielist.second_tags.value
+                       if tmp in self.tags:
+                               self.tag_second = tmp
+                       else:
+                               self.tag_second = "<"+_("Tag 2")+">"
                self["key_green"].text = self.tag_first
                self["key_yellow"].text = self.tag_second
                
                # the rest is presented in a list, available on the
                # fourth ("blue") button
                self["key_green"].text = self.tag_first
                self["key_yellow"].text = self.tag_second
                
                # the rest is presented in a list, available on the
                # fourth ("blue") button
-               if len(self.tags) > 2:
-                       self["key_blue"].text = _("Other...")
+               if self.tags:
+                       self["key_blue"].text = _("Tags")+"..."
                else:
                        self["key_blue"].text = ""
 
                else:
                        self["key_blue"].text = ""
 
@@ -317,20 +338,26 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
        def setSortType(self, type):
                self["list"].setSortType(type)
 
        def setSortType(self, type):
                self["list"].setSortType(type)
 
-       def reloadList(self):
+       def reloadList(self, sel = None, home = False):
                if not pathExists(config.movielist.last_videodir.value):
                        path = resolveFilename(SCOPE_HDD)
                        config.movielist.last_videodir.value = path
                        config.movielist.last_videodir.save()
                        self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + path)
                        self["freeDiskSpace"].path = path
                if not pathExists(config.movielist.last_videodir.value):
                        path = resolveFilename(SCOPE_HDD)
                        config.movielist.last_videodir.value = path
                        config.movielist.last_videodir.save()
                        self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + path)
                        self["freeDiskSpace"].path = path
+               if sel is None:
+                       sel = self.getCurrent()
                self["list"].reload(self.current_ref, self.selected_tags)
                title = _("Recorded files...")
                self["list"].reload(self.current_ref, self.selected_tags)
                title = _("Recorded files...")
-               if self.selected_tags is not None:
-                       title += " - " + ','.join(self.selected_tags)
                if config.usage.setup_level.index >= 2: # expert+
                        title += "  " + config.movielist.last_videodir.value
                if config.usage.setup_level.index >= 2: # expert+
                        title += "  " + config.movielist.last_videodir.value
+               if self.selected_tags is not None:
+                       title += " - " + ','.join(self.selected_tags)
                self.setTitle(title)
                self.setTitle(title)
+               if not (sel and self["list"].moveTo(sel)):
+                       if home:
+                               self["list"].moveToIndex(0)
+               self.updateTags()
                self["freeDiskSpace"].update()
 
        def doPathSelect(self):
                self["freeDiskSpace"].update()
 
        def doPathSelect(self):
@@ -348,7 +375,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                                config.movielist.last_videodir.save()
                                self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res)
                                self["freeDiskSpace"].path = res
                                config.movielist.last_videodir.save()
                                self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res)
                                self["freeDiskSpace"].path = res
-                               self.reloadList()
+                               self.reloadList(home = True)
                        else:
                                self.session.open(
                                        MessageBox,
                        else:
                                self.session.open(
                                        MessageBox,
@@ -358,35 +385,41 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                                        )
 
        def showAll(self):
                                        )
 
        def showAll(self):
+               self.selected_tags_ele = None
                self.selected_tags = None
                self.selected_tags = None
-               self.reloadList()
+               self.reloadList(home = True)
 
 
-       def showTagsN(self, n):
-               if len(self.tags) < n:
+       def showTagsN(self, tagele):
+               if not self.tags:
                        self.showTagWarning()
                        self.showTagWarning()
+               elif not tagele or self.selected_tags_ele == tagele or not tagele.value in self.tags:
+                       self.showTagsMenu(tagele)
                else:
                else:
-                       print "select tag #%d, %s, %s" % (n, self.tags[n - 1], ','.join(self.tags))
-                       self.selected_tags = set([self.tags[n - 1]])
-                       self.reloadList()
+                       self.selected_tags_ele = tagele
+                       self.selected_tags = set([tagele.value])
+                       self.reloadList(home = True)
 
        def showTagsFirst(self):
 
        def showTagsFirst(self):
-               self.showTagsN(1)
+               self.showTagsN(config.movielist.first_tags)
 
        def showTagsSecond(self):
 
        def showTagsSecond(self):
-               self.showTagsN(2)
+               self.showTagsN(config.movielist.second_tags)
+
+       def showTagsSelect(self):
+               self.showTagsN(None)
 
        def tagChosen(self, tag):
                if tag is not None:
                        self.selected_tags = set([tag[0]])
 
        def tagChosen(self, tag):
                if tag is not None:
                        self.selected_tags = set([tag[0]])
-                       self.reloadList()
+                       if self.selected_tags_ele:
+                               self.selected_tags_ele.value = tag[0]
+                               self.selected_tags_ele.save()
+                       self.reloadList(home = True)
 
 
-       def showTagsMenu(self):
-               if len(self.tags) < 3:
-                       self.showTagWarning()
-               else:
-                       list = [(tag, self.getTagDescription(tag)) for tag in self.tags ]
-                       self.session.openWithCallback(self.tagChosen, ChoiceBox, title=_("Please select keyword to filter..."), list = list)
+       def showTagsMenu(self, tagele):
+               self.selected_tags_ele = tagele
+               list = [(tag, self.getTagDescription(tag)) for tag in self.tags ]
+               self.session.openWithCallback(self.tagChosen, ChoiceBox, title=_("Please select tag to filter..."), list = list)
 
        def showTagWarning(self):
 
        def showTagWarning(self):
-               # TODO
-               self.session.open(MessageBox, _("You need to define some keywords first!\nPress the menu-key to define keywords.\nDo you want to define keywords now?"), MessageBox.TYPE_ERROR)
+               self.session.open(MessageBox, _("No tags are set on these movies."), MessageBox.TYPE_ERROR)
index c4dfff7..1774061 100644 (file)
@@ -8,6 +8,7 @@ from Components.MenuList import MenuList
 from Components.Button import Button
 from Components.Label import Label
 from Components.Pixmap import Pixmap
 from Components.Button import Button
 from Components.Label import Label
 from Components.Pixmap import Pixmap
+from Screens.MovieSelection import getPreferredTagEditor
 from Screens.LocationBox import MovieLocationBox
 from Screens.ChoiceBox import ChoiceBox
 from RecordTimer import AFTEREVENT
 from Screens.LocationBox import MovieLocationBox
 from Screens.ChoiceBox import ChoiceBox
 from RecordTimer import AFTEREVENT
@@ -21,8 +22,7 @@ class TimerEntry(Screen, ConfigListScreen):
                Screen.__init__(self, session)
                self.timer = timer
 
                Screen.__init__(self, session)
                self.timer = timer
 
-               self.entryStartDate = None
-               self.entryEndDate = None
+               self.entryDate = None
                self.entryService = None
 
                self["oktext"] = Label(_("OK"))
                self.entryService = None
 
                self["oktext"] = Label(_("OK"))
@@ -88,13 +88,13 @@ class TimerEntry(Screen, ConfigListScreen):
                        self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
                        self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
                        self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
                        self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
                        self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
                        self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
+                       self.timerentry_tags = self.timer.tags + []
+                       self.timerentry_tagsset = ConfigSelection(choices = [len(self.timerentry_tags) == 0 and "None" or " ".join(self.timerentry_tags)])
 
                        self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
 
 
                        self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
 
-                       self.timerentry_startdate = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
+                       self.timerentry_date = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
                        self.timerentry_starttime = ConfigClock(default = self.timer.begin)
                        self.timerentry_starttime = ConfigClock(default = self.timer.begin)
-
-                       self.timerentry_enddate = ConfigDateTime(default = self.timer.end, formatstring =  _("%d.%B %Y"), increment = 86400)
                        self.timerentry_endtime = ConfigClock(default = self.timer.end)
 
                        default = self.timer.dirname or resolveFilename(SCOPE_HDD)
                        self.timerentry_endtime = ConfigClock(default = self.timer.end)
 
                        default = self.timer.dirname or resolveFilename(SCOPE_HDD)
@@ -120,19 +120,6 @@ class TimerEntry(Screen, ConfigListScreen):
                        self.timerentry_service_ref = self.timer.service_ref
                        self.timerentry_service = ConfigSelection([servicename])
 
                        self.timerentry_service_ref = self.timer.service_ref
                        self.timerentry_service = ConfigSelection([servicename])
 
-                       self.timerentry_startdate.addNotifier(self.checkDate)
-                       self.timerentry_enddate.addNotifier(self.checkDate)
-
-       def checkDate(self, configElement):
-               if configElement is self.timerentry_startdate:
-                       if self.timerentry_enddate.value < self.timerentry_startdate.value:
-                               self.timerentry_enddate.value = self.timerentry_startdate.value
-                               self["config"].invalidate(self.entryEndDate)
-               if configElement is self.timerentry_enddate:
-                       if (self.timerentry_enddate.value < self.timerentry_startdate.value):
-                               self.timerentry_startdate.value = self.timerentry_enddate.value
-                               self["config"].invalidate(self.entryStartDate)
-
        def createSetup(self, widget):
                self.list = []
                self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
        def createSetup(self, widget):
                self.list = []
                self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
@@ -165,34 +152,24 @@ class TimerEntry(Screen, ConfigListScreen):
                                self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
                                self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
 
                                self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
                                self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
 
-                       #self.list.append(getConfigListEntry("StartDate", self.timerentry_startdate))
-#              self.list.append(getConfigListEntry("Weekday", self.timerentry_weekday))
-
-               self.entryStartDate = getConfigListEntry(_("Start"), self.timerentry_startdate)
-               if self.timerentry_type.value == "once":
-                       self.list.append(self.entryStartDate)
-                       self.list.append(getConfigListEntry(" ", self.timerentry_starttime))
-               else:
-                       self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
-
-               self.entryEndDate = getConfigListEntry(_("End"), self.timerentry_enddate)
+               self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date)
                if self.timerentry_type.value == "once":
                if self.timerentry_type.value == "once":
-                       if self.timerentry_justplay.value != "zap":
-                               self.list.append(self.entryEndDate)
-                               self.list.append(getConfigListEntry(" ", self.timerentry_endtime))
-               else:
-                       if self.timerentry_justplay.value != "zap":
-                               self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
+                       self.list.append(self.entryDate)
+               self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
+               if self.timerentry_justplay.value != "zap":
+                       self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
+               self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
+               self.list.append(self.channelEntry)
 
 
+               self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
+               self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset)
                if self.timerentry_justplay.value != "zap":
                        if config.usage.setup_level.index >= 2: # expert+
                if self.timerentry_justplay.value != "zap":
                        if config.usage.setup_level.index >= 2: # expert+
-                               self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname)
                                self.list.append(self.dirname)
                                self.list.append(self.dirname)
+                       if getPreferredTagEditor():
+                               self.list.append(self.tagsSet)
                        self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
 
                        self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
 
-               self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
-               self.list.append(self.channelEntry)
-
                self[widget].list = self.list
                self[widget].l.setList(self.list)
 
                self[widget].list = self.list
                self[widget].l.setList(self.list)
 
@@ -206,14 +183,14 @@ class TimerEntry(Screen, ConfigListScreen):
                        self.createSetup("config")
 
        def keyLeft(self):
                        self.createSetup("config")
 
        def keyLeft(self):
-               if self["config"].getCurrent() is self.channelEntry:
+               if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]:
                        self.keySelect()
                else:
                        ConfigListScreen.keyLeft(self)
                        self.newConfig()
 
        def keyRight(self):
                        self.keySelect()
                else:
                        ConfigListScreen.keyLeft(self)
                        self.newConfig()
 
        def keyRight(self):
-               if self["config"].getCurrent() is self.channelEntry:
+               if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]:
                        self.keySelect()
                else:
                        ConfigListScreen.keyRight(self)
                        self.keySelect()
                else:
                        ConfigListScreen.keyRight(self)
@@ -235,6 +212,12 @@ class TimerEntry(Screen, ConfigListScreen):
                                self.timerentry_dirname.value,
                                minFree = 100 # We require at least 100MB free space
                        )
                                self.timerentry_dirname.value,
                                minFree = 100 # We require at least 100MB free space
                        )
+               elif getPreferredTagEditor() and cur == self.tagsSet:
+                       self.session.openWithCallback(
+                               self.tagEditFinished,
+                               getPreferredTagEditor(),
+                               self.timerentry_tags
+                       )
                else:
                        self.keyGo()
 
                else:
                        self.keyGo()
 
@@ -249,24 +232,15 @@ class TimerEntry(Screen, ConfigListScreen):
                dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
                return int(mktime(dt.timetuple()))
 
                dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
                return int(mktime(dt.timetuple()))
 
-       def buildRepeatedBegin(self, rep_time, start_time):
-               d = localtime(rep_time)
-               dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, start_time[0], start_time[1])
-               return int(mktime(dt.timetuple()))
-
        def getBeginEnd(self):
        def getBeginEnd(self):
-               enddate = self.timerentry_enddate.value
+               date = self.timerentry_date.value
                endtime = self.timerentry_endtime.value
                endtime = self.timerentry_endtime.value
-
-               startdate = self.timerentry_startdate.value
                starttime = self.timerentry_starttime.value
 
                starttime = self.timerentry_starttime.value
 
-               begin = self.getTimestamp(startdate, starttime)
-               end = self.getTimestamp(enddate, endtime)
+               begin = self.getTimestamp(date, starttime)
+               end = self.getTimestamp(date, endtime)
 
 
-               # because of the dateChecks, startdate can't be < enddate.
-               # however, the endtime can be less than the starttime.
-               # in this case, add 1 day.
+               # if the endtime is less than the starttime, add 1 day.
                if end < begin:
                        end += 86400
                return begin, end
                if end < begin:
                        end += 86400
                return begin, end
@@ -278,6 +252,7 @@ class TimerEntry(Screen, ConfigListScreen):
                self.timer.resetRepeated()
                self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value]
                self.timer.service_ref = self.timerentry_service_ref
                self.timer.resetRepeated()
                self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value]
                self.timer.service_ref = self.timerentry_service_ref
+               self.timer.tags = self.timerentry_tags
 
                self.timer.dirname = self.timerentry_dirname.value
                config.movielist.last_timer_videodir.value = self.timer.dirname
 
                self.timer.dirname = self.timerentry_dirname.value
                config.movielist.last_timer_videodir.value = self.timer.dirname
@@ -352,6 +327,12 @@ class TimerEntry(Screen, ConfigListScreen):
                                self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
                        self.timerentry_dirname.value = res
 
                                self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res)
                        self.timerentry_dirname.value = res
 
+       def tagEditFinished(self, ret):
+               if ret is not None:
+                       self.timerentry_tags = ret
+                       self.timerentry_tagsset.setChoices([len(ret) == 0 and "None" or " ".join(ret)])
+                       self["config"].invalidate(self.tagsSet)
+
 class TimerLog(Screen):
        def __init__(self, session, timer):
                Screen.__init__(self, session)
 class TimerLog(Screen):
        def __init__(self, session, timer):
                Screen.__init__(self, session)