From 3bfd917ea18b1329182d87cec98660203174fa83 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 31 May 2018 23:40:11 +0800 Subject: [PATCH] Add SkinManager to all parts --- Menu/GameShell/Music Player/list_item.py | 1 - skin/default/config.cfg | 3 + .../sys.py/gameshell/icons/blueselector.png | Bin 0 -> 3392 bytes sys.py/UI/blueselector_b64.py | 2 - sys.py/UI/foot_bar.py | 11 +-- sys.py/UI/main_screen.py | 7 +- sys.py/UI/page.py | 31 ++++---- sys.py/UI/skin_manager.py | 74 ++++++++++++++++++ sys.py/UI/title_bar.py | 17 ++-- sys.py/UI/untitled_icon.py | 4 +- sys.py/run.py | 4 +- 11 files changed, 116 insertions(+), 38 deletions(-) create mode 100644 skin/default/config.cfg create mode 100644 skin/default/sys.py/gameshell/icons/blueselector.png delete mode 100644 sys.py/UI/blueselector_b64.py create mode 100644 sys.py/UI/skin_manager.py diff --git a/Menu/GameShell/Music Player/list_item.py b/Menu/GameShell/Music Player/list_item.py index e3fe554..f681fc3 100644 --- a/Menu/GameShell/Music Player/list_item.py +++ b/Menu/GameShell/Music Player/list_item.py @@ -65,7 +65,6 @@ class ListItem(object): _PlayingProcess = 0 # 0 - 100 _Parent = None - _ActiveBackgroundColor = pygame.Color(232,232,232) def __init__(self): self._Labels = {} diff --git a/skin/default/config.cfg b/skin/default/config.cfg new file mode 100644 index 0000000..2fe3f5a --- /dev/null +++ b/skin/default/config.cfg @@ -0,0 +1,3 @@ +[Colors] +High = #33a6ff +White = #ffffff diff --git a/skin/default/sys.py/gameshell/icons/blueselector.png b/skin/default/sys.py/gameshell/icons/blueselector.png new file mode 100644 index 0000000000000000000000000000000000000000..82e285b18582e27775782e3eb0bba331e814106d GIT binary patch literal 3392 zcmV-G4ZreeRy0|nZSSVotdO<+GOsO7M6lkM6Fx8=!S=nS}FaY&7|_M zAi_dj**-k1t3JY(PjwMxr6N|W7T2e^Dywu=vVu}%W|FoW+{dT5k}X<{B1P!(A(WDP zCrRl?X6C;8$DPdFnWXuc+)R?`{QjDI?z!)I=bba>o{#suN0{uiXn>ja9SBh%4Ai1L zLe#to5eI;nwFqH75JY(y_R*;tU$p&`ze)OdV_kz!0_;Q%C(>u~r9!gUCX5EkL^ zEm|}HfI8-&&t)<}0G^-*VeY^Ta$&xV?sJG+PjkS2o|v_jc-Mz%*P!p;WdxMh;IZC0 z#O?V7Y3f`&Fr(ISdR8|_TYyf_&7&v}anNi7V3`~N9vCQsc>Z(dpMevB5W;ehZ*U}e z&zQbTiIk^FX|v8GBR7CX0R!ZIqUN0d#H~*Q*Lze-qw)os!`~~A(cXIkhx__yp4~HO z8Hw&Q5N837&I8>?Q=|B%`+=dI-b#S5}Ar*Vpnr zjK9GX_C{3K7Nzc|*F2jmBs1>idui=mfTmZVnkHawWtF@|hlV(i+zmQAn@dqzm}}lT z9xqt`UmV3f0Y^I!yaxXrYTQzOL>q%nPA^@Uh3+N39-vhatXk-=5;ir8ocdV?Ew-C91K)Nz`?`Vwp)1+*- z-bR|Oz!{#@R-%!0zQ`{J?pWaS2#Y}W;nZBln!48k*lsltG>>L`L}S9A8lINVQfO>I zj`||IT&#}lB5F1vwT<+KKaewaylXvaIyquLL)`wzSc~zg4cFSDgy(U%+aK9w#O+4D zmb-4#Ix@-ipaxI}`W52#e4^%Er552&4L9WLz<$61`4MTei8bc``67EFNpb}AP+_8e zg4SeXsUk~j!xPENQ0IMU;8B_zI)LmX6G57%SW_|_iR4NgXA8oNT$&mmp*j3trHC87 z!4vjpQ2kW)Dh0BXsJX9{!lw*z`>%j4p!0zp^qT8R?beRY;0fz$l&=;^xQ?dCP8aQ`6GFBlm-vn473967;-sH z;oYOtv_hE15mfUNY$5@aZ|3IkhhTE7_)JA&-K&ty1N7TaHG>&>7w602p&lE$hPU;c zOWf)pX8n=4{r7(9S`joiw1I2@+&OoVt-~1`hN|IhT1UqI1#ogUCB-cBOqNKm59(G9 z?g~~tQFG5ovLAbBpGmGKZ)|s#IFg ziw3B-uf*Xm5P7)bC#C$R#@Im0xd5m`=>rnQSqf`-+`0v_^CilgWX$upSPm6GRAmTS zty59XN9EUpRoJ}2JGF+F?BC!zOu8tmX^uQo4n2<-@=eOi_Hw+&h9sw%e=NI3mBMzb zfwZ{pA+y2{_7506-cWKP-f@lcQx-~Jd9|z{QgT0{7XZ+kTmoDT-hOySwgJy)ul7?r z?OSD5v9b_7H-Di^*?DLlcn$u+u+1EE1;Nk?!scRD%y@NxkSe3W>+vh3jxLAdZlUX< z_J=YmRk?`7QT^-OwWD*PzlOIRoJ+#~BnkVH!G@z%N}x9Q5Zb>&CS8a;3?Q^?kRx_G z@Q!TOfm=1Il*VH^gFw$;63XoDcfl57$@d|SXVqPPOVo@WOGcHk5yWs76wGp~{&~W* zsYGI0i*zp`;Ou8rTwI4p7v|6X);N2l|VB!PRR5BUu#(hV+ zsQkgL;W2wDqSw0dqV%3)#w4jSdJ@)EC^rE%!O-=>j-J`1(oX@?+#K>CQS-Km)UlE= z=u4kW&e#BY;Y2BOJYazN97x)eb}H??Crp?|l|Y#|3iNIg$+gfwZD?>eh=pnfxQ`Vx_fMRrm4b6A-VwZT7WDh2G)11I zUEj+=YO3C{e&LCm2!K8fUPqv1k_OUL@du^BxClngsNERKtWq-{zuO zRWGbkF=P{}n}Hz6mi}hC$RXeUH_$cNt2dZto>!gB8UyWim~`z7E}D^ZJt-R6t9S8X zE{BsJDwArJ$ucwPH8vC*Tx3V#wO%p)T2&YcYYp+P7Gl;0p492Zw+jufJXkOYQVA75 zP-O_V_r3>5w}31`SVwpApNg{-8a!(51Kr^6z>+QkT5|NV-FR)%-CwB^!s3l5M(QZ;IHtcD-p#7| z9RsorDI{jygrQGj=q_URfcB`0hh=6GHEu$A4tNR;+>nc3?qTR9wz%~o;6~k4%|P(d zT%5uxB{AF*+bg+GA^{}xmGM<)ilHjRtSgCGcV=T74$II6SGk=+=ka&bsWoFzv9gHU zw<2spxDNEEJpNYkNh<>w+ThLRFM#jn6J%R;vuu{u?u!ub*%eI3=vy${V|7FC}jUJ`ega&;+gaS)-Ow5d^*f{0jIz!Y62I`1MGh8olRL-1-@Cjwhvu zkkQP_@C&1sHI+zoM{smGYV2W6{d1*?8GQ{`d88<%o>b%9p}`rw!JEw=AX0P~U0`3S3QT%p*86ds{{-e_Q$nDZl`5_@-@+#IZj|*vE5g6f z)bO+1z4qP{P^}=JMfns3j#7Y1$sxS`^PYW7XArP|jBqxv7sI%5JdfBa8!`LahhuMt>ar;8hFOrL@p&NN{?+iNNE`0iW%;=m5r^sK z{SFvE{b zn((Tsmk#o0A5nPf(Ndl*C$X-2kUa?bnMUPxR4y&+N>a>Pgvccbr=t9bsQCl{aqDK_ z#%wMJm95l=H;hND^zxhwToVeBN*9(ToP@zgfiLFL;`V%|1rPdukVm`D77h7FD|z$UwMxjcVi(AJcUpl3z5S> zv8Pgg1tsI$?lCsN9MG@Qp>f_wt}QY)z{$MUeG2dba~mGzfZYhJ06M|g#+-(qPsADb z6LPlu0Gem_5Vx;I^~S8@dI&c`?Oz3a#eGjSBHxbUj{Xz0gN{5Dc!@eGocLJ}W`YhAU$0y^N75@(r WV}tY?9hhtY0000= left_width: break @@ -139,7 +140,7 @@ class FootBar: def ClearCanvas(self): - self._CanvasHWND.fill( self._BgColor ) + self._CanvasHWND.fill( self._SkinManager.GiveColor("White") ) self._Icons["round_corners"].NewCoord(5,self._Height -5 ) self._Icons["round_corners"]._IconIndex = 2 @@ -178,7 +179,7 @@ class FootBar: self._Icons[x].Draw() - pygame.draw.line(self._CanvasHWND,(169,169,169),(0,0),(Width,0),self._BorderWidth) + pygame.draw.line(self._CanvasHWND,self._SkinManager.GiveColor("Line"),(0,0),(Width,0),self._BorderWidth) if self._HWND != None: self._HWND.blit(self._CanvasHWND,(self._PosX,Height - self._Height,Width,self._BarHeight)) diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index 69e6aef..0ace849 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -9,7 +9,6 @@ import sys from libs import easing from datetime import datetime -import base64 from beeprint import pp ## local package import @@ -26,6 +25,8 @@ from label import Label from untitled_icon import UntitledIcon from Emulator import MyEmulator +from skin_manager import SkinManager + class MessageBox(Label): _Parent = None @@ -122,6 +123,7 @@ class MainScreen(object): _MsgBox = None _MsgBoxFont = fonts["veramono20"] _IconFont = fonts["varela15"] + _SkinManager = None def __init__(self): self._Pages = [] @@ -132,6 +134,9 @@ class MainScreen(object): self._MsgBox= MessageBox() self._MsgBox._Parent= self self._MsgBox.Init(" ", self._MsgBoxFont) + + self._SkinManager = SkinManager() + self._SkinManager.Init() def FartherPages(self): self._PageMax = len(self._Pages) diff --git a/sys.py/UI/page.py b/sys.py/UI/page.py index c166bd3..e5e2422 100644 --- a/sys.py/UI/page.py +++ b/sys.py/UI/page.py @@ -9,18 +9,14 @@ import math from libs import easing -import base64 -from beeprint import pp +#import base64 +#from beeprint import pp ### local import from constants import ALIGN,icon_width,icon_height,Width,Height,ICON_TYPES from util_funcs import midRect from keys_def import CurKeys - -from blueselector_b64 import blueselector - - -blueselector_surf = pygame.image.frombuffer(base64.b64decode(blueselector),(92,92),"RGBA") +from icon_pool import MyIconPool class PageStack: def __init__(self): @@ -107,6 +103,7 @@ class Page(object): _SelectedIconTopOffset=20 _EasingDur = 30 + def __init__(self): self._Icons = [] @@ -132,9 +129,9 @@ class Page(object): if cnt >= (self._IconNumbers -1): break cnt+=1 - #icon的实际surface是要另行赋值的,这儿只创建空的icon,输入了坐标等信息 + ps = PageSelector() - ps._IconSurf = blueselector_surf + ps._IconSurf = MyIconPool._Icons["blueselector"] ps._Parent = self ps.Init(icon_width/2, TitleBar._BarHeight+icon_height/2,92,92,128) self._Ps = ps @@ -158,7 +155,7 @@ class Page(object): it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) ps = PageSelector() - ps._IconSurf = blueselector_surf + ps._IconSurf = MyIconPool._Icons["blueselector"] ps._Parent = self ps.Init(start_x,start_y,92,92,128) @@ -211,7 +208,7 @@ class Page(object): it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) ps = PageSelector() - ps._IconSurf = blueselector_surf + ps._IconSurf = MyIconPool._Icons["blueselector"] ps._Parent = self ps.Init(start_x,start_y,92,92,128) @@ -247,9 +244,9 @@ class Page(object): if cnt >= (self._IconNumbers -1): break cnt+=1 - #icon的实际surface是要另行赋值的,这儿只创建空的icon,输入了坐标等信息 + ps = PageSelector() - ps._IconSurf = blueselector_surf + ps._IconSurf = MyIconPool._Icons["blueselector"] ps._Parent = self ps.Init(icon_width/2,icon_height/2,92,92,128) self._Ps = ps @@ -291,7 +288,7 @@ class Page(object): ps = PageSelector() - ps._IconSurf = blueselector_surf + ps._IconSurf = MyIconPool._Icons["blueselector"] ps._Parent = self ps.Init(start_x,start_y-self._SelectedIconTopOffset,92,92,128) @@ -324,10 +321,10 @@ class Page(object): it._Index = i it.Init(start_x+i*icon_width,start_y,icon_width,icon_height,0) self._Icons.append(it) - #icon的实际surface是要另行赋值的,这儿只创建空的icon,输入了坐标等信息 + if self._IconNumbers > 0: ps = PageSelector() - ps._IconSurf = blueselector_surf + ps._IconSurf = MyIconPool._Icons["blueselector"] ps._Parent = self ps.Init(start_x,start_y,icon_width+4,icon_height+4,128) self._Ps = ps @@ -546,7 +543,7 @@ class Page(object): print("OnTopLevel ",self._Screen._PageIndex) def ClearCanvas(self): - self._CanvasHWND.fill((255,255,255)) + self._CanvasHWND.fill(self._Screen._SkinManager.GiveColor("White")) def ClearIcons(self): for i in range(0,self._IconNumbers): diff --git a/sys.py/UI/skin_manager.py b/sys.py/UI/skin_manager.py new file mode 100644 index 0000000..5b6b3f8 --- /dev/null +++ b/sys.py/UI/skin_manager.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +import pygame +import config +import ConfigParser + +class CaseConfigParser(ConfigParser.SafeConfigParser): + def optionxform(self, optionstr): + return optionstr + +class SkinManager(object): + """ + _HighColor = pygame.Color(51,166,255) # #33a6ff + _TextColor = pygame.Color(83,83,83) # #535353 + _FrontColor = pygame.Color(131,199,219) ## light blue,#83c7db + _URLColor = pygame.Color(51,166,255) ## blue more #33a6ff + _LineColor = pygame.Color(169,169,169) # #a9a9a9 + _TitleBgColor = pygame.Color(228,228,228) # #e4e4e4 + _ActiveColor = pygame.Color(175,90,0) ## light brown #af5a00 + """ + + _Colors = {} + _Config = None + + def __init__(self): + pass + + def ConvertToRGB(self,hexstr): + + h = hexstr.lstrip('#') + return tuple(int(h[i:i+2], 16) for i in (0, 2 ,4)) + + def Init(self): + + Colors = {} + Colors["High"] = pygame.Color(51,166,255) + Colors["Text"] = pygame.Color(83,83,83) + Colors["Front"] = pygame.Color(131,199,219) + Colors["URL"] = pygame.Color(51,166,255) + Colors["Line"] = pygame.Color(169,169,169) + Colors["TitleBg"] = pygame.Color(228,228,228) + Colors["Active"] = pygame.Color(175,90,0) + Colors["White"] = pygame.Color(255,255,255) + + self._Colors = Colors + + self._Config = CaseConfigParser() + + fname = "../skin/"+config.SKIN+"/config.cfg" + + try: + self._Config.read(fname) + except Exception,e: + print("read skin config.cfg error %s" % str(e)) + return + else: + if "Colors" in self._Config.sections(): + colour_opts = self._Config.options("Colors") +# print(colour_opts) + for i in self._Colors: + if i in colour_opts: + try: + self._Colors[i] = self.ConvertToRGB(self._Config.get("Colors",i)) + except Exception,e: + print("error in ConvertToRGB %s" % str(e)) + continue + + + def GiveColor(self,name): + if name in self._Colors: + return self._Colors[name] + else: + return pygame.Color(255,0,0) + diff --git a/sys.py/UI/title_bar.py b/sys.py/UI/title_bar.py index 95c2c59..eda0378 100644 --- a/sys.py/UI/title_bar.py +++ b/sys.py/UI/title_bar.py @@ -31,13 +31,9 @@ class TitleBar: _PosY = 0 _Width = Width _Height = 25 - _IconColor = pygame.Color(114,114,144) _BarHeight = 24.5 _LOffset = 3 _ROffset = 3 - _BgColor = pygame.Color(228,228,228) - _TxtColor = pygame.Color(83,83,83) - _BottomLineColor = pygame.Color(169,169,169) _Icons = {} _icon_width = 18 _icon_height = 18 @@ -45,8 +41,11 @@ class TitleBar: _CanvasHWND = None _HWND = None _Title = "" - + _InLowBackLight = -1 + + _SkinManager = None + def __init__(self): self._Icons = {} @@ -240,7 +239,7 @@ class TitleBar: print( wifi_strength()) def ClearCanvas(self): - self._CanvasHWND.fill( self._BgColor ) + self._CanvasHWND.fill( self._SkinManager.GiveColor("TitleBg") ) self._Icons["round_corners"].NewCoord(5,5) self._Icons["round_corners"]._IconIndex = 0 @@ -267,10 +266,10 @@ class TitleBar: time_text_size = fonts["varela12"].size(cur_time) title_text_size = fonts["varela16"].size(title) - self._CanvasHWND.blit(fonts["varela16"].render(title,True,self._TxtColor),midRect(title_text_size[0]/2+self._LOffset, + self._CanvasHWND.blit(fonts["varela16"].render(title,True,self._SkinManager.GiveColor("Text")),midRect(title_text_size[0]/2+self._LOffset, title_text_size[1]/2+(self._BarHeight-title_text_size[1])/2, title_text_size[0],title_text_size[1],Width,Height)) - self._CanvasHWND.blit(fonts["varela12"].render(cur_time,True,self._TxtColor),midRect(Width-time_text_size[0]/2-self._ROffset, + self._CanvasHWND.blit(fonts["varela12"].render(cur_time,True,self._SkinManager.GiveColor("Text")),midRect(Width-time_text_size[0]/2-self._ROffset, time_text_size[1]/2+(self._BarHeight-time_text_size[1])/2, time_text_size[0],time_text_size[1],Width,Height)) @@ -302,7 +301,7 @@ class TitleBar: self._Icons["battery"].Draw() - pygame.draw.line(self._CanvasHWND,self._BottomLineColor,(0,self._BarHeight),(self._Width,self._BarHeight),self._BorderWidth) + pygame.draw.line(self._CanvasHWND,self._SkinManager.GiveColor("Line"),(0,self._BarHeight),(self._Width,self._BarHeight),self._BorderWidth) if self._HWND != None: self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width,self._Height)) diff --git a/sys.py/UI/untitled_icon.py b/sys.py/UI/untitled_icon.py index b13b675..debfeee 100644 --- a/sys.py/UI/untitled_icon.py +++ b/sys.py/UI/untitled_icon.py @@ -11,10 +11,10 @@ from datetime import datetime import base64 from beeprint import pp -from util_funcs import midRect +from util_funcs import midRect,SkinMap from fonts import fonts -BlankPng = "gameshell/blank.png" ## 80x80 +BlankPng = SkinMap("gameshell/blank.png") ## 80x80 ## use blank circle as bg, Two alpha As Icon Label #Upper and Lower class UntitledIcon(object): diff --git a/sys.py/run.py b/sys.py/run.py index 467cf81..a1a76fe 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -322,7 +322,9 @@ def big_loop(): main_screen.ReadTheDirIntoPages("../Menu",0,None) main_screen.FartherPages() - + title_bar._SkinManager = main_screen._SkinManager + foot_bar._SkinManager = main_screen._SkinManager + sound_patch = SoundPatch() sound_patch._Parent = main_screen sound_patch.Init()