def updateList(self): while self.proc.poll() is None: output = self.proc.stdout.readline() if (output != ""): print("stout: " + output.rstrip()) self.data.append({"name": output.rstrip()}) # output = self.proc.stderr.readline() # if(output != ""): # print("sterr: " + output.rstrip()) # self.data.append({ # "name": output.rstrip() # }) self.initList() self.setSelection(len(self.data) - 1) RenderControl.setDirty() self.data.append({"name": ""}) self.data.append({"name": "Task finished, press 'B' to go back"}) self.initList() self.setSelection(len(self.data) - 1) RenderControl.setDirty() self.isTerminated = True TaskHandler.removePeriodicTask(self.updateTask)
def handleEvents(self, events): if(self.overlay != None): self.overlay.handleEvents(events) return for event in events: if event.type == pygame.KEYDOWN: if event.key == Keys.DINGOO_BUTTON_LEFT: self.moveFolderUp() RenderControl.setDirty() if event.type == pygame.KEYUP: if event.key == Keys.DINGOO_BUTTON_START: if(self.selectFolder): if(self.entryList[self.currentIndex]["isFolder"] and self.entryList[self.currentIndex]["name"] != ".."): self.callback(self.currentPath + "/" + self.entryList[self.currentIndex]["name"]) else: self.callback(self.currentPath) RenderControl.setDirty() return else: self.onSelect(Keys.DINGOO_BUTTON_START) AbstractList.AbstractList.handleEvents(self, events)
def __init__(self, screen, titel, data, options, callback): AbstractList.AbstractList.__init__(self, screen, titel, options) self.options = options self.callback = callback self.data = data self.yFolderOffset = (self.listEntryHeight - self.folderIcon.get_height()) / 2 self.xFolderOffset = (self.listEntryHeight - self.folderIcon.get_width()) / 2 self.yFileOffset = (self.listEntryHeight - self.fileIcon.get_height()) / 2 self.xFileOffset = (self.listEntryHeight - self.fileIcon.get_width()) / 2 self.initList() res = ResumeHandler.getResumeFile() if (res != None and res["line"] != None and ("type" in options and options["type"] != "lastPlayed" and options["type"] != "favourites")): self.setSelection(res["line"]) self.onChange() if (not self.currentSelection == None): self.previewPath = self.currentSelection["preview"] self.preview_final = self.previewPath RenderControl.setDirty() AbstractList.AbstractList.updatePreview(self) self.onChange()
def optionsCallback(self, selection, text): self.overlay = None if (not Configuration.isRS97()): self.configOptions = self.configOptions + json.load( open('config/legacy.json')) if (selection == 0): self.subComponent = ConfigMenu.ConfigMenu(self.screen, "Add new link",{"textColor":(55,55,55), "backgroundColor":(221,221,221), "useSidebar":True}, \ self.getEmptyData() ,self.configOptions ,self.addEditCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], (255, 255, 255)) self.subComponent.setFooter(footer) self.subComponent.setConfigCallback(self.configCallback) if (selection == 1): self.subComponent = ConfigMenu.ConfigMenu(self.screen, "Edit link",{"textColor":(55,55,55), "backgroundColor":(221,221,221)}, \ self.currentSelection ,self.configOptions ,self.addEditCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], (255, 255, 255)) self.subComponent.setFooter(footer) self.subComponent.setConfigCallback(self.configCallback) if (selection == 2): self.overlay = ConfirmOverlay.ConfirmOverlay( "really delete?", (255, 255, 255), [("theme/b_button.png", "back"), ("theme/a_button.png", "delete")], self.deleteCallback) RenderControl.setDirty()
def handleEvents(self, events): if (self.subComponent != None): self.subComponent.handleEvents(events) return if (self.overlay != None): self.overlay.handleEvents(events) return for event in events: if event.type == pygame.KEYDOWN: if event.key == Keys.DINGOO_BUTTON_SELECT: if ("allowEdit" in self.config["options"] and self.config["options"]["allowEdit"]): if (len(self.options) == 0): self.overlay = SelectionMenu.SelectionMenu( self.screen, ["add"], self.optionsCallback) else: self.overlay = SelectionMenu.SelectionMenu( self.screen, ["add", "edit", "remove"], self.optionsCallback) RenderControl.setDirty() if (self.overlay is None): AbstractList.AbstractList.handleEvents(self, events)
def updateBattery(self): bat = self.getCurrentBatteryImage() self.readBatteryLevel() if (bat != self.getCurrentBatteryImage()): self.updateHeader() RenderControl.setDirty()
def handleEvents(self, events): if (self.subComponent != None): self.subComponent.handleEvents(events) return if (self.overlay != None): self.overlay.handleEvents(events) return for event in events: if event.type == pygame.KEYDOWN: self.keyDown = True if (self.isTerminated): if event.key == Keys.DINGOO_BUTTON_UP: if (not len(self.entryList) <= 1): self.up() self.onChange() RenderControl.setDirty() if event.key == Keys.DINGOO_BUTTON_DOWN: if (not len(self.entryList) <= 1): self.down() self.onChange() RenderControl.setDirty() if event.key == Keys.DINGOO_BUTTON_L: self.up(self.maxListEntries) self.onChange() RenderControl.setDirty() if event.key == Keys.DINGOO_BUTTON_R: self.down(self.maxListEntries) self.onChange() RenderControl.setDirty() if event.key == Keys.DINGOO_BUTTON_B: self.callback() RenderControl.setDirty()
def installIPK(self): print("Opening ipk file selection") options = {} options["textColor"] = (55, 55, 55) options["useSidebar"] = False options["useGamelist"] = False options["fileFilter"] = [".ipk", ".IPK"] options["useFileFilter"] = True options["limitSelection"] = False options["hideFolders"] = False options["selectionPath"] = "/home/retrofw" self.subComponent = FileChooser.FileChooser(self.screen, "IPK Selection", "/home/retrofw", False, options, self.installIPKCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "select")], (255, 255, 255)) self.subComponent.setFooter(footer) RenderControl.setDirty()
def handleEvents(self, events): if (self.subComponent != None): self.subComponent.handleEvents(events) return if (self.overlay != None): self.overlay.handleEvents(events) return for event in events: if event.type == pygame.KEYDOWN: if event.key == Keys.DINGOO_BUTTON_SELECT: if (len(self.data) == 0): self.overlay = SelectionMenu.SelectionMenu( self.screen, ["install new"], self.optionsCallback) else: self.overlay = SelectionMenu.SelectionMenu( self.screen, ["install new", "uninstall"], self.optionsCallback) RenderControl.setDirty() if (self.overlay is None): NativeAppList.NativeAppList.handleEvents(self, events)
def installIPKCallback(self, selection, key=Keys.DINGOO_BUTTON_A, direct=False): print(selection) if (selection.lower().find("pymenu-") != -1): self.subComponent = None self.overlay = ConfirmOverlay.ConfirmOverlay( "Install with Gmenu", [("theme/b_button.png", "back")], self.pyMenuSelectedCallback) RenderControl.setDirty() return if (selection != None): #cmd = "opkg install " + selection cmd = ["opkg", "install", selection, "--force-reinstall"] #cmd = [ "ping","localhost"] self.subComponent = ProgramExecuter.ProgramExecuter( self.screen, "Installing IPK", cmd, self.executerCallback) self.subComponent.setFooter(None) else: self.subComponent = None
def optionsCallback(self, selection, text): self.overlay = None if (text == "add"): self.subComponent = ConfigMenu.ConfigMenu(self.screen, "Add new emulator",{"textColor":(55,55,55), "backgroundColor":(221,221,221), "useSidebar":True}, \ self.getEmptyData() ,self.configOptions ,self.addEditCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], (255, 255, 255)) self.subComponent.setFooter(footer) self.subComponent.setConfigCallback(self.configCallback) if (text == "edit"): self.subComponent = ConfigMenu.ConfigMenu(self.screen, "Edit emulator",{"textColor":(55,55,55), "backgroundColor":(221,221,221)}, \ self.currentSelection ,self.configOptions ,self.addEditCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], (255, 255, 255)) self.subComponent.setFooter(footer) self.subComponent.setConfigCallback(self.configCallback) if (text == "remove"): self.overlay = ConfirmOverlay.ConfirmOverlay( "really delete?", [("theme/b_button.png", "back"), ("theme/a_button.png", "delete")], self.deleteCallback) RenderControl.setDirty()
def openSettings(self): options = json.load(open('config/options.json')) theme = None for opt in options: if opt["id"] == "themeName": theme = opt if (theme != None): theme["values"] = [] theme["names"] = [] itemlist = os.listdir("theme/themes") for item in itemlist: if (item.endswith(".json")): theme["values"].append(item.replace(".json", "")) theme["names"].append(item.replace(".json", "")) self.subComponent = ConfigMenu.ConfigMenu(self.screen, "General Settings (PyMenu v" + str(self.config["version"]) + ")",{"textColor":(255,255,255), "backgroundColor":(0,0,0)}, \ Configuration.getPathData("options"), options ,self.configCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], (255, 255, 255)) self.subComponent.setFooter(footer) RenderControl.setDirty()
def addEditCallback(self, entry): self.subComponent = None print(entry) if (entry == None): self.reload() return if (entry["background"] == None or not os.path.isfile(entry["background"])): print("Background does not exist! ") self.reload() return if (entry["icon"] == None or not os.path.isfile(entry["icon"])): print("Icon does not exist! ") self.reload() return if (entry != None and not entry in self.config["mainMenu"]): self.config["mainMenu"].insert(self.currentIndex, entry) Configuration.saveConfiguration() self.loadSystemImages() RenderControl.setDirty()
def optionsCallback(self, selection, text): self.overlay = None opt = Theme.getConfigOptions() if (text == "add"): opt["useSidebar"] = True self.subComponent = ConfigMenu.ConfigMenu(self.screen, "Add new link",opt, \ self.getEmptyData() ,self.configOptions ,self.addEditCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], opt["footerFontColor"], opt["footerColor"]) self.subComponent.setFooter(footer) self.subComponent.setConfigCallback(self.configCallback) if (text == "edit"): self.subComponent = ConfigMenu.ConfigMenu(self.screen, "Edit link",opt, \ self.currentSelection ,self.configOptions ,self.addEditCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], opt["footerFontColor"], opt["footerColor"]) self.subComponent.setFooter(footer) self.subComponent.setConfigCallback(self.configCallback) if (text == "remove"): self.overlay = ConfirmOverlay.ConfirmOverlay( "really delete?", [("theme/b_button.png", "back"), ("theme/a_button.png", "delete")], self.deleteCallback) RenderControl.setDirty()
def optionsCallback(self, optionID, text): print("Options came back with: ", optionID) self.overlay = None if (optionID == 0): self.overlay = SelectionMenu.SelectionMenu(self.screen, ["Emulator", "Native"], self.typeAddCallback) if (optionID == 1): conf = None if (self.config["mainMenu"][self.currentIndex]["type"] == "emulator"): conf = json.load(open('config/entry.json')) if (not Configuration.isRS97()): conf = conf + json.load(open('config/pap.json')) else: conf = json.load(open('config/native.json')) self.subComponent = ConfigMenu.ConfigMenu(self.screen, "Edit menu entry",{"textColor":(55,55,55), "backgroundColor":(221,221,221)}, \ self.config["mainMenu"][self.currentIndex] ,conf ,self.addEditCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], (255, 255, 255)) self.subComponent.setFooter(footer) if (optionID == 2): self.overlay = ConfirmOverlay.ConfirmOverlay( "really delete?", (255, 255, 255), [("theme/b_button.png", "back"), ("theme/a_button.png", "delete")], self.deleteCallback) RenderControl.setDirty()
def handleEvents(self, events): for event in events: if event.type == pygame.KEYDOWN: if event.key == Keys.DINGOO_BUTTON_B or event.key == Keys.DINGOO_BUTTON_A: if (self.callback != None): self.callback(1) RenderControl.setDirty()
def updateFooterPos(self, start, target, current, finished): if (not finished): self.footer.setYPosition(current) else: self.footer.setEnabled(False) RenderControl.setDirty()
def onSelect(self): if (self.options["options"][self.currentIndex] in self.data): self.data.remove(self.options["options"][self.currentIndex]) else: self.data.append(self.options["options"][self.currentIndex]) self.initList() RenderControl.setDirty()
def animationCallback(self, start, target, current, finished): self.menuAlpha = current if(finished): self.showBrightness = False self.showVolume = False RenderControl.setDirty()
def resetAnimation(self): self.menuAlpha = 255 if(self.animationId is not None): TaskHandler.stopAnimation(self.animationId) self.animationId = TaskHandler.addAnimation(255, 20, 600, self.animationCallback, 1500) RenderControl.setDirty()
def updatePreview(self): self.preview_final = self.previewPath self.anim = None self.image = None self.renderAnim = False TaskHandler.removePeriodicTask(self.animTask) self.animTask = TaskHandler.addPeriodicTask(1000, self.onShowAnim, 1000) RenderControl.setDirty()
def select(self): if (self.selection == "band"): self.openSelection(self.config["mainMenu"][self.currentIndex]) if (self.selection == "power"): self.openPowerMenu() if (self.selection == "settings"): self.openSettings() RenderControl.setDirty()
def openSettings(self): self.subComponent = ConfigMenu.ConfigMenu(self.screen, "General Settings",{"textColor":(255,255,255), "backgroundColor":(0,0,0)}, \ Configuration.getPathData("options"), json.load(open('config/options.json')) ,self.configCallback) footer = Footer.Footer([("theme/direction.png", "select")], [("theme/b_button.png", "back"), ("theme/a_button.png", "change"), ("theme/start_button.png", "save")], (255, 255, 255)) self.subComponent.setFooter(footer) RenderControl.setDirty()
def init(): lastRenderTime = 1 Common.mountSD(True) # try: # if(not Configuration.isOpenDinguX()): # os.system('/usr/bin/retrofw network on') # except Exception as ex: # pass realScreen = pygame.display.set_mode( (config["screenWidth"], config["screenHeight"]), HWSURFACE, 16) screen = pygame.Surface((config["screenWidth"], config["screenHeight"])) suspend = Suspend.Suspend() renderObject = MainMenu.MainMenu(screen, suspend) brightness = BrightnessVolumeControl.BrightnessVolume() while True: # main game loop events = pygame.event.get() for event in events: if event.type == QUIT: pygame.quit() sys.exit() suspend.handleEvents(events) renderObject.handleEvents(events) brightness.handleEvents(events) if (RenderControl.isDirty()): start = int(round(time.time() * 1000)) RenderControl.setDirty(False) renderObject.render(screen) brightness.render(screen) if ("showFPS" in config["options"] and config["options"]["showFPS"]): if (lastRenderTime == 0): lastRenderTime = 1 textSurface = textFont.render( str(int(round(1000 / lastRenderTime))) + "fps ~" + str(lastRenderTime) + "ms", True, (255, 255, 255)) screen.blit(textSurface, (0, 0)) #print("render time: " + str(lastRenderTime)) realScreen.blit(screen, (0, 0)) pygame.display.update() lastRenderTime = int(round(time.time() * 1000)) - start TaskHandler.updateTasks() fpsClock.tick(Common.getFPS())
def transitionCallback(self, start, target, current, finished): if (finished): self.inTransition = False self.transitionOffset = 0 if (target < 0): self.currentIndex = self.getNext() else: self.currentIndex = self.getPrev() else: self.transitionOffset = current RenderControl.setDirty()
def renderPreview(self, screen): if (self.currentIndex == -1): return if (not self.previewEnabled): desc = self.renderDescription() if (not desc == None): screen.blit(desc, (5, 56)) return if (self.useSidebar): xOffset = (128) / 2 yOffset = (128) / 2 if (self.preview_final != None): animPath = None animPath1 = self.preview_final.replace(".png", ".anim.jpg") animPath2 = self.preview_final.replace(".png", ".anim.png") if (os.path.exists(animPath1) and os.path.isfile(animPath1)): animPath = animPath1 elif (os.path.exists(animPath2) and os.path.isfile(animPath2)): animPath = animPath2 if (animPath != None and self.renderAnim): if (self.anim == None): self.anim = Animation.Animation(animPath, (128, 128)) if (self.useSidebar and self.anim != None): self.anim.render(screen, (5, 56)) RenderControl.setDirty() elif ((os.path.exists(self.preview_final) and os.path.isfile(self.preview_final)) or "opk#" in self.preview_final.lower()): if (self.image == None): self.image = Common.loadImage(self.preview_final) self.image = Common.aspect_scale(self.image, 128, 128, False) if (self.useSidebar): xOffset = (128 - self.image.get_width()) / 2 yOffset = (128 - self.image.get_height()) / 2 screen.blit(self.image, (5 + xOffset, 56 + yOffset)) else: if (not self.keyDown): #fallback if image not found desc = self.renderDescription() if (not desc == None): screen.blit(desc, (5, 56))
def handleEvents(self, events): for event in events: if event.type == pygame.KEYDOWN: if event.key == Keys.DINGOO_BUTTON_LEFT: self.moveFolderUp() RenderControl.setDirty() if event.type == pygame.KEYUP: if event.key == Keys.DINGOO_BUTTON_START: if (self.selectFolder): self.callback(self.currentPath) RenderControl.setDirty() AbstractList.AbstractList.handleEvents(self, events)
def configCallback(self, select): newThemeName = self.config["options"]["themeName"] if (self.themeName != self.config["options"]["themeName"]): print("Theme changed") self.config["options"]["themeName"] = newThemeName self.subComponent = None Configuration.saveOptions(self.config["options"]) self.reload() RenderControl.setDirty()
def init(): lastRenderTime = 1 setVolume() if (Configuration.isRS97() and platform.processor() == ""): realScreen = pygame.display.set_mode((320, 240), HWSURFACE, 16) screen = pygame.Surface( (config["screenWidth"], config["screenHeight"])) else: realScreen = pygame.display.set_mode( (config["screenWidth"], config["screenHeight"]), HWSURFACE, 16) screen = realScreen renderObject = MainMenu.MainMenu(screen) suspend = Suspend.Suspend() brightness = BrightnessVolumeControl.BrightnessVolume() while True: # main game loop events = pygame.event.get() for event in events: if event.type == QUIT: pygame.quit() sys.exit() suspend.handleEvents(events) renderObject.handleEvents(events) brightness.handleEvents(events) if (RenderControl.isDirty()): start = int(round(time.time() * 1000)) RenderControl.setDirty(False) renderObject.render(screen) brightness.render(screen) if ("showFPS" in config["options"] and config["options"]["showFPS"]): if (lastRenderTime == 0): lastRenderTime = 1 textSurface = textFont.render( str(int(round(1000 / lastRenderTime))) + "fps ~" + str(lastRenderTime) + "ms", True, (255, 255, 255)) screen.blit(textSurface, (0, 0)) print("render time: " + str(lastRenderTime)) realScreen.blit(screen, (0, 0)) pygame.display.update() lastRenderTime = int(round(time.time() * 1000)) - start TaskHandler.updateTasks() fpsClock.tick(Common.FPS)
def initListAsync(self): if("useGamelist" in self.options and self.options["useGamelist"] == True): Common.loadGameList() if(os.path.isdir(self.currentPath) and os.path.exists(self.currentPath)): self.entryList = [] entry = {} entry["name"] = ".." entry["isFolder"] = True entry["text"] = self.entryFont.render("..", True, self.textColor) self.entryList.append(entry) self.fileList = os.listdir(os.path.normpath(self.currentPath)) Common.quick_sort(self.fileList) try: for f in self.fileList: if(os.path.isdir(self.currentPath + "/" + f)): entry = {} entry["name"] = f entry["isFolder"] = True entry["text"] = None self.entryList.append(entry) for f in self.fileList: if(not os.path.isdir(self.currentPath + "/" + f) and not self.selectFolder and self.filterFile(f)): entry = {} entry["name"] = f entry["isFolder"] = False entry["text"] = None self.entryList.append(entry) except Exception as ex: pass if(not self.reset == None): for entry in self.entryList: if(entry["name"] == self.reset): self.setSelection(self.entryList.index(entry)) elif(self.res != None and self.res["line"] != None): self.setInitialSelection(self.res["line"]) self.res = None else: self.setSelection(0) self.onChange() self.listReady = True RenderControl.setDirty()