__init__.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. import commands
  4. import shutil
  5. import os
  6. from libs.roundrects import aa_round_rect
  7. from UI.constants import Width,Height,ICON_TYPES
  8. from UI.page import Page,PageSelector
  9. from UI.label import Label
  10. from UI.util_funcs import midRect
  11. from UI.keys_def import CurKeys, GetButtonsLayoutMode, SetButtonsLayoutMode, IsKeyStartOrA, IsKeyMenuOrB
  12. from UI.scroller import ListScroller
  13. from UI.icon_pool import MyIconPool
  14. from UI.icon_item import IconItem
  15. from UI.multi_icon_item import MultiIconItem
  16. from UI.multilabel import MultiLabel
  17. from UI.confirm_page import ConfirmPage
  18. class UpdateConfirmPage(ConfirmPage):
  19. _ConfirmText = "Apply to RetroArch?"
  20. _RetroArchConf = "/home/cpi/.config/retroarch/retroarch.cfg"
  21. _LayoutMode = "Unknown"
  22. def ModifyRetroArchConf(self,keys):
  23. try:
  24. with open(self._RetroArchConf, mode="r") as f:
  25. confarr = f.readlines()
  26. except:
  27. return "retroarch.cfg cannot open."
  28. bka = bkb = bkx = bky = False
  29. try:
  30. for i, ln in enumerate(confarr):
  31. lnk = ln.split("=")[0].strip()
  32. if lnk == "input_player1_a":
  33. confarr[i] = "input_player1_a = \"" + keys[0] + "\"\n"
  34. bka = True
  35. if lnk == "input_player1_b":
  36. confarr[i] = "input_player1_b = \"" + keys[1] + "\"\n"
  37. bkb = True
  38. if lnk == "input_player1_x":
  39. confarr[i] = "input_player1_x = \"" + keys[2] + "\"\n"
  40. bkx = True
  41. if lnk == "input_player1_y":
  42. confarr[i] = "input_player1_y = \"" + keys[3] + "\"\n"
  43. bky = True
  44. except:
  45. return "retroarch.cfg cannot parse."
  46. if bka and bkb and bkx and bky:
  47. None
  48. else:
  49. return "retroarch.cfg validation error."
  50. try:
  51. with open(self._RetroArchConf, mode="w") as f:
  52. confarr = f.writelines(confarr)
  53. except:
  54. return "retroarch.cfg cannot write."
  55. return "Completed! Your RA keymap: " + self._LayoutMode.upper()
  56. def KeyDown(self,event):
  57. def finalizeWithDialog(msg):
  58. self._Screen._MsgBox.SetText(msg)
  59. self._Screen._MsgBox.Draw()
  60. self._Screen.SwapAndShow()
  61. return
  62. if IsKeyMenuOrB(event.key):
  63. self.ReturnToUpLevelPage()
  64. self._Screen.Draw()
  65. self._Screen.SwapAndShow()
  66. if IsKeyStartOrA(event.key):
  67. if self._LayoutMode == "xbox":
  68. keymap = ["j","k","u","i"]
  69. elif self._LayoutMode == "snes":
  70. keymap = ["k","j","i","u"]
  71. else:
  72. finalizeWithDialog("Internal error.")
  73. return
  74. print("mode: " + self._LayoutMode)
  75. if not os.path.isfile(self._RetroArchConf):
  76. finalizeWithDialog("retroarch.cfg was not found.")
  77. return
  78. try:
  79. shutil.copyfile(self._RetroArchConf, self._RetroArchConf + ".blbak")
  80. except:
  81. finalizeWithDialog("Cannot create .blbak")
  82. return
  83. finalizeWithDialog(self.ModifyRetroArchConf(keymap))
  84. return
  85. def OnReturnBackCb(self):
  86. self.ReturnToUpLevelPage()
  87. self._Screen.Draw()
  88. self._Screen.SwapAndShow()
  89. def Draw(self):
  90. self.ClearCanvas()
  91. self.DrawBG()
  92. for i in self._MyList:
  93. i.Draw()
  94. self.Reset()
  95. class ButtonsLayoutPage(Page):
  96. _FootMsg = ["Nav.","","UpdateRetroArch","Back","Toggle"]
  97. _MyList = []
  98. _AList = {}
  99. _Scrolled = 0
  100. _BGwidth = 320
  101. _BGheight = 240-24-20
  102. _DrawOnce = False
  103. _Scroller = None
  104. _ConfirmPage = None
  105. _EasingDur = 30
  106. _dialog_index = 0
  107. def __init__(self):
  108. Page.__init__(self)
  109. self._Icons = {}
  110. def GenList(self):
  111. self._MyList = []
  112. def Init(self):
  113. if self._Screen != None:
  114. if self._Screen._CanvasHWND != None and self._CanvasHWND == None:
  115. self._HWND = self._Screen._CanvasHWND
  116. self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) )
  117. self._PosX = self._Index*self._Screen._Width
  118. self._Width = self._Screen._Width ## equal to screen width
  119. self._Height = self._Screen._Height
  120. DialogBoxs = MultiIconItem()
  121. DialogBoxs._ImgSurf = MyIconPool.GiveIconSurface("buttonslayout")
  122. DialogBoxs._MyType = ICON_TYPES["STAT"]
  123. DialogBoxs._Parent = self
  124. DialogBoxs._IconWidth = 300
  125. DialogBoxs._IconHeight = 150
  126. DialogBoxs.Adjust(0,0,134,372,0)
  127. self._Icons["DialogBoxs"] = DialogBoxs
  128. self.GenList()
  129. self._Scroller = ListScroller()
  130. self._Scroller._Parent = self
  131. self._Scroller._PosX = self._Width - 10
  132. self._Scroller._PosY = 2
  133. self._Scroller.Init()
  134. self._Scroller.SetCanvasHWND(self._HWND)
  135. self._ConfirmPage = UpdateConfirmPage()
  136. self._ConfirmPage._LayoutMode = GetButtonsLayoutMode()
  137. self._ConfirmPage._Screen = self._Screen
  138. self._ConfirmPage._Name = "Overwrite RA conf"
  139. self._ConfirmPage._Parent = self
  140. self._ConfirmPage.Init()
  141. def ScrollDown(self):
  142. dis = 10
  143. if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 0:
  144. self._PosY -= dis
  145. self._Scrolled -= dis
  146. def ScrollUp(self):
  147. dis = 10
  148. if self._PosY < 0:
  149. self._PosY += dis
  150. self._Scrolled += dis
  151. def ToggleMode(self):
  152. if GetButtonsLayoutMode() == "xbox":
  153. SetButtonsLayoutMode("snes")
  154. self._dialog_index = 1
  155. self._Screen.Draw()
  156. self._Screen.SwapAndShow()
  157. else:
  158. SetButtonsLayoutMode("xbox")
  159. self._dialog_index = 0
  160. self._Screen.Draw()
  161. self._Screen.SwapAndShow()
  162. def OnLoadCb(self):
  163. self._Scrolled = 0
  164. self._PosY = 0
  165. self._DrawOnce = False
  166. self._dialog_index = 0 if GetButtonsLayoutMode() == "xbox" else 1
  167. def OnReturnBackCb(self):
  168. self.ReturnToUpLevelPage()
  169. self._Screen.Draw()
  170. self._Screen.SwapAndShow()
  171. def KeyDown(self,event):
  172. if IsKeyMenuOrB(event.key):
  173. self.ReturnToUpLevelPage()
  174. self._Screen.Draw()
  175. self._Screen.SwapAndShow()
  176. if IsKeyStartOrA(event.key):
  177. self.ToggleMode()
  178. if event.key == CurKeys["X"]:
  179. self._ConfirmPage._LayoutMode = GetButtonsLayoutMode()
  180. self._Screen.PushPage(self._ConfirmPage)
  181. self._Screen.Draw()
  182. self._Screen.SwapAndShow()
  183. def Draw(self):
  184. self.ClearCanvas()
  185. self._Icons["DialogBoxs"].NewCoord(0,30)
  186. self._Icons["DialogBoxs"]._IconIndex = self._dialog_index
  187. self._Icons["DialogBoxs"].DrawTopLeft()
  188. if self._HWND != None:
  189. self._HWND.fill((255,255,255))
  190. self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) )
  191. class APIOBJ(object):
  192. _Page = None
  193. def __init__(self):
  194. pass
  195. def Init(self,main_screen):
  196. self._Page = ButtonsLayoutPage()
  197. self._Page._Screen = main_screen
  198. self._Page._Name ="Buttons Layout"
  199. self._Page.Init()
  200. def API(self,main_screen):
  201. if main_screen !=None:
  202. main_screen.PushPage(self._Page)
  203. main_screen.Draw()
  204. main_screen.SwapAndShow()
  205. OBJ = APIOBJ()
  206. def Init(main_screen):
  207. OBJ.Init(main_screen)
  208. def API(main_screen):
  209. OBJ.API(main_screen)