From 0b8331d3d00a44146c70b67bf2b966dd278efcf8 Mon Sep 17 00:00:00 2001 From: cuu Date: Tue, 15 Jan 2019 01:05:59 +0800 Subject: [PATCH 1/7] ReunionPagesIcons combines 20_Retro Games now --- sys.py/UI/Emulator/rom_list_page.py | 4 ++-- sys.py/UI/main_screen.py | 21 +++++++++++++++++++++ sys.py/UI/util_funcs.py | 6 +++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/sys.py/UI/Emulator/rom_list_page.py b/sys.py/UI/Emulator/rom_list_page.py index 18614f2..4bdf2bd 100644 --- a/sys.py/UI/Emulator/rom_list_page.py +++ b/sys.py/UI/Emulator/rom_list_page.py @@ -154,8 +154,8 @@ class RomListPage(Page): bname = os.path.basename(v) ### filter extension if len(bname)> 1: is_excluded = False - for exclude_pattern in self._Emulator["EXCLUDE"]: - if re.match(exclude_pattern, bname): + 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 diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index ca8e576..52b6d01 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -406,6 +406,27 @@ class MainScreen(object): tmp.append(tup) tmp = sorted(tmp, key=itemgetter(0)) + + retro_games_idx = [] + for i,x in enumerate(tmp): + if "20_Retro Games" in x[0]: + retro_games_idx.append(x[1]) + + if len(retro_games_idx) > 1: + for i in range(1,len(retro_games_idx)): + p._Icons[retro_games_idx[0]]._LinkPage._Icons.extend( p._Icons[retro_games_idx[i]]._LinkPage._Icons) + #p._Icons[ retro_games_idx[0]]._LinkPage._Icons.extend( tmp[ retro_games_idx[i] ]._LinkPage._Icons ) + + + tmp_swap = [] + for i, x in enumerate(tmp): + if "20_Retro Games" not in x[0]: + tmp_swap.append(x) + if "20_Retro Games" in x[0] and i == retro_games_idx[0]: + tmp_swap.append(x) + + tmp = tmp_swap + #print(tmp) new_icons = [] for x in tmp: diff --git a/sys.py/UI/util_funcs.py b/sys.py/UI/util_funcs.py index 34d5cc9..68262bf 100644 --- a/sys.py/UI/util_funcs.py +++ b/sys.py/UI/util_funcs.py @@ -16,6 +16,10 @@ import config def SkinMap(orig_file_or_dir): DefaultSkin = "default" + #doing a wrapper for items under /home/cpi/apps/Menu/*, to be like Menu/GameShell/* + if orig_file_or_dir.startswith("/home/cpi/apps/Menu"): + orig_file_or_dir = orig_file_or_dir.replace("/home/cpi/apps/Menu/","../Menu/GameShell/") + if orig_file_or_dir.startswith(".."): ret = orig_file_or_dir.replace("..","../skin/"+config.SKIN) if FileExists(ret) == False: @@ -24,7 +28,7 @@ def SkinMap(orig_file_or_dir): ret = "../skin/"+config.SKIN+"/sys.py/"+orig_file_or_dir if FileExists(ret) == False: ret = "../skin/"+DefaultSkin+"/sys.py/"+orig_file_or_dir - + if FileExists( ret ): return ret else: ## if not existed both in default or custom skin ,return where it is From c641c8d84ae64d3b515b65024b00c496b32c0327 Mon Sep 17 00:00:00 2001 From: cuu Date: Tue, 15 Jan 2019 01:15:43 +0800 Subject: [PATCH 2/7] ReunionPagesIcons combines 20_Retro Games now --- sys.py/UI/main_screen.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index 52b6d01..6c1496e 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -408,21 +408,21 @@ class MainScreen(object): tmp = sorted(tmp, key=itemgetter(0)) retro_games_idx = [] + retro_games_dir = "20_Retro Games" for i,x in enumerate(tmp): - if "20_Retro Games" in x[0]: + if retro_games_dir in x[0]: retro_games_idx.append(x[1]) if len(retro_games_idx) > 1: for i in range(1,len(retro_games_idx)): - p._Icons[retro_games_idx[0]]._LinkPage._Icons.extend( p._Icons[retro_games_idx[i]]._LinkPage._Icons) - #p._Icons[ retro_games_idx[0]]._LinkPage._Icons.extend( tmp[ retro_games_idx[i] ]._LinkPage._Icons ) + p._Icons[retro_games_idx[0]]._LinkPage._Icons.extend( p._Icons[retro_games_idx[i]]._LinkPage._Icons) ### assumes the folder of ~/apps/Menu/20_Retro Games is legalzip","sfc"], tmp_swap = [] for i, x in enumerate(tmp): - if "20_Retro Games" not in x[0]: + if retro_games_dir not in x[0]: tmp_swap.append(x) - if "20_Retro Games" in x[0] and i == retro_games_idx[0]: + if retro_games_dir in x[0] and i == retro_games_idx[0]: tmp_swap.append(x) tmp = tmp_swap From 7e75d4856b4172b4a9b55398d6884a28d1842dc1 Mon Sep 17 00:00:00 2001 From: cuu Date: Tue, 15 Jan 2019 16:37:15 +0800 Subject: [PATCH 3/7] add widget.py --- .../10_Settings/Bluetooth/__init__.py | 84 ++++------------- .../10_Settings/LauncherGo/__init__.py | 7 +- .../10_Settings/Notification/__init__.py | 23 ----- .../10_Settings/PowerOptions/__init__.py | 24 ----- .../Time/timezone_lib_list_page.py | 33 +------ Menu/GameShell/10_Settings/Wifi/net_item.py | 7 +- Menu/GameShell/10_Settings/Wifi/wifi_list.py | 91 ++++--------------- Menu/GameShell/10_Settings/list_page.py | 24 ----- Menu/GameShell/50_PICO-8/__init__.py | 86 ++++++++++++++++++ Menu/GameShell/50_PICO-8/md5sum.log | 2 + .../97_Music Player/music_lib_list_page.py | 33 +------ sys.py/UI/above_all_patch.py | 4 +- sys.py/UI/confirm_page.py | 3 - sys.py/UI/foot_bar.py | 6 +- sys.py/UI/icon_item.py | 12 +-- sys.py/UI/info_page_list_item.py | 7 +- sys.py/UI/info_page_selector.py | 3 - sys.py/UI/keyboard.py | 8 -- sys.py/UI/label.py | 14 +-- sys.py/UI/main_screen.py | 4 +- sys.py/UI/multilabel.py | 12 +-- sys.py/UI/page.py | 43 +++++++-- sys.py/UI/textarea.py | 7 +- sys.py/UI/title_bar.py | 6 +- sys.py/UI/widget.py | 26 ++++++ 25 files changed, 213 insertions(+), 356 deletions(-) create mode 100644 Menu/GameShell/50_PICO-8/__init__.py create mode 100644 Menu/GameShell/50_PICO-8/md5sum.log create mode 100644 sys.py/UI/widget.py diff --git a/Menu/GameShell/10_Settings/Bluetooth/__init__.py b/Menu/GameShell/10_Settings/Bluetooth/__init__.py index 3c67acf..3d161d7 100644 --- a/Menu/GameShell/10_Settings/Bluetooth/__init__.py +++ b/Menu/GameShell/10_Settings/Bluetooth/__init__.py @@ -177,30 +177,6 @@ class BleInfoPage(Page): li._PosX = 2 self._MyList.append(li) - 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 TryToForget(self): global adapter proxy_obj = bus.get_object("org.bluez", self._Path) @@ -336,10 +312,10 @@ class BleListSelector(PageSelector): def Draw(self): idx = self._Parent._PsIndex - if idx < len( self._Parent._WirelessList): - x = self._Parent._WirelessList[idx]._PosX+2 - y = self._Parent._WirelessList[idx]._PosY+1 - h = self._Parent._WirelessList[idx]._Height -3 + if idx < len( self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 self._PosX = x self._PosY = y @@ -367,7 +343,7 @@ class BleListMessageBox(Label): class BluetoothPage(Page): - _WirelessList = [] + _MyList = [] #Wicd dbus part _Adapter = None _Dbus = None @@ -398,7 +374,7 @@ class BluetoothPage(Page): def __init__(self): Page.__init__(self) - self._WirelessList = [] + self._MyList = [] self._CanvasHWND = None def ShowBox(self,msg): @@ -520,10 +496,10 @@ class BluetoothPage(Page): def TryConnect(self): global bus - if self._PsIndex >= len(self._WirelessList): + if self._PsIndex >= len(self._MyList): return - cur_li = self._WirelessList[self._PsIndex] + cur_li = self._MyList[self._PsIndex] print(cur_li._Path) if "Connected" in cur_li._Atts: @@ -562,7 +538,7 @@ class BluetoothPage(Page): def GenNetworkList(self): - self._WirelessList = [] + self._MyList = [] start_x = 0 start_y = 0 @@ -586,7 +562,7 @@ class BluetoothPage(Page): ni.Init(v,self._Devices[v]) counter += 1 - self._WirelessList.append(ni) + self._MyList.append(ni) self._PsIndex = 0 @@ -631,31 +607,7 @@ class BluetoothPage(Page): self.GenNetworkList() else: self._Offline = True - - 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 KeyDown(self,event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: @@ -698,13 +650,13 @@ class BluetoothPage(Page): self.Rescan() if event.key == CurKeys["Y"]: - if len(self._WirelessList) == 0: + if len(self._MyList) == 0: return if self._Offline == True: return - self._InfoPage._AList = self._WirelessList[self._PsIndex]._Atts - self._InfoPage._Path = self._WirelessList[self._PsIndex]._Path + self._InfoPage._AList = self._MyList[self._PsIndex]._Atts + self._InfoPage._Path = self._MyList[self._PsIndex]._Path self._Screen.PushPage(self._InfoPage) self._Screen.Draw() self._Screen.SwapAndShow() @@ -715,23 +667,23 @@ class BluetoothPage(Page): def Draw(self): self.ClearCanvas() - if len(self._WirelessList) == 0: + if len(self._MyList) == 0: return - if len(self._WirelessList) * NetItem._Height > self._Height: + if len(self._MyList) * NetItem._Height > self._Height: self._Ps._Width = self._Width - 11 self._Ps.Draw() - for i in self._WirelessList: + for i in self._MyList: i.Draw() - self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height) + self._Scroller.UpdateSize( len(self._MyList)*NetItem._Height, self._PsIndex*NetItem._Height) self._Scroller.Draw() else: self._Ps._Width = self._Width self._Ps.Draw() - for i in self._WirelessList: + for i in self._MyList: i.Draw() diff --git a/Menu/GameShell/10_Settings/LauncherGo/__init__.py b/Menu/GameShell/10_Settings/LauncherGo/__init__.py index d509724..d49e35d 100644 --- a/Menu/GameShell/10_Settings/LauncherGo/__init__.py +++ b/Menu/GameShell/10_Settings/LauncherGo/__init__.py @@ -3,7 +3,7 @@ import os import pygame #import math #mport subprocess -import glob +import platform #from beeprint import pp from libs.roundrects import aa_round_rect @@ -24,8 +24,9 @@ class APIOBJ(object): main_screen._MsgBox.Draw() main_screen.SwapAndShow() pygame.time.delay(300) - os.system("sed -i s/launcher/launchergo/g ~/.bashrc" ) - os.system("sudo reboot") + if "arm" in platform.machine(): + os.system("sed -i s/launcher/launchergo/g ~/.bashrc" ) + os.system("sudo reboot") OBJ = APIOBJ() def Init(main_screen): diff --git a/Menu/GameShell/10_Settings/Notification/__init__.py b/Menu/GameShell/10_Settings/Notification/__init__.py index 803c332..6347298 100644 --- a/Menu/GameShell/10_Settings/Notification/__init__.py +++ b/Menu/GameShell/10_Settings/Notification/__init__.py @@ -168,29 +168,6 @@ class NotificationPage(Page): 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 diff --git a/Menu/GameShell/10_Settings/PowerOptions/__init__.py b/Menu/GameShell/10_Settings/PowerOptions/__init__.py index 49004bf..139738d 100644 --- a/Menu/GameShell/10_Settings/PowerOptions/__init__.py +++ b/Menu/GameShell/10_Settings/PowerOptions/__init__.py @@ -402,30 +402,6 @@ class PowerOptionsPage(Page): self._InfoPage._Screen = self._Screen self._InfoPage._Name = "Power option detail" self._InfoPage.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: diff --git a/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py index f55be7e..6f560fa 100644 --- a/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py +++ b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py @@ -200,35 +200,6 @@ class TimezoneListPage(Page): self._Scroller._PosY = 2 self._Scroller.Init() - - def ScrollUp(self,Step=1): - if len(self._MyList) == 0: - return - tmp = self._PsIndex - self._PsIndex -= Step - - 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 - - - def ScrollDown(self,Step=1): - if len(self._MyList) == 0: - return - tmp = self._PsIndex - self._PsIndex +=Step - 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 - def Click(self): if len(self._MyList) == 0: return @@ -275,12 +246,12 @@ class TimezoneListPage(Page): self._Screen.SwapAndShow() if event.key == CurKeys["Right"]: - self.ScrollDown(Step=5) + self.FScrollDown(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Left"]: - self.ScrollUp(Step=5) + self.FScrollUp(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() diff --git a/Menu/GameShell/10_Settings/Wifi/net_item.py b/Menu/GameShell/10_Settings/Wifi/net_item.py index 0149c2d..9888852 100644 --- a/Menu/GameShell/10_Settings/Wifi/net_item.py +++ b/Menu/GameShell/10_Settings/Wifi/net_item.py @@ -10,7 +10,7 @@ from UI.icon_item import IconItem from UI.multi_icon_item import MultiIconItem from UI.icon_pool import MyIconPool from UI.skin_manager import MySkinManager - +from UI.widget import Widget class NetItemMultiIcon(MultiIconItem): _CanvasHWND = None @@ -33,10 +33,7 @@ class NetItemIcon(IconItem): self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height)) -class NetItem(object): - _PosX = 0 - _PosY = 0 - _Width = 0 +class NetItem(Widget): _Height = 30 _Bssid="" # 50:3A:A0:51:18:3C diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py index c2d6c09..47234d4 100644 --- a/Menu/GameShell/10_Settings/Wifi/wifi_list.py +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -142,30 +142,6 @@ class WifiInfoPage(Page): self._DisconnectConfirmPage._Name = "Confirm Disconnect" self._DisconnectConfirmPage._Parent = self self._DisconnectConfirmPage.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] @@ -230,9 +206,7 @@ class WifiListSelector(PageSelector): _BackgroundColor = MySkinManager.GiveColor('Front') def __init__(self): - self._PosX = 0 - self._PosY = 0 - self._Height = 0 + pass def AnimateDraw(self,x2,y2): pass @@ -240,10 +214,10 @@ class WifiListSelector(PageSelector): def Draw(self): idx = self._Parent._PsIndex - if idx < len( self._Parent._WirelessList): - x = self._Parent._WirelessList[idx]._PosX+11 - y = self._Parent._WirelessList[idx]._PosY+1 - h = self._Parent._WirelessList[idx]._Height -3 + if idx < len( self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+11 + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 self._PosX = x self._PosY = y @@ -270,7 +244,7 @@ class WifiListMessageBox(Label): self._CanvasHWND.blit(my_text,(x,y,w,h)) class WifiList(Page): - _WirelessList = [] + _MyList = [] #Wicd dbus part _Wireless = None _Daemon = None @@ -300,7 +274,7 @@ class WifiList(Page): def __init__(self): Page.__init__(self) - self._WirelessList = [] + self._MyList = [] self._CanvasHWND = None def ShowBox(self,msg): @@ -317,7 +291,7 @@ class WifiList(Page): self._Screen.SwapAndShow() def GenNetworkList(self): - self._WirelessList = [] + self._MyList = [] start_x = 0 start_y = 0 @@ -336,7 +310,7 @@ class WifiList(Page): #ni._Bssid = self._Wireless.GetWirelessProperty(network_id,"bssid") ni.Init(network_id,is_active) - self._WirelessList.append(ni) + self._MyList.append(ni) self._PsIndex = 0 @@ -397,8 +371,8 @@ class WifiList(Page): if info != None: if len(info) > 3: _id = int(info[3]) - if _id < len(self._WirelessList): - self._WirelessList[_id].UpdateStrenLabel( str(info[2])) + if _id < len(self._MyList): + self._MyList[_id].UpdateStrenLabel( str(info[2])) self._PrevWicdState = state @@ -521,7 +495,7 @@ class WifiList(Page): netid = self._PsIndex - for i,v in enumerate(self._WirelessList): + for i,v in enumerate(self._MyList): if v._Bssid == self._CurBssid: netid = i break @@ -550,7 +524,7 @@ class WifiList(Page): self.ShowBox(MyLangManager.Tr("Connecting")) - self._WirelessList[netid].Connect() + self._MyList[netid].Connect() print("after Connect") self.UpdateStatus() @@ -584,31 +558,6 @@ class WifiList(Page): """ 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() @@ -657,13 +606,13 @@ class WifiList(Page): self._Screen.SwapAndShow() if event.key == CurKeys["Enter"]: ## enter to set password,enter is B on GM - if len(self._WirelessList) == 0: + if len(self._MyList) == 0: return - self._CurBssid = self._WirelessList[self._PsIndex]._Bssid + self._CurBssid = self._MyList[self._PsIndex]._Bssid wicd_wirelss_encrypt_pwd = self.GetWirelessEncrypt(self._PsIndex) - if self._WirelessList[self._PsIndex]._IsActive: + if self._MyList[self._PsIndex]._IsActive: self.ShowBox( self._Wireless.GetWirelessIP('') ) else: self._Screen.PushCurPage() @@ -693,7 +642,7 @@ class WifiList(Page): self.Rescan(False) if event.key == CurKeys["Y"]: - if len(self._WirelessList) == 0: + if len(self._MyList) == 0: return self._InfoPage._NetworkId = self._PsIndex @@ -762,13 +711,13 @@ class WifiList(Page): def Draw(self): self.ClearCanvas() - if len(self._WirelessList) == 0: + if len(self._MyList) == 0: return self._Ps.Draw() - for i in self._WirelessList: + for i in self._MyList: i.Draw() - self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height) + self._Scroller.UpdateSize( len(self._MyList)*NetItem._Height, self._PsIndex*NetItem._Height) self._Scroller.Draw() diff --git a/Menu/GameShell/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py index c9a14ab..721c8b0 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -104,30 +104,6 @@ class ListPage(Page): 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: diff --git a/Menu/GameShell/50_PICO-8/__init__.py b/Menu/GameShell/50_PICO-8/__init__.py new file mode 100644 index 0000000..f547c9f --- /dev/null +++ b/Menu/GameShell/50_PICO-8/__init__.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +import pygame +import validators + +from UI.constants import Width,Height,ICON_TYPES +from UI.simple_name_space import SimpleNamespace +from UI.page import Page +from UI.label import Label +from UI.fonts import fonts +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.keys_def import CurKeys +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.textarea import Textarea + +class Textbulletinboard(Textarea): + + def Draw(self): + pass + +class NOPICOPage(Page): + _FootMsg = ["Nav","","","Back",""] + _TextColor = MySkinManager.GiveColor('Text') + _DrawOnce = False + + + def KeyDown(self,event): + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + if self._FootMsg[3] == "Back": + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + return + + def Draw(self): + if self._DrawOnce == False: + self.ClearCanvas() + + self._DrawOnce = True + +class PICO8Page(Page): + _FootMsg = ["Nav","","","Back",""] + _MyList = [] + + _ListFontObj = fonts["varela13"] + + _AList = {} + _Labels = {} + + _Coords = {} + + _URLColor = MySkinManager.GiveColor('URL') + _TextColor = MySkinManager.GiveColor('Text') + _Scrolled = 0 + + _PngSize = {} + + _DrawOnce = False + _Scroller = None + _Scrolled = 0 + + + +class APIOBJ(object): + + _Page = None + + def __init__(self): + pass + def Init(self,main_screen): + pass + def API(self,main_screen): + if main_screen !=None: + + main_screen._MsgBox.SetText("Starting pico-8") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(300) + + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) diff --git a/Menu/GameShell/50_PICO-8/md5sum.log b/Menu/GameShell/50_PICO-8/md5sum.log new file mode 100644 index 0000000..f66e2de --- /dev/null +++ b/Menu/GameShell/50_PICO-8/md5sum.log @@ -0,0 +1,2 @@ +a3f2995cf117499f880bd964d6a0e1f2 pico-8_0.1.11g_raspi.zip +6726141c784afd4a41be6b7414c1b932 pico-8_0.1.11g_amd64.zip diff --git a/Menu/GameShell/97_Music Player/music_lib_list_page.py b/Menu/GameShell/97_Music Player/music_lib_list_page.py index 6760f77..4969eb4 100644 --- a/Menu/GameShell/97_Music Player/music_lib_list_page.py +++ b/Menu/GameShell/97_Music Player/music_lib_list_page.py @@ -196,35 +196,6 @@ class MusicLibListPage(Page): self._Scroller._PosY = 2 self._Scroller.Init() - - def ScrollUp(self,Step=1): - if len(self._MyList) == 0: - return - tmp = self._PsIndex - self._PsIndex -= Step - - 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 - - - def ScrollDown(self,Step=1): - if len(self._MyList) == 0: - return - tmp = self._PsIndex - self._PsIndex +=Step - 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 - def Click(self): if len(self._MyList) == 0: return @@ -272,12 +243,12 @@ class MusicLibListPage(Page): """ if event.key == CurKeys["Right"]: - self.ScrollDown(Step=5) + self.FScrollDown(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() if event.key == CurKeys["Left"]: - self.ScrollUp(Step=5) + self.FScrollUp(Step=5) self._Screen.Draw() self._Screen.SwapAndShow() """ diff --git a/sys.py/UI/above_all_patch.py b/sys.py/UI/above_all_patch.py index 661cd8f..0a28f69 100644 --- a/sys.py/UI/above_all_patch.py +++ b/sys.py/UI/above_all_patch.py @@ -18,10 +18,10 @@ from fonts import fonts from keys_def import CurKeys from label import Label from skin_manager import MySkinManager +from widget import Widget - -class AboveAllPatch(object): +class AboveAllPatch(Widget): _PosX =Width/2 _PosY =Height/2 _Width =50 diff --git a/sys.py/UI/confirm_page.py b/sys.py/UI/confirm_page.py index 4efac84..d932510 100644 --- a/sys.py/UI/confirm_page.py +++ b/sys.py/UI/confirm_page.py @@ -20,9 +20,6 @@ class ListPageSelector(PageSelector): _BackgroundColor = MySkinManager.GiveColor('Front') def __init__(self): - self._PosX = 0 - self._PosY = 0 - self._Height = 0 self._Width = Width def AnimateDraw(self,x2,y2): diff --git a/sys.py/UI/foot_bar.py b/sys.py/UI/foot_bar.py index f744fc1..5964fb0 100644 --- a/sys.py/UI/foot_bar.py +++ b/sys.py/UI/foot_bar.py @@ -13,7 +13,7 @@ from multi_icon_item import MultiIconItem from icon_pool import MyIconPool from libs.roundrects import aa_round_rect from lang_manager import MyLangManager - +from widget import Widget icon_base_path = SkinMap("gameshell/footbar_icons/") class FootBarIcon(MultiIconItem): @@ -40,9 +40,7 @@ class FootBarIcon(MultiIconItem): self._PosY, self._Width,self._Height,Width,Height), (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) -class FootBar: - _PosX = 0 - _PosY = 0 +class FootBar(Widget): _Width = Width _Height = 20 _BarHeight = 20.5 diff --git a/sys.py/UI/icon_item.py b/sys.py/UI/icon_item.py index 63b17ca..8edea09 100644 --- a/sys.py/UI/icon_item.py +++ b/sys.py/UI/icon_item.py @@ -7,12 +7,8 @@ from constants import icon_width,icon_height,ICON_TYPES,ALIGN,icon_ext,Width,He from util_funcs import color_surface,midRect from label import Label from lang_manager import MyLangManager - -class IconItem: - _PosX=0 - _PosY=0 - _Width=0 - _Height=0 +from widget import Widget +class IconItem(Widget): _ImageName="" _ImgSurf = None _Parent = None @@ -37,10 +33,6 @@ class IconItem: def SetLableColor(self,color): self._Label.SetColor(color) - def NewCoord(self,x,y): - self._PosX = x - self._PosY = y - def AddLabel(self,text,fontobj): if self._Label == None: self._Label = Label() diff --git a/sys.py/UI/info_page_list_item.py b/sys.py/UI/info_page_list_item.py index 5174f70..bfbd8c7 100644 --- a/sys.py/UI/info_page_list_item.py +++ b/sys.py/UI/info_page_list_item.py @@ -3,11 +3,8 @@ import pygame from label import Label from skin_manager import MySkinManager - -class InfoPageListItem(object): - _PosX = 0 - _PosY = 0 - _Width = 0 +from widget import Widget +class InfoPageListItem(Widget): _Height = 30 _Labels = {} diff --git a/sys.py/UI/info_page_selector.py b/sys.py/UI/info_page_selector.py index a96b381..69869e6 100644 --- a/sys.py/UI/info_page_selector.py +++ b/sys.py/UI/info_page_selector.py @@ -11,9 +11,6 @@ class InfoPageSelector(PageSelector): _BackgroundColor = MySkinManager.GiveColor('Front') def __init__(self): - self._PosX = 0 - self._PosY = 0 - self._Height = 0 self._Width = Width def AnimateDraw(self,x2,y2): diff --git a/sys.py/UI/keyboard.py b/sys.py/UI/keyboard.py index a9fb145..8fea7a7 100644 --- a/sys.py/UI/keyboard.py +++ b/sys.py/UI/keyboard.py @@ -23,10 +23,6 @@ from text_item import TextItem import myvars class KeyboardIcon(IconItem): - _PosX = 0 - _PosY = 0 - _Width = 0 - _Height = 0 _Color = MySkinManager.GiveColor('Text') _MyType = ICON_TYPES["NAV"] _Parent = None @@ -57,10 +53,6 @@ class KeyboardSelector(PageSelector): # pygame.draw.rect(self._Parent._CanvasHWND,(0,0,0),rect,1) class Keyboard(Page): - _PosX = 0 - _PosY = 0 - _Width = 0 - _Height = 0 _SectionNumbers = 3 _SectionIndex = 1 diff --git a/sys.py/UI/label.py b/sys.py/UI/label.py index 2a52e34..ccfa98d 100644 --- a/sys.py/UI/label.py +++ b/sys.py/UI/label.py @@ -10,12 +10,8 @@ from util_funcs import midRect #UI lib from skin_manager import MySkinManager from lang_manager import MyLangManager - -class Label: - _PosX=0 - _PosY=0 - _Width=0 - _Height=0 +from widget import Widget +class Label(Widget): _Text="" _FontObj=None _Color = MySkinManager.GiveColor('Text') @@ -32,10 +28,6 @@ class Label: my_text = self._FontObj.render(self._Text,True,self._Color) self._Width = my_text.get_width() self._Height = my_text.get_height() - - def NewCoord(self,x,y): - self._PosX = x - self._PosY = y def SetColor(self,color): self._Color = color @@ -50,8 +42,6 @@ class Label: self._Width = my_text.get_width() self._Height = my_text.get_height() - def Width(self): - return self._Width def SetCanvasHWND(self,_canvashwnd): self._CanvasHWND = _canvashwnd diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index 6c1496e..3a12a0e 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -28,6 +28,7 @@ from Emulator import MyEmulator from skin_manager import MySkinManager from lang_manager import MyLangManager +from widget import Widget from counter_screen import CounterScreen @@ -121,11 +122,10 @@ python_package_flag = "__init__.py" emulator_flag = "action.config" ##Abstract object for manage Pages ,not the pygame's physic screen -class MainScreen(object): +class MainScreen(Widget): _Pages = [] _PageMax = 0 _PageIndex = 0 - _PosX = 0 _PosY = TitleBar._BarHeight+1 _Width = Width _Height = Height -FootBar._BarHeight -TitleBar._BarHeight diff --git a/sys.py/UI/multilabel.py b/sys.py/UI/multilabel.py index ba47624..c955ea0 100644 --- a/sys.py/UI/multilabel.py +++ b/sys.py/UI/multilabel.py @@ -4,11 +4,9 @@ import pygame from skin_manager import MySkinManager from lang_manager import MyLangManager +from widget import Widget - -class MultiLabel: ##Multi Line Label - _PosX=0 - _PosY=0 +class MultiLabel(Widget): ##Multi Line Label _Width=135 _Height=100 _Text="" @@ -28,9 +26,6 @@ class MultiLabel: ##Multi Line Label self.blit_text(self._CanvasHWND,self._Text,(self._PosX,self._PosY),self._FontObj) - def NewCoord(self,x,y): - self._PosX = x - self._PosY = y def SetColor(self,color): self._Color = color @@ -43,9 +38,6 @@ class MultiLabel: ##Multi Line Label self.blit_text(self._CanvasHWND,self._Text,(self._PosX,self._PosY),self._FontObj) - def Width(self): - return self._Width - def SetCanvasHWND(self,_canvashwnd): self._CanvasHWND = _canvashwnd diff --git a/sys.py/UI/page.py b/sys.py/UI/page.py index 4c5f29a..8e2c1ab 100644 --- a/sys.py/UI/page.py +++ b/sys.py/UI/page.py @@ -18,6 +18,7 @@ from util_funcs import midRect from keys_def import CurKeys from icon_pool import MyIconPool from lang_manager import MyLangManager +from widget import Widget class PageStack: def __init__(self): @@ -37,11 +38,8 @@ class PageStack: def Length(self): return len(self.stack) -class PageSelector: - _PosX = 0 - _PosY = 0 - _Width = 0 - _Height = 0 +class PageSelector(Widget): + _Parent = None _Alpha = 0 _OnShow = True @@ -81,11 +79,7 @@ class PageSelector: if self._IconSurf != None: self._Parent._CanvasHWND.blit(self._IconSurf,rect) -class Page(object): - _PosX=0 - _PosY=0 - _Width=0 - _Height=0 +class Page(Widget): _Icons = [] _Ps = None _PsIndex = 0 @@ -579,6 +573,35 @@ class Page(object): if cur_li._PosY < 0: for i in range(0, len(self._MyList)): self._MyList[i]._PosY += self._MyList[i]._Height + + def FScrollUp(self,Step=1): + if len(self._MyList) == 0: + return + tmp = self._PsIndex + self._PsIndex -= Step + + 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 + + + def FScrollDown(self,Step=1): + if len(self._MyList) == 0: + return + tmp = self._PsIndex + self._PsIndex +=Step + 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 + def KeyDown(self,event):##default keydown,every inherited page class should have it's own KeyDown if event.key == CurKeys["A"]: diff --git a/sys.py/UI/textarea.py b/sys.py/UI/textarea.py index 39f0b15..50d7f4c 100644 --- a/sys.py/UI/textarea.py +++ b/sys.py/UI/textarea.py @@ -11,12 +11,9 @@ from UI.page import Page,PageStack,PageSelector from UI.label import Label from UI.fonts import fonts from UI.skin_manager import MySkinManager +from UI.widget import Widget -class Textarea: - _PosX =0 - _PosY = 0 - _Width = 0 - _Height = 0 +class Textarea(Widget): _BackgroundColor = MySkinManager.GiveColor('TitleBg') _CanvasHWND = None _MyWords = [] diff --git a/sys.py/UI/title_bar.py b/sys.py/UI/title_bar.py index eec4ff6..18a0514 100644 --- a/sys.py/UI/title_bar.py +++ b/sys.py/UI/title_bar.py @@ -19,7 +19,7 @@ from multi_icon_item import MultiIconItem from icon_pool import MyIconPool from lang_manager import MyLangManager from util_funcs import midRect,SwapAndShow,SkinMap - +from widget import Widget from config import Battery from libs.roundrects import aa_round_rect @@ -27,9 +27,7 @@ from libs.roundrects import aa_round_rect from libs.DBUS import is_wifi_connected_now,wifi_strength icon_base_path = SkinMap("gameshell/titlebar_icons/") -class TitleBar: - _PosX = 0 - _PosY = 0 +class TitleBar(Widget): _Width = Width _Height = 25 _BarHeight = 24.5 diff --git a/sys.py/UI/widget.py b/sys.py/UI/widget.py new file mode 100644 index 0000000..4d1eec0 --- /dev/null +++ b/sys.py/UI/widget.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +class Widget: + _PosX =0 + _PosY = 0 + _Width = 0 + _Height = 0 + + def __init__(self): + pass + + def NewCoord(self,x,y): + self._PosX = x + self._PosY = y + + def Coord(self): + return self._PosX,self._PosY + + def Width(self): + return self._Width + + def Height(self): + return self._Height + + def Size(self): + return self._Width,self._Height From e6c22c90e07a88131f0d0a3e82883d393e65e498 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 16 Jan 2019 01:17:02 +0800 Subject: [PATCH 4/7] PICO-8 alpha --- Menu/GameShell/50_PICO-8/__init__.py | 342 ++++++++++++++++++++++--- skin/default/Menu/GameShell/PICO-8.png | Bin 0 -> 1174 bytes sys.py/UI/textarea.py | 5 +- 3 files changed, 303 insertions(+), 44 deletions(-) create mode 100644 skin/default/Menu/GameShell/PICO-8.png diff --git a/Menu/GameShell/50_PICO-8/__init__.py b/Menu/GameShell/50_PICO-8/__init__.py index f547c9f..bc8d87c 100644 --- a/Menu/GameShell/50_PICO-8/__init__.py +++ b/Menu/GameShell/50_PICO-8/__init__.py @@ -2,8 +2,8 @@ import pygame import validators -from UI.constants import Width,Height,ICON_TYPES -from UI.simple_name_space import SimpleNamespace +from UI.constants import Width,Height,ICON_TYPES,RUNEVT +#from UI.simple_name_space import SimpleNamespace from UI.page import Page from UI.label import Label from UI.fonts import fonts @@ -13,71 +13,333 @@ from UI.keys_def import CurKeys from UI.skin_manager import MySkinManager from UI.lang_manager import MyLangManager from UI.textarea import Textarea +from UI.widget import Widget + +from UI.util_funcs import FileExists + +from libs.roundrects import aa_round_rect + +class Word: + _T = "" + _Color = MySkinManager.GiveColor('Text') ## default text color + _FontObj = MyLangManager.TrFont("varela12") ##default font + _Size = 12 + _Bold = False + _UndLine = False + def SetColor(self,color): + self._Color = color + + def GetColor(self): + return self._Color + + def SetFont(self,fnt): + self._FontObj = fnt + + def SetBold(self,bd): + self._Bold = bd + + def SetUnderLine(self,bd): + self._UndLine = bd + + def __init__(self,v=""): + self._T = v + + def __str__(self): + return self._T + + def __unicode__(self): + return self._T.encode("utf-8") + + def __add__(self,a): + return self._T + a + + def __repr__(self): + return self._T + + def __len__(self): + return len(self._T) + + def __eq__(self, other): + return self._T == other + + def FnHeight(self): + return self._FontObj.get_height() + + def Render(self): + self._FontObj.set_bold(self._Bold) + self._FontObj.set_underline(self._UndLine) + + sur = self._FontObj.render(self._T,True,self._Color) + + self._FontObj.set_bold(False) + self._FontObj.set_underline(False) + return sur + +class Text: + _Words = [] + def __init__(self,content="",color=None,fnt=None,Bold=False,Und=False): + self._Words = [ Word(x) for x in list(content) ] + if color != None: + self.SetColor(color) + if fnt != None: + self.SetFont(fnt) + + if Bold == True: + self.SetBold(True) + if Und == True: + self.SetUnderLine(True) + + def SetColor(self,color): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetColor(color) + + def SetBold(self,bd): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetBold(bd) + + def SetUnderLine(self,bd): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetUnderLine(bd) + + def SetFont(self,fnt): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetFont(fnt) + + def __add__(self,a): + return self._Words+a.Words() + + def Words(self): + return self._Words class Textbulletinboard(Textarea): + _TextLimit = 200 + _BackgroundColor = MySkinManager.GiveColor("White") + _Align = "Left" ## Left or Center + def SetAndBlitText(self,words):# words => [] + + if self._TextFull != True: + self._MyWords = words + #self.BlitText() + self._TextIndex = len(self._MyWords) + else: + print("is Full %s" % "".join(str(self._MyWords))) + + def BuildBlitText(self): + blit_rows = [[]] + w = 0 + xmargin = 5 + endmargin = 15 + x = self._PosX+xmargin + linenumber = 0 + cursor_row = 0 + + for i, v in enumerate(self._MyWords): + if str(v) == "\n": + w = 0 + x = self._PosX+xmargin + linenumber+=1 + blit_rows.append([]) + else: + t = v.Render() + t_width = t.get_width() + w += t_width + del(t) + + blit_rows[linenumber].append(v) + + if i == self._TextIndex - 1: + cursor_row = linenumber + + if w + t_width >= self._Width-endmargin: + x = self._PosX+xmargin + w = 0 + linenumber += 1 + blit_rows.append([]) + + + self._BlitWords = blit_rows + self._BlitIndex = self._TextIndex + + def BlitText(self): + # build up blitwords + self.BuildBlitText() + xmargin = 5 + endmargin = 5 + start_x = self._PosX+xmargin ##start_point_x + start_y = self._PosY ## start_point_y + x = self._PosX+xmargin ##start_point_x + y = self._PosY ## start_point_y + + self._TextFull = len(self._MyWords) > self._TextLimit + last_height = 0 + + for row_idx, row in enumerate(self._BlitWords): + + if len(row) == 0: + y = y + 16 + w = 0 + continue + + else: + total_row_width = 0 + for i,v in enumerate(row): + t = v.Render() + total_row_width += t.get_width() + if total_row_width > self._Width-endmargin: + total_row_width = self._Width + start_x = self._PosX + xmargin + break + else: + if self._Align == "Center": + start_x = (self._Width - total_row_width)/2 + + last_height = 0 + total_row_width = 0 + x = start_x + for i,v in enumerate(row): + t = v.Render() + total_row_width += t.get_width() + + if last_height < v.FnHeight(): + last_height = v.FnHeight() + + if total_row_width > self._Width-endmargin: + x = start_x + y = y + last_height + total_row_width = 0 + + self._CanvasHWND.blit(t, (x,y)) + x += t.get_width() + + y = y + last_height + def Draw(self): - pass + #aa_round_rect(self._CanvasHWND, (4,24.5+6,312,60),self._BackgroundColor,4,0,self._BackgroundColor) + + aa_round_rect(self._CanvasHWND, + (self._PosX,self._PosY,self._Width,self._Height),self._BackgroundColor,4,0,self._BackgroundColor) + + self.BlitText() + class NOPICOPage(Page): _FootMsg = ["Nav","","","Back",""] - _TextColor = MySkinManager.GiveColor('Text') - _DrawOnce = False - + 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 + + self._Board = Textbulletinboard() + + self._Board._PosX = 4 + self._Board._PosY = 20 + self._Board._Width= self._Width - 4*2 + self._Board._Height = 100 + self._Board._CanvasHWND = self._CanvasHWND + self._Board.Init() + + a = Text("Please Go to \n",None,MyLangManager.TrFont("varela14"),True) + b = Text("https://www.lexaloffle.com/pico-8.php",MySkinManager.GiveColor("URL"),None,True,True) + c = Text("buy a pico-8 raspi") + + d = a.Words()+b.Words()+c.Words() + self._Board.SetAndBlitText(d) + def KeyDown(self,event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: - if self._FootMsg[3] == "Back": - self.ReturnToUpLevelPage() - self._Screen.Draw() - self._Screen.SwapAndShow() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() return def Draw(self): - if self._DrawOnce == False: - self.ClearCanvas() - - self._DrawOnce = True - -class PICO8Page(Page): - _FootMsg = ["Nav","","","Back",""] - _MyList = [] - - _ListFontObj = fonts["varela13"] - - _AList = {} - _Labels = {} + self.ClearCanvas() + self._Board.Draw() + - _Coords = {} +class PICO8ZipHashErrPage(Page): + _FootMsg = ["Nav","","","Cancel","Continue"] - _URLColor = MySkinManager.GiveColor('URL') - _TextColor = MySkinManager.GiveColor('Text') - _Scrolled = 0 + 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 + + self._Board = Textbulletinboard() + + self._Board._PosX = 4 + self._Board._PosY = self._Height/2 - 35 + self._Board._Width= self._Width - 4*2 + self._Board._Height = 100 + self._Board._CanvasHWND = self._CanvasHWND + self._Board._Align = "Center" + self._Board.Init() + + a = Text("Zip md5sum error\n",None,MyLangManager.TrFont("varela24")) + b = Text("Continue anyway?\n",None,MyLangManager.TrFont("varela24")) + + self._Board.SetAndBlitText(a.Words()+b.Words()) + + def KeyDown(self,event): + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + return - _PngSize = {} - - _DrawOnce = False - _Scroller = None - _Scrolled = 0 - + def Draw(self): + self.ClearCanvas() + self._Board.Draw() class APIOBJ(object): _Page = None + _PICO8 ="/home/cpi/games/PICO-8" + _pico8 ="/home/cpi/games/PICO-8/pico-8" def __init__(self): pass + + def CheckPico8(self): + if FileExists(self._PICO8) and FileExists(self._pico8): + return True + def Init(self,main_screen): - pass + self._NOPicoPage = NOPICOPage() + self._NOPicoPage._Name = "No Pico8" + self._NOPicoPage._Screen = main_screen + self._NOPicoPage.Init() + + self._HashErrPage = PICO8ZipHashErrPage() + self._HashErrPage._Name = "Md5sum failed" + self._HashErrPage._Screen = main_screen + self._HashErrPage.Init() + def API(self,main_screen): if main_screen !=None: - - main_screen._MsgBox.SetText("Starting pico-8") - main_screen._MsgBox.Draw() - main_screen.SwapAndShow() - pygame.time.delay(300) - + if self.CheckPico8() == False: + main_screen._MsgBox.SetText("Starting pico-8") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(300) + cmdpath = "/home/cpi/games/PICO-8/PICO-8.sh" + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + else: + main_screen.PushPage(self._NOPicoPage) + #main_screen.PushPage(self._HashErrPage) + main_screen.Draw() + main_screen.SwapAndShow() OBJ = APIOBJ() def Init(main_screen): diff --git a/skin/default/Menu/GameShell/PICO-8.png b/skin/default/Menu/GameShell/PICO-8.png new file mode 100644 index 0000000000000000000000000000000000000000..65ef00b91645bc43078a63fb9ba39d6ab5242aaf GIT binary patch literal 1174 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdoh8V2Sl~aSW-L^LCcMhgP-7@%`KD zBZ8-R8hOlKutDsQYIMZxBEh8BOV+Ma{;tctXs_UFfWVf*)fgM*UJ z1P*SMLrk5NF?F1+<{ta-!C=|4Wp-;*8(sE&+`swX!zWKzy1Tn8YHN?4J3Jgb*43`9HR_XzLviM?0h*oQaPT1F$IyD(S<;f=%X8JHO^tdVW zurUjDvOM}&akMaNt5n%;Ss<9dE--At>8DzqvV80=fk!T042*0{+bju0+S=NxOuTH& zbNrUeynpvjNvQM0$0J8ra?EBY?K^z<@T5LTNy&qE?#R^G-Jj0V=Cp8F`j5J$we{hvSEtH+|N3>|{{8WR)BToj+`hfN z#42|C)@-32d-lX^XRT+Cj*eEH`>epiz}$TK3U0RM)b)EsvV?Bjzu*7tS=!N$=gytm zmG>!{VDXB@xYr~?q`K`X{wD{tKfB)pRZ{J=Txm&GKZ#wrPjccg~?;m{gMkg&j z-G1%tnKLJ@Zv^@YD6hwV>1K}D(Imm2HT#}aY>a3DCdb@d*Yfi6n}zoOE5unCV`F2x zcGcMNdrq2gHjR-XH#aw6_0<V1n{)f^wB*@m+kgqzb?*K5?f2hLfBf;|$4#GW+m1hOJpTCSryW@zxI>lx s7&UT~D+r2tw6F>#Ho8PmllhNnhC}gfrS2cO!19K{)78&qol`;+0PQdoZU6uP literal 0 HcmV?d00001 diff --git a/sys.py/UI/textarea.py b/sys.py/UI/textarea.py index 50d7f4c..7b96fd1 100644 --- a/sys.py/UI/textarea.py +++ b/sys.py/UI/textarea.py @@ -3,9 +3,6 @@ import pygame from libs.roundrects import aa_round_rect - - - ## local UI import from UI.page import Page,PageStack,PageSelector from UI.label import Label @@ -67,7 +64,7 @@ class Textarea(Widget): self.BlitText() self.AddTextIndex() else: - print("is Full %s" % "".join(self._MyWords)) + print("is Full %s" % "".join(str(self._MyWords))) def BuildBlitText(self): blit_rows = [[]] From 565605cfef8a3769faee6027e806650472bbfcdb Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 16 Jan 2019 12:03:40 +0800 Subject: [PATCH 5/7] add text_bulletinboard.py --- Menu/GameShell/50_PICO-8/__init__.py | 226 +-------------------------- sys.py/UI/text_bulletinboard.py | 220 ++++++++++++++++++++++++++ 2 files changed, 227 insertions(+), 219 deletions(-) create mode 100644 sys.py/UI/text_bulletinboard.py diff --git a/Menu/GameShell/50_PICO-8/__init__.py b/Menu/GameShell/50_PICO-8/__init__.py index bc8d87c..5c0b610 100644 --- a/Menu/GameShell/50_PICO-8/__init__.py +++ b/Menu/GameShell/50_PICO-8/__init__.py @@ -12,220 +12,9 @@ from UI.icon_pool import MyIconPool from UI.keys_def import CurKeys from UI.skin_manager import MySkinManager from UI.lang_manager import MyLangManager -from UI.textarea import Textarea -from UI.widget import Widget - +from UI.text_bulletinboard import Textbulletinboard,Text from UI.util_funcs import FileExists -from libs.roundrects import aa_round_rect - -class Word: - _T = "" - _Color = MySkinManager.GiveColor('Text') ## default text color - _FontObj = MyLangManager.TrFont("varela12") ##default font - _Size = 12 - _Bold = False - _UndLine = False - def SetColor(self,color): - self._Color = color - - def GetColor(self): - return self._Color - - def SetFont(self,fnt): - self._FontObj = fnt - - def SetBold(self,bd): - self._Bold = bd - - def SetUnderLine(self,bd): - self._UndLine = bd - - def __init__(self,v=""): - self._T = v - - def __str__(self): - return self._T - - def __unicode__(self): - return self._T.encode("utf-8") - - def __add__(self,a): - return self._T + a - - def __repr__(self): - return self._T - - def __len__(self): - return len(self._T) - - def __eq__(self, other): - return self._T == other - - def FnHeight(self): - return self._FontObj.get_height() - - def Render(self): - self._FontObj.set_bold(self._Bold) - self._FontObj.set_underline(self._UndLine) - - sur = self._FontObj.render(self._T,True,self._Color) - - self._FontObj.set_bold(False) - self._FontObj.set_underline(False) - return sur - -class Text: - _Words = [] - def __init__(self,content="",color=None,fnt=None,Bold=False,Und=False): - self._Words = [ Word(x) for x in list(content) ] - if color != None: - self.SetColor(color) - if fnt != None: - self.SetFont(fnt) - - if Bold == True: - self.SetBold(True) - if Und == True: - self.SetUnderLine(True) - - def SetColor(self,color): - if len(self._Words) > 0: - for i,x in enumerate(self._Words): - self._Words[i].SetColor(color) - - def SetBold(self,bd): - if len(self._Words) > 0: - for i,x in enumerate(self._Words): - self._Words[i].SetBold(bd) - - def SetUnderLine(self,bd): - if len(self._Words) > 0: - for i,x in enumerate(self._Words): - self._Words[i].SetUnderLine(bd) - - def SetFont(self,fnt): - if len(self._Words) > 0: - for i,x in enumerate(self._Words): - self._Words[i].SetFont(fnt) - - def __add__(self,a): - return self._Words+a.Words() - - def Words(self): - return self._Words - -class Textbulletinboard(Textarea): - _TextLimit = 200 - _BackgroundColor = MySkinManager.GiveColor("White") - _Align = "Left" ## Left or Center - - def SetAndBlitText(self,words):# words => [] - - if self._TextFull != True: - self._MyWords = words - #self.BlitText() - self._TextIndex = len(self._MyWords) - else: - print("is Full %s" % "".join(str(self._MyWords))) - - def BuildBlitText(self): - blit_rows = [[]] - w = 0 - xmargin = 5 - endmargin = 15 - x = self._PosX+xmargin - linenumber = 0 - cursor_row = 0 - - for i, v in enumerate(self._MyWords): - if str(v) == "\n": - w = 0 - x = self._PosX+xmargin - linenumber+=1 - blit_rows.append([]) - else: - t = v.Render() - t_width = t.get_width() - w += t_width - del(t) - - blit_rows[linenumber].append(v) - - if i == self._TextIndex - 1: - cursor_row = linenumber - - if w + t_width >= self._Width-endmargin: - x = self._PosX+xmargin - w = 0 - linenumber += 1 - blit_rows.append([]) - - - self._BlitWords = blit_rows - self._BlitIndex = self._TextIndex - - def BlitText(self): - # build up blitwords - self.BuildBlitText() - xmargin = 5 - endmargin = 5 - start_x = self._PosX+xmargin ##start_point_x - start_y = self._PosY ## start_point_y - x = self._PosX+xmargin ##start_point_x - y = self._PosY ## start_point_y - - self._TextFull = len(self._MyWords) > self._TextLimit - last_height = 0 - - for row_idx, row in enumerate(self._BlitWords): - - if len(row) == 0: - y = y + 16 - w = 0 - continue - - else: - total_row_width = 0 - for i,v in enumerate(row): - t = v.Render() - total_row_width += t.get_width() - if total_row_width > self._Width-endmargin: - total_row_width = self._Width - start_x = self._PosX + xmargin - break - else: - if self._Align == "Center": - start_x = (self._Width - total_row_width)/2 - - last_height = 0 - total_row_width = 0 - x = start_x - for i,v in enumerate(row): - t = v.Render() - total_row_width += t.get_width() - - if last_height < v.FnHeight(): - last_height = v.FnHeight() - - if total_row_width > self._Width-endmargin: - x = start_x - y = y + last_height - total_row_width = 0 - - self._CanvasHWND.blit(t, (x,y)) - x += t.get_width() - - y = y + last_height - - def Draw(self): - #aa_round_rect(self._CanvasHWND, (4,24.5+6,312,60),self._BackgroundColor,4,0,self._BackgroundColor) - - aa_round_rect(self._CanvasHWND, - (self._PosX,self._PosY,self._Width,self._Height),self._BackgroundColor,4,0,self._BackgroundColor) - - self.BlitText() - class NOPICOPage(Page): _FootMsg = ["Nav","","","Back",""] @@ -248,7 +37,7 @@ class NOPICOPage(Page): a = Text("Please Go to \n",None,MyLangManager.TrFont("varela14"),True) b = Text("https://www.lexaloffle.com/pico-8.php",MySkinManager.GiveColor("URL"),None,True,True) - c = Text("buy a pico-8 raspi") + c = Text("buy a pico-8 raspi and put zip into \n/home/cpi/games/PICO-8") d = a.Words()+b.Words()+c.Words() self._Board.SetAndBlitText(d) @@ -285,8 +74,8 @@ class PICO8ZipHashErrPage(Page): self._Board._Align = "Center" self._Board.Init() - a = Text("Zip md5sum error\n",None,MyLangManager.TrFont("varela24")) - b = Text("Continue anyway?\n",None,MyLangManager.TrFont("varela24")) + a = Text("Md5sum check error\n",None,MyLangManager.TrFont("varela24")) + b = Text("continue anyway?\n",None,MyLangManager.TrFont("varela24")) self._Board.SetAndBlitText(a.Words()+b.Words()) @@ -305,24 +94,23 @@ class PICO8ZipHashErrPage(Page): class APIOBJ(object): _Page = None - _PICO8 ="/home/cpi/games/PICO-8" _pico8 ="/home/cpi/games/PICO-8/pico-8" def __init__(self): pass def CheckPico8(self): - if FileExists(self._PICO8) and FileExists(self._pico8): + if FileExists(self._pico8): return True def Init(self,main_screen): self._NOPicoPage = NOPICOPage() - self._NOPicoPage._Name = "No Pico8" + self._NOPicoPage._Name = "Not Found" self._NOPicoPage._Screen = main_screen self._NOPicoPage.Init() self._HashErrPage = PICO8ZipHashErrPage() - self._HashErrPage._Name = "Md5sum failed" + self._HashErrPage._Name = "Md5sum check failed" self._HashErrPage._Screen = main_screen self._HashErrPage.Init() diff --git a/sys.py/UI/text_bulletinboard.py b/sys.py/UI/text_bulletinboard.py new file mode 100644 index 0000000..2892272 --- /dev/null +++ b/sys.py/UI/text_bulletinboard.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- + +import pygame +from libs.roundrects import aa_round_rect + +## local UI import +from page import Page,PageStack,PageSelector +from label import Label +from fonts import fonts +from skin_manager import MySkinManager +from lang_manager import MyLangManager +from widget import Widget +from textarea import Textarea + +class Word: + _T = "" + _Color = MySkinManager.GiveColor('Text') ## default text color + _FontObj = MyLangManager.TrFont("varela12") ##default font + _Size = 12 + _Bold = False + _UndLine = False + def SetColor(self,color): + self._Color = color + + def GetColor(self): + return self._Color + + def SetFont(self,fnt): + self._FontObj = fnt + + def SetBold(self,bd): + self._Bold = bd + + def SetUnderLine(self,bd): + self._UndLine = bd + + def __init__(self,v=""): + self._T = v + + def __str__(self): + return self._T + + def __unicode__(self): + return self._T.encode("utf-8") + + def __add__(self,a): + return self._T + a + + def __repr__(self): + return self._T + + def __len__(self): + return len(self._T) + + def __eq__(self, other): + return self._T == other + + def FnHeight(self): + return self._FontObj.get_height() + + def Render(self): + self._FontObj.set_bold(self._Bold) + self._FontObj.set_underline(self._UndLine) + + sur = self._FontObj.render(self._T,True,self._Color) + + self._FontObj.set_bold(False) + self._FontObj.set_underline(False) + return sur + +class Text: + _Words = [] + def __init__(self,content="",color=None,fnt=None,Bold=False,Und=False): + self._Words = [ Word(x) for x in list(content) ] + if color != None: + self.SetColor(color) + if fnt != None: + self.SetFont(fnt) + + if Bold == True: + self.SetBold(True) + if Und == True: + self.SetUnderLine(True) + + def SetColor(self,color): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetColor(color) + + def SetBold(self,bd): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetBold(bd) + + def SetUnderLine(self,bd): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetUnderLine(bd) + + def SetFont(self,fnt): + if len(self._Words) > 0: + for i,x in enumerate(self._Words): + self._Words[i].SetFont(fnt) + + def __add__(self,a): + return self._Words+a.Words() + + def Words(self): + return self._Words + +class Textbulletinboard(Textarea): + _TextLimit = 200 + _BackgroundColor = MySkinManager.GiveColor("White") + _Align = "Left" ## Left or Center + + def SetAndBlitText(self,words):# words => [] + + if self._TextFull != True: + self._MyWords = words + #self.BlitText() + self._TextIndex = len(self._MyWords) + else: + print("is Full %s" % "".join(str(self._MyWords))) + + def BuildBlitText(self): + blit_rows = [[]] + w = 0 + xmargin = 5 + endmargin = 15 + x = self._PosX+xmargin + linenumber = 0 + cursor_row = 0 + + for i, v in enumerate(self._MyWords): + if str(v) == "\n": + w = 0 + x = self._PosX+xmargin + linenumber+=1 + blit_rows.append([]) + else: + t = v.Render() + t_width = t.get_width() + w += t_width + del(t) + + blit_rows[linenumber].append(v) + + if i == self._TextIndex - 1: + cursor_row = linenumber + + if w + t_width >= self._Width-endmargin: + x = self._PosX+xmargin + w = 0 + linenumber += 1 + blit_rows.append([]) + + + self._BlitWords = blit_rows + self._BlitIndex = self._TextIndex + + def BlitText(self): + # build up blitwords + self.BuildBlitText() + xmargin = 5 + endmargin = 5 + start_x = self._PosX+xmargin ##start_point_x + start_y = self._PosY ## start_point_y + x = self._PosX+xmargin ##start_point_x + y = self._PosY ## start_point_y + + self._TextFull = len(self._MyWords) > self._TextLimit + last_height = 0 + + for row_idx, row in enumerate(self._BlitWords): + + if len(row) == 0: + y = y + 16 + w = 0 + continue + + else: + total_row_width = 0 + for i,v in enumerate(row): + t = v.Render() + total_row_width += t.get_width() + if total_row_width > self._Width-endmargin: + total_row_width = self._Width + start_x = self._PosX + xmargin + break + else: + if self._Align == "Center": + start_x = (self._Width - total_row_width)/2 + + last_height = 0 + total_row_width = 0 + x = start_x + for i,v in enumerate(row): + t = v.Render() + total_row_width += t.get_width() + + if last_height < v.FnHeight(): + last_height = v.FnHeight() + + if total_row_width > self._Width-endmargin: + x = start_x + y = y + last_height + total_row_width = 0 + + self._CanvasHWND.blit(t, (x,y)) + x += t.get_width() + + y = y + last_height + + def Draw(self): + #aa_round_rect(self._CanvasHWND, (4,24.5+6,312,60),self._BackgroundColor,4,0,self._BackgroundColor) + + aa_round_rect(self._CanvasHWND, + (self._PosX,self._PosY,self._Width,self._Height),self._BackgroundColor,4,0,self._BackgroundColor) + + self.BlitText() From be872d0536d4f8422a0987410fd2f4aafb9d034c Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 17 Jan 2019 00:56:40 +0800 Subject: [PATCH 6/7] Comm software package alpha --- .gitignore | 2 +- Menu/GameShell/50_PICO-8/PICO-8.sh | 5 + Menu/GameShell/50_PICO-8/Post-Up.sh | 8 + Menu/GameShell/50_PICO-8/__init__.py | 136 ------- Menu/GameShell/50_PICO-8/compkginfo.json | 9 + Menu/GameShell/50_PICO-8/md5sum.log | 2 - Menu/GameShell/50_PICO-8/pico-8/config.txt | 99 +++++ Menu/GameShell/50_PICO-8/pico-8/log.txt | 90 +++++ .../50_PICO-8/pico-8/sdl_controllers.txt | 1 + skin/default/Menu/GameShell/PICO-8.png | Bin 1174 -> 1987 bytes .../sys.py/gameshell/icons/pico8_md5_err.png | Bin 0 -> 3685 bytes .../sys.py/gameshell/icons/pico8_notfound.png | Bin 0 -> 3732 bytes .../UI/CommercialSoftwarePackage/__init__.py | 342 ++++++++++++++++++ sys.py/UI/constants.py | 2 +- sys.py/UI/icon_item.py | 19 + sys.py/UI/icon_pool.py | 22 +- sys.py/UI/lang_manager.py | 5 +- sys.py/UI/main_screen.py | 37 +- sys.py/UI/page.py | 4 +- sys.py/UI/text_bulletinboard.py | 27 +- 20 files changed, 650 insertions(+), 160 deletions(-) create mode 100755 Menu/GameShell/50_PICO-8/PICO-8.sh create mode 100755 Menu/GameShell/50_PICO-8/Post-Up.sh delete mode 100644 Menu/GameShell/50_PICO-8/__init__.py create mode 100644 Menu/GameShell/50_PICO-8/compkginfo.json delete mode 100644 Menu/GameShell/50_PICO-8/md5sum.log create mode 100644 Menu/GameShell/50_PICO-8/pico-8/config.txt create mode 100644 Menu/GameShell/50_PICO-8/pico-8/log.txt create mode 100644 Menu/GameShell/50_PICO-8/pico-8/sdl_controllers.txt create mode 100644 skin/default/sys.py/gameshell/icons/pico8_md5_err.png create mode 100644 skin/default/sys.py/gameshell/icons/pico8_notfound.png create mode 100644 sys.py/UI/CommercialSoftwarePackage/__init__.py diff --git a/.gitignore b/.gitignore index 3e20d37..e812c3b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ sys.py/.lang !**/Jobs/.gitkeep !**/Jobs/00_lowpower.sh !**/Jobs/00_lowpower.alias - +.done diff --git a/Menu/GameShell/50_PICO-8/PICO-8.sh b/Menu/GameShell/50_PICO-8/PICO-8.sh new file mode 100755 index 0000000..cfbba82 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/PICO-8.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +#SDL_VIDEODRIVER=x11 DISPLAY=:0 ./pico-8/pico8_dyn -splore -draw_rect 32,0,256,240 +cd /home/cpi/games/PICO-8/pico-8 +SDL_VIDEODRIVER=x11 DISPLAY=:0 ./pico8_dyn -draw_rect 32,0,256,240 diff --git a/Menu/GameShell/50_PICO-8/Post-Up.sh b/Menu/GameShell/50_PICO-8/Post-Up.sh new file mode 100755 index 0000000..f2062a3 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/Post-Up.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +mkdir ~/.lexaloffle + +cp -rf pico-8 ~/.lexaloffle + +touch .done + diff --git a/Menu/GameShell/50_PICO-8/__init__.py b/Menu/GameShell/50_PICO-8/__init__.py deleted file mode 100644 index 5c0b610..0000000 --- a/Menu/GameShell/50_PICO-8/__init__.py +++ /dev/null @@ -1,136 +0,0 @@ -# -*- coding: utf-8 -*- -import pygame -import validators - -from UI.constants import Width,Height,ICON_TYPES,RUNEVT -#from UI.simple_name_space import SimpleNamespace -from UI.page import Page -from UI.label import Label -from UI.fonts import fonts -from UI.icon_item import IconItem -from UI.icon_pool import MyIconPool -from UI.keys_def import CurKeys -from UI.skin_manager import MySkinManager -from UI.lang_manager import MyLangManager -from UI.text_bulletinboard import Textbulletinboard,Text -from UI.util_funcs import FileExists - - -class NOPICOPage(Page): - _FootMsg = ["Nav","","","Back",""] - - 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 - - self._Board = Textbulletinboard() - - self._Board._PosX = 4 - self._Board._PosY = 20 - self._Board._Width= self._Width - 4*2 - self._Board._Height = 100 - self._Board._CanvasHWND = self._CanvasHWND - self._Board.Init() - - a = Text("Please Go to \n",None,MyLangManager.TrFont("varela14"),True) - b = Text("https://www.lexaloffle.com/pico-8.php",MySkinManager.GiveColor("URL"),None,True,True) - c = Text("buy a pico-8 raspi and put zip into \n/home/cpi/games/PICO-8") - - d = a.Words()+b.Words()+c.Words() - self._Board.SetAndBlitText(d) - - def KeyDown(self,event): - if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: - self.ReturnToUpLevelPage() - self._Screen.Draw() - self._Screen.SwapAndShow() - return - - def Draw(self): - self.ClearCanvas() - self._Board.Draw() - - -class PICO8ZipHashErrPage(Page): - _FootMsg = ["Nav","","","Cancel","Continue"] - - 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 - - self._Board = Textbulletinboard() - - self._Board._PosX = 4 - self._Board._PosY = self._Height/2 - 35 - self._Board._Width= self._Width - 4*2 - self._Board._Height = 100 - self._Board._CanvasHWND = self._CanvasHWND - self._Board._Align = "Center" - self._Board.Init() - - a = Text("Md5sum check error\n",None,MyLangManager.TrFont("varela24")) - b = Text("continue anyway?\n",None,MyLangManager.TrFont("varela24")) - - self._Board.SetAndBlitText(a.Words()+b.Words()) - - def KeyDown(self,event): - if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: - self.ReturnToUpLevelPage() - self._Screen.Draw() - self._Screen.SwapAndShow() - return - - def Draw(self): - self.ClearCanvas() - self._Board.Draw() - - -class APIOBJ(object): - - _Page = None - _pico8 ="/home/cpi/games/PICO-8/pico-8" - - def __init__(self): - pass - - def CheckPico8(self): - if FileExists(self._pico8): - return True - - def Init(self,main_screen): - self._NOPicoPage = NOPICOPage() - self._NOPicoPage._Name = "Not Found" - self._NOPicoPage._Screen = main_screen - self._NOPicoPage.Init() - - self._HashErrPage = PICO8ZipHashErrPage() - self._HashErrPage._Name = "Md5sum check failed" - self._HashErrPage._Screen = main_screen - self._HashErrPage.Init() - - def API(self,main_screen): - if main_screen !=None: - if self.CheckPico8() == False: - main_screen._MsgBox.SetText("Starting pico-8") - main_screen._MsgBox.Draw() - main_screen.SwapAndShow() - pygame.time.delay(300) - cmdpath = "/home/cpi/games/PICO-8/PICO-8.sh" - pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) - else: - main_screen.PushPage(self._NOPicoPage) - #main_screen.PushPage(self._HashErrPage) - main_screen.Draw() - main_screen.SwapAndShow() - -OBJ = APIOBJ() -def Init(main_screen): - OBJ.Init(main_screen) -def API(main_screen): - OBJ.API(main_screen) diff --git a/Menu/GameShell/50_PICO-8/compkginfo.json b/Menu/GameShell/50_PICO-8/compkginfo.json new file mode 100644 index 0000000..77a86cc --- /dev/null +++ b/Menu/GameShell/50_PICO-8/compkginfo.json @@ -0,0 +1,9 @@ +{ +"GameDir":"/home/cpi/games/PICO-8/", +"InstallDir":"pico-8", +"NotFoundMsg":["Please purchase the PICO-8 \n|None|varela16", +"and copy it to the \"Games\" folder|None|varela16"], + +"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932"}, +"Post-Up":"bash Post-Up.sh" +} diff --git a/Menu/GameShell/50_PICO-8/md5sum.log b/Menu/GameShell/50_PICO-8/md5sum.log deleted file mode 100644 index f66e2de..0000000 --- a/Menu/GameShell/50_PICO-8/md5sum.log +++ /dev/null @@ -1,2 +0,0 @@ -a3f2995cf117499f880bd964d6a0e1f2 pico-8_0.1.11g_raspi.zip -6726141c784afd4a41be6b7414c1b932 pico-8_0.1.11g_amd64.zip diff --git a/Menu/GameShell/50_PICO-8/pico-8/config.txt b/Menu/GameShell/50_PICO-8/pico-8/config.txt new file mode 100644 index 0000000..15ea6fc --- /dev/null +++ b/Menu/GameShell/50_PICO-8/pico-8/config.txt @@ -0,0 +1,99 @@ +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Configuration for pico-8 +// +// config.txt is read on startup and saved on exit. +// To generate the default config.txt, delete this file. +// +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +// :: Video Settings + +window_size 0 0 // window width, height +screen_size 0 0 // screen width, height (stretched to window) +show_fps 0 // Draw frames per second in the corner + + +// :: Window Settings + +windowed 0 // 1 to start up in windowed mode +window_position -1 -1 // x and y position of window, or -1, -1 to let the window manager decide +frameless 0 // 1 to use a window with no frame +fullscreen_method 1 // 0 maximized window (linux) 1 borderless desktop-sized window 2 fullscreen + + +// :: System Settings + +foreground_sleep_ms 1 // number of milliseconds to sleep each frame. Try 10 to conserve battery power + +background_sleep_ms 20 // number of milliseconds to sleep each frame when running in the background + +sessions 4 // number of times program has been run + +// (scancode) hold this key down and left-click to simulate right-click +rmb_key 0 // 0 for none 226 for LALT + +// 0:off 1: ignore SDL_TEXTINPUT and use SDL_GetKeyboardState instead (mapped to a US layout) +emulate_textinput 1 + +// Desktop for saving screenshots etc. Defaults to $HOME/Desktop +desktop_path + + + +// :: Audio Settings + +sound_volume 256 // 0..256 +music_volume 256 // 0..256 +mix_buffer_size 1024 // usually 1024. Try 2048 if you get choppy sound + + +// :: + +version 0.1.11g + + +// Location of pico-8's root folder +root_path /home/cpi/.lexaloffle/pico-8/carts/ + + +// Location of cartridge save data +cdata_path /home/cpi/.lexaloffle/pico-8/cdata/ + + +// Specify which player index joystick control begins at (0..7) +joystick_index 0 + + +// Custom keyboard scancodes for buttons. player0 0..6, player1 0..5 +button_keys 0 0 0 0 13 14 0 0 0 0 0 0 0 + +// Play notes as they are plotted in frequency mode +live_notes 0 + +// iff 1: when using keyboard cursor, snap to closest pixel / map cel +cursor_snap 0 + +// maximum length of gif in seconds (1..120, default 8) +gif_len 8 + +// 0 classic 1 dark blue background in code editor +gui_theme 0 + +// scale of screenshots and gifs // 2 means 256x256 +screenshot_scale 3 +gif_scale 2 + +// when 1 can enter glyphs using shift-A..Z +shift_glyphs 1 + +// 0 for off. 1 to notify whenever unsaved changes are backed up +show_backup_messages 1 + +// 0 for off. 1 to allow control of a cart's framerate due to host machine's cpu capacity (recommended) +host_framerate_control 1 + +// filter splore content +// 0 for no filter (18+) 1 medium (13+) 2 maximum (kid-friendly) +content_filter 1 + diff --git a/Menu/GameShell/50_PICO-8/pico-8/log.txt b/Menu/GameShell/50_PICO-8/pico-8/log.txt new file mode 100644 index 0000000..3f783a2 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/pico-8/log.txt @@ -0,0 +1,90 @@ +codo_init + platform: Linux + Found config.txt + + 01 window_size 0 0 // window width, height + 02 screen_size 0 0 // screen width, height (stretched to window) + 03 show_fps 0 // Draw frames per second in the corner + 04 windowed 0 // 1 to start up in windowed mode + 05 window_position -1 -1 // x and y position of window, or -1, -1 to let the window manager decide + new window position: -1, -1 + 06 frameless 0 // 1 to use a window with no frame + 07 fullscreen_method 1 // 0 maximized window (linux) 1 borderless desktop-sized window 2 fullscreen + 08 foreground_sleep_ms 1 // number of milliseconds to sleep each frame. Try 10 to conserve battery power + 09 background_sleep_ms 20 // number of milliseconds to sleep each frame when running in the background + 10 sessions 3 // number of times program has been run + 11 rmb_key 0 // 0 for none 226 for LALT + 12 emulate_textinput 1 + 13 desktop_path + 14 sound_volume 256 // 0..256 + 15 music_volume 256 // 0..256 + 16 mix_buffer_size 1024 // usually 1024. Try 2048 if you get choppy sound + 17 version 0.1.11g + 18 root_path /home/cpi/.lexaloffle/pico-8/carts/ + 19 cdata_path /home/cpi/.lexaloffle/pico-8/cdata/ + 20 joystick_index 0 + 21 button_keys 0 0 0 0 0 0 0 0 0 0 0 0 0 + 22 live_notes 0 + 23 cursor_snap 0 + 24 gif_len 8 + 25 gui_theme 0 + 26 screenshot_scale 3 + 27 gif_scale 2 + 28 shift_glyphs 1 + 29 show_backup_messages 1 + 30 host_framerate_control 1 + 31 content_filter 1 + + codo_system_init + Compiled against SDL version: 2.0.7 + Linked against SDL version: 2.0.5 + Built-in video drivers: 0 x11 1 wayland 2 dummy + Current video driver: x11 + Built-in render drivers: + Renderer opengl: + Flags: 0x0000000E ( | | ) + Texture formats (1): ARGB8888 + Renderer opengles2: + Flags: 0x0000000E ( | | ) + Texture formats (4): ARGB8888, ABGR8888, RGB888, BGR888 + Renderer software: + Flags: 0x00000009 ( | ) + Texture formats (8): ARGB8888, ABGR8888, RGBA8888, BGRA8888, RGB888, BGR888, RGB565, RGB555 + codo_reset_timer + codo_gui_init + codo_keys_init + codo_text_init + codo_video_init + codo_mouse_init + codo_joystick_init + Reading controller mappings: /home/cpi/.lexaloffle/pico-8/sdl_controllers.txt + searching for joysticks + found 0 joysticks + ok +ok +codo_load_pod: /home/cpi/apps/Menu/50_PICO-8/pico8.dat ok +codo_set_screen 128 128 8 100 + set pixel_perfect 1 + window size: 640 480 +codo_plat_pi: forcing fullscreen mode +Current renderer: + Renderer opengl: + Flags: 0x0000000A ( | ) + Texture formats (5): ARGB8888, YV12, IYUV, 0x3231564e, 0x3132564e + Max Texture Size: 8192x8192 +codo_sound_init mix_buffer_size: 1024 +codo_sound_init +SDL_INIT_AUDIO ok +SDL_OpenAudio ok +Built-in audio drivers: 0 pulseaudio 1 alsa 2 sndio 3 dsp 4 disk 5 dummy +Current audio driver: alsa +codo_exit + cmusic_stop + codo_main_exit + codo_config_save + codo_sound_exit + codo_video_exit + codo_joystick_exit + codo_system_exit + codo_items_created: 1023 +ok diff --git a/Menu/GameShell/50_PICO-8/pico-8/sdl_controllers.txt b/Menu/GameShell/50_PICO-8/pico-8/sdl_controllers.txt new file mode 100644 index 0000000..d6719d7 --- /dev/null +++ b/Menu/GameShell/50_PICO-8/pico-8/sdl_controllers.txt @@ -0,0 +1 @@ +// add SDL2 game controller mappings to this file diff --git a/skin/default/Menu/GameShell/PICO-8.png b/skin/default/Menu/GameShell/PICO-8.png index 65ef00b91645bc43078a63fb9ba39d6ab5242aaf..26b80d255daf060668f51984df0b78eec987a28b 100644 GIT binary patch delta 1984 zcmV;x2S50h3BwPN8Gi%-001NyIwk-B00Lr5M??VshmXv^00009a7bBm000XU000XU z0RWnu7ytkO2XskIMF-;n5C<_Aal9#0000M6Nkl=aVhxC2FgV;Ih1zLN|Ih@n_JazxGLC5xY=5U%5{!Q+j2(s)oTJo; zr8GuBW;QehqAm1emB~OD96~yAU?chNANOYS_1*_-~H{m@1Aq+xhDxs zN>mmLn8%lyLpGUs@d5z?v~!6T{=>(dl(xx?kT5~8RF-l-rF>}|5C4}24slq%hzp>y zD5Z?$q(|8C8h>@{qCxs&2&lZ2@gr^*X6JpC!Z zXO{$G0H{(a=NYC4Z}jjXhxmYI=?&4#Lm~HYKX;K7ym^^z)Qoq+#|fxb@mppEFHf?E zy>dAM-A`u?-(x}W#(6f#{wM*eTxxj8T=a8*U(2ZpE`P1t`2`PSnahKe%Y{h;s_#%k z1^@%>qf*X}e&TW8zl-hr7Bs$6GUk1A+01G)ZU^P^$I#<@Lc%4poeFbtmI^s)_f#K! z4*l&Gto(~L>Q#190Ax_B7V%^0a%QkX;AQf@!RulZh4y$85jo0yHleY~saKg3093Q_ zu@C@1#ecF@dWfP(k8Gs`KL88ysW}k>s(g--55T(=Ni#7JIZY7<0m$d5%8vk0&8EQ^ zm7P2+9mGhagB9!qU=|JbTC{8ffO>KOsFWwAj~I&d$&>sFfE@m+vc>_Zl6jjv0Jh3z z;vn)ITLH-9PbxXQ27kvl0eFLFiI+Uf9{?y}dw&=}wVHKiY5Y(I;=!hpK?W!@%cVlC z4gsigsWFD-(b#@_!zQ>}e~WzA7@b#DuCoSfxEbi?5&4`ri+s)_bORYiNn-)kDiacH zj*Z<5i`a}_ln<#@Ho=0riL=}SoZ=gH5#FJ{b!FSX_@<`H_4X}0s#5Q82mvnT7uiOS zCx5sdXko5g9~~^L=N4dq$L#~quI%m{`+#72#F0hS|ZrgE#ylfob;vqn-&PF-y20l5>34Z{}44_J5IRLwGi@XlNa+RhvxRi9Dhqqh< z_!d2Ym!*S%0LP`>Eqv0>hXCBC0T%=C9&VC9o5hQzvP_2Rh^qiKO}@(Vm~=#dumM7U zJOP{OBn?>LVIBZyv3XAmOG=evR-nr3(9+YnQ#tK;%LSxY{gWb~(0^kl z_>6AsE_NDhMo#v{NY#*gjAQmKRWm)U_AQBn5!M-sfIN#^0XP@$k1XtdLKEF)p`*N3 z+$MUyW?1OF$TimiUIif2GAY`tt^?F6^ICXat-&-4my3nYxTm|0YzhFK7M;T`-6UFN z0gHB5Yw&*-p8=5LI>4C#T(bBSz<>CYI7-;#1>@m7CS_Bg?Od8b4Vv8RejyT z<35@`t-!t|kT~Vr_68(4i0;xAY4|mFvHZ#fJa@7*iG=8~k0e|lU@Sv*z z9{`|1Z<_uBz`{`HJ@FNl$z1>((tw8v07m+s1ajugK|Fi_dDc4+*jx zRc=HI{E5jF{cP}*WW-66ylD>fUQmURZEKtYiO6wWeMZfK>@#PL%Xm#C#0@Wj*I5QY z&FDfO%f^oD9N`bx5;p~I;rjsi#`>}`fYQwh4srbgmCrP5+=#O#f)pS#Uo zWf@J8*~JLLswT5E{M;>mCoAjZA6mGR3y1x}<_NbeNs~5ml?^PJbG1uBzpT$s2UAMk+#8 z500-ybQU$iO=&-Gvt<$`qMKM5RLXli5rq;_^Xk>S6y+k@pUb|eB$KL>omAipuF=kCoWsvYG=;Kq;pP7VYb99C SuLbD<0000FfWVf*)fgM*UJ z1P*SMLrk5NF?F1+<{ta-!C=|4Wp-;*8(sE&+`swX!zWKzy1Tn8YHN?4J3Jgb*43`9HR_XzLviM?0h*oQaPT1F$IyD(S<;f=%X8JHO^tdVW zurUjDvOM}&akMaNt5n%;Ss<9dE--At>8DzqvV80=fk!T042*0{+bju0+S=NxOuTH& zbNrUeynpvjNvQM0$0J8ra?EBY?K^z<@T5LTNy&qE?#R^G-Jj0V=Cp8F`j5J$we{hvSEtH+|N3>|{{8WR)BToj+`hfN z#42|C)@-32d-lX^XRT+Cj*eEH`>epiz}$TK3U0RM)b)EsvV?Bjzu*7tS=!N$=gytm zmG>!{VDXB@xYr~?q`K`X{wD{tKfB)pRZ{J=Txm&GKZ#wrPjccg~?;m{gMkg&j z-G1%tnKLJ@Zv^@YD6hwV>1K}D(Imm2HT#}aY>a3DCdb@d*Yfi6n}zoOE5unCV`F2x zcGcMNdrq2gHjR-XH#aw6_0<V1n{)f^wB*@m+kgqzb?*K5?f2hLfBf;|$4#GW+m1hOJpTCSryW@zxI>lx s7&UT~D+r2tw6F>#Ho8PmllhNnhC}gfrS2cO!19K{)78&qol`;+0PQdoZU6uP diff --git a/skin/default/sys.py/gameshell/icons/pico8_md5_err.png b/skin/default/sys.py/gameshell/icons/pico8_md5_err.png new file mode 100644 index 0000000000000000000000000000000000000000..8b281a1984c6387aecc9759af93400bb3aae70ad GIT binary patch literal 3685 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 EF9^{^`v3p{ literal 0 HcmV?d00001 diff --git a/sys.py/UI/CommercialSoftwarePackage/__init__.py b/sys.py/UI/CommercialSoftwarePackage/__init__.py new file mode 100644 index 0000000..ba5b066 --- /dev/null +++ b/sys.py/UI/CommercialSoftwarePackage/__init__.py @@ -0,0 +1,342 @@ +# -*- coding: utf-8 -*- + +""" +Package /home/cpi/games/xxx/yyy.zip ,only support in zip + +com_pkg_info /home/cpi/launcher/Menu/GameShell/xxxx/compkginfo.json +use https://jsonlint.com/ to validate first in case syntax err + +``` +{ +"NotFoundMsg":["Please Go to \n|None|varela14|True", +"https://www.lexaloffle.com/pico-8.php|URL|None|True|True", +"buy a pico-8 raspi and put zip into \n/home/cpi/games/PICO-8"] + +"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932"} +} + +``` + +""" + +import pygame +#import validators +import os +import commands +from UI.constants import Width,Height,ICON_TYPES,RUNEVT,RESTARTUI +#from UI.simple_name_space import SimpleNamespace +from UI.page import Page +from UI.label import Label +from UI.fonts import fonts +from UI.icon_item import IconItem +from UI.icon_pool import MyIconPool +from UI.keys_def import CurKeys +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.text_bulletinboard import Textbulletinboard,Text +from UI.util_funcs import FileExists + + +class NotFoundPage(Page): + _FootMsg = ["Nav","","","Back",""] + _BG = "pico8_notfound" + _Leader = None + _Padding = pygame.Rect(0,20,0,0) + 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 + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool._Icons[self._BG] + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + #print( MyIconPool.Width(self._BG),MyIconPool.Height(self._BG) ) + self._BGpng.Adjust(0,0,MyIconPool.Width(self._BG),MyIconPool.Height(self._BG),0) + + self._Board = Textbulletinboard() + + self._Board._PosX = 4 + self._Board._PosY = 100 + self._Board._Width= self._Width - 4*2 + self._Board._Height = 100 + self._Board._CanvasHWND = self._CanvasHWND + self._Board._Align = "Center" + self._Board._RowPitch =30 + self._Board.Init() + + if self._Leader!= None and self._Leader._ComPkgInfo != None: + if "NotFoundMsg" in self._Leader._ComPkgInfo: + d = [] + for i, v in enumerate(self._Leader._ComPkgInfo["NotFoundMsg"]): + Color = None + Font = None + Bold = False + Und = False + Txt = "" + parts = v.split("|") + if len(parts) > 0: + Txt = parts[0] + + if len(parts) == 2: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + elif len(parts) == 3: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + elif len(parts) == 4: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + elif len(parts) == 5: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + if parts[4] == "True": + Und = True + + a = Text(Txt,Color,Font,Bold,Und) + d = d + a.Words() + + self._Board.SetAndBlitText(d) + + def KeyDown(self,event): + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + return + + def Draw(self): + self.ClearCanvas() + if self._BGpng != None: + self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y ) + self._BGpng.DrawTopLeft() + self._Board._PosY = self._BGpng._Height+self._Padding.y + else: + self._Board._PosY = self._Padding.y + + self._Board.Draw() + + +class HashErrPage(Page): + _FootMsg = ["Nav","","","Cancel","Continue"] + _BG ="pico8_md5_err" + + _Leader = None + _Padding = pygame.Rect(0,20,0,0) + + 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 + + self._BGpng = IconItem() + self._BGpng._ImgSurf = MyIconPool._Icons[self._BG] + self._BGpng._MyType = ICON_TYPES["STAT"] + self._BGpng._Parent = self + self._BGpng.Adjust(0,0,MyIconPool.Width(self._BG),MyIconPool.Height(self._BG),0) + + self._Board = Textbulletinboard() + + self._Board._PosX = 4 + self._Board._PosY = self._Height/2 - 35 + self._Board._Width= self._Width - 4*2 + self._Board._Height = 100 + self._Board._CanvasHWND = self._CanvasHWND + self._Board._RowPitch =30 + self._Board._Align = "Center" + self._Board.Init() + + if self._Leader!= None and self._Leader._ComPkgInfo != None: + if "HashErrMsg" in self._Leader._ComPkgInfo: + d = [] + for i, v in enumerate(self._Leader._ComPkgInfo["HashErrMsg"]): + Color = None + Font = None + Bold = False + Und = False + Txt = "" + parts = v.split("|") + if len(parts) > 0: + Txt = parts[0] + + if len(parts) == 2: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + elif len(parts) == 3: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + elif len(parts) == 4: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + elif len(parts) == 5: + if parts[1] != "None": + Color = MySkinManager.GiveColor(parts[1]) + if parts[2] != "None": + Font = MyLangManager.TrFont(parts[2]) + if parts[3] == "True": + Bold = True + if parts[4] == "True": + Und = True + + a = Text(Txt,Color,Font,Bold,Und) + d = d + a.Words() + + self._Board.SetAndBlitText(d) + + else: + a = Text("MD5 check Failed!\n",None,MyLangManager.TrFont("varela16")) + b = Text("Do you want to continue?",None,MyLangManager.TrFont("varela16")) + self._Board.SetAndBlitText(a.Words()+b.Words()) + + def KeyDown(self,event): + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + return + + if event.key == CurKeys["B"]: + self._Leader.InstallPackage(self._Screen) + return + + def OnLoadCb(self): + pass + + def Draw(self): + self.ClearCanvas() + if self._BGpng != None: + self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y) + self._BGpng.DrawTopLeft() + self._Board._PosY = self._BGpng._Height+self._Padding.y + else: + self._Board._PosY = self._Padding.y + + self._Board.Draw() + + +class MyCommercialSoftwarePackage(object): + _ComPkgInfo = None + _Done = "" + _InvokeDir = "" + + def __init__(self): + pass + + def InstallPackage(self,main_screen): + main_screen._MsgBox.SetText("Installing the package") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + json_config = self._ComPkgInfo + cur_dir = os.getcwd() + + os.chdir(json_config["GameDir"]) + for i,v in enumerate(json_config["MD5"]): + os.system("unzip -o %s" %v) ## auto overwrite + + if "Post-Up" in json_config: + if FileExists(self._InvokeDir): + os.chdir(self._InvokeDir) + + os.system(json_config["Post-Up"]) + + + os.chdir(cur_dir) + pygame.time.delay(1000) + + main_screen._MsgBox.SetText("Package Installed") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(500) + + pygame.event.post( pygame.event.Event(RESTARTUI, message="")) + + def VerifyPackage(self,main_screen): + ## do unzip and check md5sum once + + main_screen._MsgBox.SetText("Verify the package") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(400) + + Checked = False + + json_config = self._ComPkgInfo + if json_config == None: + return + + if "MD5" in json_config: + for i,v in enumerate(json_config["MD5"]): + print(i,v) + if FileExists( os.path.join(json_config["GameDir"], v )): + print( os.path.join(json_config["GameDir"],v )) + out = commands.getstatusoutput("md5sum %s" % os.path.join(json_config["GameDir"],v)) + ret = out[1] + ret = ret.split(" ") + print(ret) + if ret[0] == json_config["MD5"][v]: + print("md5 is ok") + Checked = True + + return Checked + + return Checked + + def Init(self,main_screen): + self._Page1 = NotFoundPage() + self._Page1._Name = "Not Found" + self._Page1._Screen = main_screen + self._Page1._Leader = self + self._Page1.Init() + + self._Page2 = HashErrPage() + self._Page2._Name = "Md5sum check failed" + self._Page2._Screen = main_screen + self._Page2._Leader = self + self._Page2.Init() + + + def API(self,main_screen): + if main_screen !=None: + if self._Done != "": + main_screen._MsgBox.SetText("Starting") + main_screen._MsgBox.Draw() + main_screen.SwapAndShow() + pygame.time.delay(300) + #### + + pygame.event.post( pygame.event.Event(RUNEVT, message=self._Done)) + #### + else: + print(self._ComPkgInfo) + if FileExists( os.path.join(self._ComPkgInfo["GameDir"],self._ComPkgInfo["InstallDir"] )) == False: + main_screen.PushPage(self._Page1) + main_screen.Draw() + main_screen.SwapAndShow() + else: + if self.VerifyPackage(main_screen) == False: + main_screen.PushPage(self._Page2) + main_screen.Draw() + main_screen.SwapAndShow() + else: + self.InstallPackage(main_screen) + diff --git a/sys.py/UI/constants.py b/sys.py/UI/constants.py index c6b8574..6aab244 100644 --- a/sys.py/UI/constants.py +++ b/sys.py/UI/constants.py @@ -24,7 +24,7 @@ icon_height = 80 icon_ext = ".sh" -ICON_TYPES={"Emulator":7,"FILE":6,"STAT":5,"NAV":4,"LETTER":3,"FUNC":2,"DIR":1,"EXE":0,"None":-1} # FUNC is like UI widget's function,DIR contains child page,EXE just execute a binary +ICON_TYPES={"Commercial":8,"Emulator":7,"FILE":6,"STAT":5,"NAV":4,"LETTER":3,"FUNC":2,"DIR":1,"EXE":0,"None":-1} # FUNC is like UI widget's function,DIR contains child page,EXE just execute a binary ## H=horizontal ,V=vertical S=Single Line #SLeft start from left, single line diff --git a/sys.py/UI/icon_item.py b/sys.py/UI/icon_item.py index 8edea09..237f3d1 100644 --- a/sys.py/UI/icon_item.py +++ b/sys.py/UI/icon_item.py @@ -81,7 +81,26 @@ class IconItem(Widget): def Clear(self): pass + + def DrawTopLeft(self): + if self._Align==ALIGN["VCenter"]: #default + if self._Label != None: + self._Label._PosX = self._PosX - self._Label._Width/2 + self._Parent._PosX + self._Label._PosY = self._PosY + self._Height/2 +6 + self._Parent._PosY + + elif self._Align ==ALIGN["HLeft"]: + if self._Label != None: + self._Label._PosX = self._PosX + self._Width/2 + 3 + self._Parent._PosX + self._Label._PosY = self._PosY - self._Label._Height/2 + self._Parent._PosY + if self._Label!=None: + self._Label.Draw() + + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,pygame.Rect(self._PosX+self._Parent._PosX, + self._PosY+self._Parent._PosY, + self._Width, + self._Height)) def Draw(self): if self._Align==ALIGN["VCenter"]: #default if self._Label != None: diff --git a/sys.py/UI/icon_pool.py b/sys.py/UI/icon_pool.py index f08058c..dc04b1c 100644 --- a/sys.py/UI/icon_pool.py +++ b/sys.py/UI/icon_pool.py @@ -13,6 +13,7 @@ class IconPool(object): _GameShellIconPath = SkinMap("gameshell/icons/") _Icons = {} + _Sizes = {} def __init__(self): self._Icons= {} @@ -23,7 +24,24 @@ class IconPool(object): if os.path.isfile(self._GameShellIconPath+"/"+i) and i.endswith(".png"): keyname = i.split(".")[0] self._Icons[keyname] = pygame.image.load(self._GameShellIconPath+"/"+i).convert_alpha() - + self._Sizes[keyname] = self._Icons[keyname].get_size() + + def Width(self,keyname): + if keyname in self._Sizes: + return self._Sizes[keyname][0] + + def Height(self,keyname): + if keyname in self._Sizes: + return self._Sizes[keyname][1] + +##global Handler +MyIconPool = None + +def InitMyIconPool(): + global MyIconPool + if MyIconPool == None: + MyIconPool = IconPool() + +InitMyIconPool() -MyIconPool = IconPool() diff --git a/sys.py/UI/lang_manager.py b/sys.py/UI/lang_manager.py index 0a1de09..5a027e7 100644 --- a/sys.py/UI/lang_manager.py +++ b/sys.py/UI/lang_manager.py @@ -89,7 +89,10 @@ class LangManager(object): return english_key_str def TrFont(self,orig_font_str): - font_size_number = int(filter(str.isdigit, orig_font_str)) + try: + font_size_number = int(filter(str.isdigit, orig_font_str)) + except TypeError: + font_size_number = int(filter(unicode.isdigit, orig_font_str)) if font_size_number > 120: raise Exception('font string format error') diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index 3a12a0e..f390b8d 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -5,7 +5,7 @@ from pygame.locals import * from sys import exit import os import sys - +import json from operator import itemgetter from libs import easing @@ -25,6 +25,7 @@ from keys_def import CurKeys from label import Label from untitled_icon import UntitledIcon from Emulator import MyEmulator +from CommercialSoftwarePackage import MyCommercialSoftwarePackage from skin_manager import MySkinManager from lang_manager import MyLangManager @@ -120,6 +121,7 @@ class MessageBox(Label): python_package_flag = "__init__.py" emulator_flag = "action.config" +commercialsoftware_flag = "compkginfo.json" ##Abstract object for manage Pages ,not the pygame's physic screen class MainScreen(Widget): @@ -383,7 +385,14 @@ class MainScreen(Widget): if i.endswith(emulator_flag): return True return False - + + def IsCommercialPackage(self,dirname): + files = os.listdir(dirname) + for i in sorted(files): + if i.endswith(commercialsoftware_flag): + return True + return False + def IsPythonPackage(self,dirname): files = os.listdir(dirname) for i in sorted(files): @@ -435,6 +444,7 @@ class MainScreen(Widget): def ReadTheDirIntoPages(self,_dir,pglevel,cur_page): + global commercialsoftware_flag if FileExists(_dir) == False and os.path.isdir(_dir) == False: return @@ -523,11 +533,30 @@ class MainScreen(Widget): iconitem._MyType = ICON_TYPES["Emulator"] cur_page._Icons.append(iconitem) - elif self.IsExecPackage(_dir+"/"+i): + elif self.IsCommercialPackage( os.path.join(_dir,i)): + data = None + em = MyCommercialSoftwarePackage() + if FileExists( _dir+"/"+i+"/.done"): + print(_dir+"/"+i+"/.done") + em._Done = os.path.realpath(_dir+"/"+i+"/"+i2+".sh") + else: + with open(os.path.join(_dir,i) +"/"+commercialsoftware_flag) as f: + data = json.load(f) + em._ComPkgInfo = data + em._Done = "" + + em._InvokeDir = os.path.realpath( os.path.join(_dir,i)) + em.Init(self) + + iconitem._CmdPath = em + iconitem._MyType = ICON_TYPES["Commercial"] + cur_page._Icons.append(iconitem) + + elif self.IsExecPackage(_dir+"/"+i): ## ExecPackage is the last one to check iconitem._MyType = ICON_TYPES["EXE"] iconitem._CmdPath = os.path.realpath(_dir+"/"+i+"/"+i2+".sh") MakeExecutable(iconitem._CmdPath) - cur_page._Icons.append(iconitem) + cur_page._Icons.append(iconitem) else: iconitem._MyType = ICON_TYPES["DIR"] iconitem._LinkPage = Page() diff --git a/sys.py/UI/page.py b/sys.py/UI/page.py index 8e2c1ab..b734c0e 100644 --- a/sys.py/UI/page.py +++ b/sys.py/UI/page.py @@ -98,6 +98,8 @@ class Page(Widget): _SelectedIconTopOffset=20 _EasingDur = 30 + _Padding = pygame.Rect(0,0,0,0)# x,y,w,h + _Margin = pygame.Rect(0,0,0,0) def __init__(self): self._Icons = [] @@ -519,7 +521,7 @@ class Page(Widget): if api_cb != None: if callable(api_cb): cur_icon._CmdPath.API(self._Screen) - elif cur_icon._MyType == ICON_TYPES["Emulator"]: + elif cur_icon._MyType == ICON_TYPES["Emulator"] or cur_icon._MyType == ICON_TYPES["Commercial"]: cur_icon._CmdPath.API(self._Screen) def ReturnToUpLevelPage(self): diff --git a/sys.py/UI/text_bulletinboard.py b/sys.py/UI/text_bulletinboard.py index 2892272..017458c 100644 --- a/sys.py/UI/text_bulletinboard.py +++ b/sys.py/UI/text_bulletinboard.py @@ -112,12 +112,12 @@ class Textbulletinboard(Textarea): _TextLimit = 200 _BackgroundColor = MySkinManager.GiveColor("White") _Align = "Left" ## Left or Center + _RowPitch = -1 def SetAndBlitText(self,words):# words => [] if self._TextFull != True: self._MyWords = words - #self.BlitText() self._TextIndex = len(self._MyWords) else: print("is Full %s" % "".join(str(self._MyWords))) @@ -130,13 +130,15 @@ class Textbulletinboard(Textarea): x = self._PosX+xmargin linenumber = 0 cursor_row = 0 - + + #print(self._MyWords) for i, v in enumerate(self._MyWords): if str(v) == "\n": w = 0 x = self._PosX+xmargin - linenumber+=1 - blit_rows.append([]) + linenumber+=2 + blit_rows.append([]) + blit_rows.append([]) else: t = v.Render() t_width = t.get_width() @@ -153,8 +155,7 @@ class Textbulletinboard(Textarea): w = 0 linenumber += 1 blit_rows.append([]) - - + self._BlitWords = blit_rows self._BlitIndex = self._TextIndex @@ -171,10 +172,13 @@ class Textbulletinboard(Textarea): self._TextFull = len(self._MyWords) > self._TextLimit last_height = 0 - for row_idx, row in enumerate(self._BlitWords): - + for row_idx, row in enumerate(self._BlitWords): if len(row) == 0: - y = y + 16 + if self._RowPitch > 0: + y = y + self._RowPitch + else: + y = y + 16 + w = 0 continue @@ -194,6 +198,7 @@ class Textbulletinboard(Textarea): last_height = 0 total_row_width = 0 x = start_x + y = y + last_height for i,v in enumerate(row): t = v.Render() total_row_width += t.get_width() @@ -208,9 +213,7 @@ class Textbulletinboard(Textarea): self._CanvasHWND.blit(t, (x,y)) x += t.get_width() - - y = y + last_height - + def Draw(self): #aa_round_rect(self._CanvasHWND, (4,24.5+6,312,60),self._BackgroundColor,4,0,self._BackgroundColor) From 530c08dc34fa13286288c044776e054b049396dc Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 17 Jan 2019 14:20:57 +0800 Subject: [PATCH 7/7] small fix in CommercialSoftwarePackage --- sys.py/UI/CommercialSoftwarePackage/__init__.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sys.py/UI/CommercialSoftwarePackage/__init__.py b/sys.py/UI/CommercialSoftwarePackage/__init__.py index ba5b066..bcfd5c8 100644 --- a/sys.py/UI/CommercialSoftwarePackage/__init__.py +++ b/sys.py/UI/CommercialSoftwarePackage/__init__.py @@ -41,7 +41,7 @@ class NotFoundPage(Page): _FootMsg = ["Nav","","","Back",""] _BG = "pico8_notfound" _Leader = None - _Padding = pygame.Rect(0,20,0,0) + _Padding = pygame.Rect(0,12,0,6) def Init(self): self._PosX = self._Index*self._Screen._Width self._Width = self._Screen._Width @@ -64,7 +64,7 @@ class NotFoundPage(Page): self._Board._Height = 100 self._Board._CanvasHWND = self._CanvasHWND self._Board._Align = "Center" - self._Board._RowPitch =30 + self._Board._RowPitch =28 self._Board.Init() if self._Leader!= None and self._Leader._ComPkgInfo != None: @@ -122,7 +122,7 @@ class NotFoundPage(Page): if self._BGpng != None: self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y ) self._BGpng.DrawTopLeft() - self._Board._PosY = self._BGpng._Height+self._Padding.y + self._Board._PosY = self._BGpng._Height+self._Padding.y+self._Padding.h else: self._Board._PosY = self._Padding.y @@ -134,7 +134,7 @@ class HashErrPage(Page): _BG ="pico8_md5_err" _Leader = None - _Padding = pygame.Rect(0,20,0,0) + _Padding = pygame.Rect(0,12,0,6) def Init(self): self._PosX = self._Index*self._Screen._Width @@ -152,11 +152,11 @@ class HashErrPage(Page): self._Board = Textbulletinboard() self._Board._PosX = 4 - self._Board._PosY = self._Height/2 - 35 + self._Board._PosY = self._Height/2 - 30 self._Board._Width= self._Width - 4*2 self._Board._Height = 100 self._Board._CanvasHWND = self._CanvasHWND - self._Board._RowPitch =30 + self._Board._RowPitch =28 self._Board._Align = "Center" self._Board.Init() @@ -227,7 +227,7 @@ class HashErrPage(Page): if self._BGpng != None: self._BGpng.NewCoord((self._Width-self._BGpng._Width)/2,self._Padding.y) self._BGpng.DrawTopLeft() - self._Board._PosY = self._BGpng._Height+self._Padding.y + self._Board._PosY = self._BGpng._Height+self._Padding.y+self._Padding.h else: self._Board._PosY = self._Padding.y @@ -327,7 +327,7 @@ class MyCommercialSoftwarePackage(object): pygame.event.post( pygame.event.Event(RUNEVT, message=self._Done)) #### else: - print(self._ComPkgInfo) + #print(self._ComPkgInfo) if FileExists( os.path.join(self._ComPkgInfo["GameDir"],self._ComPkgInfo["InstallDir"] )) == False: main_screen.PushPage(self._Page1) main_screen.Draw()