buttons_layout_page.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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/rect"
  11. "github.com/cuu/gogame/surface"
  12. "github.com/cuu/gogame/color"
  13. "github.com/cuu/gogame/event"
  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.Draw()
  88. self.Screen.SwapAndShow()
  89. }
  90. if ev.Data["Key"] == UI.CurKeys["B"] {
  91. keymap := []string{"j","k","u","i"}
  92. if self.LayoutMode == "xbox" {
  93. keymap = []string{"j","k","u","i"}
  94. }else if self.LayoutMode == "snes" {
  95. keymap = []string{ "k","j","i","u" }
  96. }else {
  97. self.finalizeWithDialog("Internal error.")
  98. return
  99. }
  100. fmt.Println( "mode: ",self.LayoutMode)
  101. if UI.IsAFile(self.RetroArchConf) == false {
  102. self.finalizeWithDialog("retroarch.cfg was not found.")
  103. return
  104. }
  105. cpCmd := exec.Command("cp", "-rf", self.RetroArchConf,self.RetroArchConf+".blbak")
  106. err := cpCmd.Run()
  107. if err != nil {
  108. fmt.Println(err)
  109. self.finalizeWithDialog("Cannot create .blbak")
  110. return
  111. }
  112. self.finalizeWithDialog(self.ModifyRetroArchConf(keymap))
  113. return
  114. }
  115. }
  116. func (self *UpdateConfirmPage) OnReturnBackCb() {
  117. self.ReturnToUpLevelPage()
  118. self.Screen.Draw()
  119. self.Screen.SwapAndShow()
  120. }
  121. func (self *UpdateConfirmPage) Draw() {
  122. self.ClearCanvas()
  123. self.DrawBG()
  124. for _,v := range self.MyList {
  125. v.Draw()
  126. }
  127. self.Reset()
  128. }
  129. type ButtonsLayoutPage struct {
  130. UI.Page
  131. ListFontObj *ttf.Font
  132. BGwidth int
  133. BGheight int
  134. DrawOnce bool
  135. Scrolled int
  136. Scroller *UI.ListScroller
  137. ConfirmPage *UpdateConfirmPage
  138. dialog_index int
  139. Icons map[string]UI.IconItemInterface
  140. ConfigFilename string
  141. }
  142. func NewButtonsLayoutPage() *ButtonsLayoutPage {
  143. p := &ButtonsLayoutPage{}
  144. p.PageIconMargin = 20
  145. p.SelectedIconTopOffset = 20
  146. p.EasingDur = 10
  147. p.Align = UI.ALIGN["SLeft"]
  148. p.FootMsg = [5]string{"Nav","UpdateRetroArch","","Back","Toggle"}
  149. p.Icons = make( map[string]UI.IconItemInterface )
  150. p.BGwidth = UI.Width
  151. p.BGheight = UI.Height - 24 -20
  152. p.ConfigFilename = "sysgo/.buttonslayout"
  153. return p
  154. }
  155. func (self *ButtonsLayoutPage) Init() {
  156. if self.Screen != nil {
  157. if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
  158. self.HWND = self.Screen.CanvasHWND
  159. self.CanvasHWND = surface.Surface(self.Screen.Width,self.Screen.Height)
  160. }
  161. }
  162. self.PosX = self.Index*self.Screen.Width
  163. self.Width = self.Screen.Width
  164. self.Height = self.Screen.Height
  165. DialogBoxs := UI.NewMultiIconItem()
  166. DialogBoxs.ImgSurf = UI.MyIconPool.GetImgSurf("buttonslayout")
  167. DialogBoxs.MyType = UI.ICON_TYPES["STAT"]
  168. DialogBoxs.Parent = self
  169. DialogBoxs.IconWidth = 300
  170. DialogBoxs.IconHeight = 150
  171. DialogBoxs.Adjust(0,0,134,372,0)
  172. self.Icons["DialogBoxs"] = DialogBoxs
  173. self.Scroller = UI.NewListScroller()
  174. self.Scroller.Parent = self
  175. self.Scroller.PosX = self.Width - 10
  176. self.Scroller.PosY = 2
  177. self.Scroller.Init()
  178. self.Scroller.SetCanvasHWND(self.HWND)
  179. self.ConfirmPage = NewUpdateConfirmPage()
  180. self.ConfirmPage.LayoutMode = self.GetButtonsLayoutMode()
  181. self.ConfirmPage.Screen = self.Screen
  182. self.ConfirmPage.Name = "Overwrite RA conf"
  183. self.ConfirmPage.Init()
  184. }
  185. func (self *ButtonsLayoutPage) ScrollUp() {
  186. dis := 10
  187. if self.PosY < 0 {
  188. self.PosY += dis
  189. self.Scrolled += dis
  190. }
  191. }
  192. func (self *ButtonsLayoutPage) ScrollDown() {
  193. dis := 10
  194. if UI.Abs(self.Scrolled) < (self.BGheight - self.Height) / 2 + 0 {
  195. self.PosY -= dis
  196. self.Scrolled -=dis
  197. }
  198. }
  199. func (self *ButtonsLayoutPage) GetButtonsLayoutMode() string {
  200. lm := "xbox"
  201. lm_bytes,err := ioutil.ReadFile(self.ConfigFilename)
  202. if err == nil {
  203. for _,v := range []string{"xbox","snes"} {
  204. if v == string(lm_bytes) {
  205. lm = string(lm_bytes)
  206. break
  207. }
  208. }
  209. }
  210. return lm
  211. }
  212. func (self *ButtonsLayoutPage) ToggleMode() {
  213. if self.GetButtonsLayoutMode() == "xbox" {
  214. d := []byte("snes")
  215. err := ioutil.WriteFile(self.ConfigFilename,d,0644)
  216. if err != nil {
  217. fmt.Println(err)
  218. }
  219. self.dialog_index = 1
  220. self.Screen.Draw()
  221. self.Screen.SwapAndShow()
  222. }else {
  223. d := []byte("xbox")
  224. err := ioutil.WriteFile(self.ConfigFilename,d,0644)
  225. if err != nil {
  226. fmt.Println(err)
  227. }
  228. self.dialog_index = 0
  229. self.Screen.Draw()
  230. self.Screen.SwapAndShow()
  231. }
  232. }
  233. func (self *ButtonsLayoutPage) OnLoadCb() {
  234. self.Scrolled = 0
  235. self.PosY = 0
  236. self.DrawOnce = false
  237. if self.GetButtonsLayoutMode() == "xbox" {
  238. self.dialog_index = 0
  239. }else {
  240. self.dialog_index = 1
  241. }
  242. }
  243. func (self *ButtonsLayoutPage) OnReturnBackCb() {
  244. self.ReturnToUpLevelPage()
  245. self.Screen.Draw()
  246. self.Screen.SwapAndShow()
  247. }
  248. func (self *ButtonsLayoutPage) KeyDown(ev *event.Event) {
  249. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  250. self.ReturnToUpLevelPage()
  251. self.Screen.Draw()
  252. self.Screen.SwapAndShow()
  253. }
  254. if ev.Data["Key"] == UI.CurKeys["B"] {
  255. self.ToggleMode()
  256. }
  257. if ev.Data["Key"] == UI.CurKeys["X"] {
  258. self.ConfirmPage.LayoutMode = self.GetButtonsLayoutMode()
  259. self.Screen.PushPage(self.ConfirmPage)
  260. self.Screen.Draw()
  261. self.Screen.SwapAndShow()
  262. }
  263. }
  264. func (self *ButtonsLayoutPage) Draw() {
  265. self.ClearCanvas()
  266. self.Icons["DialogBoxs"].NewCoord(0,30)
  267. self.Icons["DialogBoxs"].SetIconIndex(self.dialog_index)
  268. self.Icons["DialogBoxs"].DrawTopLeft()
  269. if self.HWND != nil {
  270. surface.Fill(self.HWND, &color.Color{255,255,255,255})
  271. rect_ := rect.Rect(self.PosX,self.PosY,self.Width,self.Height)
  272. surface.Blit(self.HWND,self.CanvasHWND,&rect_,nil)
  273. }
  274. }