fixes by adenin:
[enigma2.git] / lib / python / Screens / MovieSelection.py
index a2ccb79a4b10b9c0a04e9a433a4a94a0b7f1b98b..5951653ffc38d5bd249e38146d80a79cd6e49d3c 100644 (file)
@@ -7,14 +7,14 @@ from Components.DiskInfo import DiskInfo
 from Components.Pixmap import Pixmap
 from Components.Label import Label
 from Components.PluginComponent import plugins
 from Components.Pixmap import Pixmap
 from Components.Label import Label
 from Components.PluginComponent import plugins
-from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, configfile
+from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations
 from Components.Sources.ServiceEvent import ServiceEvent
 
 from Plugins.Plugin import PluginDescriptor
 
 from Screens.MessageBox import MessageBox
 from Screens.ChoiceBox import ChoiceBox
 from Components.Sources.ServiceEvent import ServiceEvent
 
 from Plugins.Plugin import PluginDescriptor
 
 from Screens.MessageBox import MessageBox
 from Screens.ChoiceBox import ChoiceBox
-from Screens.LocationBox import LocationBox
+from Screens.LocationBox import MovieLocationBox
 from Screens.HelpMenu import HelpableScreen
 
 from Tools.Directories import *
 from Screens.HelpMenu import HelpableScreen
 
 from Tools.Directories import *
@@ -26,8 +26,31 @@ config.movielist = ConfigSubsection()
 config.movielist.moviesort = ConfigInteger(default=MovieList.SORT_RECORDED)
 config.movielist.listtype = ConfigInteger(default=MovieList.LISTTYPE_ORIGINAL)
 config.movielist.description = ConfigInteger(default=MovieList.HIDE_DESCRIPTION)
 config.movielist.moviesort = ConfigInteger(default=MovieList.SORT_RECORDED)
 config.movielist.listtype = ConfigInteger(default=MovieList.LISTTYPE_ORIGINAL)
 config.movielist.description = ConfigInteger(default=MovieList.HIDE_DESCRIPTION)
-# FIXME: see if this is always accessible by InfoBarGenerics
 config.movielist.last_videodir = ConfigText(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):
@@ -69,23 +92,18 @@ class MovieContextMenu(Screen):
                self.close(False)
 
        def sortBy(self, newType):
                self.close(False)
 
        def sortBy(self, newType):
-               self.csel.saveflag = True
                config.movielist.moviesort.value = 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):
-               self.csel.saveflag = True
                config.movielist.listtype.value = newType
                self.csel.setListType(newType)
                self.csel.list.redrawList()
                self.close()
 
        def showDescription(self, newType):
                config.movielist.listtype.value = newType
                self.csel.setListType(newType)
                self.csel.list.redrawList()
                self.close()
 
        def showDescription(self, newType):
-               self.csel.saveflag = True
                config.movielist.description.value = newType
                self.csel.setDescriptionState(newType)
                self.csel.updateDescription()
                config.movielist.description.value = newType
                self.csel.setDescriptionState(newType)
                self.csel.updateDescription()
@@ -124,7 +142,8 @@ class MovieContextMenu(Screen):
                if result == False:
                        self.session.openWithCallback(self.close, MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR)
                else:
                if result == False:
                        self.session.openWithCallback(self.close, MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR)
                else:
-                       list = self.csel["list"].removeService(self.service)
+                       self.csel["list"].removeService(self.service)
+                       self.csel["freeDiskSpace"].update()
                        self.close()
 
 class SelectionEventInfo:
                        self.close()
 
 class SelectionEventInfo:
@@ -148,12 +167,9 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                Screen.__init__(self, session)
                HelpableScreen.__init__(self)
 
                Screen.__init__(self, session)
                HelpableScreen.__init__(self)
 
-               self.saveflag = False
-
                self.tags = [ ]
                self.selected_tags = None
                self.tags = [ ]
                self.selected_tags = None
-
-               self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + config.movielist.last_videodir.value)
+               self.selected_tags_ele = None
 
                self.movemode = False
                self.bouquet_mark_edit = False
 
                self.movemode = False
                self.bouquet_mark_edit = False
@@ -167,6 +183,11 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                self["DescriptionBorder"] = Pixmap()
                self["DescriptionBorder"].hide()
 
                self["DescriptionBorder"] = Pixmap()
                self["DescriptionBorder"].hide()
 
