瀏覽代碼

add languages into settings menu

cuu 5 年之前
父節點
當前提交
152b2a8ac7

+ 310 - 0
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)
+    
+        

+ 8 - 32
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"],

+ 1 - 1
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
 

+ 2 - 1
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()

+ 5 - 2
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")

+ 3 - 0
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...

+ 3 - 0
sys.py/langs/03_简体中文.ini

@@ -46,3 +46,6 @@ Connecting=连接中
 BluetoothScanning=蓝牙搜索中...
 Scanning=搜索中..
 ShutDownConnecting=断开连接...
+Select=选择
+Detail=详细
+Applying=设置中...

+ 2 - 2
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)