class LanguagesPage(Page): _FootMsg = ["Nav", "", "", "Back", "Select"] _MyList = [] _ListFont = fonts["notosanscjk15"] _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _InfoPage = None def __init__(self): Page.__init__(self) self._Icons = {} def GenList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 files_path = [ os.path.basename(x) for x in sorted(glob.glob('langs/*.ini')) ] for i, u in enumerate(files_path): #print(i,u) li = PageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont li._Active = False li._Value = u.decode("utf8") lang_name = u.split("_")[1] lang_name = lang_name.split(".")[0] li.Init(lang_name.decode("utf8")) last_height += li._Height self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool._Icons["done"] done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._Active == True: return for i in self._MyList: i._Active = False cur_li._Active = True print(cur_li._Value) with open(".lang", "w") as f: f.write(cur_li._Value) self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() MyLangManager.UpdateLang() pygame.event.post(pygame.event.Event(RESTARTUI, message="")) ##Restart Launcher pygame.time.delay(1000) self._Screen.Draw() self._Screen.SwapAndShow() def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False with open(".lang", "r") as f: thelang = f.read() thelang = thelang.strip() if thelang == "": thelang = "English" for i in self._MyList: if thelang in i._Value: i._Active = True def OnReturnBackCb(self): pass """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ def KeyDown(self, event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["B"]: self.Click() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * PageListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * PageListItem._Height, self._PsIndex * PageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill((255, 255, 255)) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height))
class GPUDriverPage(Page): _FootMsg = ["Nav","","","Back","Select"] _MyList = [] _ListFont = fonts["notosanscjk15"] _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240-24-20 _DrawOnce = False _Scroller = None _InfoPage = None def __init__(self): Page.__init__(self) self._Icons = {} def GenList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 drivers = [["fbturbo","Fbturbo"], ["modesetting","Lima"]] for i,u in enumerate( drivers ): #print(i,u) li = PageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont li._Active = False li._Value = u[0] li.Init( u[1] ) last_height += li._Height self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) self._PosX = self._Index*self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool._Icons["done"] done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._Active == True: return print(cur_li._Value) if "arm" in platform.machine(): for i in self._MyList: i._Active = False cur_li._Active = True self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() if "modesetting" in cur_li._Value: os.system("touch %s/.lima" % os.path.expanduser('~') ) else: os.system("rm %s/.lima" % os.path.expanduser('~') ) pygame.time.delay(800) os.system("sudo reboot") else: self._Screen._MsgBox.SetText("Do it in GameShell") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False ## grep Driver /etc/xorg.conf | tr -s " " | cut -d " " -f3 ## "fbturbo" ## "modesetting" thedrv = "" if "arm" in platform.machine(): if FileExists("%s/.lima" % os.path.expanduser('~')): thedrv = "modesetting" else: thedrv = "fbturbo" if thedrv == "": thedrv = "fbturbo" for i in self._MyList: i._Active = False for i in self._MyList: if thedrv in i._Value: i._Active = True def OnReturnBackCb(self): pass """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ def KeyDown(self,event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["B"]: self.Click() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * PageListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height/2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height/2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill((255,255,255)) self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) )
class TimezoneListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "", "", "Back", "Select"] _MyList = [] _SwapMyList = [] _ListFont = MyLangManager.TrFont("notosanscjk15") _MyStack = None _Scroller = None _BGpng = None _BGwidth = 56 _BGheight = 70 def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] self._SwapMyList = [] self._MyStack = TimeLibStack() def buildDirectoryList(self, path): elements = [{ 'name': f, 'file_path': os.path.join(path, f), 'is_file': os.path.isfile(os.path.join(path, f)) } for f in os.listdir(path)] return elements def SyncList(self, path): alist = self.buildDirectoryList(path) if not alist: print("buildDirectoryList empty") return self._MyList = [] self._SwapMyList = [] start_x = 0 start_y = 0 hasparent = 0 if self._MyStack.Length() > 0: hasparent = 1 li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["DIR"] li.Init("[..]") self._MyList.append(li) for i, v in enumerate(sorted(alist)): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + (i + hasparent) * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["FILE"] if not v['is_file']: li._MyType = ICON_TYPES["DIR"] else: li._MyType = ICON_TYPES["FILE"] li.Init(v['name']) li._Path = v["file_path"] self._MyList.append(li) for i in self._MyList: self._SwapMyList.append(i) def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList("/usr/share/zoneinfo/posix") icon_for_list = MultiIconItem() icon_for_list._ImgSurf = MyIconPool.GiveIconSurface("sys") icon_for_list._MyType = ICON_TYPES["STAT"] icon_for_list._Parent = self icon_for_list.Adjust(0, 0, 18, 18, 0) self._Icons["sys"] = icon_for_list self._BGpng = IconItem() self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("empty") self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel("No timezones found on system!", MyLangManager.TrFont("varela22")) self._BGpng.SetLableColor(MySkinManager.GiveColor('Disabled')) self._BGpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._MyType == ICON_TYPES["DIR"]: if cur_li._Path == "[..]": self._MyStack.Pop() self.SyncList(self._MyStack.Last()) self._PsIndex = 0 else: self._MyStack.Push(self._MyList[self._PsIndex]._Path) self.SyncList(self._MyStack.Last()) self._PsIndex = 0 if cur_li._MyType == ICON_TYPES["FILE"]: ## set the current timezone subprocess.call(['sudo', 'cp', cur_li._Path, '/etc/localtime']) #copyfile(cur_li._Path, '/etc/localtime') print("add", cur_li._Path) self._Screen.Draw() self._Screen.SwapAndShow() def Rescan(self): self.SyncList("/usr/share/zoneinfo/posix") self._PsIndex = 0 def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Right"]: self.FScrollDown(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Left"]: self.FScrollUp(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: self._BGpng.NewCoord(self._Width / 2, self._Height / 2) self._BGpng.Draw() return else: if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if False: i._Active = True else: i._Active = False if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if False: i._Active = True else: i._Active = False if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw()
class ListPage(Page): _Icons = {} _Selector=None _FootMsg = ["Nav","","","Back","Enter"] _MyList = [] _ListFontObj = MyLangManager.TrFont("varela15") _Scroller = None def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = InfoPageSelector() ps._Parent = self ps._PosX = 2 self._Ps = ps self._PsIndex = 0 # "" pkgname, label alist = [["","Airplane","Airplane Mode"], ["","PowerOptions","Power Options"], ["","Wifi","Wi-Fi"], ["","Bluetooth","Bluetooth"], ["","Sound","Sound Volume"], ["","Brightness","BackLight Brightness"], ["","Storage",""], ["","Time","Timezone"], ["","Languages","Languages"], ["","Notification","Notification"], ["","Update", ""], ["","About", "About"], ["","PowerOFF","Power OFF"], ["","ButtonsLayout","Buttons Layout"], ["","LauncherGo","Switch to LauncherGo"], ["","Lima","GPU driver switch"], ["","GateWay","Network gateway switch"]] start_x = 0 start_y = 0 sys.path.append(myvars.basepath)# add self as import path for i,v in enumerate(alist): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i*ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj if v[2] != "": li.Init(v[2]) else: li.Init(v[1]) #if v[1] == "Wifi" or v[1] == "Sound" or v[1] == "Brightness" or v[1] == "Storage" or v[1] == "Update" or v[1] == "About" or v[1] == "PowerOFF" or v[1] == "HelloWorld": if FileExists(myvars.basepath+"/"+ v[1]): li._LinkObj = __import__(v[1]) init_cb = getattr(li._LinkObj,"Init",None) if init_cb != None: if callable(init_cb): li._LinkObj.Init(self._Screen) self._MyList.append(li) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def Click(self): cur_li = self._MyList[self._PsIndex] if cur_li._LinkObj != None: api_cb = getattr(cur_li._LinkObj,"API",None) if api_cb != None: if callable(api_cb): cur_li._LinkObj.API(self._Screen) def KeyDown(self,event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() def Draw(self): self.ClearCanvas() if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class GPUDriverPage(Page): _FootMsg = ["Nav", "", "", "Back", "Select"] _MyList = [] _ListFont = MyLangManager.TrFont("notosanscjk12") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _InfoPage = None def __init__(self): Page.__init__(self) self._Icons = {} def GenList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 drivers = [["fbturbo", "FBTURBO driver (Software Rendering)"], [ "modesetting", "LIMA driver (Experimental Hardware Rendering)" ]] for i, u in enumerate(drivers): #print(i,u) li = PageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont li._Active = False li._Value = u[0] li.Init(u[1]) last_height += li._Height self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._Active == True: return print(cur_li._Value) if "arm" in platform.machine(): for i in self._MyList: i._Active = False cur_li._Active = True self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() if "modesetting" in cur_li._Value: ## enable lima os.system("touch %s/.lima" % os.path.expanduser('~')) ArmSystem( "sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima /usr/lib/xorg/modules/drivers/modesetting_drv.so" ) ArmSystem( "sudo sed -i '/^#.*lima/s/^#//' /etc/ld.so.conf.d/00-arm-linux-gnueabihf.conf" ) ArmSystem("sudo ldconfig") else: #disable lima os.system("rm %s/.lima" % os.path.expanduser('~')) ArmSystem( "sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima" ) ArmSystem( "sudo sed -i 's/^[^#]*lima/#&/' /etc/ld.so.conf.d/00-arm-linux-gnueabihf.conf" ) ArmSystem("sudo ldconfig") pygame.time.delay(800) os.system("sudo reboot") else: self._Screen._MsgBox.SetText("Do it in GameShell") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False ## grep Driver /etc/xorg.conf | tr -s " " | cut -d " " -f3 ## "fbturbo" ## "modesetting" thedrv = "" if "arm" in platform.machine(): if FileExists("%s/.lima" % os.path.expanduser('~')): thedrv = "modesetting" else: thedrv = "fbturbo" if thedrv == "": thedrv = "fbturbo" for i in self._MyList: i._Active = False for i in self._MyList: if thedrv in i._Value: i._Active = True def OnReturnBackCb(self): pass """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * PageListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * PageListItem._Height, self._PsIndex * PageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height))
class PlayListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "Remove", "RTA", "Back", "Play/Pause"] _MyList = [] _ListFont = MyLangManager.TrFont("notosanscjk15") _Scroller = None _CurSongTime = "0:0" _BGpng = None _BGwidth = 75 _BGheight = 70 _Scrolled = 0 _CurSongName = "" def __init__(self): self._Icons = {} Page.__init__(self) self._CanvasHWND = None self._MyList = [] def SyncList(self): self._MyList = [] start_x = 0 start_y = 0 if myvars.Poller == None: return play_list = myvars.Poller.playlist() for i, v in enumerate(play_list): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFont if "title" in v: if isinstance(v["title"], (list, )): li.Init(" | ".join(v["title"])) else: li.Init(v["title"]) if "file" in v: li._Path = v["file"] elif "file" in v: li.Init(os.path.basename(v["file"])) li._Path = v["file"] else: li.Init("NoName") li._Labels["Text"]._PosX = 7 self._MyList.append(li) self.SyncPlaying() def GObjectInterval(self): ## 250 ms self.SyncPlaying() if self._Screen.CurPage() == self: self._Screen.Draw() self._Screen.SwapAndShow() return True def SyncPlaying(self): if myvars.Poller == None: return current_song = myvars.Poller.poll() for i, v in enumerate(self._MyList): self._MyList[i]._Playing = False self._MyList[i]._PlayingProcess = 0 if current_song != None: if "song" in current_song: posid = int(current_song["song"]) if posid < len(self._MyList): # out of index self._CurSongName = self._MyList[posid]._Text if "state" in current_song: if current_song["state"] == "stop": self._MyList[posid]._Playing = False else: self._MyList[posid]._Playing = True if "time" in current_song: self._CurSongTime = current_song["time"] times_ = current_song["time"].split(":") if len(times_) > 1: cur = float(times_[0]) end = float(times_[1]) pros = int((cur / end) * 100.0) self._MyList[posid]._PlayingProcess = pros def InPlayList(self, path): for i, v in enumerate(self._MyList): if v._Path == path: return True def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList() gobject.timeout_add(850, self.GObjectInterval) self._BGpng = IconItem() self._BGpng._ImgSurf = MyIconPool._Icons["heart"] self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel(MyLangManager.Tr("my favorite music"), MyLangManager.TrFont("varela18")) self._BGpng.SetLableColor(MySkinManager.GiveColor('Disabled')) self._BGpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height self._Scrolled += 1 def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height self._Scrolled -= 1 def SyncScroll(self): # show where it left if self._Scrolled == 0: return if self._PsIndex < len(self._MyList): cur_li = self._MyList[self._PsIndex] if self._Scrolled > 0: if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[ i]._Height elif self._Scrolled < 0: if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[ i]._Height def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] play_pos_id = myvars.Poller.play(self._PsIndex) self.SyncPlaying() self._Screen.Draw() self._Screen.SwapAndShow() def OnReturnBackCb(self): # return from music_lib_list_page self.SyncList() self.SyncScroll() def KeyDown(self, event): if IsKeyMenuOrB(event.key): if myvars.Poller != None: myvars.Poller.stop() self._CurSongTime = "" self._CurSongName = "" self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Right"]: #add self._Screen.PushCurPage() self._Screen.SetCurPage(myvars.MusicLibListPage) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: # del selected songs myvars.Poller.delete(self._PsIndex) self.SyncList() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() if event.key == CurKeys["X"]: # start spectrum myvars.SpectrumPage._Neighbor = self self._Screen.PushPage(myvars.SpectrumPage) self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: self._BGpng.NewCoord(self._Width / 2, self._Height / 2) self._BGpng.Draw() return else: if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw()
class PowerOptionsPage(Page): _FootMsg = ["Nav", "Detail", "", "Back", "Select"] _MyList = [] _ListFont = MyLangManager.TrFont("notosanscjk15") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _InfoPage = None def __init__(self): Page.__init__(self) self._Icons = {} def GenList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 supersaving = {} supersaving["key"] = "super" supersaving["label"] = "Power saving" supersaving["value"] = "supersaving" powersaving = {} powersaving["key"] = "saving" powersaving["label"] = "Balanced" powersaving["value"] = "powersaving" balance_saving = {} balance_saving["key"] = "balance" balance_saving["label"] = "Performance" balance_saving["value"] = "balance_saving" server_saving = {} server_saving["key"] = "server" server_saving["label"] = "Server" server_saving["value"] = "server" self._AList["supersaving"] = supersaving self._AList["powersaving"] = powersaving self._AList["server"] = server_saving self._AList["balance_saving"] = balance_saving for i, u in enumerate( ["supersaving", "powersaving", "server", "balance_saving"]): if u not in self._AList: continue v = self._AList[u] li = PageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont li._Active = False li._Value = self._AList[u]["value"] if self._AList[u]["label"] != "": li.Init(self._AList[u]["label"]) else: li.Init(self._AList[u]["key"]) last_height += li._Height self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) self._InfoPage = InfoPage() self._InfoPage._Screen = self._Screen self._InfoPage._Name = "Power option detail" self._InfoPage.Init() def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._Active == True: return for i in self._MyList: i._Active = False cur_li._Active = True print(cur_li._Value) with open(".powerlevel", "w") as f: f.write(cur_li._Value) config.PowerLevel = cur_li._Value if config.PowerLevel != "supersaving": os.system("sudo iw wlan0 set power_save off > /dev/null") else: os.system("sudo iw wlan0 set power_save on > /dev/null") self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.event.post(pygame.event.Event(POWEROPT, message="")) pygame.time.delay(1000) self._Screen.Draw() self._Screen.SwapAndShow() def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False with open(".powerlevel", "r") as f: powerlevel = f.read() powerlevel = powerlevel.strip() if powerlevel == "": powerlevel = "balance_saving" for i in self._MyList: if i._Value == powerlevel: i._Active = True def OnReturnBackCb(self): pass """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: cur_li = self._MyList[self._PsIndex] time1 = config.PowerLevels[cur_li._Value][0] time2 = config.PowerLevels[cur_li._Value][1] time3 = config.PowerLevels[cur_li._Value][2] self._InfoPage._Time1 = time1 self._InfoPage._Time2 = time2 self._InfoPage._Time3 = time3 self._Screen.PushPage(self._InfoPage) self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * PageListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * PageListItem._Height, self._PsIndex * PageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height))
class ListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "", "", "Back", "Enter"] _MyList = [] _ListFontObj = fonts["varela15"] _Scroller = None MyPages = [] basepath = None def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 start_x = 0 start_y = 0 if self.basepath not in sys.path: # add self as import path sys.path.append(self.basepath) for i, v in enumerate(self.MyPages): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj if v[1] != "": li.Init(v[1]) else: li.Init(v[0]) if FileExists(self.basepath + "/" + v[0]): li._LinkObj = __import__(v[0]) init_cb = getattr(li._LinkObj, "Init", None) if init_cb != None: if callable(init_cb): li._LinkObj.Init(self._Screen) self._MyList.append(li) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height def Click(self): cur_li = self._MyList[self._PsIndex] if cur_li._LinkObj != None: api_cb = getattr(cur_li._LinkObj, "API", None) if api_cb != None: if callable(api_cb): cur_li._LinkObj.API(self._Screen) def KeyDown(self, event): if event.key == CurKeys["B"] or event.key == CurKeys["Menu"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["A"]: self.Click() def Draw(self): self.ClearCanvas() if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class CoresPage(Page): _FootMsg = ["Nav","Del","Scan","Back",""] _MyList = [] _ListFontObj = MyLangManager.TrFont("varela13") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240-24-20 _DrawOnce = False _Scroller = None _EasingDur = 30 _CORES_PATH = "%s/apps/emulators" % os.path.expanduser('~') _Config =None _AllowedExts = [".so",".bin"] _HiddenSos = ["chailove_libretro.so","nxengine_libretro.so"] def __init__(self): Page.__init__(self) self._Icons = {} if "arm" in platform.machine(): pass def GenList(self): self._MyList = [] ## map ini to self._AList files_path = glob.glob(self._CORES_PATH+"/*") start_x = 10 start_y = 0 counter = 0 for i,v in enumerate( files_path): if os.path.basename(v) in self._HiddenSos: continue filename, file_extension = os.path.splitext(v) alias_file = filename+file_extension + ".alias" if file_extension in self._AllowedExts: li = InfoPageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + counter*InfoPageListItem._Height li._Width = Width-10 li._Fonts["normal"] = self._ListFontObj li._Fonts["small"] = MySkinManager.GiveFont("varela12") li._ReadOnly = True if os.path.isfile(alias_file): fp = open(alias_file, "r") alias = fp.read() alias = alias.strip() label_text = alias.decode("utf8") li.Init( label_text ) fp.close() else: li.Init( os.path.basename(v) ) li._Flag = v ##li.SetSmallText( v ) self._MyList.append(li) counter += 1 def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._CanvasHWND = self._Screen._CanvasHWND self._PosX = self._Index*self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height ps = InfoPageSelector() ps._PosX = 11 ps._Parent = self ps._Width = self._Width-10 self._Ps = ps self._PsIndex = 0 self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = 2 self._Scroller._PosY = 2 self._Scroller.Init() self._ConfirmBox = DeleteCoreConfirmPage() self._ConfirmBox._Screen = self._Screen self._ConfirmBox._Name = "Confirm to Delete?" self._ConfirmBox._Parent = self self._ConfirmBox.Init() def ReScan(self): self.GenList() self.RefreshPsIndex() def ConfirmBoxCallbackA(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] os.system("rm %s" % CmdClean(cur_li._Flag)) self.GenList() self.RefreshPsIndex() def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False self.GenList() def OnReturnBackCb(self): pass def KeyDown(self,event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["X"]: #Scan current self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: #del if len(self._MyList) == 0: return self._ConfirmBox.CallbackA = self.ConfirmBoxCallbackA self._Screen.PushPage(self._ConfirmBox) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) > 0: self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList)*InfoPageListItem._Height, self._PsIndex*InfoPageListItem._Height) self._Scroller.Draw()
class SkinsPage(Page): _FootMsg = ["Nav", "", "Scan", "Back", "Select"] _MyList = [] _ListFont = MyLangManager.TrFont("notosanscjk15") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _InfoPage = None def __init__(self): Page.__init__(self) self._Icons = {} def GenList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 skins = [["../skin/default", "Default"]] files_path = glob.glob("/home/cpi/skins/*") for i, v in enumerate(files_path): if os.path.isdir(v): bname = os.path.basename(v) print(v, bname) skins.append([v, bname]) for i, u in enumerate(skins): #print(i,u) li = PageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont li._Active = False li._Value = u[0] li.Init(u[1]) last_height += li._Height self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._Active == True: return print(cur_li._Value) for i in self._MyList: i._Active = False cur_li._Active = True self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() if "../skin/default" in cur_li._Value: os.system("rm %s/.gameshell_skin" % os.path.expanduser('~')) else: os.system("echo %s > %s/.gameshell_skin" % (cur_li._Value, os.path.expanduser('~'))) pygame.time.delay(700) pygame.event.post(pygame.event.Event(RESTARTUI, message="")) def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False for i in self._MyList: i._Active = False for i in self._MyList: if config.SKIN in i._Value: i._Active = True def OnReturnBackCb(self): pass """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["X"]: self.GenList() for i in self._MyList: i._Active = False for i in self._MyList: if config.SKIN in i._Value: i._Active = True self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * PageListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * PageListItem._Height, self._PsIndex * PageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height))
class GameStorePage(Page): _FootMsg = ["Nav", "Update", "Up", "Back", "Select"] _MyList = [] _ListFont12 = MyLangManager.TrFont("notosanscjk12") _ListFont15 = MyLangManager.TrFont("varela15") _AList = {} # _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _InfoPage = None _Downloading = None _aria2_db = "aria2tasks.db" _warehouse_db = "warehouse.db" _GobjTimer = -1 _Scrolled_cnt = 0 def __init__(self): Page.__init__(self) self._Icons = {} self._MyStack = RPCStack() #title file type ## Two level url , only github.com repos = [{ "title": "github.com/clockworkpi/warehouse", "file": "https://raw.githubusercontent.com/clockworkpi/warehouse/master/index.json", "type": "source" }] self._MyStack.Push(repos) def GObjectUpdateProcessInterval(self): ret = True dirty = False for x in self._MyList: if x._Type == "launcher" or x._Type == "pico8" or x._Type == "tic80": percent = config.RPC.getPercent(x._Value["file"]) if percent is not None: x.SetSmallText(str(percent) + "%") dirty = True else: x.SetSmallText("") if self._Screen.CurPage() == self and dirty == True: self._Screen.Draw() self._Screen.SwapAndShow() return ret def SyncWarehouse(self): try: conn = sqlite3.connect(self._warehouse_db) conn.row_factory = dict_factory c = conn.cursor() ret = c.execute("SELECT * FROM warehouse").fetchall() conn.close() return ret except Exception as ex: print(ex) return None return None def SyncTasks(self): try: conn = sqlite3.connect(self._aria2_db) conn.row_factory = dict_factory c = conn.cursor() ret = c.execute("SELECT * FROM tasks").fetchall() conn.close() return ret except Exception as ex: print(ex) return None return None def SyncList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 repos = [] stk = self._MyStack.Last() stk_lev = self._MyStack.Length() repos.extend(stk) add_new_house = [{ "title": "Add new warehouse...", "file": "master/index.json", "type": "add_house", "status": "complete" }] if stk_lev == 1: # on top ware_menu = self.SyncWarehouse() if ware_menu != None and len(ware_menu) > 0: #print(ware_menu) repos.extend(ware_menu) tasks_menu = self.SyncTasks() if tasks_menu != None and len(tasks_menu) > 0: #print(tasks_menu) repos.extend(tasks_menu) #print(repos) repos.extend(add_new_house) for i, u in enumerate(repos): #print(i,u) li = GameStoreListItem() li._CanvasHWND = self._CanvasHWND li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont15 li._Fonts["small"] = self._ListFont12 li._Active = False li._ReadOnly = True li._Value = u li._Type = u["type"] li.Init(u["title"]) if stk_lev > 1: remote_file_url = u["file"] menu_file = remote_file_url.split( "raw.githubusercontent.com")[1] local_menu_file = "%s/aria2download%s" % ( os.path.expanduser('~'), menu_file) if FileExists(local_menu_file): li._ReadOnly = False else: li._ReadOnly = True elif stk_lev == 1: if "status" in u: if u["status"] == "complete": li._ReadOnly = False if u["type"] == "source": li._ReadOnly = False last_height += li._Height if li._Type == "launcher" or li._Type == "pico8" or li._Type == "tic80": li.SetSmallText("") self._MyList.append(li) self.RefreshPsIndex() def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = InfoPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._CanvasHWND) self._remove_page = YesCancelConfirmPage() self._remove_page._Screen = self._Screen self._remove_page._StartOrA_Event = self.RemoveGame self._remove_page._Name = "Are you sure?" self._remove_page.Init() self._Keyboard = Keyboard() self._Keyboard._Name = "Enter warehouse addr" self._Keyboard._FootMsg = ["Nav.", "Add", "ABC", "Backspace", "Enter"] self._Keyboard._Screen = self._Screen self._Keyboard.Init() self._Keyboard.SetPassword("github.com/clockworkpi/warehouse") self._Keyboard._Caller = self self._PreviewPage = ImageDownloadProcessPage() self._PreviewPage._Screen = self._Screen self._PreviewPage._Name = "Preview" self._PreviewPage.Init() self._LoadHousePage = LoadHousePage() self._LoadHousePage._Screen = self._Screen self._LoadHousePage._Name = "Warehouse" self._LoadHousePage._Caller = self self._LoadHousePage.Init() def ResetHouse(self): if self._PsIndex > len(self._MyList) - 1: return cur_li = self._MyList[self._PsIndex] if cur_li._Value["type"] == "source": remote_file_url = cur_li._Value["file"] menu_file = remote_file_url.split("raw.githubusercontent.com")[ 1] #assume master branch local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'), menu_file) local_menu_file_path = os.path.dirname(local_menu_file) print(local_menu_file_path) local_jsons = glob.glob(local_menu_file_path + "/**/*.json") try: if os.path.exists(local_menu_file): os.remove(local_menu_file) if os.path.exists(local_menu_file + ".aria2"): os.remove(local_menu_file + ".aria2") for x in local_jsons: os.remove(x) except Exception as ex: print(ex) self._Screen._MsgBox.SetText("Done") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() def LoadHouse(self): if self._PsIndex > len(self._MyList) - 1: return cur_li = self._MyList[self._PsIndex] if cur_li._Value["type"] == "source" or cur_li._Value["type"] == "dir": self._LoadHousePage._URL = cur_li._Value["file"] self._Screen.PushPage(self._LoadHousePage) self._Screen.Draw() self._Screen.SwapAndShow() def PreviewGame(self): if self._PsIndex > len(self._MyList) - 1: return cur_li = self._MyList[self._PsIndex] if cur_li._Value["type"] == "launcher" or cur_li._Value[ "type"] == "pico8" or cur_li._Value["type"] == "tic80": if "shots" in cur_li._Value: print(cur_li._Value["shots"]) self._PreviewPage._URL = cur_li._Value["shots"] self._Screen.PushPage(self._PreviewPage) self._Screen.Draw() self._Screen.SwapAndShow() def RemoveGame(self): if self._PsIndex > len(self._MyList) - 1: return cur_li = self._MyList[self._PsIndex] #if cur_li._Active == True: # return print("Remove cur_li._Value", cur_li._Value) if cur_li._Value["type"] == "source": print("remove a source") try: conn = sqlite3.connect(self._warehouse_db) conn.row_factory = dict_factory c = conn.cursor() c.execute("DELETE FROM warehouse WHERE file = '%s'" % cur_li._Value["file"]) conn.commit() conn.close() except Exception as ex: print(ex) elif cur_li._Value["type"] == "launcher" or cur_li._Value[ "type"] == "pico8" or cur_li._Value["type"] == "tic80": remote_file_url = cur_li._Value["file"] menu_file = remote_file_url.split("raw.githubusercontent.com")[1] local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'), menu_file) local_menu_file_path = os.path.dirname(local_menu_file) gid, ret = config.RPC.urlDownloading(remote_file_url) if ret == True: config.RPC.remove(gid) try: if os.path.exists(local_menu_file): os.remove(local_menu_file) if os.path.exists(local_menu_file + ".aria2"): os.remove(local_menu_file + ".aria2") if os.path.exists( os.path.join(local_menu_file_path, cur_li._Value["title"])): rmtree( os.path.join(local_menu_file_path, cur_li._Value["title"])) except Exception as ex: print(ex) def Click(self): if self._PsIndex > len(self._MyList) - 1: return cur_li = self._MyList[self._PsIndex] #if cur_li._Active == True: # return print("cur_li._Value", cur_li._Value) if cur_li._Value["type"] == "source" or cur_li._Value["type"] == "dir": remote_file_url = cur_li._Value["file"] menu_file = remote_file_url.split("raw.githubusercontent.com")[ 1] #assume master branch local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'), menu_file) print(local_menu_file) if FileExists(local_menu_file) == False: self.LoadHouse() else: #read the local_menu_file, push into stack,display menu self._Downloading = None try: with open(local_menu_file) as json_file: local_menu_json = json.load(json_file) print(local_menu_json) self._MyStack.Push(local_menu_json["list"]) self.SyncList() self._Screen.Draw() self._Screen.SwapAndShow() except Exception as ex: print(ex) self._Screen._MsgBox.SetText("Open house failed ") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() elif cur_li._Value["type"] == "add_house": print("show keyboard to add ware house") self._Screen.PushCurPage() self._Screen.SetCurPage(self._Keyboard) else: #download the game probably remote_file_url = cur_li._Value["file"] menu_file = remote_file_url.split("raw.githubusercontent.com")[1] local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'), menu_file) if FileExists(local_menu_file) == False: gid, ret = config.RPC.urlDownloading(remote_file_url) if ret == False: gid = config.RPC.addUri(remote_file_url, options={"out": menu_file}) self._Downloading = gid print("stack length ", self._MyStack.Length()) """ if self._MyStack.Length() > 1:## not on the top list page try: conn = sqlite3.connect(self._aria2_db) c = conn.cursor() c.execute("INSERT INTO tasks(gid,title,file,type,status,fav) VALUES ('"+gid+"','"+cur_li._Value["title"]+"','"+cur_li._Value["file"]+"','"+cur_li._Value["type"]+"','active','0')") conn.commit() conn.close() except Exception as ex: print("SQLITE3 ",ex) """ else: print( config.RPC.tellStatus( gid, ["status", "totalLength", "completedLength"])) self._Screen._MsgBox.SetText("Getting the game now") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.time.delay(800) self._Screen._TitleBar.Redraw() else: print("file downloaded" ) # maybe check it if is installed,then execute it if cur_li._Value[ "type"] == "launcher" and cur_li._ReadOnly == False: local_menu_file_path = os.path.dirname(local_menu_file) game_sh = os.path.join(local_menu_file_path, cur_li._Value["title"], cur_li._Value["title"] + ".sh") #game_sh = reconstruct_broken_string( game_sh) print("run game: ", game_sh, os.path.exists(game_sh)) self._Screen.RunEXE(game_sh) if cur_li._Value[ "type"] == "pico8" and cur_li._ReadOnly == False: if os.path.exists( "/home/cpi/games/PICO-8/pico-8/pico8") == True: game_sh = "/home/cpi/launcher/Menu/GameShell/50_PICO-8/PICO-8.sh" self._Screen.RunEXE(game_sh) else: self._Screen._MsgBox.SetText("Purchase pico8") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.time.delay(800) if cur_li._Value[ "type"] == "tic80" and cur_li._ReadOnly == False: game_sh = "/home/cpi/apps/Menu/51_TIC-80/TIC-80.sh" self._Screen.RunEXE(game_sh) def OnAria2CompleteCb(self, gid): print("OnAria2CompleteCb ", gid) self.SyncList() self._Screen.Draw() self._Screen.SwapAndShow() def raw_github_com(self, _url): #eg: github.com/clockworkpi/warehouse if _url.startswith("github.com") == False: return False parts = _url.split("/") if len(parts) != 3: return False return "/".join([ "https://raw.githubusercontent.com", parts[1], parts[2], "master/index.json" ]) def OnKbdReturnBackCb(self): inputed = "".join(self._Keyboard._Textarea._MyWords).strip() inputed = inputed.replace("http://", "") inputed = inputed.replace("https://", "") if inputed.endswith(".git"): inputed = inputed[:len(inputed) - 4] if inputed.endswith("/"): inputed = inputed[:len(inputed) - 1] print("last: ", inputed) try: conn = sqlite3.connect(self._warehouse_db) conn.row_factory = dict_factory c = conn.cursor() ret = c.execute("SELECT * FROM warehouse WHERE title='%s'" % inputed).fetchone() if ret != None: self._Screen._MsgBox.SetText("Warehouse existed!") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() else: if "github.com/clockworkpi/warehouse" in inputed: self._Screen._MsgBox.SetText("Warehouse existed!") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() else: valid_url = self.raw_github_com(inputed) if valid_url == False: self._Screen._MsgBox.SetText("Warehouse url error!") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() else: sql_insert = """ INSERT INTO warehouse(title,file,type) VALUES( '%s', '%s', 'source');""" % (inputed, valid_url) c.execute(sql_insert) conn.commit() self.SyncList() self._Screen.Draw() self._Screen.SwapAndShow() conn.close() except Exception as ex: print(ex) def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False #sync print("OnLoadCb") if self._MyStack.Length() == 1: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Update" else: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Preview" self._GobjTimer = gobject.timeout_add( 500, self.GObjectUpdateProcessInterval) self.SyncList() def OnReturnBackCb(self): if self._MyStack.Length() == 1: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Update" else: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Preview" self.SyncList() self.RestoreScrolled() self._Screen.Draw() self._Screen.SwapAndShow() """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ # def ScrollDown(self): # if len(self._MyList) == 0: # return # self._PsIndex += 1 # if self._PsIndex >= len(self._MyList): # self._PsIndex = len(self._MyList)-1 # cur_li = self._MyList[self._PsIndex] # if cur_li._PosY+cur_li._Height > self._Height: # for i in range(0, len(self._MyList)): # self._MyList[i]._PosY -= self._MyList[i]._Height # self._Scrolled_cnt -= self._MyList[i]._Height # def ScrollUp(self): # if len(self._MyList) == 0: # return # self._PsIndex -= 1 # if self._PsIndex < 0: # self._PsIndex = 0 # cur_li = self._MyList[self._PsIndex] # if cur_li._PosY < 0: # for i in range(0, len(self._MyList)): # self._MyList[i]._PosY += self._MyList[i]._Height # self._Scrolled_cnt += self._MyList[i]._Height def KeyDown(self, event): if IsKeyMenuOrB(event.key): if self._MyStack.Length() > 1: self._MyStack.Pop() if self._MyStack.Length() == 1: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Update" else: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Preview" if self._MyStack.Length() == 2: self._FootMsg[2] = "" self._FootMsg[1] = "" self.SyncList() self._Screen.Draw() self._Screen.SwapAndShow() elif self._MyStack.Length() == 1: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() gobject.source_remove(self._GobjTimer) if IsKeyStartOrA(event.key): self.Click() if self._MyStack.Length() == 1: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Update" else: self._FootMsg[2] = "Remove" self._FootMsg[1] = "Preview" if self._MyStack.Length() == 2: self._FootMsg[2] = "" self._FootMsg[1] = "" self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["X"]: #print(self._MyStack.Length() ) if self._PsIndex <= len(self._MyList) - 1: cur_li = self._MyList[self._PsIndex] if cur_li._Type != "dir": if self._MyStack.Length() == 1 and self._PsIndex == 0: pass #predefined source else: self._Screen.PushPage(self._remove_page) self._remove_page._StartOrA_Event = self.RemoveGame self._Screen.Draw() self._Screen.SwapAndShow() return self.SyncList() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: if self._MyStack.Length() == 1: self.ResetHouse() else: self.PreviewGame() if event.key == CurKeys["Up"]: # self.ScrollUp() self.SpeedScroll(event.key) self.ScrollUp(self._ScrollStep) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: # self.ScrollDown() self.SpeedScroll(event.key) self.ScrollDown(self._ScrollStep) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Right"]: # PageDown self.ScrollDown(5) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Left"]: # PageUp self.ScrollUp(5) self._Screen.Draw() self._Screen.SwapAndShow() def RestoreScrolled(self): for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled_cnt def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * self._MyList[0]._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * self._MyList[0]._Height, self._PsIndex * self._MyList[0]._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height))
class ListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "", "", "Back", "Enter"] _MyList = [] _ListFontObj = MyLangManager.TrFont("varela15") _Scroller = None def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = InfoPageSelector() ps._Parent = self ps._PosX = 2 self._Ps = ps self._PsIndex = 0 # "" pkgname, label alist = [ # ["","Airplane","Airplane Mode"], # haven't looked at this yet ["", "PowerOptions", "Power Options"], # haven't looked at this yet # ["","Wifi","Wi-Fi"], # currently lists networks, but doesn't know we're connected ["", "Bluetooth", "Bluetooth" ], # haven't looked at this much yet, but it lists devices ["", "Sound", "Sound Volume"], ["", "Brightness", "BackLight Brightness"], ["", "Storage", ""], # reports 6.6gb of total storage? I thought CHIP was 4gb # ["","Time","Timezone"], # lists timezones, but hangs on selection ["", "Languages", "Languages"], # works, but haven't localized new stuff yet # ["","Update", ""], # not needed, we can update manually for now ["", "About", "About"], ["", "PowerOFF", "Power OFF"], # ["","ButtonsLayout","Buttons Layout"], # not needed, this is just for switching between snes/xbox layouts # ["","GateWay","Network gateway switch"] # haven't looked at this yet ] start_x = 0 start_y = 0 sys.path.append(myvars.basepath) # add self as import path for i, v in enumerate(alist): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj if v[2] != "": li.Init(v[2]) else: li.Init(v[1]) #if v[1] == "Wifi" or v[1] == "Sound" or v[1] == "Brightness" or v[1] == "Storage" or v[1] == "Update" or v[1] == "About" or v[1] == "PowerOFF" or v[1] == "HelloWorld": if FileExists(myvars.basepath + "/" + v[1]): li._LinkObj = __import__(v[1]) init_cb = getattr(li._LinkObj, "Init", None) if init_cb != None: if callable(init_cb): li._LinkObj.Init(self._Screen) self._MyList.append(li) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def Click(self): cur_li = self._MyList[self._PsIndex] if cur_li._LinkObj != None: api_cb = getattr(cur_li._LinkObj, "API", None) if api_cb != None: if callable(api_cb): cur_li._LinkObj.API(self._Screen) def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() def Draw(self): self.ClearCanvas() if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class NotificationPage(Page): _FootMsg = ["Nav", "", "", "Back", "Toggle"] _MyList = [] _ListFontObj = MyLangManager.TrFont("varela13") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _EasingDur = 30 _GSNOTIFY_CFG = "gsnotify/gsnotify.cfg" _GSNOTIFY_SOCKET = "/tmp/gsnotify.sock" _Config = None def __init__(self): Page.__init__(self) self._Icons = {} def ReadConfig(self, fname): if FileExists(fname): if self._Config == None: self._Config = ConfigParser.ConfigParser() self._Config.optionxform = str self._Config.read(fname) else: print(fname, "not found") def GenList(self): if self._Config == None: return self._AList = {} self._MyList = [] ## map ini to self._AList for i, v in enumerate(self._Config.items("Settings")): self._AList[v[0]] = v[ 1] ## {'BGCOLOR': '#eab934', 'Enabled': 'False',...} start_x = 10 start_y = 0 for i, v in enumerate(self._AList): li = InfoPageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i * InfoPageListItem._Height li._Width = Width - 10 li._Fonts["normal"] = self._ListFontObj li._Fonts["small"] = fonts["varela12"] li.Init(v) li._Flag = v li.SetSmallText(self._AList[v]) if v != "Enabled": li._ReadOnly = True self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._CanvasHWND = self._Screen._CanvasHWND self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height ps = InfoPageSelector() ps._PosX = 11 ps._Parent = self ps._Width = self._Width - 10 self._Ps = ps self._PsIndex = 0 self.ReadConfig(self._GSNOTIFY_CFG) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = 2 self._Scroller._PosY = 2 self._Scroller.Init() def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] print("Click ", cur_li._Flag) def SendMsgToUnixSocket(self, msg): if FileExists(self._GSNOTIFY_SOCKET) == False: print(self._GSNOTIFY_SOCKET, " not existed") return try: s = socket.socket(socket.AF_UNIX) s.settimeout(1) # 1 second timeout s.connect(self._GSNOTIFY_SOCKET) s.send(msg) data = s.recv(1024) print("received: {}".format(data)) s.close() except Exception as err: print(err) ## print error ,but ignore it def ToggleEnable(self): print("ToggleEnable") if self._Config == None: return e = self._Config.get("Settings", "Enabled") if e == "False": self.SendMsgToUnixSocket("Enable") else: self.SendMsgToUnixSocket("Disable") def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False self.GenList() def OnReturnBackCb(self): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() def KeyDown(self, event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["B"]: self.ToggleEnable() self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.time.delay(1000) self.ReadConfig(self._GSNOTIFY_CFG) self.GenList() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() self._Ps.Draw() if len(self._MyList) > 0: for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList) * InfoPageListItem._Height, self._PsIndex * InfoPageListItem._Height) self._Scroller.Draw()
class PlayListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "", "Remove", "Back", "Play/Pause"] _MyList = [] _ListFont = fonts["notosanscjk15"] _Scroller = None _BGpng = None _BGwidth = 75 _BGheight = 70 def __init__(self): self._Icons = {} Page.__init__(self) self._CanvasHWND = None self._MyList = [] def SyncList(self): self._MyList = [] start_x = 0 start_y = 0 if myvars.Poller == None: return play_list = myvars.Poller.playlist() for i, v in enumerate(play_list): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFont if "title" in v: li.Init(v["title"]) if "file" in v: li._Path = v["file"] elif "file" in v: li.Init(os.path.basename(v["file"])) li._Path = v["file"] else: li.Init("NoName") li._Labels["Text"]._PosX = 7 self._MyList.append(li) self.SyncPlaying() def GObjectInterval(self): ## 250 ms if self._Screen.CurPage() == self: self.SyncPlaying() self._Screen.Draw() self._Screen.SwapAndShow() return True def SyncPlaying(self): if myvars.Poller == None: return current_song = myvars.Poller.poll() for i, v in enumerate(self._MyList): self._MyList[i]._Playing = False self._MyList[i]._PlayingProcess = 0 if current_song != None: if "song" in current_song: posid = int(current_song["song"]) if posid < len(self._MyList): # out of index if "state" in current_song: if current_song["state"] == "stop": self._MyList[posid]._Playing = False else: self._MyList[posid]._Playing = True if "time" in current_song: times_ = current_song["time"].split(":") if len(times_) > 1: cur = float(times_[0]) end = float(times_[1]) pros = int((cur / end) * 100.0) self._MyList[posid]._PlayingProcess = pros def InPlayList(self, path): for i, v in enumerate(self._MyList): if v._Path == path: return True def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList() gobject.timeout_add(850, self.GObjectInterval) self._BGpng = IconItem() self._BGpng._ImgSurf = MyIconPool._Icons["heart"] self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel("my favourites", fonts["varela18"]) self._BGpng.SetLableColor(pygame.Color(204, 204, 204)) self._BGpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] play_pos_id = myvars.Poller.play(self._PsIndex) self.SyncPlaying() self._Screen.Draw() self._Screen.SwapAndShow() def OnReturnBackCb(self): self.SyncList() def KeyDown(self, event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: if myvars.Poller != None: myvars.Poller.stop() self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Right"]: #add self._Screen.PushCurPage() self._Screen.SetCurPage(myvars.MusicLibListPage) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: # del selected songs myvars.Poller.delete(self._PsIndex) self.SyncList() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Enter"]: self.Click() if event.key == CurKeys["Start"]: # start spectrum self._Screen.PushPage(myvars.SpectrumPage) self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: self._BGpng.NewCoord(self._Width / 2, self._Height / 2) self._BGpng.Draw() return else: if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class MusicLibListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "", "Scan", "Back", "Add to Playlist"] _MyList = [] _SwapMyList = [] _ListFont = MyLangManager.TrFont("notosanscjk15") _MyStack = None _Scroller = None _BGpng = None _BGwidth = 56 _BGheight = 70 def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] self._SwapMyList = [] self._MyStack = MusicLibStack() def SyncList(self, path): if myvars.Poller == None: return alist = myvars.Poller.listfiles(path) if alist == False: print("listfiles return false") return self._MyList = [] self._SwapMyList = [] start_x = 0 start_y = 0 hasparent = 0 if self._MyStack.Length() > 0: hasparent = 1 li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["DIR"] li._Parent = self li.Init("[..]") self._MyList.append(li) for i, v in enumerate(sorted(alist)): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + (i + hasparent) * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["FILE"] li._Parent = self if "directory" in v: li._MyType = ICON_TYPES["DIR"] dir_base_name = os.path.basename(v["directory"]) li.Init(dir_base_name) li._Path = v["directory"] elif "file" in v: bname = os.path.basename(v["file"]) li.Init(bname) li._Path = v["file"] else: li.Init("NoName") self._MyList.append(li) for i in self._MyList: self._SwapMyList.append(i) def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList("/") icon_for_list = MultiIconItem() icon_for_list._ImgSurf = MyIconPool._Icons["sys"] icon_for_list._MyType = ICON_TYPES["STAT"] icon_for_list._Parent = self icon_for_list.Adjust(0, 0, 18, 18, 0) self._Icons["sys"] = icon_for_list self._BGpng = IconItem() self._BGpng._ImgSurf = MyIconPool._Icons["empty"] self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel(MyLangManager.Tr("Please upload data over Wi-Fi"), MyLangManager.TrFont("varela22")) self._BGpng.SetLableColor(MySkinManager.GiveColor('Disabled')) self._BGpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._MyType == ICON_TYPES["DIR"]: if cur_li._Path == "[..]": self._MyStack.Pop() self.SyncList(self._MyStack.Last()) self._PsIndex = 0 else: self._MyStack.Push(self._MyList[self._PsIndex]._Path) self.SyncList(self._MyStack.Last()) self._PsIndex = 0 if cur_li._MyType == ICON_TYPES["FILE"]: ## add to playlist only myvars.Poller.addfile(cur_li._Path) myvars.PlayListPage.SyncList() print("add", cur_li._Path) self._Screen.Draw() self._Screen.SwapAndShow() def Rescan(self): self.SyncList("/") self._PsIndex = 0 def KeyDown(self, event): if IsKeyMenuOrB(event.key) or event.key == CurKeys["Left"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() """ if event.key == CurKeys["Right"]: self.FScrollDown(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Left"]: self.FScrollUp(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() """ if event.key == CurKeys["X"]: self.Rescan() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() def Draw(self): self.ClearCanvas() """ start_x = 0 start_y = 0 counter = 0 self._MyList = [] for i,v in enumerate(self._SwapMyList): if myvars.PlayListPage.InPlayList(v._Path): v._Active = True else: v._Active = False if v._Active == False: v.NewCoord(start_x, start_y+counter* ListItem._Height) counter+=1 self._MyList.append(v) """ if len(self._MyList) == 0: self._BGpng.NewCoord(self._Width / 2, self._Height / 2) self._BGpng.Draw() return else: if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if myvars.PlayListPage.InPlayList(i._Path): i._Active = True else: i._Active = False if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if myvars.PlayListPage.InPlayList(i._Path): i._Active = True else: i._Active = False if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw()
class NotificationPage(Page): _FootMsg = ["Nav", "", "", "Back", "Toggle"] _MyList = [] _ListFontObj = MyLangManager.TrFont("varela13") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _EasingDur = 30 _GSNOTIFY_JOBS = "gsnotify/Jobs" _GSNOTIFY_SOCKET = "/tmp/gsnotify.sock" _Config = None _AllowedExts = [".sh", ".lsp", ".lua", ".bin", ".py", ".js"] def __init__(self): Page.__init__(self) self._Icons = {} if "arm" in platform.machine(): os.system("git config --global core.filemode false") def GenList(self): self._MyList = [] ## map ini to self._AList files_path = glob.glob(self._GSNOTIFY_JOBS + "/*") start_x = 10 start_y = 0 counter = 0 for i, v in enumerate(files_path): filename, file_extension = os.path.splitext(v) alias_file = filename + ".alias" if file_extension in self._AllowedExts: li = NotifyJobListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + counter * InfoPageListItem._Height li._Width = Width - 10 li._Fonts["normal"] = self._ListFontObj li._Fonts["small"] = fonts["varela12"] if IsExecutable(v): li._ReadOnly = True if os.path.isfile(alias_file): fp = open(alias_file, "r") alias = fp.read() alias = alias.strip() label_text = alias.decode("utf8") li.Init(label_text) fp.close() else: li.Init(os.path.basename(v)) li._Flag = v ##li.SetSmallText( v ) self._MyList.append(li) counter += 1 def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._CanvasHWND = self._Screen._CanvasHWND self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height ps = InfoPageSelector() ps._PosX = 11 ps._Parent = self ps._Width = self._Width - 10 self._Ps = ps self._PsIndex = 0 self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = 2 self._Scroller._PosY = 2 self._Scroller.Init() def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] #print("Click ",cur_li._Flag) if IsExecutable(cur_li._Flag): os.system("chmod -x " + cur_li._Flag) else: os.system("chmod +x " + cur_li._Flag) self.GenList() def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False self.GenList() def OnReturnBackCb(self): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() def KeyDown(self, event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["B"]: self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.time.delay(638) self.Click() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() self._Ps.Draw() if len(self._MyList) > 0: for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList) * InfoPageListItem._Height, self._PsIndex * InfoPageListItem._Height) self._Scroller.Draw()
class WifiList(Page): _WirelessList = [] #Wicd dbus part _Wireless = None _Daemon = None _Dbus = None _WifiPassword = "" _Connecting = False _Scanning = False _PrevWicdState = None _Selector = None _ShowingMessageBox = False _MsgBox = None _ConnectTry = 0 _BlockingUI = False _BlockCb = None _LastStatusMsg = "" _FootMsg = ["Nav.","Scan","Info","Back","Enter"] _EncMethods = None _Scroller = None _ListFontObj = fonts["notosanscjk15"] _InfoPage = None def __init__(self): Page.__init__(self) self._WirelessList = [] self._CanvasHWND = None def ShowBox(self,msg): self._MsgBox._Text = msg self._ShowingMessageBox = True self._Screen.Draw() self._MsgBox.Draw() self._Screen.SwapAndShow() def HideBox(self): self.Draw() self._ShowingMessageBox = False self._Screen.SwapAndShow() def GenNetworkList(self): self._WirelessList = [] start_x = 0 start_y = 0 for network_id in range(0,self._Wireless.GetNumberOfNetworks()): is_active = \ self._Wireless.GetCurrentSignalStrength("") != 0 and \ self._Wireless.GetCurrentNetworkID(self._Wireless.GetIwconfig()) == network_id \ and self._Wireless.GetWirelessIP('') is not None ni = NetItem() ni._Parent = self ni._PosX = start_x ni._PosY = start_y + network_id* NetItem._Height ni._Width = Width ni._FontObj = self._ListFontObj #ni._Bssid = self._Wireless.GetWirelessProperty(network_id,"bssid") ni.Init(network_id,is_active) self._WirelessList.append(ni) self._PsIndex = 0 def Disconnect(self): self._Connecting= False self._Daemon.Disconnect() ## force to disconnect def ShutDownConnecting(self): print("Shutdownconnecting...",self._ConnectTry) self._Daemon.CancelConnect() self._Daemon.SetForcedDisconnect(True) self._Connecting = False def Rescan(self,sync=False): print("start Rescan") if self._Wireless != None: self._Wireless.Scan(sync) ## dbus signal functions def DbusScanFinishedSig(self): if self._Screen._CurrentPage != self: return self.ResetPageSelector() self.UpdateNetList(force_check=True) self._Scanning = False self.HideBox() self._BlockingUI = False print("dbus says scan finished") def DbusScanStarted(self): if self._Screen._CurrentPage !=self: return self._Scanning = True self.ShowBox("Wifi scanning...") self._BlockingUI = True print("dbus says start scan...") def UpdateNetList(self,state=None,info=None,force_check=False,firstrun=False): if self._Daemon == None: return if not state: state,trash = self._Daemon.GetConnectionStatus() print("state") pp(state) print("Trash: ") pp(trash) if force_check or self._PrevWicdState != state: self.GenNetworkList() ## refresh the network list if info != None: if len(info) > 3: _id = int(info[3]) if _id < len(self._WirelessList): self._WirelessList[_id].UpdateStrenLabel( str(info[2])) self._PrevWicdState = state def SetConnectingStatus(self,fast): wireless_connecting = self._Wireless.CheckIfWirelessConnecting() """ if self._ConnectTry > 5000: #wicd itself will take a very long time to try to connect ,will not block forever,just make it faster to dropout self.ShutDownConnecting() self._ConnectTry = 0 self._BlockingUI = False return False """ if wireless_connecting: if not fast: iwconfig = self._Wireless.GetIwconfig() else: iwconfig = '' essid = self._Wireless.GetCurrentNetwork(iwconfig) stat = self._Wireless.CheckWirelessConnectingMessage() if self._LastStatusMsg != "%s: %s"%(essid,stat): print("%s: %s" %(essid,stat)) self._LastStatusMsg = "%s: %s"%(essid,stat) self.ShowBox(self._LastStatusMsg) self._Screen._FootBar.UpdateNavText(self._LastStatusMsg) SwapAndShow() #self._ConnectTry+=1 return True else: self._Connecting = False return self._Connecting def UpdateStatus(self): print("UpdateStatus") wireless_connecting = self._Wireless.CheckIfWirelessConnecting() fast = not self._Daemon.NeedsExternalCalls() self._Connecting = wireless_connecting if self._Connecting: gobject.timeout_add(250,self.SetConnectingStatus,fast) else: if not fast: iwconfig = self._Wireless.GetIwconfig() else: iwconfig = '' if self.CheckForWireless(iwconfig,self._Wireless.GetWirelessIP(''),None): return True else: print("Not Connected") return True def DbusDaemonStatusChangedSig(self,state=None,info=None): if self._Screen._CurrentPage != self: return print("in DbusDaemonStatusChangedSig") """ dbus.UInt32(2L) ['192.168.31.141', 'TP-LINK4G', '88', '0', '72.2 Mb/s'] """ # pp(info) self.UpdateNetList(state,info) if info != None: self._Screen.Draw() self._Screen.SwapAndShow() def DbusConnectResultsSent(self,result): print(" in DbusConnectResultsSent") """ in DbusConnectResultsSent 'dhcp_failed' dbus says start scan... """ if result != None: print(result) self._Connecting = False self._BlockingUI = False if self._BlockCb != None: self._BlockCb() self._BlockCb = None self._Screen._FootBar.ResetNavText() def CheckForWireless(self,iwconfig,wireless_ip,set_status): if not wireless_ip: return False network = self._Wireless.GetCurrentNetwork(iwconfig) if not network: return False network = misc.to_unicode(network) if daemon.GetSignalDisplayType() == 0: strength = self._Wireless.GetCurrentSignalStrength(iwconfig) else: strength = self._Wireless.GetCurrentDBMStrength(iwconfig) if strength is None: return False strength = misc.to_unicode(self._Daemon.FormatSignalForPrinting(strength)) ip = misc.to_unicode(wireless_ip) print(_('Connected to $A at $B (IP: $C)').replace ('$A', network).replace ('$B', strength).replace ('$C', ip)) return True def ConfigWireless(self,password): netid = self._PsIndex print(netid," ", password) """ self._Wireless.SetWirelessProperty(netid,"dhcphostname","GameShell") self._Wireless.SetWirelessProperty(netid,"ip","None") self._Wireless.SetWirelessProperty(netid,"dns_domain","None") self._Wireless.SetWirelessProperty(netid,"gateway","None") self._Wireless.SetWirelessProperty(netid,"use_global_dns",0) self._Wireless.SetWirelessProperty(netid,"netmask","None") self._Wireless.SetWirelessProperty(netid,"usedhcphostname",0) ## set 1 to use hostname above self._Wireless.SetWirelessProperty(netid,"bitrate","auto") self._Wireless.SetWirelessProperty(netid,"allow_lower_bitrates",0) self._Wireless.SetWirelessProperty(netid,"dns3","None") self._Wireless.SetWirelessProperty(netid,"dns2","None") self._Wireless.SetWirelessProperty(netid,"dns1","None") self._Wireless.SetWirelessProperty(netid,"use_settings_globally",0) self._Wireless.SetWirelessProperty(netid,"use_static_dns",0) self._Wireless.SetWirelessProperty(netid,"search_domain","None") """ self._Wireless.SetWirelessProperty(netid,"enctype","wpa-psk") self._Wireless.SetWirelessProperty(netid,"apsk",password) self._Wireless.SetWirelessProperty(netid,"automatic",1) self.ShowBox("Connecting...") self._WirelessList[netid].Connect() print("after Connect") self.UpdateStatus() def GetWirelessEncrypt(self,network_id): results = [] activeID = -1 for x,enc_type in enumerate(self._EncMethods): if enc_type["type"] == self._Wireless.GetWirelessProperty(network_id,"enctype"): activeID = x break if activeID == -1: return results for type_ in ['required','optional']: fields = self._EncMethods[activeID][type_] for field in fields: try: text = field[1].lower().replace(' ','_') except KeyError: text = field[1].replace(' ','_') value = self._Wireless.GetWirelessProperty(network_id, field[0]) results.append({text:value}) """ [{'preshared_key': 'blah blah blah',},] or nothing [{'identity': None,},{'password': None,},] """ return results def ScrollUp(self): if len(self._WirelessList) == 0: return self._PsIndex-=1 if self._PsIndex < 0: self._PsIndex = 0 cur_ni = self._WirelessList[self._PsIndex] if cur_ni._PosY < 0: for i in range(0,len(self._WirelessList)): self._WirelessList[i]._PosY += self._WirelessList[i]._Height def ScrollDown(self): if len(self._WirelessList) == 0: return self._PsIndex+=1 if self._PsIndex >= len(self._WirelessList): self._PsIndex = len(self._WirelessList) -1 cur_ni = self._WirelessList[self._PsIndex] if cur_ni._PosY + cur_ni._Height > self._Height: for i in range(0,len(self._WirelessList)): self._WirelessList[i]._PosY -= self._WirelessList[i]._Height def AbortedAndReturnToUpLevel(self): self.HideBox() self._Screen._FootBar.ResetNavText() self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() def KeyDown(self,event): # if self._BlockingUI == True: # print("UI blocking ...") # return if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: if self._Wireless != None: wireless_connecting = self._Wireless.CheckIfWirelessConnecting() if wireless_connecting: self.ShutDownConnecting() self.ShowBox("ShutDownConnecting...") self._BlockingUI=True self._BlockCb = self.AbortedAndReturnToUpLevel else: self.AbortedAndReturnToUpLevel() else: self.HideBox() self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Enter"]: ## enter to set password,enter is B on GM if len(self._WirelessList) == 0: return wicd_wirelss_encrypt_pwd = self.GetWirelessEncrypt(self._PsIndex) if self._WirelessList[self._PsIndex]._IsActive: self.ShowBox( self._Wireless.GetWirelessIP('') ) else: self._Screen.PushCurPage() self._Screen.SetCurPage( myvars.PasswordPage ) thepass = "" for i in wicd_wirelss_encrypt_pwd: if "preshared_key" in i: if i["preshared_key"] != None: if len(i["preshared_key"]) > 0: thepass = i["preshared_key"] break myvars.PasswordPage.SetPassword(thepass) self._Screen.Draw() self._Screen.SwapAndShow() """ try: self._Screen.Draw() self._Screen.SwapAndShow() except Exception as e: print(e) exit(-1) """ if event.key == CurKeys["X"]: self.Rescan(False) if event.key == CurKeys["Y"]: if len(self._WirelessList) == 0: return self._InfoPage._NetworkId = self._PsIndex self._InfoPage._Wireless = self._Wireless self._InfoPage._Daemon = self._Daemon self._Screen.PushPage(self._InfoPage) self._Screen.Draw() self._Screen.SwapAndShow() def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height #self._CanvasHWND = pygame.Surface((self._Width,self._Height)) self._CanvasHWND = self._Screen._CanvasHWND ps = WifiListSelector() ps._Parent = self ps._Width = Width - 12 self._Ps = ps self._PsIndex = 0 msgbox = WifiListMessageBox() msgbox._CanvasHWND = self._CanvasHWND msgbox.Init(" ",fonts["veramono12"]) msgbox._Parent = self self._MsgBox = msgbox self._EncMethods = misc.LoadEncryptionMethods() # load predefined templates from /etc/wicd/... """ { 'fields': [], 'name': 'WPA 1/2 (Passphrase)', 'optional': [], 'protected': [ ['apsk', 'Preshared_Key'], ], 'required': [ ['apsk', 'Preshared_Key'], ], 'type': 'wpa-psk', }, """ self.UpdateNetList(force_check=True,firstrun=True) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = 2 self._Scroller._PosY = 2 self._Scroller.Init() self._InfoPage = WifiInfoPage() self._InfoPage._Screen = self._Screen self._InfoPage._Name = "Wifi info" self._InfoPage.Init() def Draw(self): self.ClearCanvas() if len(self._WirelessList) == 0: return self._Ps.Draw() for i in self._WirelessList: i.Draw() self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height) self._Scroller.Draw()
class ListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "", "", "Back", "Enter"] _MyList = [] _ListFontObj = fonts["varela15"] _Scroller = None def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 # "" pkgname, label alist = [ ["", "Airplane", "Airplane Mode"], ["", "PowerOptions", "Power Options"], ["", "Wifi", "Wi-Fi"], ["", "Sound", "Sound Volume"], ["", "Brightness", "BackLight Brightness"], ["", "Storage", ""], ["", "Update", ""], ["", "About", "About"], ["", "PowerOFF", "Power off"], ["", "ButtonsLayout", "Buttons Layout"], ] start_x = 0 start_y = 0 sys.path.append(myvars.basepath) # add self as import path for i, v in enumerate(alist): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj if v[2] != "": li.Init(v[2]) else: li.Init(v[1]) #if v[1] == "Wifi" or v[1] == "Sound" or v[1] == "Brightness" or v[1] == "Storage" or v[1] == "Update" or v[1] == "About" or v[1] == "PowerOFF" or v[1] == "HelloWorld": if FileExists(myvars.basepath + "/" + v[1]): li._LinkObj = __import__(v[1]) init_cb = getattr(li._LinkObj, "Init", None) if init_cb != None: if callable(init_cb): li._LinkObj.Init(self._Screen) self._MyList.append(li) self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height def Click(self): cur_li = self._MyList[self._PsIndex] if cur_li._LinkObj != None: api_cb = getattr(cur_li._LinkObj, "API", None) if api_cb != None: if callable(api_cb): cur_li._LinkObj.API(self._Screen) def KeyDown(self, event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Enter"]: self.Click() def Draw(self): self.ClearCanvas() if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class RomListPage(Page): _Icons = {} _Selector=None _FootMsg = ["Nav","Scan","Del","Add Fav","Run"] _MyList = [] _ListFont = fonts["notosanscjk15"] _MyStack = None _Emulator = None _Parent = None _Scroller = None _Scrolled = 0 _BGwidth = 56 _BGheight = 70 _RomSoConfirmDownloadPage = None def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] self._MyStack = RomStack() self._Emulator = {} def GeneratePathList(self,path): if os.path.isdir(path) == False: return False files_path = glob.glob(path+"/*") ret = [] for i ,v in enumerate(files_path): dirmap = {} #if os.path.isdir(v): # dir_base_name = os.path.basename(v) # if dir_base_name == ".Trash" or dir_base_name == ".Fav": # pass # else: # dirmap["directory"] = v # ret.append(dirmap) if os.path.isfile(v): stats = os.stat(v) if stats.st_gid == self._Parent._FavGID: continue bname = os.path.basename(v) ### filter extension if len(bname)> 1: pieces = bname.split(".") if len(pieces) > 1: if pieces[ len(pieces)-1 ].lower() in self._Emulator["EXT"]: dirmap["file"] = v ret.append(dirmap) # else: # print("not file or dir") return ret def SyncList(self,path): alist = self.GeneratePathList(path) if alist == False: print("listfiles return false") return self._MyList = [] start_x = 0 start_y = 0 hasparent = 0 if self._MyStack.Length() > 0: hasparent = 1 li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["DIR"] li._Parent = self li.Init("[..]") self._MyList.append(li) for i,v in enumerate(sorted(alist)): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + (i+hasparent)*ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["FILE"] li._Parent = self if "directory" in v: li._MyType = ICON_TYPES["DIR"] li.Init(v["directory"]) elif "file" in v: li.Init(v["file"]) else: li.Init("NoName") self._MyList.append(li) def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList(self._Emulator["ROM"]) ### will also mkdir of the ***ROM self try: os.makedirs(self._Emulator["ROM"]+"/.Trash") except OSError: if not os.path.isdir(self._Emulator["ROM"]+"/.Trash"): raise try: os.makedirs(self._Emulator["ROM"]+"/.Fav") except OSError: if not os.path.isdir(self._Emulator["ROM"]+"/.Fav"): raise self._MyStack._Emulator = self._Emulator icon_for_list = MultiIconItem() icon_for_list._ImgSurf = self._Parent._Icons["sys"] icon_for_list._MyType = ICON_TYPES["STAT"] icon_for_list._Parent = self icon_for_list.Adjust(0,0,18,18,0) self._Icons["sys"] = icon_for_list bgpng = IconItem() bgpng._ImgSurf = MyIconPool._Icons["empty"] bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.AddLabel("Please upload data over Wi-Fi", fonts["varela22"]) bgpng.SetLableColor(pygame.Color(204,204,204)) bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) self._Icons["bg"] = bgpng self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() rom_so_confirm_page = RomSoConfirmPage() rom_so_confirm_page._Screen = self._Screen rom_so_confirm_page._Name = "Download Confirm" rom_so_confirm_page._Parent = self rom_so_confirm_page.Init() self._RomSoConfirmDownloadPage = rom_so_confirm_page def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height self._Scrolled +=1 def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex +=1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) -1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY +cur_li._Height > self._Height: for i in range(0,len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height self._Scrolled -= 1 def SyncScroll(self): ## if self._Scrolled == 0: return if self._PsIndex < len(self._MyList): cur_li = self._MyList[self._PsIndex] if self._Scrolled > 0: if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height elif self._Scrolled < 0: if cur_li._PosY +cur_li._Height > self._Height: for i in range(0,len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._MyType == ICON_TYPES["DIR"]: if cur_li._Path == "[..]": self._MyStack.Pop() self.SyncList( self._MyStack.Last() ) self._PsIndex = 0 else: self._MyStack.Push( self._MyList[self._PsIndex]._Path ) self.SyncList( self._MyStack.Last() ) self._PsIndex = 0 if cur_li._MyType == ICON_TYPES["FILE"]: ## add to playlist only self._Screen._MsgBox.SetText("Launching...") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() print("Run ",cur_li._Path) # check ROM_SO exists if FileExists(self._Emulator["ROM_SO"]): escaped_path = CmdClean( cur_li._Path) cmdpath = " ".join( (self._Emulator["LAUNCHER"],self._Emulator["ROM_SO"], escaped_path)) pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) return else: self._Screen.PushPage(self._RomSoConfirmDownloadPage) self._Screen.Draw() self._Screen.SwapAndShow() self._Screen.Draw() self._Screen.SwapAndShow() def ReScan(self): if self._MyStack.Length() == 0: self.SyncList(self._Emulator["ROM"]) else: self.SyncList( self._MyStack.Last() ) idx = self._PsIndex if idx > (len(self._MyList)-1): idx = len(self._MyList) if idx > 0: idx -=1 elif idx == 0:##nothing in _MyList pass self._PsIndex = idx ## sync PsIndex self.SyncScroll() def OnReturnBackCb(self): self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() def KeyDown(self,event): if event.key == CurKeys["Menu"] : self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Right"]: self._Screen.PushCurPage() self._Screen.SetCurPage(self._Parent.FavListPage) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Enter"]: self.Click() if event.key == CurKeys["A"]: if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li.IsFile(): # remove any dup first try: os.system("chgrp " + self._Parent._FavGname +" "+ CmdClean(cur_li._Path)) except: pass self._Screen._MsgBox.SetText("Adding to Favourite list") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.time.delay(600) self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["X"]: #Scan current self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: #del if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li.IsFile(): self._Parent.DeleteConfirmPage.SetFileName(cur_li._Path) self._Parent.DeleteConfirmPage.SetTrashDir(self._Emulator["ROM"]+"/.Trash") self._Screen.PushCurPage() self._Screen.SetCurPage(self._Parent.DeleteConfirmPage) self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: self._Icons["bg"].NewCoord(self._Width/2,self._Height/2) self._Icons["bg"].Draw() else: if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 10 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize( len(self._MyList)*ListItem._Height, self._PsIndex*ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class SelectPage(Page): _MyList = [] def __init__(self): Page.__init__(self) self._Icons = {} def Init(self): self._ListFontObj = MyLangManager.TrFont("varela15") self._ListSmFontObj = MySkinManager.GiveFont("varela12") if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = self._Screen._CanvasHWND self._PosX = self._Index*self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height ps = GamePageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = 2 self._Scroller._PosY = 2 self._Scroller.Init() def Generate(self, game, branches, current): start_x = 0 start_y = 0 i = 0 self._Game = game for branch in branches: li = InfoPageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i*InfoPageListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj li._Fonts["small"] = self._ListSmFontObj li._LinkObj = branch li.Init(branch) if branch == current: self._PsIndex = i li._PosX = 2 self._MyList.append(li) i = i + 1 def Draw(self): self.ClearCanvas() if len(self._MyList) * InfoPageListItem._Height > self._Height: self._Ps._Width = self._Width - 10 self._Ps._PosX = 9 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize(len(self._MyList)*InfoPageListItem._Height, self._PsIndex*InfoPageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw() def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() def Click(self): if self._PsIndex >= len(self._MyList): return cur_li = self._MyList[self._PsIndex] git.checkout_branch(self._Game, cur_li._LinkObj)
class AboutPage(Page): _FootMsg = ["Nav.", "", "", "Back", ""] _MyList = [] _ListFontObj = MyLangManager.TrFont("varela13") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 300 _DrawOnce = False _Scroller = None def __init__(self): Page.__init__(self) self._Icons = {} def Uname(self): out = {} out["key"] = "uname" out["label"] = "Kernel:" st = subprocess.check_output(["uname", "-srmo"]) st = st.strip("\n") st = st.strip("\t") out["value"] = st self._AList["uname"] = out return def CpuMhz(self): try: with open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq" ) as f: content = f.readlines() content = [x.strip() for x in content] except: print("open %s failed" % "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq") content = ["0"] mhz = int(content[0]) / 1000.0 cpuscalemhz = {} cpuscalemhz["key"] = "cpuscalemhz" cpuscalemhz["label"] = "CPU Mhz:" cpuscalemhz["value"] = str(mhz) self._AList["cpuscalemhz"] = cpuscalemhz return def CpuInfo(self): last_processor = 0 with open("/proc/cpuinfo") as f: for line in f: if line.startswith("processor"): parts = line.split(":") cur_processor_number = int(parts[1].strip()) if cur_processor_number > last_processor: last_processor = cur_processor_number if line.startswith("model name"): parts = line.split(":") # print( parts[1].strip() ) processor = {} processor["key"] = "processor" processor["label"] = "Processor:" processor["value"] = parts[1].strip() self._AList["processor"] = processor if line.startswith("cpu MHz"): parts = line.split(":") # print(parts[1].strip() ) cpumhz = {} cpumhz["key"] = "cpumhz" cpumhz["label"] = "CPU MHz:" cpumhz["value"] = parts[1].strip() self._AList["cpumhz"] = cpumhz if line.startswith("cpu cores"): parts = line.split(":") # print(parts[1].strip() ) cpucores = {} cpucores["key"] = "cpucores" cpucores["label"] = "CPU cores:" cpucores["value"] = parts[1].strip() self._AList["cpucores"] = cpucores if line.startswith("Features"): parts = line.split(":") # print(parts[1].strip() ) f_ = {} f_["key"] = "features" f_["label"] = "Features:" f_["value"] = parts[1].strip() self._AList["features"] = f_ if line.startswith("flags"): parts = line.split(":") # print(parts[1].strip() ) flags = {} flags["key"] = "flags" flags["label"] = "Flags:" flags["value"] = parts[1].strip() self._AList["flags"] = flags if last_processor > 0: arm_cores = {} arm_cores["key"] = "armcores" arm_cores["label"] = "CPU cores:" arm_cores["value"] = str(last_processor + 1) self._AList["armcores"] = arm_cores def MemInfo(self): with open("/proc/meminfo") as f: for line in f: if line.startswith("MemTotal"): parts = line.split(":") parts[1] = parts[1].replace("kB", "") print(parts[1].strip()) memory = {} memory["key"] = "memory" memory["label"] = "Memory:" memory["value"] = str( int(parts[1].strip()) / 1000.0) + " MB" self._AList["memory"] = memory break def LauncherVersion(self): launcher_version = {} launcher_version["key"] = "launcher_ver" launcher_version["label"] = "Launcher:" launcher_version["value"] = VERSION self._AList["launcher_ver"] = launcher_version def OsImageVersion(self): if FileExists("/etc/clockworkpi_os_image_version"): try: with open("/etc/clockworkpi_os_image_version") as f: content = f.readlines() content = [x.strip() for x in content] except: print("open %s failed" % "/etc/clockworkpi_os_image_version") content = None if content != None and len(content) > 0: os_image_ver = {} os_image_ver["key"] = "os_image_ver" os_image_ver["label"] = "OS Image:" os_image_ver["value"] = content[0][:12] self._AList["os_image_ver"] = os_image_ver def GenList(self): self._MyList = [] start_x = 0 start_y = 10 last_height = 0 for i, u in enumerate([ "processor", "armcores", "cpuscalemhz", "features", "memory", "uname", "launcher_ver", "os_image_ver" ]): #for i,u in enumerate( ["processor","cpucores","cpumhz","flags","memory","uname"] ): if u not in self._AList: continue v = self._AList[u] li = InfoPageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFontObj li._Fonts["small"] = MySkinManager.GiveFont("varela12") if self._AList[u]["label"] != "": li.Init(self._AList[u]["label"]) else: li.Init(self._AList[u]["key"]) li._Flag = self._AList[u]["key"] li.SetSmallText(self._AList[u]["value"]) last_height += li._Height self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight + 50)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height bgpng = MultiIconItem() bgpng._ImgSurf = MyIconPool.GiveIconSurface("about_bg") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._Icons["bg"] = bgpng self.CpuInfo() self.MemInfo() self.CpuMhz() self.Uname() self.LauncherVersion() self.OsImageVersion() self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) def ScrollDown(self): dis = 10 if abs(self._Scrolled) < (self._BGheight - self._Height) / 2 + 100: self._PosY -= dis self._Scrolled -= dis def ScrollUp(self): dis = 10 if self._PosY < 0: self._PosY += dis self._Scrolled += dis def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False def OnReturnBackCb(self): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): if self._DrawOnce == False: self.ClearCanvas() #self._Ps.Draw() for i in self._MyList: i.Draw() self._DrawOnce = True self._Icons["bg"].DrawRect((230, 0, 82, 184), (228, 0, 82, 184)) y = self._MyList[len(self._MyList) - 1]._PosY + 30 self._Icons["bg"].DrawRect(((self._Width - 191) / 2, y, 191, 68), (65, 232, 191, 68)) if self._HWND != None: self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height)) self._Scroller.UpdateSize(self._BGheight, abs(self._Scrolled) * 3) self._Scroller.Draw()
class BranchSelectPage(Page): _MyList = [] def __init__(self): Page.__init__(self) self._Icons = {} def Init(self): self._SubPage = SelectPage() self._SubPage._Screen = self._Screen self._SubPage._Name = "Select Branch" self._SubPage.Init() self._ListFontObj = MyLangManager.TrFont("varela15") self._ListSmFontObj = MySkinManager.GiveFont("varela12") if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = self._Screen._CanvasHWND self._PosX = self._Index*self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height ps = GamePageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = 2 self._Scroller._PosY = 2 self._Scroller.Init() start_x = 0 start_y = 0 i = 0 games = git.get_games() for game in games: li = InfoPageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + i*InfoPageListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj li._Fonts["small"] = self._ListSmFontObj li._LinkObj = game li.Init( game.split("/")[-1] ) sm_text = str(len(git.get_branches(game)[0])) li.SetSmallText(sm_text) li._PosX = 2 self._MyList.append(li) i = i + 1 def Draw(self): self.ClearCanvas() if len(self._MyList) * InfoPageListItem._Height > self._Height: self._Ps._Width = self._Width - 10 self._Ps._PosX = 9 self._Ps.Draw() for i in self._MyList: i.Draw() self._Scroller.UpdateSize(len(self._MyList)*InfoPageListItem._Height, self._PsIndex*InfoPageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw() def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() def Click(self): if self._PsIndex >= len(self._MyList): return cur_li = self._MyList[self._PsIndex] branches, current = git.get_branches(cur_li._LinkObj) self._SubPage.Generate(cur_li._LinkObj, branches, current) self._Screen.PushPage(self._SubPage) self._Screen.Draw() self._Screen.SwapAndShow()
class FavListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "Scan", "Remove", "", "Run"] _MyList = [] _ListFont = fonts["notosanscjk15"] _MyStack = None _Emulator = None _Parent = None _Scroller = None _Scrolled = 0 _BGwidth = 75 _BGheight = 73 _RomSoConfirmDownloadPage = None def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] self._MyStack = FavStack() self._Emulator = {} def GeneratePathList(self, path): if os.path.isdir(path) == False: return False files_path = glob.glob(path + "/*") ret = [] for i, v in enumerate(files_path): dirmap = {} if os.path.isdir( v) and self._Emulator["FILETYPE"] == "dir": ## like DOSBOX gameshell_bat = self._Emulator["EXT"][0] if FileExists(v + "/" + gameshell_bat): stats = os.stat(v) if stats.st_gid != self._Parent._FavGID: ## only favs continue dirmap["gamedir"] = v.decode("utf8") ret.append(dirmap) if os.path.isfile(v) and self._Emulator["FILETYPE"] == "file": stats = os.stat(v) if stats.st_gid != self._Parent._FavGID: ## only favs continue bname = os.path.basename(v) ### filter extension if len(bname) > 1: pieces = bname.split(".") if len(pieces) > 1: if pieces[len(pieces) - 1].lower() in self._Emulator["EXT"]: dirmap["file"] = v.decode("utf8") ret.append(dirmap) # else: # print("not file or dir") return ret def SyncList(self, path): alist = self.GeneratePathList(path) if alist == False: print("listfiles return false") return # print("fav list alist: ") # print(alist) self._MyList = [] start_x = 0 start_y = 0 hasparent = 0 if self._MyStack.Length() > 0: hasparent = 1 li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["DIR"] li._Parent = self li.Init("[..]") self._MyList.append(li) for i, v in enumerate(sorted(alist)): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + (i + hasparent) * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["FILE"] li._Parent = self if "directory" in v: li._MyType = ICON_TYPES["DIR"] li.Init(v["directory"]) elif "file" in v: li.Init(v["file"]) elif "gamedir" in v: li.Init(v["gamedir"]) else: li.Init("NoName") self._MyList.append(li) def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList(self._Emulator["ROM"]) self._MyStack._Emulator = self._Emulator icon_for_list = MultiIconItem() icon_for_list._ImgSurf = self._Parent._Icons["sys"] icon_for_list._MyType = ICON_TYPES["STAT"] icon_for_list._Parent = self icon_for_list.Adjust(0, 0, 18, 18, 0) self._Icons["sys"] = icon_for_list bgpng = IconItem() bgpng._ImgSurf = MyIconPool._Icons["star"] bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.AddLabel("my favourites games", fonts["varela18"]) bgpng.SetLableColor(SkinManager().GiveColor('Disabled')) bgpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._Icons["bg"] = bgpng self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() rom_so_confirm_page = RomSoConfirmPage() rom_so_confirm_page._Screen = self._Screen rom_so_confirm_page._Name = "Download Confirm" rom_so_confirm_page._Parent = self rom_so_confirm_page.Init() self._RomSoConfirmDownloadPage = rom_so_confirm_page def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height self._Scrolled += 1 def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height self._Scrolled -= 1 def SyncScroll(self): ## if self._Scrolled == 0: return if self._PsIndex < len(self._MyList): cur_li = self._MyList[self._PsIndex] if self._Scrolled > 0: if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[ i]._Height elif self._Scrolled < 0: if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[ i]._Height def Click(self): if len(self._MyList) == 0: return if self._PsIndex > len(self._MyList) - 1: return cur_li = self._MyList[self._PsIndex] if cur_li._MyType == ICON_TYPES["DIR"]: return if cur_li._MyType == ICON_TYPES["FILE"]: ## add to playlist only self._Screen._MsgBox.SetText("Launching...") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() if self._Emulator["FILETYPE"] == "dir": path = cur_li._Path + "/" + self._Emulator["EXT"][0] else: path = cur_li._Path print("Run ", path) if self._Emulator["FILETYPE"] == "dir": escaped_path = CmdClean(path) else: escaped_path = CmdClean(path) custom_config = "" if self._Emulator["RETRO_CONFIG"] != "" and len( self._Emulator["RETRO_CONFIG"]) > 5: custom_config = " -c " + self._Emulator["RETRO_CONFIG"] cmdpath = " ".join( (self._Emulator["LAUNCHER"], self._Emulator["ROM_SO"], custom_config, escaped_path)) if self._Emulator[ "ROM_SO"] == "": #empty means No needs for rom so pygame.event.post(pygame.event.Event(RUNEVT, message=cmdpath)) else: if FileExists(self._Emulator["ROM_SO"]): pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) else: self._Screen.PushPage(self._RomSoConfirmDownloadPage) self._Screen.Draw() self._Screen.SwapAndShow() return self._Screen.Draw() self._Screen.SwapAndShow() def ReScan(self): if self._MyStack.Length() == 0: self.SyncList(self._Emulator["ROM"]) else: self.SyncList(self._MyStack.Last()) idx = self._PsIndex if idx > (len(self._MyList) - 1): idx = len(self._MyList) if idx > 0: idx -= 1 elif idx == 0: ##nothing in _MyList pass self._PsIndex = idx ## sync PsIndex self.SyncScroll() def OnReturnBackCb(self): self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() def OnLoadCb(self): self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() def KeyDown(self, event): if event.key == CurKeys["Menu"] or event.key == CurKeys["Left"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Enter"]: self.Click() if event.key == CurKeys["X"]: #Scan current self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: #del if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li.IsFile(): """ #self._Parent.FavDeleteConfirmPage.SetFileName(cur_li._Path) #self._Parent.FavDeleteConfirmPage.SetTrashDir(self._Emulator["ROM"])## Fav delete,return to ROM dir,not .Trash #self._Screen.PushCurPage() #self._Screen.SetCurPage(self._Parent.FavDeleteConfirmPage) #self._Screen.Draw() #self._Screen.SwapAndShow() """ #delete directly without confirm dialog stats = os.stat(cur_li._Path) os.chown( cur_li._Path, stats.st_uid, stats.st_uid) ## normally uid and gid should be the same self._Screen._MsgBox.SetText("Deleting...") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.time.delay(600) self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: self._Icons["bg"].NewCoord(self._Width / 2, self._Height / 2) self._Icons["bg"].Draw() else: if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 10 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class GateWayPage(Page): _FootMsg = ["Nav", "Clear All", "", "Back", "Select"] _MyList = [] _ListFont = fonts["notosanscjk15"] _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _InfoPage = None def __init__(self): Page.__init__(self) self._Icons = {} def GenList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 drivers = [["usb0", "USB Ethernet"], ["wlan0", "Wi-Fi"]] for i, u in enumerate(drivers): #print(i,u) li = PageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont li._Active = False li._Value = u[0] li.Init(u[1]) last_height += li._Height self._MyList.append(li) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool._Icons["done"] done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._Active == True: out = commands.getstatusoutput( "sudo ip route | grep default | cut -d \" \" -f3") if len(out[1]) > 7: self._Screen._MsgBox.SetText(out[1]) self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() return print(cur_li._Value) if "arm" in platform.machine(): for i in self._MyList: i._Active = False self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() cur_li._Active = self.ApplyGateWay(cur_li._Value) pygame.time.delay(1000) self._Screen.Draw() self._Screen.SwapAndShow() else: self._Screen._MsgBox.SetText("Do it in GameShell") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() def ClearAllGateways(self): self._Screen._MsgBox.SetText("Cleaning up") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() os.system("sudo ip route del 0/0") pygame.time.delay(800) for i in self._MyList: i._Active = False self._Screen.Draw() self._Screen.SwapAndShow() def ApplyGateWay(self, gateway): os.system("sudo ip route del 0/0") if gateway == "usb0": out = commands.getstatusoutput( "sudo ifconfig usb0 | grep inet | tr -s \" \"| cut -d \" \" -f3" ) if len(out[1]) > 7: if "error" not in out[1]: parts = out[1].split(".") if len(parts) == 4: ##IPv4 tp3 = int(parts[3]) tmp = tp3 if tp3 == 0: tmp = int(parts[3]) + 1 elif tp3 == 1: tmp = int(parts[3]) + 1 elif tp3 > 1: tmp = int(parts[3]) - 1 parts[3] = str(tmp) ipaddress = ".".join(parts) os.system("sudo route add default gw " + ipaddress) return True else: if is_wifi_connected_now(): os.system("sudo dhclient wlan0") return True else: self._Screen._MsgBox.SetText("Wi-Fi is not connected") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() return False return False def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False ## grep Driver /etc/xorg.conf | tr -s " " | cut -d " " -f3 ## "fbturbo" ## "modesetting" thedrv = "" if "arm" in platform.machine(): out = commands.getstatusoutput("sudo ip route | grep default") if len(out[1]) > 7: if "usb0" in out[1]: thedrv = "usb0" elif "wlan0" in out[1]: thedrv = "wlan0" for i in self._MyList: i._Active = False if thedrv != "": for i in self._MyList: if thedrv in i._Value: i._Active = True ## if usb0 and wlan0 all actived, clear all def OnReturnBackCb(self): pass """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() if event.key == CurKeys["Y"]: self.ClearAllGateways() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * PageListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * PageListItem._Height, self._PsIndex * PageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill((255, 255, 255)) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height))
class RomListPage(Page): _Icons = {} _Selector = None _FootMsg = ["Nav", "Scan", "Del", "AddFav", "Run"] _MyList = [] _ListFont = fonts["notosanscjk15"] _MyStack = None _Emulator = None _Parent = None _Scroller = None _Scrolled = 0 _BGwidth = 56 _BGheight = 70 _RomSoConfirmDownloadPage = None def __init__(self): Page.__init__(self) self._Icons = {} self._CanvasHWND = None self._MyList = [] self._MyStack = RomStack() self._Emulator = {} def GeneratePathList(self, path): if os.path.isdir(path) == False: return False files_path = glob.glob(path + "/*") ret = [] for i, v in enumerate(files_path): dirmap = {} if os.path.isdir( v) and self._Emulator["FILETYPE"] == "dir": ## like DOSBOX gameshell_bat = self._Emulator["EXT"][0] stats = os.stat(v) if stats.st_gid == self._Parent._FavGID: ##skip fav roms continue if FileExists(v + "/" + gameshell_bat): dirmap["gamedir"] = v.decode("utf8") ret.append(dirmap) if os.path.isfile(v) and self._Emulator["FILETYPE"] == "file": stats = os.stat(v) if stats.st_gid == self._Parent._FavGID: ##skip fav roms continue bname = os.path.basename(v) ### filter extension if len(bname) > 1: is_excluded = False for exclude_ext in self._Emulator[ "EXCLUDE"]: ## only compares filename endswith ext in EXCLUDE,splited by , if len(exclude_ext) > 1 and bname.endswith( exclude_ext): is_excluded = True break if not is_excluded: pieces = bname.split(".") if len(pieces) > 1: if pieces[len(pieces) - 1].lower() in self._Emulator["EXT"]: dirmap["file"] = v.decode("utf8") ret.append(dirmap) # else: # print("not file or dir") return ret def SyncList(self, path): alist = self.GeneratePathList(path) if alist == False: print("listfiles return false") return self._MyList = [] start_x = 0 start_y = 0 hasparent = 0 if self._MyStack.Length() > 0: hasparent = 1 li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["DIR"] li._Parent = self li.Init("[..]") self._MyList.append(li) for i, v in enumerate(sorted(alist)): li = ListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + (i + hasparent) * ListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFont li._MyType = ICON_TYPES["FILE"] li._Parent = self if "directory" in v: li._MyType = ICON_TYPES["DIR"] li.Init(v["directory"]) elif "file" in v: li.Init(v["file"]) elif "gamedir" in v: li.Init(v["gamedir"]) else: li.Init("NoName") self._MyList.append(li) def Init(self): self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width self._Height = self._Screen._Height self._CanvasHWND = self._Screen._CanvasHWND ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.SyncList(self._Emulator["ROM"]) ### will also mkdir of the ***ROM self try: os.makedirs(self._Emulator["ROM"] + "/.Trash") except OSError: if not os.path.isdir(self._Emulator["ROM"] + "/.Trash"): raise try: os.makedirs(self._Emulator["ROM"] + "/.Fav") except OSError: if not os.path.isdir(self._Emulator["ROM"] + "/.Fav"): raise self._MyStack._Emulator = self._Emulator icon_for_list = MultiIconItem() icon_for_list._ImgSurf = self._Parent._Icons["sys"] icon_for_list._MyType = ICON_TYPES["STAT"] icon_for_list._Parent = self icon_for_list.Adjust(0, 0, 18, 18, 0) self._Icons["sys"] = icon_for_list bgpng = IconItem() bgpng._ImgSurf = MyIconPool._Icons["empty"] bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.AddLabel(MyLangManager.Tr("Please upload data over Wi-Fi"), MyLangManager.TrFont("varela22")) bgpng.SetLableColor(MySkinManager.GiveColor('Disabled')) bgpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._Icons["bg"] = bgpng self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() rom_so_confirm_page = RomSoConfirmPage() rom_so_confirm_page._Screen = self._Screen rom_so_confirm_page._Name = "Download Confirm" rom_so_confirm_page._Parent = self rom_so_confirm_page.Init() self._RomSoConfirmDownloadPage = rom_so_confirm_page def ScrollUp(self): if len(self._MyList) == 0: return tmp = self._PsIndex self._PsIndex -= self._ScrollStep if self._PsIndex < 0: self._PsIndex = 0 dy = tmp - self._PsIndex cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height * dy self._Scrolled += dy def ScrollDown(self): if len(self._MyList) == 0: return tmp = self._PsIndex self._PsIndex += self._ScrollStep if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 dy = self._PsIndex - tmp cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height * dy self._Scrolled -= dy def SyncScroll(self): ## if self._Scrolled == 0: return if self._PsIndex < len(self._MyList): cur_li = self._MyList[self._PsIndex] if self._Scrolled > 0: if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[ i]._Height elif self._Scrolled < 0: if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._Scrolled * self._MyList[ i]._Height def Click(self): if len(self._MyList) == 0: return if self._PsIndex > len(self._MyList) - 1: return cur_li = self._MyList[self._PsIndex] if cur_li._MyType == ICON_TYPES["DIR"]: if cur_li._Path == "[..]": self._MyStack.Pop() self.SyncList(self._MyStack.Last()) self._PsIndex = 0 else: self._MyStack.Push(self._MyList[self._PsIndex]._Path) self.SyncList(self._MyStack.Last()) self._PsIndex = 0 if cur_li._MyType == ICON_TYPES["FILE"]: self._Screen._MsgBox.SetText("Launching") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() if self._Emulator["FILETYPE"] == "dir": path = cur_li._Path + "/" + self._Emulator["EXT"][0] else: path = cur_li._Path print("Run ", path) if self._Emulator["FILETYPE"] == "dir": escaped_path = CmdClean(path) else: escaped_path = CmdClean(path) custom_config = "" if self._Emulator["RETRO_CONFIG"] != "" and len( self._Emulator["RETRO_CONFIG"]) > 5: custom_config = " -c " + self._Emulator["RETRO_CONFIG"] cmdpath = " ".join( (self._Emulator["LAUNCHER"], self._Emulator["ROM_SO"], custom_config, escaped_path)) if self._Emulator[ "ROM_SO"] == "": #empty means No needs for rom so pygame.event.post(pygame.event.Event(RUNEVT, message=cmdpath)) else: if FileExists(self._Emulator["ROM_SO"]): pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) else: self._Screen.PushPage(self._RomSoConfirmDownloadPage) self._Screen.Draw() self._Screen.SwapAndShow() return self._Screen.Draw() self._Screen.SwapAndShow() def ReScan(self): if self._MyStack.Length() == 0: self.SyncList(self._Emulator["ROM"]) else: self.SyncList(self._MyStack.Last()) idx = self._PsIndex if idx > (len(self._MyList) - 1): idx = len(self._MyList) if idx > 0: idx -= 1 elif idx == 0: ##nothing in _MyList pass self._PsIndex = idx ## sync PsIndex self.SyncScroll() def OnReturnBackCb(self): self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() def SpeedScroll(self, thekey): if self._Screen._LastKey == thekey: self._ScrollStep += 1 if self._ScrollStep >= 5: self._ScrollStep = 5 else: self._ScrollStep = 1 cur_time = time.time() if cur_time - self._Screen._LastKeyDown > 0.3: self._ScrollStep = 1 def KeyDown(self, event): if event.key == CurKeys["Menu"]: self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Right"]: self._Screen.PushCurPage() self._Screen.SetCurPage(self._Parent.FavListPage) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Up"]: self.SpeedScroll(event.key) self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.SpeedScroll(event.key) self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Enter"]: self.Click() if event.key == CurKeys["A"]: if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li.IsFile(): # remove any dup first try: os.system("chgrp " + self._Parent._FavGname + " " + CmdClean(cur_li._Path)) except: pass self._Screen._MsgBox.SetText("AddFavList") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() pygame.time.delay(600) self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["X"]: #Scan current self.ReScan() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Y"]: #del if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li.IsFile(): self._Parent.DeleteConfirmPage.SetFileName(cur_li._Path) self._Parent.DeleteConfirmPage.SetTrashDir( self._Emulator["ROM"] + "/.Trash") self._Screen.PushCurPage() self._Screen.SetCurPage(self._Parent.DeleteConfirmPage) self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: self._Icons["bg"].NewCoord(self._Width / 2, self._Height / 2) self._Icons["bg"].Draw() else: if len(self._MyList) * ListItem._Height > self._Height: self._Ps._Width = self._Width - 10 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * ListItem._Height, self._PsIndex * ListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: i.Draw()
class WallpaperPage(Page): _FootMsg = ["Nav", "", "", "Back", "Select"] _MyList = [] _ListFont = MyLangManager.TrFont("notosanscjk15") _AList = {} _Scrolled = 0 _BGwidth = 320 _BGheight = 240 - 24 - 20 _DrawOnce = False _Scroller = None _InfoPage = None def __init__(self): Page.__init__(self) self._Icons = {} def GenList(self): self._MyList = [] start_x = 0 start_y = 0 last_height = 0 files_path = config.SKIN + '/Menu/GameShell/Wallpaper/' if (os.path.exists(files_path)): content = os.listdir(files_path) else: content = [] for i, u in enumerate(content): print(i, u) li = PageListItem() li._Parent = self li._PosX = start_x li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFont li._Active = False li._Value = u.decode("utf8") li._Path = files_path + u image_name = u.split("_")[1] image_name = image_name.split(".")[0] li.Init(image_name.decode("utf8")) last_height += li._Height self._MyList.append(li) no_wallpaper = PageListItem() no_wallpaper._Parent = self no_wallpaper._PosX = start_x no_wallpaper._PosY = start_y + last_height no_wallpaper._Width = Width no_wallpaper._Fonts["normal"] = self._ListFont no_wallpaper._Active = False no_wallpaper._Value = 'None' no_wallpaper._Path = 'None' no_wallpaper.Init('None') self._MyList.append(no_wallpaper) def Init(self): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND self._CanvasHWND = pygame.Surface( (self._Screen._Width, self._BGheight)) self._PosX = self._Index * self._Screen._Width self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height done = IconItem() done._ImgSurf = MyIconPool._Icons["done"] done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done ps = ListPageSelector() ps._Parent = self self._Ps = ps self._PsIndex = 0 self.GenList() self._Scroller = ListScroller() self._Scroller._Parent = self self._Scroller._PosX = self._Width - 10 self._Scroller._PosY = 2 self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) def ScrollDown(self): if len(self._MyList) == 0: return self._PsIndex += 1 if self._PsIndex >= len(self._MyList): self._PsIndex = len(self._MyList) - 1 cur_li = self._MyList[self._PsIndex] if cur_li._PosY + cur_li._Height > self._Height: for i in range(0, len(self._MyList)): self._MyList[i]._PosY -= self._MyList[i]._Height def ScrollUp(self): if len(self._MyList) == 0: return self._PsIndex -= 1 if self._PsIndex < 0: self._PsIndex = 0 cur_li = self._MyList[self._PsIndex] if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height def Click(self): if len(self._MyList) == 0: return cur_li = self._MyList[self._PsIndex] if cur_li._Active == True: return for i in self._MyList: i._Active = False cur_li._Active = True print(cur_li._Value) with open(".wallpaper", "w") as f: f.write(cur_li._Path) config.wallpapers = cur_li._Path self._Screen._MsgBox.SetText("Applying") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() print("fuckTHis", config.wallpapers, cur_li._Path) pygame.event.post(pygame.event.Event(RESTARTUI, message="")) ##Restart Launcher pygame.time.delay(1000) self._Screen.Draw() self._Screen.SwapAndShow() def OnLoadCb(self): self._Scrolled = 0 self._PosY = 0 self._DrawOnce = False with open(".wallpaper", "r") as f: wallpaper = f.read() wallpaper = wallpaper.strip() for i in self._MyList: if wallpaper == i._Path: i._Active = True def OnReturnBackCb(self): pass """ self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() """ def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.Click() if event.key == CurKeys["Up"]: self.ScrollUp() self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Down"]: self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas() if len(self._MyList) == 0: return else: if len(self._MyList) * PageListItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() self._Scroller.UpdateSize( len(self._MyList) * PageListItem._Height, self._PsIndex * PageListItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() for i in self._MyList: if i._PosY > self._Height + self._Height / 2: break if i._PosY < 0: continue i.Draw() if self._HWND != None: self._HWND.fill((255, 255, 255)) self._HWND.blit( self._CanvasHWND, (self._PosX, self._PosY, self._Width, self._Height))