add possibility to disable user input in Messageboxes
[enigma2.git] / lib / python / Screens / PluginBrowser.py
index 429163ee4cdbbdbad9791120358089835e70e453..520d6d7a4b7bc9527c8d0dc7d6f0d5994add86b7 100644 (file)
@@ -2,22 +2,22 @@ from Screen import Screen
 
 from enigma import eConsoleAppContainer
 
 
 from enigma import eConsoleAppContainer
 
-from Components.MenuList import MenuList
 from Components.ActionMap import ActionMap
 from Components.PluginComponent import plugins
 from Components.PluginList import *
 from Components.ActionMap import ActionMap
 from Components.PluginComponent import plugins
 from Components.PluginList import *
-from Components.config import config
 from Components.Label import Label
 from Screens.MessageBox import MessageBox
 from Screens.Console import Console
 from Plugins.Plugin import PluginDescriptor
 from Components.Label import Label
 from Screens.MessageBox import MessageBox
 from Screens.Console import Console
 from Plugins.Plugin import PluginDescriptor
-from Tools.Directories import resolveFilename, SCOPE_PLUGINS
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.LoadPixmap import LoadPixmap
+
 
 class PluginBrowser(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
                
 
 class PluginBrowser(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
                
-               self["red"] = Label(_("Delete"))
+               self["red"] = Label(_("Remove Plugins"))
                self["green"] = Label(_("Download Plugins"))
                
                self.list = []
                self["green"] = Label(_("Download Plugins"))
                
                self.list = []
@@ -31,7 +31,16 @@ class PluginBrowser(Screen):
                        "red": self.delete,
                        "green": self.download
                })
                        "red": self.delete,
                        "green": self.download
                })
-               
+               self.onExecBegin.append(self.checkWarnings)
+       
+       def checkWarnings(self):
+               if len(plugins.warnings):
+                       text = _("Some plugins are not available:\n")
+                       for (pluginname, error) in plugins.warnings:
+                               text += _("%s (%s)\n") % (pluginname, error)
+                       plugins.resetWarnings()
+                       self.session.open(MessageBox, text = text, type = MessageBox.TYPE_WARNING)
+
        def save(self):
                #self.close()
                self.run()
        def save(self):
                #self.close()
                self.run()
@@ -50,28 +59,41 @@ class PluginBrowser(Screen):
                self["list"].l.setList(self.list)
 
        def delete(self):
                self["list"].l.setList(self.list)
 
        def delete(self):
-               pass
+               self.session.openWithCallback(self.updateList, PluginDownloadBrowser, PluginDownloadBrowser.REMOVE)
        
        def download(self):
        
        def download(self):
-               self.session.openWithCallback(self.updateList, PluginDownloadBrowser)
+               self.session.openWithCallback(self.updateList, PluginDownloadBrowser, PluginDownloadBrowser.DOWNLOAD)
 
 class PluginDownloadBrowser(Screen):
 
 class PluginDownloadBrowser(Screen):
-       def __init__(self, session):
+       DOWNLOAD = 0
+       REMOVE = 1
+       
+       def __init__(self, session, type):
                Screen.__init__(self, session)
                
                Screen.__init__(self, session)
                
+               self.type = type
+               
                self.container = eConsoleAppContainer()
                self.container = eConsoleAppContainer()
-               self.container.appClosed.get().append(self.runFinished)
-               self.container.dataAvail.get().append(self.dataAvail)
+               self.container.appClosed.append(self.runFinished)
+               self.container.dataAvail.append(self.dataAvail)
                self.onLayoutFinish.append(self.startRun)
                self.onLayoutFinish.append(self.startRun)
+               self.onShown.append(self.setWindowTitle)
                
                self.list = []
                self["list"] = PluginList(self.list)
                self.pluginlist = []
                
                self.list = []
                self["list"] = PluginList(self.list)
                self.pluginlist = []
+               self.expanded = []
+               self.installedplugins = []
                
                
-               self["text"] = Label(_("Downloading plugin information. Please wait..."))
+               if self.type == self.DOWNLOAD:
+                       self["text"] = Label(_("Downloading plugin information. Please wait..."))
+               elif self.type == self.REMOVE:
+                       self["text"] = Label(_("Getting plugin information. Please wait..."))
                
                self.run = 0
                
                self.run = 0
-                               
+
+               self.remainingdata = ""
+
                self["actions"] = ActionMap(["WizardActions"], 
                {
                        "ok": self.go,
                self["actions"] = ActionMap(["WizardActions"], 
                {
                        "ok": self.go,
@@ -79,43 +101,112 @@ class PluginDownloadBrowser(Screen):
                })
                
        def go(self):
                })
                
        def go(self):
