diff --git a/Menu/GameShell/10_Settings/Languages/__init__.py b/Menu/GameShell/10_Settings/Languages/__init__.py new file mode 100644 index 0000000..68b0436 --- /dev/null +++ b/Menu/GameShell/10_Settings/Languages/__init__.py @@ -0,0 +1,310 @@ +# -*- coding: utf-8 -*- +import os +import pygame +#import math +#mport subprocess +import glob +#from beeprint import pp +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,POWEROPT +from UI.page import Page,PageSelector +from UI.label import Label +from UI.fonts import fonts +from UI.util_funcs import midRect +from UI.keys_def import CurKeys +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector + +import config + +class ListPageSelector(InfoPageSelector): + def Draw(self): + idx = self._Parent._PsIndex + + 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 + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class PageListItem(InfoPageListItem): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + _Active = False + _Value = "" + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY+ (self._Height- self._Labels["Text"]._Height)/2 + + if self._Active == True: + self._Parent._Icons["done"].NewCoord( self._Parent._Width-30,self._PosY+5) + self._Parent._Icons["done"].Draw() + + self._Labels["Text"].Draw(self._Active) + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width -10 + self._Labels["Small"]._PosY = self._PosY + (self._Height- self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + +class LanguagesPage(Page): + _FootMsg = [MyLangManager.Tr("Nav"),"","",MyLangManager.Tr("Back"),MyLangManager.Tr("Select")] + _MyList = [] + _ListFont = fonts["notosanscjk15"] + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + files_path = [os.path.basename(x) for x in sorted(glob.glob('langs/*.ini'))] + + for i,u in enumerate( files_path ): + print(i,u) + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._Active = False + li._Value = u.decode("utf8") + lang_name = u.split("_")[1] + lang_name = lang_name.split(".")[0] + + li.Init( lang_name.decode("utf8") ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool._Icons["done"] + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + + def ScrollDown(self): + if len(self._MyList) == 0: + return + self._PsIndex +=1 + if self._PsIndex >= len(self._MyList): + self._PsIndex = len(self._MyList) -1 + + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY +cur_li._Height > self._Height: + for i in range(0,len(self._MyList)): + self._MyList[i]._PosY -= self._MyList[i]._Height + + def ScrollUp(self): + if len(self._MyList) == 0: + return + self._PsIndex -= 1 + if self._PsIndex < 0: + self._PsIndex = 0 + cur_li = self._MyList[self._PsIndex] + if cur_li._PosY < 0: + for i in range(0, len(self._MyList)): + self._MyList[i]._PosY += self._MyList[i]._Height + + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li._Active == True: + return + + for i in self._MyList: + i._Active = False + + cur_li._Active = True + print(cur_li._Value) + with open(".lang","w") as f: + f.write(cur_li._Value) + + self._Screen._MsgBox.SetText(MyLangManager.Tr("Applying")) + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + MyLangManager.UpdateLang() + + ##pygame.event.post( pygame.event.Event(RUNEVT, message="exit 0")) ##Restart Launcher + + pygame.time.delay(1000) + + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + with open(".lang", "r") as f: + thelang = f.read() + + thelang = thelang.strip() + + if thelang == "": + thelang = "English" + + for i in self._MyList: + if thelang in i._Value: + i._Active = True + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + def KeyDown(self,event): + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["B"]: + self.Click() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * PageListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill((255,255,255)) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = LanguagesPage() + self._Page._Screen = main_screen + self._Page._Name ="Languages" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + 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/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py index d48e78e..31d6023 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -14,47 +14,21 @@ from UI.util_funcs import midRect,FileExists from UI.keys_def import CurKeys from UI.scroller import ListScroller from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_selector import InfoPageSelector from list_item import ListItem import myvars -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): - pass - - def Draw(self): - idx = self._Parent._PsIndex - if idx < len(self._Parent._MyList): - x = 2 - y = self._Parent._MyList[idx]._PosY+1 - h = self._Parent._MyList[idx]._Height -3 - - self._PosX = x - self._PosY = y - self._Height = h - - aa_round_rect(self._Parent._CanvasHWND, - (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) - - - class ListPage(Page): _Icons = {} _Selector=None - _FootMsg = ["Nav","","","Back","Enter"] + _FootMsg = [MyLangManager.Tr("Nav"),"","",MyLangManager.Tr("Back"),MyLangManager.Tr("Enter")] _MyList = [] - _ListFontObj = fonts["varela15"] + _ListFontObj = MyLangManager.TrFont("varela15") _Scroller = None @@ -71,11 +45,12 @@ class ListPage(Page): self._CanvasHWND = self._Screen._CanvasHWND - ps = ListPageSelector() + ps = InfoPageSelector() ps._Parent = self + ps._PosX = 2 self._Ps = ps self._PsIndex = 0 - + # "" pkgname, label alist = [["","Airplane","Airplane Mode"], ["","PowerOptions","Power Options"], @@ -85,6 +60,7 @@ class ListPage(Page): ["","Brightness","BackLight Brightness"], ["","Storage",""], ["","Time","Timezone"], + ["","Languages","Languages"], ["","Notification","Notification"], ["","Update", ""], ["","About", "About"], diff --git a/sys.py/UI/constants.py b/sys.py/UI/constants.py index 1f37a41..c6b8574 100644 --- a/sys.py/UI/constants.py +++ b/sys.py/UI/constants.py @@ -42,5 +42,5 @@ RUNSYS = pygame.USEREVENT+3 LOWLIGHT = pygame.USEREVENT+4 ## when dim screen backlight FOOTMSG = pygame.USEREVENT+5 ## POWEROPT = pygame.USEREVENT+6 - +RESTARTUI = pygame.USEREVENT+7 ##restart launcher diff --git a/sys.py/UI/icon_item.py b/sys.py/UI/icon_item.py index 44b3ff2..39e9110 100644 --- a/sys.py/UI/icon_item.py +++ b/sys.py/UI/icon_item.py @@ -6,6 +6,7 @@ import pygame from constants import icon_width,icon_height,ICON_TYPES,ALIGN,icon_ext,Width,Height from util_funcs import color_surface,midRect from label import Label +from lang_manager import MyLangManager class IconItem: _PosX=0 @@ -65,7 +66,7 @@ class IconItem: self._LinkPage._Screen = self._Parent._Screen self._LinkPage._CanvasHWND = self._Parent._Screen._CanvasHWND - self._LinkPage._FootMsg = ["Nav.","","","Back","Enter"] ## Default Page Foot info + self._LinkPage._FootMsg = [MyLangManager.Tr("Nav"),"","",MyLangManager.Tr("Back"),MyLangManager.Tr("Enter")] ## Default Page Foot info if self._LinkPage._Align == ALIGN["HLeft"]: self._LinkPage.AdjustHLeftAlign() diff --git a/sys.py/UI/lang_manager.py b/sys.py/UI/lang_manager.py index 4451fd9..7904b1d 100644 --- a/sys.py/UI/lang_manager.py +++ b/sys.py/UI/lang_manager.py @@ -15,7 +15,6 @@ class LangManager(object): """ _Langs = {} - _EngLangs = {} ##default Language dict,must be correct _Config = None _ConfigFileName = "00_English.ini" @@ -25,7 +24,11 @@ class LangManager(object): def Init(self): if not self._Langs: self.SetLangs() - + + def UpdateLang(self): + self._Langs = {} + self.SetLangs() + def SetLangs(self): self._Config = CaseConfigParser() print("SetLangs") diff --git a/sys.py/langs/00_English.ini b/sys.py/langs/00_English.ini index b80576c..7854951 100644 --- a/sys.py/langs/00_English.ini +++ b/sys.py/langs/00_English.ini @@ -48,3 +48,6 @@ Connecting=Connecting BluetoothScanning=Bluetooth scanning... Scanning=Scanning.. ShutDownConnecting=ShutDownConnecting... +Select=Select +Detail=Detail +Applying=Applying... diff --git a/sys.py/langs/03_简体中文.ini b/sys.py/langs/03_简体中文.ini index 97ef7fc..c1894e4 100644 --- a/sys.py/langs/03_简体中文.ini +++ b/sys.py/langs/03_简体中文.ini @@ -46,3 +46,6 @@ Connecting=连接中 BluetoothScanning=蓝牙搜索中... Scanning=搜索中.. ShutDownConnecting=断开连接... +Select=选择 +Detail=详细 +Applying=设置中... diff --git a/sys.py/run.py b/sys.py/run.py index ebfcc16..dfce104 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -31,7 +31,7 @@ else: #local UI import -from UI.constants import Width,Height,bg_color,icon_width,icon_height,DT,GMEVT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT +from UI.constants import Width,Height,bg_color,icon_width,icon_height,DT,GMEVT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT,RESTARTUI from UI.util_funcs import ReplaceSuffix,FileExists, ReadTheFileContent,midRect,color_surface,SwapAndShow,GetExePath,X_center_mouse from UI.page import PageStack,PageSelector,Page from UI.label import Label @@ -539,7 +539,7 @@ if __name__ == '__main__': screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32) pygame.event.set_allowed(None) - pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,GMEVT,RUNEVT,RUNSYS,POWEROPT]) + pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,GMEVT,RUNEVT,RUNSYS,POWEROPT,RESTARTUI]) pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2)