Merge remote branch 'origin/pootle-import'
[vuplus_dvbapp] / lib / python / Screens / PluginBrowser.py
old mode 100644 (file)
new mode 100755 (executable)
index f5d0c8a..359552e
@@ -1,37 +1,51 @@
 from Screen import Screen
 from Screen import Screen
+from Components.Language import language
+from enigma import eConsoleAppContainer
 
 
-from enigma import eConsoleAppContainer, loadPNG
-
-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, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, fileExists, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.LoadPixmap import LoadPixmap
+
+from time import time
+
+def languageChanged():
+       plugins.clearPluginList()
+       plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
 
 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(_("Remove Plugins"))
-               self["green"] = Label(_("Download Plugins"))
+               self["red"] = Label()
+               self["green"] = Label()
                
                self.list = []
                self["list"] = PluginList(self.list)
                
                self.list = []
                self["list"] = PluginList(self.list)
-               self.updateList()
                
                
-               self["actions"] = ActionMap(["WizardActions", "ColorActions"],
+               self["actions"] = ActionMap(["WizardActions"],
                {
                        "ok": self.save,
                        "back": self.close,
                {
                        "ok": self.save,
                        "back": self.close,
+               })
+               self["PluginDownloadActions"] = ActionMap(["ColorActions"],
+               {
                        "red": self.delete,
                        "green": self.download
                })
                        "red": self.delete,
                        "green": self.download
                })
-               self.onExecBegin.append(self.checkWarnings)
+               self["SoftwareActions"] = ActionMap(["ColorActions"],
+               {
+                       "red": self.openExtensionmanager
+               })
+               self["PluginDownloadActions"].setEnabled(False)
+               self["SoftwareActions"].setEnabled(False)
+               self.onFirstExecBegin.append(self.checkWarnings)
+               self.onShown.append(self.updateList)
        
        def checkWarnings(self):
                if len(plugins.warnings):
        
        def checkWarnings(self):
                if len(plugins.warnings):
@@ -42,40 +56,59 @@ class PluginBrowser(Screen):
                        self.session.open(MessageBox, text = text, type = MessageBox.TYPE_WARNING)
 
        def save(self):
                        self.session.open(MessageBox, text = text, type = MessageBox.TYPE_WARNING)
 
        def save(self):
-               #self.close()
                self.run()
        
        def run(self):
                plugin = self["list"].l.getCurrentSelection()[0]
                self.run()
        
        def run(self):
                plugin = self["list"].l.getCurrentSelection()[0]
-               
                plugin(session=self.session)
                
        def updateList(self):
                plugin(session=self.session)
                
        def updateList(self):
-               self.list = [ ]
                self.pluginlist = plugins.getPlugins(PluginDescriptor.WHERE_PLUGINMENU)
                self.pluginlist = plugins.getPlugins(PluginDescriptor.WHERE_PLUGINMENU)
-               for plugin in self.pluginlist:
-                       self.list.append(PluginEntryComponent(plugin))
-               
+               self.list = [PluginEntryComponent(plugin) for plugin in self.pluginlist]
                self["list"].l.setList(self.list)
                self["list"].l.setList(self.list)
-
+               if fileExists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/plugin.py")):
+                       self["red"].setText(_("Manage extensions"))
+                       self["green"].setText("")
+                       self["SoftwareActions"].setEnabled(True)
+                       self["PluginDownloadActions"].setEnabled(False)
+               else:
+                       self["red"].setText(_("Remove Plugins"))
+                       self["green"].setText(_("Download Plugins"))
+                       self["SoftwareActions"].setEnabled(False)
+                       self["PluginDownloadActions"].setEnabled(True)
+                       
        def delete(self):
        def delete(self):
-               self.session.openWithCallback(self.updateList, PluginDownloadBrowser, PluginDownloadBrowser.REMOVE)
+               self.session.openWithCallback(self.PluginDownloadBrowserClosed, PluginDownloadBrowser, PluginDownloadBrowser.REMOVE)
        
        def download(self):
        
        def download(self):
