cuu 7814f9ca6f big update, add goroutine sdl render
replace a lot of self.Screen.Draw() to self.Screen.Refresh()
2023-01-23 14:04:11 +00:00

357 lines
7.4 KiB
Go

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)
}
}