+ elif (currentEntry == "ipkg-source"):
+ self.session.open(IPKGMenu, self.skin_path)
+ elif (currentEntry == "advanced-plugin"):
+ self.extended = current[3]
+ self.extended(self.session, None)
+
+ def backupfiles_choosen(self, ret):
+ self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
+ config.plugins.configurationbackup.backupdirs.save()
+ config.plugins.configurationbackup.save()
+ config.save()
+
+ def backuplocation_choosen(self, option):
+ oldpath = config.plugins.configurationbackup.backuplocation.getValue()
+ if option is not None:
+ config.plugins.configurationbackup.backuplocation.value = str(option[1])
+ config.plugins.configurationbackup.backuplocation.save()
+ config.plugins.configurationbackup.save()
+ config.save()
+ newpath = config.plugins.configurationbackup.backuplocation.getValue()
+ if newpath != oldpath:
+ self.createBackupfolders()
+
+ def runUpgrade(self, result):
+ if result:
+ self.session.open(UpdatePlugin, self.skin_path)
+
+ def createBackupfolders(self):
+ print "Creating backup folder if not already there..."
+ self.backuppath = getBackupPath()
+ try:
+ if (os_path.exists(self.backuppath) == False):
+ makedirs(self.backuppath)
+ except OSError:
+ self.session.open(MessageBox, _("Sorry, your backup destination is not writeable.\n\nPlease choose another one."), MessageBox.TYPE_INFO, timeout = 10)
+
+ def backupDone(self,retval = None):
+ if retval is True:
+ self.session.open(MessageBox, _("Backup done."), MessageBox.TYPE_INFO, timeout = 10)
+ else:
+ self.session.open(MessageBox, _("Backup failed."), MessageBox.TYPE_INFO, timeout = 10)
+
+ def startRestore(self, ret = False):
+ if (ret == True):
+ self.exe = True
+ self.session.open(RestoreScreen, runRestore = True)
+
+class SoftwareManagerSetup(Screen, ConfigListScreen):
+
+ skin = """
+ <screen name="SoftwareManagerSetup" position="center,center" size="560,440" title="SoftwareManager setup">
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+ <widget name="config" position="5,50" size="550,350" scrollbarMode="showOnDemand" />
+ <ePixmap pixmap="skin_default/div-h.png" position="0,400" zPosition="1" size="560,2" />
+ <widget source="introduction" render="Label" position="5,410" size="550,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+ </screen>"""
+
+ def __init__(self, session, skin_path = None):
+ Screen.__init__(self, session)
+ self.session = session
+ self.skin_path = skin_path
+ if self.skin_path == None:
+ self.skin_path = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager")
+
+ self.onChangedEntry = [ ]
+ self.setup_title = _("Software manager setup")
+ self.overwriteConfigfilesEntry = None
+
+ self.list = [ ]
+ ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changedEntry)
+
+ self["actions"] = ActionMap(["SetupActions"],
+ {
+ "cancel": self.keyCancel,
+ "save": self.apply,
+ }, -2)
+
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("OK"))
+ self["key_yellow"] = StaticText()
+ self["key_blue"] = StaticText()
+ self["introduction"] = StaticText()
+
+ self.createSetup()
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ def layoutFinished(self):
+ self.setTitle(self.setup_title)
+
+ def createSetup(self):
+ self.list = [ ]
+ self.overwriteConfigfilesEntry = getConfigListEntry(_("Overwrite configuration files ?"), config.plugins.softwaremanager.overwriteConfigFiles)
+ self.list.append(self.overwriteConfigfilesEntry)
+ self["config"].list = self.list
+ self["config"].l.setSeperation(400)
+ self["config"].l.setList(self.list)
+ if not self.selectionChanged in self["config"].onSelectionChanged:
+ self["config"].onSelectionChanged.append(self.selectionChanged)
+ self.selectionChanged()
+
+ def selectionChanged(self):
+ if self["config"].getCurrent() == self.overwriteConfigfilesEntry:
+ self["introduction"].setText(_("Overwrite configuration files during software upgrade?"))
+ else:
+ self["introduction"].setText("")
+
+ def newConfig(self):
+ pass
+
+ def keyLeft(self):
+ ConfigListScreen.keyLeft(self)
+
+ def keyRight(self):
+ ConfigListScreen.keyRight(self)
+
+ def confirm(self, confirmed):
+ if not confirmed:
+ print "not confirmed"
+ return
+ else:
+ self.keySave()
+
+ def apply(self):
+ self.session.openWithCallback(self.confirm, MessageBox, _("Use this settings?"), MessageBox.TYPE_YESNO, timeout = 20, default = True)
+
+ def cancelConfirm(self, result):
+ if not result:
+ return
+ for x in self["config"].list:
+ x[1].cancel()
+ self.close()
+
+ def keyCancel(self):
+ if self["config"].isChanged():
+ self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?"), MessageBox.TYPE_YESNO, timeout = 20, default = True)
+ else:
+ self.close()
+
+ # for summary:
+ def changedEntry(self):
+ for x in self.onChangedEntry:
+ x()
+ self.selectionChanged()
+
+ def getCurrentEntry(self):
+ return self["config"].getCurrent()[0]
+
+ def getCurrentValue(self):
+ return str(self["config"].getCurrent()[1].value)
+
+ def createSummary(self):
+ from Screens.Setup import SetupSummary
+ return SetupSummary
+
+
+class SoftwareManagerInfo(Screen):
+ skin = """
+ <screen name="SoftwareManagerInfo" position="center,center" size="560,440" title="SoftwareManager information">
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+ <widget source="list" render="Listbox" position="5,50" size="550,340" scrollbarMode="showOnDemand" selectionDisabled="0">
+ <convert type="TemplatedMultiContent">
+ {"template": [
+ MultiContentEntryText(pos = (5, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT | RT_HALIGN_CENTER, text = 0), # index 0 is the name
+ ],
+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+ "itemHeight": 26
+ }
+ </convert>
+ </widget>
+ <ePixmap pixmap="skin_default/div-h.png" position="0,400" zPosition="1" size="560,2" />
+ <widget source="introduction" render="Label" position="5,410" size="550,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+ </screen>"""
+
+ def __init__(self, session, skin_path = None, mode = None):
+ Screen.__init__(self, session)
+ self.session = session
+ self.mode = mode
+ self.skin_path = skin_path
+ if self.skin_path == None:
+ self.skin_path = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager")
+
+ self["actions"] = ActionMap(["ShortcutActions", "WizardActions"],
+ {
+ "back": self.close,
+ "red": self.close,
+ }, -2)
+
+ self.list = []
+ self["list"] = List(self.list)
+
+ self["key_red"] = StaticText(_("Close"))
+ self["key_green"] = StaticText()
+ self["key_yellow"] = StaticText()
+ self["key_blue"] = StaticText()
+ self["introduction"] = StaticText()
+
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ def layoutFinished(self):
+ self.setTitle(_("Softwaremanager information"))
+ if self.mode is not None:
+ self.showInfos()
+
+ def showInfos(self):
+ if self.mode == "backupinfo":
+ self.list = []
+ backupfiles = config.plugins.configurationbackup.backupdirs.value
+ for entry in backupfiles:
+ self.list.append((entry,))
+ self['list'].setList(self.list)
+
+
+class PluginManager(Screen, DreamInfoHandler):
+
+ skin = """
+ <screen name="PluginManager" position="center,center" size="560,440" title="Extensions management" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+ <widget source="list" render="Listbox" position="5,50" size="550,360" scrollbarMode="showOnDemand">
+ <convert type="TemplatedMultiContent">
+ {"templates":
+ {"default": (51,[
+ MultiContentEntryText(pos = (0, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (0, 25), size = (470, 24), 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": (40,[
+ MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (30, 22), size = (500, 16), font=2, 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", 20),gFont("Regular", 16)],
+ "itemHeight": 52
+ }
+ </convert>
+ </widget>
+ <widget source="status" render="Label" position="5,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 = None, args = None):
+ Screen.__init__(self, session)
+ self.session = session
+ self.skin_path = plugin_path
+ if self.skin_path == None:
+ self.skin_path = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager")
+
+ self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "HelpActions" ],
+ {
+ "ok": self.handleCurrent,
+ "back": self.exit,
+ "red": self.exit,
+ "green": self.handleCurrent,
+ "yellow": self.handleSelected,
+ "showEventInfo": self.handleSelected,
+ "displayHelp": self.handleHelp,
+ }, -1)
+
+ self.list = []
+ self.statuslist = []
+ self.selectedFiles = []
+ self.categoryList = []
+ self.packetlist = []
+ self["list"] = List(self.list)
+ self["key_red"] = StaticText(_("Close"))
+ self["key_green"] = StaticText("")
+ self["key_yellow"] = StaticText("")
+ self["key_blue"] = StaticText("")
+ self["status"] = StaticText("")
+
+ self.cmdList = []
+ self.oktext = _("\nAfter pressing OK, please wait!")
+ if not self.selectionChanged in self["list"].onSelectionChanged:
+ self["list"].onSelectionChanged.append(self.selectionChanged)
+
+ self.currList = ""
+ self.currentSelectedTag = None
+ self.currentSelectedIndex = None
+ self.currentSelectedPackage = None
+ self.saved_currentSelectedPackage = None
+ self.restartRequired = False
+
+ self.onShown.append(self.setWindowTitle)
+ self.onLayoutFinish.append(self.getUpdateInfos)
+
+ def setWindowTitle(self):
+ self.setTitle(_("Extensions management"))
+
+ def exit(self):
+ if self.currList == "packages":
+ self.currList = "category"
+ 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:
+ iSoftwareTools.cleanupSoftwareTools()
+ self.prepareInstall()
+ if len(self.cmdList):
+ self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
+ else:
+ self.close()
+
+ def handleHelp(self):
+ if self.currList != "status":
+ self.session.open(PluginManagerHelp, self.skin_path)
+
+ def setState(self,status = None):
+ if status:
+ self.currList = "status"
+ self.statuslist = []
+ self["key_green"].setText("")
+ self["key_blue"].setText("")
+ self["key_yellow"].setText("")
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ if status == 'update':
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+ self.statuslist.append(( _("Updating software catalog"), '', _("Searching for available updates. Please wait..." ),'', '', statuspng, divpng, None, '' ))
+ elif status == 'sync':
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+ self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' ))
+ elif status == 'error':
+ self["key_green"].setText(_("Continue"))
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "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)
+
+
+ def getUpdateInfos(self):
+ if (iSoftwareTools.lastDownloadDate is not None and iSoftwareTools.NetworkConnectionAvailable is False):
+ self.rebuildList()
+ else:
+ self.setState('update')
+ iSoftwareTools.startSoftwareTools(self.getUpdateInfosCB)
+
+ def getUpdateInfosCB(self, retval = None):
+ if retval is not None:
+ if retval is True:
+ if iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+ else:
+ self["status"].setText(_("There are no updates available."))
+ self.rebuildList()
+ elif retval is False:
+ if iSoftwareTools.lastDownloadDate is None:
+ self.setState('error')
+ if iSoftwareTools.NetworkConnectionAvailable:
+ self["status"].setText(_("Updatefeed not available."))
+ else:
+ self["status"].setText(_("No network connection available."))
+ else:
+ iSoftwareTools.lastDownloadDate = time()
+ iSoftwareTools.list_updating = True
+ self.setState('update')
+ iSoftwareTools.getUpdates(self.getUpdateInfosCB)
+
+ def rebuildList(self, retval = None):
+ if self.currentSelectedTag is None:
+ self.buildCategoryList()
+ else:
+ self.buildPacketList(self.currentSelectedTag)
+
+ def selectionChanged(self):
+ current = self["list"].getCurrent()
+ self["status"].setText("")
+ if current:
+ if self.currList == "packages":
+ self["key_red"].setText(_("Back"))
+ if current[4] == 'installed':
+ self["key_green"].setText(_("Uninstall"))
+ elif current[4] == 'installable':
+ self["key_green"].setText(_("Install"))
+ if iSoftwareTools.NetworkConnectionAvailable is False:
+ self["key_green"].setText("")
+ elif current[4] == 'remove':
+ self["key_green"].setText(_("Undo uninstall"))
+ elif current[4] == 'install':
+ self["key_green"].setText(_("Undo install"))
+ if iSoftwareTools.NetworkConnectionAvailable is False:
+ self["key_green"].setText("")
+ self["key_yellow"].setText(_("View details"))
+ self["key_blue"].setText("")
+ if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+ elif len(self.selectedFiles) is not 0:
+ self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
+ else:
+ self["status"].setText(_("There are currently no outstanding actions."))
+ elif self.currList == "category":
+ self["key_red"].setText(_("Close"))
+ self["key_green"].setText("")
+ self["key_yellow"].setText("")
+ self["key_blue"].setText("")
+ if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+ self["key_yellow"].setText(_("Update"))
+ elif len(self.selectedFiles) is not 0:
+ self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
+ self["key_yellow"].setText(_("Process"))
+ else:
+ self["status"].setText(_("There are currently no outstanding actions."))
+
+ def getSelectionState(self, detailsFile):
+ for entry in self.selectedFiles:
+ if entry[0] == detailsFile:
+ return True
+ return False
+
+ 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":
+ 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:
+ if (iSoftwareTools.NetworkConnectionAvailable is False and current[4] in ('installable','install')):
+ pass
+ else:
+ self.selectedFiles.append((detailsFile,current[4],current[3]))
+ self.currentSelectedPackage = ((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':
+ if iSoftwareTools.NetworkConnectionAvailable:
+ 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':
+ if iSoftwareTools.NetworkConnectionAvailable:
+ 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()
+ elif self.currList == "status":
+ iSoftwareTools.lastDownloadDate = time()
+ iSoftwareTools.list_updating = True
+ self.setState('update')
+ iSoftwareTools.getUpdates(self.getUpdateInfosCB)
+
+ def handleSelected(self):
+ current = self["list"].getCurrent()
+ if current:
+ if self.currList == "packages":
+ if current[7] is not '':
+ detailsfile = iSoftwareTools.directory[0] + "/" + current[1]
+ if (os_path.exists(detailsfile) == True):
+ self.saved_currentSelectedPackage = self.currentSelectedPackage
+ self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current)
+ else:
+ self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO, timeout = 10)
+ elif self.currList == "category":
+ self.prepareInstall()
+ if len(self.cmdList):
+ self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
+
+ def detailsClosed(self, result = None):
+ if result is not None:
+ if result is not False:
+ self.setState('sync')
+ iSoftwareTools.lastDownloadDate = time()
+ for entry in self.selectedFiles:
+ if entry == self.saved_currentSelectedPackage:
+ self.selectedFiles.remove(entry)
+ iSoftwareTools.startIpkgListInstalled(self.rebuildList)
+
+ def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+ installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+ removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
+ if state == 'installed':
+ return((name, details, description, packagename, state, installedpng, divpng, selected))
+ elif state == 'installable':
+ return((name, details, description, packagename, state, installablepng, divpng, selected))
+ elif state == 'remove':
+ return((name, details, description, packagename, state, removepng, divpng, selected))
+ elif state == 'install':
+ 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
+ self.packetlist = []
+ for package in iSoftwareTools.packagesIndexlist[:]:
+ prerequisites = package[0]["prerequisites"]
+ if prerequisites.has_key("tag"):
+ for foundtag in prerequisites["tag"]:
+ if categorytag == foundtag:
+ attributes = package[0]["attributes"]
+ 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 = []
+ for x in self.packetlist:
+ status = ""
+ name = x[0].strip()
+ details = x[1].strip()
+ description = x[2].strip()
+ if description == "":
+ description = "No description available."
+ packagename = x[3].strip()
+ selectState = self.getSelectionState(details)
+ if iSoftwareTools.installed_packetlist.has_key(packagename):
+ if selectState == True:
+ status = "remove"
+ else:
+ status = "installed"
+ self.list.append(self.buildEntryComponent(name, _(details), _(description), packagename, status, selected = selectState))
+ else:
+ if selectState == True:
+ status = "install"
+ else:
+ status = "installable"
+ self.list.append(self.buildEntryComponent(name, _(details), _(description), packagename, status, selected = selectState))
+ if len(self.list):
+ self.list.sort(key=lambda x: x[0])
+ self["list"].style = "default"
+ self['list'].setList(self.list)
+ self["list"].updateList(self.list)
+ self.selectionChanged()
+
+ def buildCategoryList(self):
+ self.currList = "category"
+ self.categories = []
+ self.categoryList = []
+ for package in iSoftwareTools.packagesIndexlist[:]:
+ prerequisites = package[0]["prerequisites"]
+ if prerequisites.has_key("tag"):
+ for foundtag in prerequisites["tag"]:
+ attributes = package[0]["attributes"]
+ if foundtag not in self.categories:
+ self.categories.append(foundtag)
+ self.categoryList.append(self.buildCategoryComponent(foundtag))
+ self.categoryList.sort(key=lambda x: x[0])
+ self["list"].style = "category"
+ self['list'].setList(self.categoryList)
+ self["list"].updateList(self.categoryList)
+ self.selectionChanged()
+
+ def buildCategoryComponent(self, tag = None):
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ if tag is not None:
+ if tag == 'System':
+ return(( _("System"), _("View list of available system extensions" ), tag, divpng ))
+ elif tag == 'Skin':
+ return(( _("Skins"), _("View list of available skins" ), tag, divpng ))
+ elif tag == 'Recording':
+ return(( _("Recordings"), _("View list of available recording extensions" ), tag, divpng ))
+ elif tag == 'Network':
+ return(( _("Network"), _("View list of available networking extensions" ), tag, divpng ))
+ elif tag == 'CI':
+ return(( _("CommonInterface"), _("View list of available CommonInterface extensions" ), tag, divpng ))
+ elif tag == 'Default':
+ return(( _("Default Settings"), _("View list of available default settings" ), tag, divpng ))
+ elif tag == 'SAT':
+ return(( _("Satellite equipment"), _("View list of available Satellite equipment extensions." ), tag, divpng ))
+ elif tag == 'Software':
+ return(( _("Software"), _("View list of available software extensions" ), tag, divpng ))
+ elif tag == 'Multimedia':
+ return(( _("Multimedia"), _("View list of available multimedia extensions." ), tag, divpng ))
+ elif tag == 'Display':
+ return(( _("Display and Userinterface"), _("View list of available Display and Userinterface extensions." ), tag, divpng ))
+ elif tag == 'EPG':
+ return(( _("Electronic Program Guide"), _("View list of available EPG extensions." ), tag, divpng ))
+ elif tag == 'Communication':
+ return(( _("Communication"), _("View list of available communication extensions." ), tag, divpng ))
+ else: # dynamically generate non existent tags
+ return(( str(tag), _("View list of available ") + str(tag) + _(" extensions." ), tag, divpng ))
+
+ def prepareInstall(self):
+ self.cmdList = []
+ if iSoftwareTools.available_updates > 0:
+ self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False }))
+ if self.selectedFiles and len(self.selectedFiles):
+ for plugin in self.selectedFiles:
+ detailsfile = iSoftwareTools.directory[0] + "/" + plugin[0]
+ if (os_path.exists(detailsfile) == True):
+ iSoftwareTools.fillPackageDetails(plugin[0])
+ self.package = iSoftwareTools.packageDetails[0]
+ if self.package[0].has_key("attributes"):
+ self.attributes = self.package[0]["attributes"]
+ if self.attributes.has_key("needsRestart"):
+ self.restartRequired = True
+ if self.attributes.has_key("package"):
+ self.packagefiles = self.attributes["package"]
+ if plugin[1] == 'installed':
+ if self.packagefiles:
+ for package in self.packagefiles[:]:
+ 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[:]:
+ self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] }))
+ else:
+ self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
+ else:
+ if plugin[1] == 'installed':
+ self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] }))
+ else:
+ self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
+
+ def runExecute(self, result = None):
+ if result is not None:
+ if result[0] is True:
+ self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
+ elif result[0] is False:
+ self.cmdList = result[1]
+ self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
+ else:
+ self.close()
+
+ def runExecuteFinished(self):
+ self.reloadPluginlist()
+ if plugins.restartRequired or self.restartRequired:
+ self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+ else:
+ self.selectedFiles = []
+ self.restartRequired = False
+ self.detailsClosed(True)
+
+ def ExecuteReboot(self, result):
+ if result:
+ quitMainloop(3)
+ else:
+ self.selectedFiles = []
+ self.restartRequired = False
+ self.detailsClosed(True)
+
+ def reloadPluginlist(self):
+ plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+
+
+class PluginManagerInfo(Screen):
+ skin = """
+ <screen name="PluginManagerInfo" position="center,center" size="560,450" title="Plugin manager activity information" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
+ <convert type="TemplatedMultiContent">
+ {"template": [
+ MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (50, 27), size = (540, 23), 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, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
+ ],
+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+ "itemHeight": 50
+ }
+ </convert>
+ </widget>
+ <ePixmap pixmap="skin_default/div-h.png" position="0,404" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+ <widget source="status" render="Label" position="5,408" zPosition="10" size="550,44" 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_all,
+ "back": self.exit,
+ "red": self.exit,
+ "green": self.process_extensions,
+ }, -1)
+
+ self.list = []
+ self["list"] = List(self.list)
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("Only extensions."))
+ self["status"] = StaticText(_("Following tasks will be done after you press OK!"))
+
+ self.onShown.append(self.setWindowTitle)
+ self.onLayoutFinish.append(self.rebuildList)
+
+ def setWindowTitle(self):
+ self.setTitle(_("Plugin manager activity information"))
+
+ def rebuildList(self):
+ self.list = []
+ if self.cmdlist is not None:
+ for entry in self.cmdlist:
+ action = ""
+ info = ""
+ 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_CURRENT_SKIN, "skin_default/div-h.png"))
+ upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+ installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
+ removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ if action == 'install':
+ return(( _('Installing'), info, installpng, divpng))
+ elif action == 'remove':
+ return(( _('Removing'), info, removepng, divpng))
+ else:
+ return(( _('Upgrading'), info, upgradepng, divpng))
+
+ def exit(self):
+ self.close()
+
+ def process_all(self):
+ self.close((True,None))
+
+ def process_extensions(self):
+ self.list = []
+ if self.cmdlist is not None:
+ for entry in self.cmdlist:
+ cmd = entry[0]
+ if entry[0] in (0,2):
+ self.list.append((entry))
+ self.close((False,self.list))
+
+
+class PluginManagerHelp(Screen):
+ skin = """
+ <screen name="PluginManagerHelp" position="center,center" size="560,450" title="Plugin manager help" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
+ <convert type="TemplatedMultiContent">
+ {"template": [
+ MultiContentEntryText(pos = (50, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (50, 27), size = (540, 23), 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, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
+ ],
+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+ "itemHeight": 50
+ }
+ </convert>
+ </widget>
+ <ePixmap pixmap="skin_default/div-h.png" position="0,404" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+ <widget source="status" render="Label" position="5,408" zPosition="10" size="550,44" 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["key_red"] = StaticText(_("Close"))
+ self["status"] = StaticText(_("A small overview of the available icon states and actions."))
+
+ 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_CURRENT_SKIN, "skin_default/div-h.png"))
+ installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+ installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+ removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "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="center,center" size="600,440" title="Plugin details" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="author" render="Label" position="10,50" size="500,25" zPosition="10" font="Regular;21" transparent="1" />
+ <widget name="statuspic" position="550,40" size="48,48" alphatest="on"/>
+ <widget name="divpic" position="0,80" size="600,2" alphatest="on"/>
+ <widget name="detailtext" position="10,90" size="270,330" zPosition="10" font="Regular;21" transparent="1" halign="left" valign="top"/>
+ <widget name="screenshot" position="290,90" size="300,330" alphatest="on"/>
+ </screen>"""
+ def __init__(self, session, plugin_path, packagedata = None):
+ Screen.__init__(self, session)
+ self.skin_path = plugin_path
+ self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+ self.attributes = None
+ DreamInfoHandler.__init__(self, self.statusCallback, blocking = False)
+ self.directory = resolveFilename(SCOPE_METADIR)
+ if packagedata:
+ self.pluginname = packagedata[0]
+ self.details = packagedata[1]
+ self.pluginstate = packagedata[4]
+ self.statuspicinstance = packagedata[5]
+ self.divpicinstance = packagedata[6]
+ self.fillPackageDetails(self.details)
+
+ self.thumbnail = ""
+
+ self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+ {
+ "back": self.exit,
+ "red": self.exit,
+ "green": self.go,
+ "up": self.pageUp,
+ "down": self.pageDown,
+ "left": self.pageUp,
+ "right": self.pageDown,
+ }, -1)
+
+ self["key_red"] = StaticText(_("Close"))
+ self["key_green"] = StaticText("")
+ self["author"] = StaticText()
+ self["statuspic"] = Pixmap()
+ self["divpic"] = Pixmap()
+ self["screenshot"] = Pixmap()
+ self["detailtext"] = ScrollLabel()
+
+ self["statuspic"].hide()
+ self["screenshot"].hide()
+ self["divpic"].hide()
+
+ self.package = self.packageDetails[0]
+ if self.package[0].has_key("attributes"):
+ self.attributes = self.package[0]["attributes"]
+ self.restartRequired = False
+ self.cmdList = []
+ self.oktext = _("\nAfter pressing OK, please wait!")
+ self.picload = ePicLoad()
+ self.picload.PictureData.get().append(self.paintScreenshotPixmapCB)
+ self.onShown.append(self.setWindowTitle)
+ self.onLayoutFinish.append(self.setInfos)
+
+ def setWindowTitle(self):
+ self.setTitle(_("Details for plugin: ") + self.pluginname )
+
+ def exit(self):
+ self.close(False)
+
+ def pageUp(self):
+ self["detailtext"].pageUp()
+
+ def pageDown(self):
+ self["detailtext"].pageDown()
+
+ def statusCallback(self, status, progress):
+ pass
+
+ def setInfos(self):
+ if self.attributes.has_key("screenshot"):
+ self.loadThumbnail(self.attributes)
+
+ if self.attributes.has_key("name"):
+ self.pluginname = self.attributes["name"]
+ else:
+ self.pluginname = _("unknown")
+
+ if self.attributes.has_key("author"):
+ self.author = self.attributes["author"]
+ else:
+ self.author = _("unknown")
+
+ if self.attributes.has_key("description"):
+ self.description = _(self.attributes["description"].replace("\\n", "\n"))
+ else:
+ self.description = _("No description available.")
+
+ self["author"].setText(_("Author: ") + self.author)
+ self["detailtext"].setText(_(self.description))
+ if self.pluginstate in ('installable', 'install'):
+ if iSoftwareTools.NetworkConnectionAvailable:
+ self["key_green"].setText(_("Install"))
+ else:
+ self["key_green"].setText("")
+ else:
+ self["key_green"].setText(_("Remove"))
+
+ def loadThumbnail(self, entry):
+ thumbnailUrl = None
+ if entry.has_key("screenshot"):
+ thumbnailUrl = entry["screenshot"]
+ if self.language == "de":
+ if thumbnailUrl[-7:] == "_en.jpg":
+ thumbnailUrl = thumbnailUrl[:-7] + "_de.jpg"
+
+ if thumbnailUrl is not None:
+ self.thumbnail = "/tmp/" + thumbnailUrl.split('/')[-1]
+ print "[PluginDetails] downloading screenshot " + thumbnailUrl + " to " + self.thumbnail
+ if iSoftwareTools.NetworkConnectionAvailable:
+ client.downloadPage(thumbnailUrl,self.thumbnail).addCallback(self.setThumbnail).addErrback(self.fetchFailed)
+ else:
+ self.setThumbnail(noScreenshot = True)
+ else:
+ self.setThumbnail(noScreenshot = True)
+
+ def setThumbnail(self, noScreenshot = False):
+ if not noScreenshot:
+ filename = self.thumbnail
+ else:
+ filename = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/noprev.png")
+
+ sc = AVSwitch().getFramebufferScale()
+ self.picload.setPara((self["screenshot"].instance.size().width(), self["screenshot"].instance.size().height(), sc[0], sc[1], False, 1, "#00000000"))
+ self.picload.startDecode(filename)
+
+ if self.statuspicinstance != None:
+ self["statuspic"].instance.setPixmap(self.statuspicinstance.__deref__())
+ self["statuspic"].show()
+ if self.divpicinstance != None:
+ self["divpic"].instance.setPixmap(self.divpicinstance.__deref__())
+ self["divpic"].show()
+
+ def paintScreenshotPixmapCB(self, picInfo=None):
+ ptr = self.picload.getData()
+ if ptr != None:
+ self["screenshot"].instance.setPixmap(ptr.__deref__())
+ self["screenshot"].show()
+ else:
+ self.setThumbnail(noScreenshot = True)
+
+ def go(self):
+ if self.attributes.has_key("package"):
+ self.packagefiles = self.attributes["package"]
+ if self.attributes.has_key("needsRestart"):
+ self.restartRequired = True
+ self.cmdList = []
+ if self.pluginstate in ('installed', 'remove'):
+ if self.packagefiles:
+ for package in self.packagefiles[:]:
+ 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 iSoftwareTools.NetworkConnectionAvailable:
+ if self.packagefiles:
+ for package in self.packagefiles[:]:
+ 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)
+
+ def runUpgrade(self, result):
+ if result:
+ self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
+
+ def runUpgradeFinished(self):
+ self.reloadPluginlist()
+ if plugins.restartRequired or self.restartRequired:
+ self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+ else:
+ self.close(True)
+ def UpgradeReboot(self, result):
+ if result:
+ quitMainloop(3)
+ else:
+ self.close(True)
+
+ def runRemove(self, result):
+ if result:
+ self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList)
+
+ def runRemoveFinished(self):
+ self.close(True)
+
+ def reloadPluginlist(self):
+ plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+
+ def fetchFailed(self,string):
+ self.setThumbnail(noScreenshot = True)
+ print "[PluginDetails] fetch failed " + string.getErrorMessage()
+
+
+class UpdatePlugin(Screen):
+ skin = """
+ <screen name="UpdatePlugin" position="center,center" size="550,300" title="Software update" >
+ <widget name="activityslider" position="0,0" size="550,5" />
+ <widget name="slider" position="0,150" size="550,30" />
+ <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+ <widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+ </screen>"""
+
+ def __init__(self, session, args = None):
+ Screen.__init__(self, session)
+
+ self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }
+
+ self.slider = Slider(0, 4)
+ self["slider"] = self.slider
+ self.activityslider = Slider(0, 100)
+ self["activityslider"] = self.activityslider
+ self.status = StaticText(_("Please wait..."))
+ self["status"] = self.status
+ self.package = StaticText(_("Verifying your internet connection..."))
+ self["package"] = self.package
+ self.oktext = _("Press OK on your remote control to continue.")