-               self.session.openWithCallback(self.updateList, PluginDownloadBrowser, PluginDownloadBrowser.DOWNLOAD)
+               self.session.openWithCallback(self.PluginDownloadBrowserClosed, PluginDownloadBrowser, PluginDownloadBrowser.DOWNLOAD)
+
+       def PluginDownloadBrowserClosed(self):
+               self.updateList()
+               self.checkWarnings()
+
+       def openExtensionmanager(self):
+               if fileExists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/plugin.py")):
+                       try:
+                               from Plugins.SystemPlugins.SoftwareManager.plugin import PluginManager
+                       except ImportError:
+                               self.session.open(MessageBox, _("The Softwaremanagement extension is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
+                       else:
+                               self.session.openWithCallback(self.PluginDownloadBrowserClosed, PluginManager)
 
 class PluginDownloadBrowser(Screen):
        DOWNLOAD = 0
        REMOVE = 1
 
 class PluginDownloadBrowser(Screen):
        DOWNLOAD = 0
        REMOVE = 1
-       
+       lastDownloadDate = None
+
        def __init__(self, session, type):
                Screen.__init__(self, session)
                
                self.type = type
                
                self.container = eConsoleAppContainer()
        def __init__(self, session, type):
                Screen.__init__(self, session)
                
                self.type = type
                
                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.onShown.append(self.setWindowTitle)
                
                self.onLayoutFinish.append(self.startRun)
                self.onShown.append(self.setWindowTitle)
                
@@ -83,6 +116,7 @@ class PluginDownloadBrowser(Screen):
                self["list"] = PluginList(self.list)
                self.pluginlist = []
                self.expanded = []
                self["list"] = PluginList(self.list)
                self.pluginlist = []
                self.expanded = []
+               self.installedplugins = []
                
                if self.type == self.DOWNLOAD:
                        self["text"] = Label(_("Downloading plugin information. Please wait..."))
                
                if self.type == self.DOWNLOAD:
                        self["text"] = Label(_("Downloading plugin information. Please wait..."))
@@ -90,7 +124,9 @@ class PluginDownloadBrowser(Screen):
                        self["text"] = Label(_("Getting plugin information. Please wait..."))
                
                self.run = 0
                        self["text"] = Label(_("Getting plugin information. Please wait..."))
                
                self.run = 0
-                               
+
+               self.remainingdata = ""
+
                self["actions"] = ActionMap(["WizardActions"], 
                {
                        "ok": self.go,
                self["actions"] = ActionMap(["WizardActions"], 
                {
                        "ok": self.go,
@@ -98,24 +134,30 @@ class PluginDownloadBrowser(Screen):
                })
                
        def go(self):
                })
                
        def go(self):
-               if type(self["list"].l.getCurrentSelection()[0]) is str: # category
-                       if self["list"].l.getCurrentSelection()[0] in self.expanded:
-                               self.expanded.remove(self["list"].l.getCurrentSelection()[0])
+               sel = self["list"].l.getCurrentSelection()
+
+               if sel is None:
+                       return
+
+               sel = sel[0]
+               if isinstance(sel, str): # category
+                       if sel in self.expanded:
+                               self.expanded.remove(sel)
                        else:
                        else:
-                               self.expanded.append(self["list"].l.getCurrentSelection()[0])
+                               self.expanded.append(sel)
                        self.updateList()
                else:
                        if self.type == self.DOWNLOAD:
                        self.updateList()
                else:
                        if self.type == self.DOWNLOAD:
-                               self.session.openWithCallback(self.runInstall, MessageBox, _("Do you really want to download\nthe plugin \"" + self["list"].l.getCurrentSelection()[0].name + "\"?"))
+                               self.session.openWithCallback(self.runInstall, MessageBox, _("Do you really want to download\nthe plugin \"%s\"?") % sel.name)
                        elif self.type == self.REMOVE:
                        elif self.type == self.REMOVE:
-                               self.session.openWithCallback(self.runInstall, MessageBox, _("Do you really want to REMOVE\nthe plugin \"" + self["list"].l.getCurrentSelection()[0].name + "\"?"))
+                               self.session.openWithCallback(self.runInstall, MessageBox, _("Do you really want to REMOVE\nthe plugin \"%s\"?") % sel.name)
 
        def runInstall(self, val):
                if val:
                        if self.type == self.DOWNLOAD:
 
        def runInstall(self, val):
                if val:
                        if self.type == self.DOWNLOAD:
-                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg install " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
+                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["opkg install " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
                        elif self.type == self.REMOVE:
                        elif self.type == self.REMOVE:
-                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg remove " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
+                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["opkg remove " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
 
        def setWindowTitle(self):
                if self.type == self.DOWNLOAD:
 
        def setWindowTitle(self):
                if self.type == self.DOWNLOAD:
@@ -123,47 +165,81 @@ class PluginDownloadBrowser(Screen):
                elif self.type == self.REMOVE:
                        self.setTitle(_("Remove plugins"))
 
                elif self.type == self.REMOVE:
                        self.setTitle(_("Remove plugins"))
 
+       def startIpkgListInstalled(self):
+               self.container.execute("opkg list_installed enigma2-plugin-*")
+
+       def startIpkgListAvailable(self):
+               self.container.execute("opkg list enigma2-plugin-*")
+
        def startRun(self):
                self["list"].instance.hide()
                if self.type == self.DOWNLOAD:
        def startRun(self):
                self["list"].instance.hide()
                if self.type == self.DOWNLOAD:
-                       self.container.execute("ipkg update")
+                       if not PluginDownloadBrowser.lastDownloadDate or (time() - PluginDownloadBrowser.lastDownloadDate) > 3600:
+                               # Only update from internet once per hour
+                               self.container.execute("opkg update")
+                               PluginDownloadBrowser.lastDownloadDate = time()
+                       else:
+                               self.startIpkgListAvailable()
                elif self.type == self.REMOVE:
                        self.run = 1
                elif self.type == self.REMOVE:
                        self.run = 1
-                       self.container.execute("ipkg list_installed enigma2-plugin-*")
-               
+                       self.startIpkgListInstalled()
+
        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()
                self.close()
-               
+
        def runFinished(self, retval):
        def runFinished(self, retval):
+               self.remainingdata = ""
                if self.run == 0:
                        self.run = 1
                        if self.type == self.DOWNLOAD:
                if self.run == 0:
                        self.run = 1
                        if self.type == self.DOWNLOAD:
-                               self.container.execute("ipkg list enigma2-plugin-*")
+                               self.startIpkgListInstalled()
+               elif self.run == 1 and self.type == self.DOWNLOAD:
+                       self.run = 2
+                       self.startIpkgListAvailable()
                else:
                        if len(self.pluginlist) > 0:
                                self.updateList()
                                self["list"].instance.show()
                        else:
                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'):
-                       plugin = x.split(" - ")
+               #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(" - ", 2)
                        if len(plugin) == 3:
                        if len(plugin) == 3:
-                               plugin.append(plugin[0][15:])
+                               if self.run == 1 and self.type == self.DOWNLOAD:
+                                       if plugin[0] not in self.installedplugins:
+                                               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):
-               self.list = []
-               expandableIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "expandable-plugins.png"))
-               expandedIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "expanded-plugins.png"))
-               verticallineIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "verticalline-plugins.png"))
+               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:
                
                self.plugins = {}
                for x in self.pluginlist:
-                       split = x[3].split('-')
+                       split = x[3].split('-', 1)
                        if len(split) < 2:
                                continue
                        if not self.plugins.has_key(split[0]):
                        if len(split) < 2:
                                continue
                        if not self.plugins.has_key(split[0]):
@@ -173,10 +249,11 @@ class PluginDownloadBrowser(Screen):
                        
                for x in self.plugins.keys():
                        if x in self.expanded:
                        
                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]))
+                               list.append(PluginCategoryComponent(x, expandedIcon))
+                               list.extend([PluginDownloadComponent(plugin[0], plugin[1]) for plugin in self.plugins[x]])
                        else:
                        else:
-                               self.list.append(PluginCategoryComponent(x, expandableIcon))
-               self["list"].l.setList(self.list)
+                               list.append(PluginCategoryComponent(x, expandableIcon))
+               self.list = list
+               self["list"].l.setList(list)
 
 
+language.addCallback(languageChanged)