123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- package ButtonsLayout
- import (
- "fmt"
- "io/ioutil"
- "os/exec"
- //"path/filepath"
- "strings"
- "github.com/veandco/go-sdl2/ttf"
- //"github.com/cuu/gogame/draw"
- "github.com/cuu/gogame/color"
- "github.com/cuu/gogame/event"
- "github.com/cuu/gogame/rect"
- "github.com/cuu/gogame/surface"
- //"github.com/cuu/gogame/time"
- //"github.com/clockworkpi/LauncherGoDev/sysgo"
- "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
- )
- type UpdateConfirmPage struct {
- UI.ConfirmPage
- RetroArchConf string
- LayoutMode string
- }
- func NewUpdateConfirmPage() *UpdateConfirmPage {
- p := &UpdateConfirmPage{}
- p.ListFont = UI.MyLangManager.TrFont("veramono20")
- p.FootMsg = [5]string{"Nav", "", "", "Cancel", "Yes"}
- p.ConfirmText = "Apply to RetroArch?"
- p.RetroArchConf = "/home/cpi/.config/retroarch/retroarch.cfg"
- p.LayoutMode = "Unknown"
- return p
- }
- func (self *UpdateConfirmPage) ModifyRetroArchConf(keys []string) string {
- if UI.FileExists(self.RetroArchConf) {
- confarr, err := UI.ReadLines(self.RetroArchConf)
- var bka = false
- var bkb = false
- var bkx = false
- var bky = false
- if err == nil {
- for i, ln := range confarr {
- parts := strings.Split(ln, "=")
- if len(parts) < 1 {
- fmt.Println("retroarch.cfg cannot parse.")
- return "retroarch.cfg cannot parse."
- }
- lnk := strings.Trim(parts[0], "\r\n ")
- 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
- }
- }
- if bka == false || bkb == false || bkx == false || bky == false {
- fmt.Println("retroarch.cfg validation error.")
- return "retroarch.cfg validation error."
- }
- }
- err = UI.WriteLines(confarr, self.RetroArchConf)
- if err != nil {
- fmt.Println(err)
- return "retroarch.cfg cannot write."
- }
- }
- fmt.Println("Completed! Your RA keymap: " + strings.ToUpper(self.LayoutMode))
- return "Completed! Your RA keymap: " + strings.ToUpper(self.LayoutMode)
- }
- func (self *UpdateConfirmPage) finalizeWithDialog(msg string) {
- self.Screen.MsgBox.SetText(msg)
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
- return
- }
- func (self *UpdateConfirmPage) KeyDown(ev *event.Event) {
- if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
- self.ReturnToUpLevelPage()
- self.Screen.Refresh()
- }
- if ev.Data["Key"] == UI.CurKeys["B"] {
- keymap := []string{"j", "k", "u", "i"}
- if self.LayoutMode == "xbox" {
- keymap = []string{"j", "k", "u", "i"}
- } else if self.LayoutMode == "snes" {
- keymap = []string{"k", "j", "i", "u"}
- } else {
- self.finalizeWithDialog("Internal error.")
- return
- }
- fmt.Println("mode: ", self.LayoutMode)
- if UI.IsAFile(self.RetroArchConf) == false {
- self.finalizeWithDialog("retroarch.cfg was not found.")
- return
- }
- cpCmd := exec.Command("cp", "-rf", self.RetroArchConf, self.RetroArchConf+".blbak")
- err := cpCmd.Run()
- if err != nil {
- fmt.Println(err)
- self.finalizeWithDialog("Cannot create .blbak")
- return
- }
- self.finalizeWithDialog(self.ModifyRetroArchConf(keymap))
- return
- }
- }
- func (self *UpdateConfirmPage) OnReturnBackCb() {
- self.ReturnToUpLevelPage()
- self.Screen.Refresh()
- }
- func (self *UpdateConfirmPage) Draw() {
- self.ClearCanvas()
- self.DrawBG()
- for _, v := range self.MyList {
- v.Draw()
- }
- self.Reset()
- }
- type ButtonsLayoutPage struct {
- UI.Page
- ListFontObj *ttf.Font
- BGwidth int
- BGheight int
- DrawOnce bool
- Scrolled int
- Scroller *UI.ListScroller
- ConfirmPage *UpdateConfirmPage
- dialog_index int
- Icons map[string]UI.IconItemInterface
- ConfigFilename string
- }
- func NewButtonsLayoutPage() *ButtonsLayoutPage {
- p := &ButtonsLayoutPage{}
- p.PageIconMargin = 20
- p.SelectedIconTopOffset = 20
- p.EasingDur = 10
- p.Align = UI.ALIGN["SLeft"]
- p.FootMsg = [5]string{"Nav", "UpdateRetroArch", "", "Back", "Toggle"}
- p.Icons = make(map[string]UI.IconItemInterface)
- p.BGwidth = UI.Width
- p.BGheight = UI.Height - 24 - 20
- p.ConfigFilename = "sysgo/.buttonslayout"
- return p
- }
- func (self *ButtonsLayoutPage) Init() {
- if self.Screen != nil {
- if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
- self.HWND = self.Screen.CanvasHWND
- self.CanvasHWND = surface.Surface(self.Screen.Width, self.Screen.Height)
- }
- }
- self.PosX = self.Index * self.Screen.Width
- self.Width = self.Screen.Width
- self.Height = self.Screen.Height
- DialogBoxs := UI.NewMultiIconItem()
- DialogBoxs.ImgSurf = UI.MyIconPool.GetImgSurf("buttonslayout")
- DialogBoxs.MyType = UI.ICON_TYPES["STAT"]
- DialogBoxs.Parent = self
- DialogBoxs.IconWidth = 300
- DialogBoxs.IconHeight = 150
- DialogBoxs.Adjust(0, 0, 134, 372, 0)
- self.Icons["DialogBoxs"] = DialogBoxs
- self.Scroller = UI.NewListScroller()
- self.Scroller.Parent = self
- self.Scroller.PosX = self.Width - 10
- self.Scroller.PosY = 2
- self.Scroller.Init()
- self.Scroller.SetCanvasHWND(self.HWND)
- self.ConfirmPage = NewUpdateConfirmPage()
- self.ConfirmPage.LayoutMode = self.GetButtonsLayoutMode()
- self.ConfirmPage.Screen = self.Screen
- self.ConfirmPage.Name = "Overwrite RA conf"
- self.ConfirmPage.Init()
- }
- func (self *ButtonsLayoutPage) ScrollUp() {
- dis := 10
- if self.PosY < 0 {
- self.PosY += dis
- self.Scrolled += dis
- }
- }
- func (self *ButtonsLayoutPage) ScrollDown() {
- dis := 10
- if UI.Abs(self.Scrolled) < (self.BGheight-self.Height)/2+0 {
- self.PosY -= dis
- self.Scrolled -= dis
- }
- }
- func (self *ButtonsLayoutPage) GetButtonsLayoutMode() string {
- lm := "xbox"
- lm_bytes, err := ioutil.ReadFile(self.ConfigFilename)
- if err == nil {
- for _, v := range []string{"xbox", "snes"} {
- if v == string(lm_bytes) {
- lm = string(lm_bytes)
- break
- }
- }
- }
- return lm
- }
- func (self *ButtonsLayoutPage) ToggleMode() {
- if self.GetButtonsLayoutMode() == "xbox" {
- d := []byte("snes")
- err := ioutil.WriteFile(self.ConfigFilename, d, 0644)
- if err != nil {
- fmt.Println(err)
- }
- self.dialog_index = 1
- self.Screen.Refresh()
- } else {
- d := []byte("xbox")
- err := ioutil.WriteFile(self.ConfigFilename, d, 0644)
- if err != nil {
- fmt.Println(err)
- }
- self.dialog_index = 0
- self.Screen.Refresh()
- }
- }
- func (self *ButtonsLayoutPage) OnLoadCb() {
- self.Scrolled = 0
- self.PosY = 0
- self.DrawOnce = false
- if self.GetButtonsLayoutMode() == "xbox" {
- self.dialog_index = 0
- } else {
- self.dialog_index = 1
- }
- }
- func (self *ButtonsLayoutPage) OnReturnBackCb() {
- self.ReturnToUpLevelPage()
- self.Screen.Refresh()
- }
- func (self *ButtonsLayoutPage) KeyDown(ev *event.Event) {
- if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
- self.ReturnToUpLevelPage()
- self.Screen.Refresh()
- }
- if ev.Data["Key"] == UI.CurKeys["B"] {
- self.ToggleMode()
- }
- if ev.Data["Key"] == UI.CurKeys["X"] {
- self.ConfirmPage.LayoutMode = self.GetButtonsLayoutMode()
- self.Screen.PushPage(self.ConfirmPage)
- self.Screen.Refresh()
- }
- }
- func (self *ButtonsLayoutPage) Draw() {
- self.ClearCanvas()
- self.Icons["DialogBoxs"].NewCoord(0, 30)
- self.Icons["DialogBoxs"].SetIconIndex(self.dialog_index)
- self.Icons["DialogBoxs"].DrawTopLeft()
- if self.HWND != nil {
- surface.Fill(self.HWND, &color.Color{255, 255, 255, 255})
- rect_ := rect.Rect(self.PosX, self.PosY, self.Width, self.Height)
- surface.Blit(self.HWND, self.CanvasHWND, &rect_, nil)
- }
- }
|