diff --git a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py index d5d1a84..cdd7541 100644 --- a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py +++ b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- import pygame -import commands +import commands +import shutil +import os from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES @@ -15,9 +17,138 @@ from UI.icon_pool import MyIconPool from UI.icon_item import IconItem from UI.multi_icon_item import MultiIconItem from UI.multilabel import MultiLabel +from UI.confirm_page import ConfirmPage + +class UpdateConfirmPage(ConfirmPage): + _ConfirmText = "Apply to RetroArch?" + _RetroArchConf = "/home/cpi/.config/retroarch/retroarch.cfg" + _LayoutMode = "Unknown" + + _DownloadPage = None + + _URL = "" + _MD5 = "" + _Version = "" + _GIT = False + + def ModifyRetroArchConf(self,keys): + + try: + with open(self._RetroArchConf, mode="r") as f: + confarr = f.readlines() + except: + return "retroarch.cfg cannot open." + + bka = bkb = bkx = bky = False + try: + for i, ln in enumerate(confarr): + lnk = ln.split("=")[0].strip() + if lnk == "input_player1_a": + confarr[i] = "input_player1_a = \"" + keys[0] + "\"\n" + bka = True + if lnk == "input_player1_b": + confarr[i] = "input_player1_b = \"" + keys[1] + "\"\n" + bkb = True + if lnk == "input_player1_x": + confarr[i] = "input_player1_x = \"" + keys[2] + "\"\n" + bkx = True + if lnk == "input_player1_y": + confarr[i] = "input_player1_y = \"" + keys[3] + "\"\n" + bky = True + except: + return "retroarch.cfg cannot parse." + + if bka and bkb and bkx and bky: + None + else: + return "retroarch.cfg validation error." + + try: + with open(self._RetroArchConf, mode="w") as f: + confarr = f.writelines(confarr) + except: + return "retroarch.cfg cannot write." + + return "Completed! Your RA keymap: " + self._LayoutMode.upper() + + def KeyDown(self,event): + + def finalizeWithDialog(msg): + self._Screen._MsgBox.SetText(msg) + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + return + + if event.key == CurKeys["Menu"] or event.key == CurKeys["A"]: + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["B"]: + + if self._LayoutMode == "xbox": + keymap = ["j","k","u","i"] + elif self._LayoutMode == "snes": + keymap = ["k","j","i","u"] + else: + return "Internal error." + print("mode: " + self._LayoutMode) + + if not os.path.isfile(self._RetroArchConf): + finalizeWithDialog("retroarch.cfg was not found.") + return + + try: + shutil.copyfile(self._RetroArchConf, self._RetroArchConf + ".blbak") + except: + finalizeWithDialog("Cannot create .blbak") + return + + finalizeWithDialog(self.ModifyRetroArchConf(keymap)) + return + + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + return + if self._GIT == True: + cmdpath = "feh --bg-center /home/cpi/apps/launcher/sys.py/gameshell/wallpaper/updating.png; cd /home/cpi/apps/launcher ;git pull; git reset --hard %s ; feh --bg-center /home/cpi/apps/launcher/sys.py/gameshell/wallpaper/loading.png " % self._Version + pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) + self._GIT = False + return + + if self._DownloadPage == None: + self._DownloadPage = UpdateDownloadPage() + self._DownloadPage._Screen = self._Screen + self._DownloadPage._Name = "Downloading..." + self._DownloadPage.Init() + + self._DownloadPage._MD5 = self._MD5 + self._Screen.PushPage(self._DownloadPage) + self._Screen.Draw() + self._Screen.SwapAndShow() + + if self._URL != None and validators.url(self._URL): + self._DownloadPage.StartDownload(self._URL, "/tmp") + else: + print "error url %s " % self._URL + + + def OnReturnBackCb(self): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def Draw(self): + self.ClearCanvas() + self.DrawBG() + for i in self._MyList: + i.Draw() + + self.Reset() class ButtonsLayoutPage(Page): - _FootMsg = ["Nav.","","","Back","Toggle"] + _FootMsg = ["Nav.","UpdateRetroArch","","Back","Toggle"] _MyList = [] _ListFontObj = fonts["varela13"] @@ -30,6 +161,7 @@ class ButtonsLayoutPage(Page): _DrawOnce = False _Scroller = None + _ConfirmPage = None _EasingDur = 30 @@ -72,6 +204,14 @@ class ButtonsLayoutPage(Page): self._Scroller.Init() self._Scroller.SetCanvasHWND(self._HWND) + self._ConfirmPage = UpdateConfirmPage() + self._ConfirmPage._LayoutMode = self.GetButtonsLayoutMode() + self._ConfirmPage._Screen = self._Screen + self._ConfirmPage._Name = "Overwrite RA conf" + self._ConfirmPage._Parent = self + self._ConfirmPage.Init() + + def ScrollDown(self): dis = 10 if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 0: @@ -137,6 +277,12 @@ class ButtonsLayoutPage(Page): if event.key == CurKeys["B"]: self.ToggleMode() + + if event.key == CurKeys["X"]: + self._ConfirmPage._LayoutMode = self.GetButtonsLayoutMode() + self._Screen.PushPage(self._ConfirmPage) + self._Screen.Draw() + self._Screen.SwapAndShow() def Draw(self): self.ClearCanvas()