buttons_layout_page.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. package ButtonsLayout
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os/exec"
  6. //"path/filepath"
  7. "strings"
  8. "github.com/veandco/go-sdl2/ttf"
  9. //"github.com/cuu/gogame/draw"
  10. "github.com/cuu/gogame/color"
  11. "github.com/cuu/gogame/event"
  12. "github.com/cuu/gogame/rect"
  13. "github.com/cuu/gogame/surface"
  14. //"github.com/cuu/gogame/time"
  15. //"github.com/clockworkpi/LauncherGoDev/sysgo"
  16. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  17. )
  18. type UpdateConfirmPage struct {
  19. UI.ConfirmPage
  20. RetroArchConf string
  21. LayoutMode string
  22. }
  23. func NewUpdateConfirmPage() *UpdateConfirmPage {
  24. p := &UpdateConfirmPage{}
  25. p.ListFont = UI.MyLangManager.TrFont("veramono20")
  26. p.FootMsg = [5]string{"Nav", "", "", "Cancel", "Yes"}
  27. p.ConfirmText = "Apply to RetroArch?"
  28. p.RetroArchConf = "/home/cpi/.config/retroarch/retroarch.cfg"
  29. p.LayoutMode = "Unknown"
  30. return p
  31. }
  32. func (self *UpdateConfirmPage) ModifyRetroArchConf(keys []string) string {
  33. if UI.FileExists(self.RetroArchConf) {
  34. confarr, err := UI.ReadLines(self.RetroArchConf)
  35. var bka = false
  36. var bkb = false
  37. var bkx = false
  38. var bky = false
  39. if err == nil {
  40. for i, ln := range confarr {
  41. parts := strings.Split(ln, "=")
  42. if len(parts) < 1 {
  43. fmt.Println("retroarch.cfg cannot parse.")
  44. return "retroarch.cfg cannot parse."
  45. }
  46. lnk := strings.Trim(parts[0], "\r\n ")
  47. if lnk == "input_player1_a" {
  48. confarr[i] = "input_player1_a = \"" + keys[0] + "\"\n"
  49. bka = true
  50. }
  51. if lnk == "input_player1_b" {
  52. confarr[i] = "input_player1_b = \"" + keys[1] + "\"\n"
  53. bkb = true
  54. }
  55. if lnk == "input_player1_x" {
  56. confarr[i] = "input_player1_x = \"" + keys[2] + "\"\n"
  57. bkx = true
  58. }
  59. if lnk == "input_player1_y" {
  60. confarr[i] = "input_player1_y = \"" + keys[3] + "\"\n"
  61. bky = true
  62. }
  63. }
  64. if bka == false || bkb == false || bkx == false || bky == false {
  65. fmt.Println("retroarch.cfg validation error.")
  66. return "retroarch.cfg validation error."
  67. }
  68. }
  69. err = UI.WriteLines(confarr, self.RetroArchConf)
  70. if err != nil {
  71. fmt.Println(err)
  72. return "retroarch.cfg cannot write."
  73. }
  74. }
  75. fmt.Println("Completed! Your RA keymap: " + strings.ToUpper(self.LayoutMode))
  76. return "Completed! Your RA keymap: " + strings.ToUpper(self.LayoutMode)
  77. }
  78. func (self *UpdateConfirmPage) finalizeWithDialog(msg string) {
  79. self.Screen.MsgBox.SetText(msg)
  80. self.Screen.MsgBox.Draw()
  81. self.Screen.SwapAndShow()
  82. return
  83. }
  84. func (self *UpdateConfirmPage) KeyDown(ev *event.Event) {
  85. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  86. self.ReturnToUpLevelPage()
  87. self.Screen.Refresh()
  88. }
  89. if ev.Data["Key"] == UI.CurKeys["B"] {
  90. keymap := []string{"j", "k", "u", "i"}
  91. if self.LayoutMode == "xbox" {
  92. keymap = []string{"j", "k", "u", "i"}
  93. } else if self.LayoutMode == "snes" {
  94. keymap = []string{"k", "j", "i", "u"}
  95. } else {
  96. self.finalizeWithDialog("Internal error.")
  97. return
  98. }
  99. fmt.Println("mode: ", self.LayoutMode)
  100. if UI.IsAFile(self.RetroArchConf) == false {
  101. self.finalizeWithDialog("retroarch.cfg was not found.")
  102. return
  103. }
  104. cpCmd := exec.Command("cp", "-rf", self.RetroArchConf, self.RetroArchConf+".blbak")
  105. err := cpCmd.Run()
  106. if err != nil {
  107. fmt.Println(err)
  108. self.finalizeWithDialog("Cannot create .blbak")
  109. return
  110. }
  111. self.finalizeWithDialog(self.ModifyRetroArchConf(keymap))
  112. return
  113. }
  114. }
  115. func (self *UpdateConfirmPage) OnReturnBackCb() {
  116. self.ReturnToUpLevelPage()
  117. self.Screen.Refresh()
  118. }
  119. func (self *UpdateConfirmPage) Draw() {
  120. self.ClearCanvas()
  121. self.DrawBG()
  122. for _, v := range self.MyList {
  123. v.Draw()
  124. }
  125. self.Reset()
  126. }
  127. type ButtonsLayoutPage struct {
  128. UI.Page
  129. ListFontObj *ttf.Font
  130. BGwidth int
  131. BGheight int
  132. DrawOnce bool
  133. Scrolled int
  134. Scroller *UI.ListScroller
  135. ConfirmPage *UpdateConfirmPage
  136. dialog_index int
  137. Icons map[string]UI.IconItemInterface
  138. ConfigFilename string
  139. }
  140. func NewButtonsLayoutPage() *ButtonsLayoutPage {
  141. p := &ButtonsLayoutPage{}
  142. p.PageIconMargin = 20
  143. p.SelectedIconTopOffset = 20
  144. p.EasingDur = 10
  145. p.Align = UI.ALIGN["SLeft"]
  146. p.FootMsg = [5]string{"Nav", "UpdateRetroArch", "", "Back", "Toggle"}
  147. p.Icons = make(map[string]UI.IconItemInterface)
  148. p.BGwidth = UI.Width
  149. p.BGheight = UI.Height - 24 - 20
  150. p.ConfigFilename = "sysgo/.buttonslayout"
  151. return p
  152. }
  153. func (self *ButtonsLayoutPage) Init() {
  154. if self.Screen != nil {
  155. if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
  156. self.HWND = self.Screen.CanvasHWND
  157. self.CanvasHWND = surface.Surface(self.Screen.Width, self.Screen.Height)
  158. }
  159. }
  160. self.PosX = self.Index * self.Screen.Width
  161. self.Width = self.Screen.Width
  162. self.Height = self.Screen.Height
  163. DialogBoxs := UI.NewMultiIconItem()
  164. DialogBoxs.ImgSurf = UI.MyIconPool.GetImgSurf("buttonslayout")
  165. DialogBoxs.MyType = UI.ICON_TYPES["STAT"]
  166. DialogBoxs.Parent = self
  167. DialogBoxs.IconWidth = 300
  168. DialogBoxs.IconHeight = 150
  169. DialogBoxs.Adjust(0, 0, 134, 372, 0)
  170. self.Icons["DialogBoxs"] = DialogBoxs
  171. self.Scroller = UI.NewListScroller()
  172. self.Scroller.Parent = self
  173. self.Scroller.PosX = self.Width - 10
  174. self.Scroller.PosY = 2
  175. self.Scroller.Init()
  176. self.Scroller.SetCanvasHWND(self.HWND)
  177. self.ConfirmPage = NewUpdateConfirmPage()
  178. self.ConfirmPage.LayoutMode = self.GetButtonsLayoutMode()
  179. self.ConfirmPage.Screen = self.Screen
  180. self.ConfirmPage.Name = "Overwrite RA conf"
  181. self.ConfirmPage.Init()
  182. }
  183. func (self *ButtonsLayoutPage) ScrollUp() {
  184. dis := 10
  185. if self.PosY < 0 {
  186. self.PosY += dis
  187. self.Scrolled += dis
  188. }
  189. }
  190. func (self *ButtonsLayoutPage) ScrollDown() {
  191. dis := 10
  192. if UI.Abs(self.Scrolled) < (self.BGheight-self.Height)/2+0 {
  193. self.PosY -= dis
  194. self.Scrolled -= dis
  195. }
  196. }
  197. func (self *ButtonsLayoutPage) GetButtonsLayoutMode() string {
  198. lm := "xbox"
  199. lm_bytes, err := ioutil.ReadFile(self.ConfigFilename)
  200. if err == nil {
  201. for _, v := range []string{"xbox", "snes"} {
  202. if v == string(lm_bytes) {
  203. lm = string(lm_bytes)
  204. break
  205. }
  206. }
  207. }
  208. return lm
  209. }
  210. func (self *ButtonsLayoutPage) ToggleMode() {
  211. if self.GetButtonsLayoutMode() == "xbox" {
  212. d := []byte("snes")
  213. err := ioutil.WriteFile(self.ConfigFilename, d, 0644)
  214. if err != nil {
  215. fmt.Println(err)
  216. }
  217. self.dialog_index = 1
  218. self.Screen.Refresh()
  219. } else {
  220. d := []byte("xbox")
  221. err := ioutil.WriteFile(self.ConfigFilename, d, 0644)
  222. if err != nil {
  223. fmt.Println(err)
  224. }
  225. self.dialog_index = 0
  226. self.Screen.Refresh()
  227. }
  228. }
  229. func (self *ButtonsLayoutPage) OnLoadCb() {
  230. self.Scrolled = 0
  231. self.PosY = 0
  232. self.DrawOnce = false
  233. if self.GetButtonsLayoutMode() == "xbox" {
  234. self.dialog_index = 0
  235. } else {
  236. self.dialog_index = 1
  237. }
  238. }
  239. func (self *ButtonsLayoutPage) OnReturnBackCb() {
  240. self.ReturnToUpLevelPage()
  241. self.Screen.Refresh()
  242. }
  243. func (self *ButtonsLayoutPage) KeyDown(ev *event.Event) {
  244. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  245. self.ReturnToUpLevelPage()
  246. self.Screen.Refresh()
  247. }
  248. if ev.Data["Key"] == UI.CurKeys["B"] {
  249. self.ToggleMode()
  250. }
  251. if ev.Data["Key"] == UI.CurKeys["X"] {
  252. self.ConfirmPage.LayoutMode = self.GetButtonsLayoutMode()
  253. self.Screen.PushPage(self.ConfirmPage)
  254. self.Screen.Refresh()
  255. }
  256. }
  257. func (self *ButtonsLayoutPage) Draw() {
  258. self.ClearCanvas()
  259. self.Icons["DialogBoxs"].NewCoord(0, 30)
  260. self.Icons["DialogBoxs"].SetIconIndex(self.dialog_index)
  261. self.Icons["DialogBoxs"].DrawTopLeft()
  262. if self.HWND != nil {
  263. surface.Fill(self.HWND, &color.Color{255, 255, 255, 255})
  264. rect_ := rect.Rect(self.PosX, self.PosY, self.Width, self.Height)
  265. surface.Blit(self.HWND, self.CanvasHWND, &rect_, nil)
  266. }
  267. }