-               print "plugin: installing:", self.pluginlist[self["list"].l.getCurrentSelectionIndex()]
-               self.session.openWithCallback(self.runInstall, MessageBox, _("Do you really want to download\nthe plugin \"" + self.pluginlist[self["list"].l.getCurrentSelectionIndex()][3] + "\"?"))
-               
+               sel = self["list"].l.getCurrentSelection()
+
+               if sel is None:
+                       return
+
+               if type(sel[0]) is str: # category
+                       if sel[0] in self.expanded:
+                               self.expanded.remove(sel[0])
+                       else:
+                               self.expanded.append(sel[0])
+                       self.updateList()
+               else:
+                       if self.type == self.DOWNLOAD:
+                               self.session.openWithCallback(self.runInstall, MessageBox, _("Do you really want to download\nthe plugin \"%s\"?") % sel[0].name)
+                       elif self.type == self.REMOVE:
+                               self.session.openWithCallback(self.runInstall, MessageBox, _("Do you really want to REMOVE\nthe plugin \"%s\"?") % sel[0].name)
+
        def runInstall(self, val):
                if val:
        def runInstall(self, val):
                if val:
-                       self.session.openWithCallback(self.installFinished, Console, ["ipkg install " + self.pluginlist[self["list"].l.getCurrentSelectionIndex()][0]])
+                       if self.type == self.DOWNLOAD:
+                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg install " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
+                       elif self.type == self.REMOVE:
+                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg remove " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
+
+       def setWindowTitle(self):
+               if self.type == self.DOWNLOAD:
+                       self.setTitle(_("Downloadable new plugins"))
+               elif self.type == self.REMOVE:
+                       self.setTitle(_("Remove plugins"))
 
        def startRun(self):
                self["list"].instance.hide()
 
        def startRun(self):
                self["list"].instance.hide()
-               self.container.execute("ipkg update")
+               if self.type == self.DOWNLOAD:
+                       self.container.execute("ipkg update")
+               elif self.type == self.REMOVE:
+                       self.run = 1
+                       self.container.execute("ipkg list_installed enigma2-plugin-*")
                
        def installFinished(self):
                plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
                
        def installFinished(self):
                plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
-               
+               self.container.appClosed.remove(self.runFinished)
+               self.container.dataAvail.remove(self.dataAvail)
+               self.close()
+
        def runFinished(self, retval):
        def runFinished(self, retval):
+               self.remainingdata = ""
                if self.run == 0:
                        self.run = 1
                if self.run == 0:
                        self.run = 1
+                       if self.type == self.DOWNLOAD:
+                               self.container.execute("ipkg list_installed enigma2-plugin-*")
+               elif self.run == 1 and self.type == self.DOWNLOAD:
+                       self.run = 2
                        self.container.execute("ipkg list enigma2-plugin-*")
                else:
                        if len(self.pluginlist) > 0:
                                self.updateList()
                                self["list"].instance.show()
                        else:
                        self.container.execute("ipkg list enigma2-plugin-*")
                else:
                        if len(self.pluginlist) > 0:
                                self.updateList()
                                self["list"].instance.show()
                        else:
-                               self["text"].setText("No plugins found")
+                               self["text"].setText("No new plugins found")
 
        def dataAvail(self, str):
 
        def dataAvail(self, str):
-               for x in str.split('\n'):
+               #prepend any remaining data from the previous call
+               str = self.remainingdata + str
+               #split in lines
+               lines = str.split('\n')
+               #'str' should end with '\n', so when splitting, the last line should be empty. If this is not the case, we received an incomplete line
+               if len(lines[-1]):
+                       #remember this data for next time
+                       self.remainingdata = lines[-1]
+                       lines = lines[0:-1]
+               else:
+                       self.remainingdata = ""
+
+               for x in lines:
                        plugin = x.split(" - ")
                        if len(plugin) == 3:
                        plugin = x.split(" - ")
                        if len(plugin) == 3:
-                               plugin.append(plugin[0][15:])
+                               if self.run == 1 and self.type == self.DOWNLOAD:
+                                       self.installedplugins.append(plugin[0])
+                               else:
+                                       if plugin[0] not in self.installedplugins:
+                                               plugin.append(plugin[0][15:])
 
 
-                               self.pluginlist.append(plugin)
+                                               self.pluginlist.append(plugin)
        
        def updateList(self):
        
        def updateList(self):
-               for x in self.pluginlist:
-                       plugin = PluginDescriptor(name = x[3], description = x[2])
-                       self.list.append(PluginEntryComponent(plugin))
+               self.list = []
+               expandableIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/expandable-plugins.png"))
+               expandedIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/expanded-plugins.png"))
+               verticallineIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/verticalline-plugins.png"))
                
                
+               self.plugins = {}
+               for x in self.pluginlist:
+                       split = x[3].split('-')
+                       if len(split) < 2:
+                               continue
+                       if not self.plugins.has_key(split[0]):
+                               self.plugins[split[0]] = []
+                               
+                       self.plugins[split[0]].append((PluginDescriptor(name = x[3], description = x[2], icon = verticallineIcon), split[1]))
+                       
+               for x in self.plugins.keys():
+                       if x in self.expanded:
+                               self.list.append(PluginCategoryComponent(x, expandedIcon))
+                               for plugin in self.plugins[x]:
+                                       self.list.append(PluginDownloadComponent(plugin[0], plugin[1]))
+                       else:
+                               self.list.append(PluginCategoryComponent(x, expandableIcon))
                self["list"].l.setList(self.list)
 
                self["list"].l.setList(self.list)