+               if not pathExists(config.movielist.last_videodir.value):
+                       config.movielist.last_videodir.value = resolveFilename(SCOPE_HDD)
+                       config.movielist.last_videodir.save()
+               self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + config.movielist.last_videodir.value)
+
                self["list"] = MovieList(None,
                        config.movielist.listtype.value,
                        config.movielist.moviesort.value,
                self["list"] = MovieList(None,
                        config.movielist.listtype.value,
                        config.movielist.moviesort.value,
@@ -178,13 +199,12 @@ 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("")
 
-               #self["freeDiskSpace"] = DiskInfo(resolveFilename(SCOPE_HDD), DiskInfo.FREE, update=False)
-               self["freeDiskSpace"] = self.diskinfo = DiskInfo(resolveFilename(SCOPE_HDD), DiskInfo.FREE, update=False)
+               self["freeDiskSpace"] = self.diskinfo = DiskInfo(config.movielist.last_videodir.value, DiskInfo.FREE, update=False)
 
                if config.usage.setup_level.index >= 2: # expert+
                        self["InfobarActions"] = HelpableActionMap(self, "InfobarActions", 
 
                if config.usage.setup_level.index >= 2: # expert+
                        self["InfobarActions"] = HelpableActionMap(self, "InfobarActions", 
@@ -202,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",
@@ -214,6 +234,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                        })
 
                self.onShown.append(self.go)
                        })
 
                self.onShown.append(self.go)
+               self.onLayoutFinish.append(self.saveListsize)
                self.inited = False
 
        def updateDescription(self):
                self.inited = False
 
        def updateDescription(self):
@@ -238,20 +259,16 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                # this is of course not the right way to do this.
                        self.delayTimer.start(10, 1)
                        self.inited=True
                # this is of course not the right way to do this.
                        self.delayTimer.start(10, 1)
                        self.inited=True
-               # as this workaround is here anyways we can wait until the skin is initialized
-               # and afterwards read out the information we need to draw the dynamic style
+
+       def saveListsize(self):
                        listsize = self["list"].instance.size()
                        self.listWidth = listsize.width()
                        self.listHeight = listsize.height()
                        self.updateDescription()
 
        def updateHDDData(self):
                        listsize = self["list"].instance.size()
                        self.listWidth = listsize.width()
                        self.listHeight = listsize.height()
                        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["freeDiskSpace"].update()
-               self.updateTags()
 
        def moveTo(self):
                self["list"].moveTo(self.selectedmovie)
 
        def moveTo(self):
                self["list"].moveTo(self.selectedmovie)
@@ -275,12 +292,9 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                self.close(None)
 
        def saveconfig(self):
                self.close(None)
 
        def saveconfig(self):
-               if self.saveflag == True:
-                       config.movielist.moviesort.save()
-                       config.movielist.listtype.save()
-                       config.movielist.description.save()
-                       configfile.save()
-                       self.saveflag = False
+               config.movielist.moviesort.save()
+               config.movielist.listtype.save()
+               config.movielist.description.save()
 
        def getTagDescription(self, tag):
                # TODO: access the tag database
 
        def getTagDescription(self, tag):
                # TODO: access the tag database
@@ -289,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 = ""
 
@@ -321,60 +338,88 @@ 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 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.session.openWithCallback(
                        self.gotFilename,
 
        def doPathSelect(self):
                self.session.openWithCallback(
                        self.gotFilename,
-                       LocationBox,
+                       MovieLocationBox,
                        _("Please select the movie path..."),
                        _("Please select the movie path..."),
-                       currDir = config.movielist.last_videodir.value
+                       config.movielist.last_videodir.value
                )
 
        def gotFilename(self, res):
                if res is not None and res is not config.movielist.last_videodir.value:
                )
 
        def gotFilename(self, res):
                if res is not None and res is not config.movielist.last_videodir.value:
-                       config.movielist.last_videodir.value = res
-                       self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res)
-                       self.reloadList()
-                       self.updateTags()
+                       if pathExists(res):
+                               config.movielist.last_videodir.value = 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(home = True)
+                       else:
+                               self.session.open(
+                                       MessageBox,
+                                       _("Directory %s nonexistent.") % (res),
+                                       type = MessageBox.TYPE_ERROR,
+                                       timeout = 5
+                                       )
 
        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)