diff options
| author | acid-burn <acidburn@opendreambox.org> | 2009-07-20 16:07:29 +0200 |
|---|---|---|
| committer | acid-burn <acidburn@opendreambox.org> | 2009-07-20 16:07:29 +0200 |
| commit | a6f7c725e21a4b6ed064e92b453331837d12f267 (patch) | |
| tree | 788942ff0f902609c7e0c1a6b007ff4f33f14571 /lib/python/Plugins/SystemPlugins/SoftwareManager | |
| parent | 6a9a61ab28694cfbc084f04f4b49d97eff62bb7e (diff) | |
| download | enigma2-a6f7c725e21a4b6ed064e92b453331837d12f267.tar.gz enigma2-a6f7c725e21a4b6ed064e92b453331837d12f267.zip | |
some more work on plugin manager
add experimental plugin meta informations, not yet included in build process
install missing py from TuxboxPlugins plugin
remove Filemanger from plugins build process
Diffstat (limited to 'lib/python/Plugins/SystemPlugins/SoftwareManager')
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/install.png | bin | 0 -> 2341 bytes | |||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/installable.png | bin | 2272 -> 2077 bytes | |||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/installed.png | bin | 2225 -> 2114 bytes | |||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am | 3 | ||||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml | 31 | ||||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg | bin | 0 -> 111681 bytes | |||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py | 522 | ||||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/remove.png | bin | 0 -> 2315 bytes | |||
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/upgrade.png | bin | 0 -> 2645 bytes |
9 files changed, 396 insertions, 160 deletions
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/install.png b/lib/python/Plugins/SystemPlugins/SoftwareManager/install.png Binary files differnew file mode 100755 index 00000000..dadd0f3f --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/install.png diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/installable.png b/lib/python/Plugins/SystemPlugins/SoftwareManager/installable.png Binary files differindex 710f4201..6b9a2903 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/installable.png +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/installable.png diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/installed.png b/lib/python/Plugins/SystemPlugins/SoftwareManager/installed.png Binary files differindex d6a1bc10..e0b663a6 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/installed.png +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/installed.png diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am new file mode 100755 index 00000000..bf1d3491 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am @@ -0,0 +1,3 @@ +installdir = $(LIBDIR)/enigma2/python/Plugins/meta/ + +install_DATA = plugin_softwaremanager.xml *.jpg diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml new file mode 100755 index 00000000..fa84670e --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml @@ -0,0 +1,31 @@ +<default> + <prerequisites> + <tag type="Software" /> + <tag type="System" /> + </prerequisites> + <info language="en"> + <author>Dream Multimedia</author> + <name>SoftwareManager</name> + <packagename>enigma2-plugin-systemplugins-softwaremanager</packagename> + <shortdescription>SoftwareManager manages your Dreambox software.</shortdescription> + <description>The SoftwareManager manages your Dreambox software.\n + It's easy to update your receiver's software, install or remove extensions or even backup and restore your system settings. + </description> + <screenshot src="http://www.dreamboxupdate.com/preview/softmanager.jpg" /> + </info> + <info language="de"> + <author>Dream Multimedia</author> + <name>SoftwareManager</name> + <packagename>enigma2-plugin-systemplugins-softwaremanager</packagename> + <shortdescription>Der SoftwareManager verwaltet Ihre Dreambox Software.</shortdescription> + <description>Der SoftwareManager verwaltet Ihre Dreambox Software.\n + Sie können nun einfach Ihre Dreambox-Software aktualisieren, neue Erweiterungen installieren oder entfernen, + oder ihre Einstellungen sichern und wiederherstellen. + </description> + <screenshot src="http://www.dreamboxupdate.com/preview/softmanager.jpg" /> + </info> + <files type="package"> <!-- without version, without .ipk --> + <file type="package" name="enigma2-plugin-systemplugins-softwaremanager" /> + </files> + +</default> diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg Binary files differnew file mode 100755 index 00000000..a9d5a629 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py index 20b3bf4c..136e9d0b 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py @@ -326,7 +326,6 @@ class IPKGSource(Screen): desk = getDesktop(0) x= int(desk.size().width()) y= int(desk.size().height()) - #print "[IPKGSource] mainscreen: current desktop size: %dx%d" % (x,y) self["closetext"] = Label(_("Cancel")) self["edittext"] = Label(_("Save")) @@ -397,7 +396,6 @@ class IPKGSource(Screen): self["text"].deleteBackward() def keyNumberGlobal(self, number): - print "pressed", number self["text"].number(number) @@ -480,11 +478,11 @@ class PacketManager(Screen): self.statuslist = [] divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) if status == 'update': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng )) self['list'].setList(self.statuslist) elif status == 'error': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png")) + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng )) self['list'].setList(self.statuslist) @@ -654,21 +652,20 @@ class PluginManager(Screen, DreamInfoHandler): lastDownloadDate = None skin = """ - <screen position="80,90" size="560,420" title="Plugin manager..." > - <widget source="list" render="Listbox" position="5,10" size="550,365" scrollbarMode="showOnDemand"> + <screen position="80,80" size="560,440" title="Plugin manager..." > + <widget source="list" render="Listbox" position="5,5" size="550,360" scrollbarMode="showOnDemand"> <convert type="TemplatedMultiContent"> {"templates": - {"default": (52,[ - MultiContentEntryText(pos = (30, 1), size = (500, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name - MultiContentEntryText(pos = (30, 26), size = (500, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description - MultiContentEntryPixmapAlphaTest(pos = (480, 2), size = (48, 48), png = 5), # index 5 is the status pixmap - MultiContentEntryPixmapAlphaTest(pos = (0, 50), size = (550, 2), png = 6), # index 6 is the div pixmap - MultiContentEntryPixmapAlphaTest(pos = (0, 10), size = (25, 25), png = 7), # index 7 is the selected pixmap + {"default": (51,[ + MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (30, 25), size = (470, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description + MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap + MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap ]), - "category": (42,[ - MultiContentEntryText(pos = (30, 0), size = (500, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name - MultiContentEntryText(pos = (30, 26), size = (500, 14), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 2 is the description - MultiContentEntryPixmapAlphaTest(pos = (0, 40), size = (550, 2), png = 3), # index 6 is the div pixmap + "category": (40,[ + MultiContentEntryText(pos = (30, 0), size = (500, 23), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (30, 24), size = (500, 14), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description + MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap ]) }, "fonts": [gFont("Regular", 22),gFont("Regular", 14)], @@ -676,15 +673,15 @@ class PluginManager(Screen, DreamInfoHandler): } </convert> </widget> - <ePixmap pixmap="skin_default/buttons/red.png" position="0,380" zPosition="2" size="140,40" transparent="1" alphatest="on" /> - <widget name="closetext" position="0,380" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> - <ePixmap pixmap="skin_default/buttons/green.png" position="140,380" zPosition="2" size="140,40" transparent="1" alphatest="on" /> - <widget name="installtext" position="140,380" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> - <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,380" zPosition="2" size="140,40" transparent="1" alphatest="on" /> - <widget name="selecttext" position="280,380" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> - <ePixmap pixmap="skin_default/buttons/blue.png" position="420,380" zPosition="2" size="140,40" transparent="1" alphatest="on" /> - <widget name="viewtext" position="420,380" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> - + <ePixmap pixmap="skin_default/buttons/red.png" position="0,370" zPosition="2" size="140,40" transparent="1" alphatest="on" /> + <widget name="closetext" position="0,370" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + <ePixmap pixmap="skin_default/buttons/green.png" position="140,370" zPosition="2" size="140,40" transparent="1" alphatest="on" /> + <widget name="installtext" position="140,370" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,370" zPosition="2" size="140,40" transparent="1" alphatest="on" /> + <widget name="viewtext" position="280,370" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + <ePixmap pixmap="skin_default/buttons/blue.png" position="420,370" zPosition="2" size="140,40" transparent="1" alphatest="on" /> + <widget name="bluetext" position="420,370" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + <widget name="status" position="10,410" zPosition="10" size="540,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> </screen>""" def __init__(self, session, plugin_path, args = None): @@ -701,14 +698,15 @@ class PluginManager(Screen, DreamInfoHandler): DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language) self.directory = resolveFilename(SCOPE_METADIR) - self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "HelpActions" ], { - "ok": self.go, + "ok": self.handleCurrent, "back": self.exit, "red": self.exit, - "green": self.installPlugins, - "yellow": self.changeSelectionState, - "blue": self.go, + "green": self.handleCurrent, + "yellow": self.handleSelected, + "showEventInfo": self.handleSelected, + "displayHelp": self.handleHelp, }, -1) self.list = [] @@ -718,12 +716,15 @@ class PluginManager(Screen, DreamInfoHandler): self["list"] = List(self.list) self["closetext"] = Label(_("Close")) self["installtext"] = Label() - self["selecttext"] = Label() self["viewtext"] = Label() + self["bluetext"] = Label() + self["status"] = Label() self.list_updating = True self.packetlist = [] self.installed_packetlist = {} + self.available_packetlist = [] + self.available_updates = 0 self.Console = Console() self.cmdList = [] self.oktext = _("\nAfter pressing OK, please wait!") @@ -735,10 +736,12 @@ class PluginManager(Screen, DreamInfoHandler): self["list"].onSelectionChanged.append(self.selectionChanged) self["installtext"].hide() - self["selecttext"].hide() + self["bluetext"].hide() self["viewtext"].hide() + self["status"].hide() self.currList = "" self.currentSelectedTag = None + self.currentSelectedIndex = None self.onShown.append(self.setWindowTitle) self.onLayoutFinish.append(self.rebuildList) @@ -752,40 +755,54 @@ class PluginManager(Screen, DreamInfoHandler): self.currentSelectedTag = None self["list"].style = "category" self['list'].setList(self.categoryList) + self["list"].setIndex(self.currentSelectedIndex) + self["list"].updateList(self.categoryList) + self.selectionChanged() else: self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) - self.close() + if len(self.cmdList) and len(self.selectedFiles): + self.session.openWithCallback(self.runInstall, PluginManagerInfo, self.skin_path, self.cmdList) + elif not len(self.cmdList) and self.available_updates > 0: + self.cmdList = [] + self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False })) + self.session.openWithCallback(self.runInstall, PluginManagerInfo, self.skin_path, self.cmdList) + else: + self.close() - def reload(self): - if (os_path.exists(self.cache_file) == True): - remove(self.cache_file) - self.list_updating = True - self.rebuildList() + def handleHelp(self): + if self.currList != "status": + self.session.open(PluginManagerHelp, self.skin_path) + + def runInstall(self, result): + if result: + self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList) + else: + self.close() def setState(self,status = None): if status: self.currList = "status" self.statuslist = [] self["installtext"].hide() - self["selecttext"].hide() + self["bluetext"].hide() self["viewtext"].hide() divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) if status == 'update': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'', '', statuspng, divpng, None, '' )) self["list"].style = "default" self['list'].setList(self.statuslist) elif status == 'sync': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' )) self["list"].style = "default" self['list'].setList(self.statuslist) elif status == 'error': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png")) + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' )) self["list"].style = "default" self['list'].setList(self.statuslist) @@ -795,63 +812,49 @@ class PluginManager(Screen, DreamInfoHandler): def selectionChanged(self): current = self["list"].getCurrent() + self["status"].hide() if current: if self.currList == "packages": self["closetext"].setText(_("Back")) - self["closetext"].show() - self["installtext"].setText(_("Install/\nRemove")) + if current[4] == 'installed': + self["installtext"].setText(_("Remove")) + elif current[4] == 'installable': + self["installtext"].setText(_("Install")) + elif current[4] == 'remove': + self["installtext"].setText(_("Undo\nRemove")) + elif current[4] == 'install': + self["installtext"].setText(_("Undo\nInstall")) self["installtext"].show() - self["viewtext"].setText(_("Details")) + self["viewtext"].setText(_("View details")) self["viewtext"].show() - if current[8] == False: - self["selecttext"].setText(_("Select")) - else: - self["selecttext"].setText(_("Deselect")) - self["selecttext"].show() + self["bluetext"].hide() + if len(self.selectedFiles) == 0 and self.available_updates is not 0: + self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available.")) + self["status"].show() + elif len(self.selectedFiles) is not 0: + self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected.")) + self["status"].show() elif self.currList == "category": self["closetext"].setText(_("Close")) - self["closetext"].show() self["installtext"].hide() - self["selecttext"].hide() - self["viewtext"].setText(_("View")) - self["viewtext"].show() - - def changeSelectionState(self): - current = self["list"].getCurrent() - if current: - if current[8] is not '': - idx = self["list"].getIndex() - count = 0 - newList = [] - for x in self.list: - detailsFile = x[1] - if idx == count: - if x[8] == True: - SelectState = False - for entry in self.selectedFiles: - if entry[0] == detailsFile: - self.selectedFiles.remove(entry) - else: - SelectState = True - alreadyinList = False - for entry in self.selectedFiles: - if entry[0] == detailsFile: - alreadyinList = True - if not alreadyinList: - self.selectedFiles.append((detailsFile,x[4],x[3])) - newList.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), x[4].strip(), selected = SelectState)) - else: - newList.append(x) - count += 1 - old_index = self["list"].index - self.list = newList - self["list"].disable_callbacks = True - self["list"].list = self.list - self["list"].disable_callbacks = False - self["list"].setList(self.list) - self["list"].setIndex(old_index) - self["list"].updateList(self.list) - self.selectionChanged() + self["bluetext"].hide() + if len(self.selectedFiles) == 0 and self.available_updates is not 0: + self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available.")) + self["status"].show() + self["viewtext"].setText(_("Update")) + self["viewtext"].show() + elif len(self.selectedFiles) is not 0: + self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected.")) + self["status"].show() + self["viewtext"].setText(_("Process")) + self["viewtext"].show() + self["closetext"].show() + + def getSelectionState(self, detailsFile): + for entry in self.selectedFiles: + if entry[0] == detailsFile: + return True + return False def rebuildList(self): self.setState('update') @@ -862,22 +865,38 @@ class PluginManager(Screen, DreamInfoHandler): self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) else: print "last update time < 1h" - self.startInstallMetaPackage() + self.startIpkgList() def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False self.setState('error') elif event == IpkgComponent.EVENT_DONE: - self.startInstallMetaPackage() + self.startIpkgList() pass + def startIpkgList(self): + if self.list_updating: + if not self.Console: + self.Console = Console() + cmd = "ipkg list" + self.Console.ePopen(cmd, self.IpkgList_Finished) + + def IpkgList_Finished(self, result, retval, extra_args = None): + if len(result): + self.available_packetlist = [] + for x in result.splitlines(): + split = x.split(' - ') + if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions): + self.available_packetlist.append([split[0].strip(), split[1].strip(), split[2].strip()]) + self.startInstallMetaPackage() + def startInstallMetaPackage(self): if self.list_updating: self.list_updating = False if not self.Console: self.Console = Console() - cmd = "ipkg list" ### will change into "ipkg install enigma2-plugins-meta" + cmd = "ipkg install enigma2-meta" #dummy,will change probably" self.Console.ePopen(cmd, self.InstallMetaPackage_Finished) def InstallMetaPackage_Finished(self, result, retval, extra_args = None): @@ -896,26 +915,71 @@ class PluginManager(Screen, DreamInfoHandler): split = x.split(' - ') if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions): self.installed_packetlist[split[0].strip()] = split[1].strip() + self.countUpdates() if self.currentSelectedTag is None: self.buildCategoryList() else: self.buildPacketList(self.currentSelectedTag) - def go(self, returnValue = None): + def countUpdates(self): + self.available_updates = 0 + for package in self.packagesIndexlist[:]: + attributes = package[0]["attributes"] + packagename = attributes["packagename"] + for x in self.available_packetlist: + if x[0].strip() == packagename: + if self.installed_packetlist.has_key(packagename): + if self.installed_packetlist[packagename] != x[1].strip(): + self.available_updates +=1 + + def handleCurrent(self): current = self["list"].getCurrent() if current: if self.currList == "category": + self.currentSelectedIndex = self["list"].index selectedTag = current[2] self.buildPacketList(selectedTag) elif self.currList == "packages": - #self.installPlugins() - #uncomment the above line and comment the bottom lines to have install functionality on OK - if current[8] is not '': + if current[7] is not '': + idx = self["list"].getIndex() + detailsFile = self.list[idx][1] + if self.list[idx][7] == True: + for entry in self.selectedFiles: + if entry[0] == detailsFile: + self.selectedFiles.remove(entry) + else: + alreadyinList = False + for entry in self.selectedFiles: + if entry[0] == detailsFile: + alreadyinList = True + if not alreadyinList: + self.selectedFiles.append((detailsFile,current[4],current[3])) + if current[4] == 'installed': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'remove', True) + elif current[4] == 'installable': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'install', True) + elif current[4] == 'remove': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installed', False) + elif current[4] == 'install': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installable',False) + self["list"].setList(self.list) + self["list"].setIndex(idx) + self["list"].updateList(self.list) + self.selectionChanged() + + def handleSelected(self): + current = self["list"].getCurrent() + if current: + if self.currList == "packages": + if current[7] is not '': detailsfile = self.directory[0] + "/" + current[1] if (os_path.exists(detailsfile) == True): self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current) else: self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO) + elif self.currList == "category": + self.installPlugins() + def detailsClosed(self, result): if result: if not self.Console: @@ -928,44 +992,52 @@ class PluginManager(Screen, DreamInfoHandler): def buildEntryComponent(self, name, details, description, packagename, state, selected = False): divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) - if selected is False: - selectedicon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_off.png")) - else: - selectedicon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png")) - if state == 'installed': installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png")) - return((name, details, description, packagename, state, installedpng, divpng, selectedicon, selected)) - else: + return((name, details, description, packagename, state, installedpng, divpng, selected)) + elif state == 'installable': installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) - return((name, details, description, packagename, state, installablepng, divpng, selectedicon, selected)) + return((name, details, description, packagename, state, installablepng, divpng, selected)) + elif state == 'remove': + removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) + return((name, details, description, packagename, state, removepng, divpng, selected)) + elif state == 'install': + installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png")) + return((name, details, description, packagename, state, installpng, divpng, selected)) def buildPacketList(self, categorytag = None): if categorytag is not None: self.currList = "packages" self.currentSelectedTag = categorytag - #print self.packagesIndexlist self.packetlist = [] for package in self.packagesIndexlist[:]: - #print "package--->",package prerequisites = package[0]["prerequisites"] - #print "prerequisite",prerequisites if prerequisites.has_key("tag"): for foundtag in prerequisites["tag"]: if categorytag == foundtag: attributes = package[0]["attributes"] - #print "attributes---->",attributes - self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]]) + if attributes.has_key("packagetype"): + if attributes["packagetype"] == "internal": + continue + self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]]) + else: + self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]]) self.list = [] - #print "self.packetlist---->",self.packetlist for x in self.packetlist: status = "" + selectState = self.getSelectionState(x[1].strip()) if self.installed_packetlist.has_key(x[3].strip()): - status = "installed" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = False)) + if selectState == True: + status = "remove" + else: + status = "installed" + self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState)) else: - status = "installable" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = False)) + if selectState == True: + status = "install" + else: + status = "installable" + self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState)) if len(self.list): self.list.sort(key=lambda x: x[0]) self["list"].style = "default" @@ -975,16 +1047,13 @@ class PluginManager(Screen, DreamInfoHandler): def buildCategoryList(self): self.currList = "category" - #print self.packagesIndexlist self.categories = [] self.categoryList = [] for package in self.packagesIndexlist[:]: - #print "package--->",package prerequisites = package[0]["prerequisites"] - #print "prerequisite",prerequisites if prerequisites.has_key("tag"): for foundtag in prerequisites["tag"]: - #print "found tag----",foundtag + attributes = package[0]["attributes"] if foundtag not in self.categories: self.categories.append(foundtag) self.categoryList.append(self.buildCategoryComponent(foundtag)) @@ -1026,12 +1095,12 @@ class PluginManager(Screen, DreamInfoHandler): def installPlugins(self): self.cmdList = [] + if self.available_updates > 0: + self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False })) if self.selectedFiles and len(self.selectedFiles): for plugin in self.selectedFiles: - #print "processing Plugin-->",plugin detailsfile = self.directory[0] + "/" + plugin[0] if (os_path.exists(detailsfile) == True): - #print "plugin[1]-->",plugin[1] self.fillPackageDetails(plugin[0]) self.package = self.packageDetails[0] if self.package[0].has_key("attributes"): @@ -1041,53 +1110,22 @@ class PluginManager(Screen, DreamInfoHandler): if plugin[1] == 'installed': if self.packagefiles: for package in self.packagefiles[:]: - #print "removing package: ",package["name"] self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] })) + else: + self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] })) else: if self.packagefiles: for package in self.packagefiles[:]: - #print "adding package: ",package["name"] self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] })) + else: + self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] })) else: if plugin[1] == 'installed': - #print "removing package: ",plugin[2] self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] })) else: - #print "adding package: ",plugin[2] self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] })) - else: - current = self["list"].getCurrent() - if current: - if current[8] is not '': - #print "current[4]-->",current[4] - detailsfile = self.directory[0] + "/" + current[1] - if (os_path.exists(detailsfile) == True): - self.fillPackageDetails(current[1]) - self.package = self.packageDetails[0] - if self.package[0].has_key("attributes"): - self.attributes = self.package[0]["attributes"] - if self.attributes.has_key("package"): - self.packagefiles = self.attributes["package"] - if current[4] == 'installed': - if self.packagefiles: - for package in self.packagefiles[:]: - #print "removing package: ",package["name"] - self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] })) - else: - if self.packagefiles: - for package in self.packagefiles[:]: - #print "adding package: ",package["name"] - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] })) - else: - if current[4] == 'installed': - #print "removing package: ",current[0] - self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": current[3] })) - else: - #print "adding package: ",current[0] - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": current[3] })) if len(self.cmdList): - print self.cmdList - self.session.openWithCallback(self.runExecute, MessageBox, _("Do you want to continue installing or removing selected plugins?\n") + self.oktext) + self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList) def runExecute(self, result): if result: @@ -1109,6 +1147,172 @@ class PluginManager(Screen, DreamInfoHandler): plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) +class PluginManagerInfo(Screen): + skin = """ + <screen position="80,80" size="560,450" title="Plugin manager job information..." > + <widget name="status" position="5,5" zPosition="10" size="540,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + <ePixmap pixmap="skin_default/div-h.png" position="0,35" zPosition="10" size="550,2" transparent="1" alphatest="on" /> + <widget source="list" render="Listbox" position="5,45" size="550,360" scrollbarMode="showOnDemand" selectionDisabled="1"> + <convert type="TemplatedMultiContent"> + {"template": [ + MultiContentEntryText(pos = (50, 1), size = (150, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state + MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap + MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap + ], + "fonts": [gFont("Regular", 22),gFont("Regular", 18)], + "itemHeight": 52 + } + </convert> + </widget> + <ePixmap pixmap="skin_default/buttons/red.png" position="0,410" zPosition="2" size="140,40" transparent="1" alphatest="on" /> + <widget name="closetext" position="0,410" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + <ePixmap pixmap="skin_default/buttons/green.png" position="140,410" zPosition="2" size="140,40" transparent="1" alphatest="on" /> + <widget name="continuetext" position="140,410" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + </screen>""" + + def __init__(self, session, plugin_path, cmdlist = None): + Screen.__init__(self, session) + self.session = session + self.skin_path = plugin_path + self.cmdlist = cmdlist + + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + { + "ok": self.process, + "back": self.exit, + "red": self.exit, + "green": self.process, + }, -1) + + self.list = [] + self["list"] = List(self.list) + self["closetext"] = Label(_("Cancel")) + self["continuetext"] = Label(_("Continue")) + self["status"] = Label(_("Following tasks will be done after you press continue.")) + + self.onShown.append(self.setWindowTitle) + self.onLayoutFinish.append(self.rebuildList) + + def setWindowTitle(self): + self.setTitle(_("Plugin manager process information...")) + + def rebuildList(self): + self.list = [] + if self.cmdlist is not None: + for entry in self.cmdlist: + cmd = entry[0] + if cmd == 0: + action = 'install' + elif cmd == 2: + action = 'remove' + else: + action = 'upgrade' + + args = entry[1] + if cmd == 0: + info = args['package'] + elif cmd == 2: + info = args['package'] + else: + info = _("Dreambox software because updates are available.") + + self.list.append(self.buildEntryComponent(action,info)) + self['list'].setList(self.list) + self['list'].updateList(self.list) + + def buildEntryComponent(self, action,info): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) + upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) + installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png")) + removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) + if action == 'install': + return(( _('Installing'), info, installpng, divpng)) + elif action == 'remove': + return(( _('Remove'), info, removepng, divpng)) + else: + return(( _('Upgrade'), info, upgradepng, divpng)) + + def exit(self): + self.close(False) + + def process(self): + self.close(True) + + +class PluginManagerHelp(Screen): + skin = """ + <screen position="80,80" size="560,450" title="Plugin manager help..." > + <widget name="status" position="5,5" zPosition="10" size="540,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + <ePixmap pixmap="skin_default/div-h.png" position="0,35" zPosition="10" size="550,2" transparent="1" alphatest="on" /> + <widget source="list" render="Listbox" position="5,45" size="550,360" scrollbarMode="showOnDemand" selectionDisabled="1"> + <convert type="TemplatedMultiContent"> + {"template": [ + MultiContentEntryText(pos = (50, 1), size = (540, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state + MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap + MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap + ], + "fonts": [gFont("Regular", 22),gFont("Regular", 18)], + "itemHeight": 52 + } + </convert> + </widget> + <ePixmap pixmap="skin_default/buttons/red.png" position="0,410" zPosition="2" size="140,40" transparent="1" alphatest="on" /> + <widget name="closetext" position="0,410" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> + </screen>""" + + def __init__(self, session, plugin_path): + Screen.__init__(self, session) + self.session = session + self.skin_path = plugin_path + + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + { + "back": self.exit, + "red": self.exit, + }, -1) + + self.list = [] + self["list"] = List(self.list) + self["closetext"] = Label(_("Close")) + self["status"] = Label(_("Here is a small overview of the available icon states.")) + + self.onShown.append(self.setWindowTitle) + self.onLayoutFinish.append(self.rebuildList) + + def setWindowTitle(self): + self.setTitle(_("Plugin manager help...")) + + def rebuildList(self): + self.list = [] + self.list.append(self.buildEntryComponent('install')) + self.list.append(self.buildEntryComponent('installable')) + self.list.append(self.buildEntryComponent('installed')) + self.list.append(self.buildEntryComponent('remove')) + self['list'].setList(self.list) + self['list'].updateList(self.list) + + def buildEntryComponent(self, state): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) + installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png")) + installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) + removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) + installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png")) + + if state == 'installed': + return(( _('This plugin is installed.'), _('You can remove this plugin.'), installedpng, divpng)) + elif state == 'installable': + return(( _('This plugin is not installed.'), _('You can install this plugin.'), installablepng, divpng)) + elif state == 'install': + return(( _('This plugin will be installed.'), _('You can cancel the installation.'), installpng, divpng)) + elif state == 'remove': + return(( _('This plugin will be removed.'), _('You can cancel the removal.'), removepng, divpng)) + + def exit(self): + self.close() + + class PluginDetails(Screen, DreamInfoHandler): skin = """ <screen name="PluginDetails" position="60,90" size="600,420" title="PluginDetails..." > @@ -1267,14 +1471,12 @@ class PluginDetails(Screen, DreamInfoHandler): if self.pluginstate == 'installed': if self.packagefiles: for package in self.packagefiles[:]: - #print "removing packagefile: ",package["name"] self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] })) if len(self.cmdList): self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + self.pluginname + "\n" + self.oktext) else: if self.packagefiles: for package in self.packagefiles[:]: - #print "adding packagefile: ",package["name"] self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] })) if len(self.cmdList): self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + self.pluginname + "\n" + self.oktext) diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/remove.png b/lib/python/Plugins/SystemPlugins/SoftwareManager/remove.png Binary files differnew file mode 100755 index 00000000..396316f7 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/remove.png diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/upgrade.png b/lib/python/Plugins/SystemPlugins/SoftwareManager/upgrade.png Binary files differnew file mode 100755 index 00000000..6da6e379 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/upgrade.png |
