From 25ca0f6cead57424932b5827c21174511141ba17 Mon Sep 17 00:00:00 2001 From: 4k1 <23312005+4k1@users.noreply.github.com> Date: Mon, 23 Jul 2018 02:53:20 +0900 Subject: [PATCH] forum#571/Implemented to toggle ABXY position https://forum.clockworkpi.com/t/is-there-anybody-who-uses-gs-with-customized-key-position-of-abxy-buttons/571 --- .../10_Settings/ButtonsLayout/__init__.py | 174 ++++++++++++++++++ Menu/GameShell/10_Settings/list_page.py | 3 +- .../sys.py/gameshell/icons/buttonslayout.png | Bin 0 -> 21885 bytes sys.py/UI/foot_bar.py | 18 +- 4 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 Menu/GameShell/10_Settings/ButtonsLayout/__init__.py create mode 100644 skin/default/sys.py/gameshell/icons/buttonslayout.png diff --git a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py new file mode 100644 index 0000000..d5d1a84 --- /dev/null +++ b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- + +import pygame +import commands + +from libs.roundrects import aa_round_rect +from UI.constants import Width,Height,ICON_TYPES +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.multi_icon_item import MultiIconItem +from UI.multilabel import MultiLabel + +class ButtonsLayoutPage(Page): + _FootMsg = ["Nav.","","","Back","Toggle"] + _MyList = [] + _ListFontObj = fonts["varela13"] + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + + _EasingDur = 30 + + _dialog_index = 0 + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + + + 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 + + DialogBoxs = MultiIconItem() + DialogBoxs._ImgSurf = MyIconPool._Icons["buttonslayout"] + DialogBoxs._MyType = ICON_TYPES["STAT"] + DialogBoxs._Parent = self + DialogBoxs._IconWidth = 300 + DialogBoxs._IconHeight = 150 + DialogBoxs.Adjust(0,0,134,372,0) + self._Icons["DialogBoxs"] = DialogBoxs + + self.GenList() + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + def ScrollDown(self): + dis = 10 + if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 0: + self._PosY -= dis + self._Scrolled -= dis + + def ScrollUp(self): + dis = 10 + if self._PosY < 0: + self._PosY += dis + self._Scrolled += dis + + def GetButtonsLayoutMode(self): + lm = "xbox" + try: + with open(".buttonslayout", "r") as f: + lm = f.read() + except: + None + if lm not in ["xbox","snes"]: + lm = "xbox" + return lm + + def ToggleMode(self): + + if self.GetButtonsLayoutMode() == "xbox": + + with open(".buttonslayout", "w") as f: + f.write("snes") + + self._dialog_index = 1 + self._Screen.Draw() + self._Screen.SwapAndShow() + else: + + with open(".buttonslayout", "w") as f: + f.write("xbox") + + self._dialog_index = 0 + self._Screen.Draw() + self._Screen.SwapAndShow() + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + if self.GetButtonsLayoutMode() == "xbox": + self._dialog_index = 0 + else: + self._dialog_index = 1 + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def KeyDown(self,event): + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["B"]: + self.ToggleMode() + + def Draw(self): + self.ClearCanvas() + + self._Icons["DialogBoxs"].NewCoord(0,30) + self._Icons["DialogBoxs"]._IconIndex = self._dialog_index + self._Icons["DialogBoxs"].DrawTopLeft() + + 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 = ButtonsLayoutPage() + self._Page._Screen = main_screen + self._Page._Name ="Buttons Layout" + 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 64e588a..4a5ebba 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -84,7 +84,8 @@ class ListPage(Page): ["","Storage",""], ["","Update", ""], ["","About", "About"], - ["","PowerOFF","Power off"],] + ["","PowerOFF","Power off"], + ["","ButtonsLayout","Buttons Layout"],] start_x = 0 start_y = 0 diff --git a/skin/default/sys.py/gameshell/icons/buttonslayout.png b/skin/default/sys.py/gameshell/icons/buttonslayout.png new file mode 100644 index 0000000000000000000000000000000000000000..99a2531b442f3972aa03baf19334eaa8d2a0c94d GIT binary patch literal 21885 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