From aca420aab7a88afc39ffc08179d07de1edd8fd51 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 5 Dec 2018 15:08:32 +0800 Subject: [PATCH] fav_list_page --- sysgo/UI/Emulator/fav_list_page.go | 481 +++++++++++++++++++++++++++++ 1 file changed, 481 insertions(+) diff --git a/sysgo/UI/Emulator/fav_list_page.go b/sysgo/UI/Emulator/fav_list_page.go index 14542c5..0d851eb 100644 --- a/sysgo/UI/Emulator/fav_list_page.go +++ b/sysgo/UI/Emulator/fav_list_page.go @@ -3,9 +3,490 @@ package Emulator import ( "path/filepath" + + "github.com/cuu/gogame/color" "github.com/cuu/gogame/surface" "github.com/cuu/LauncherGoDev/sysgo/UI" ) +type FavListPage struct { + UI.Page + Icons map[string]UI.IconItemInterface + ListFont *ttf.Font + MyStack *EmuStack + EmulatorConfig *ActionConfig + + RomSoConfirmDownloadPage *RomSoConfirmPage + + MyList []*EmulatorListItem + BGwidth int + BGheight 70 + + Leader *MyEmulator + +} + +func NewFavListPage() *FavListPage { + p := &FavListPage{} + p.PageIconMargin = 20 + p.SelectedIconTopOffset = 20 + p.EasingDur = 10 + + p.Align = ALIGN["SLeft"] + + p.FootMsg = [5]string{ "Nav","Scan","Remove","","Run" } + + p.Icons=make(map[string]UI.IconItemInterface) + p.ListFont = UI.Fonts["notosanscjk15"] + + p.MyStack = NewEmuStack() + + p.BGwidth = 75 + p.BGheight = 73 + + return p +} + + +func (self *FavListPage) GeneratePathList(path string) []map[string]string { + if UI.IsDirectory(path) == false { + return nil + } + dirmap := make(map[string]string) + var ret []map[string]string + + file_paths,err := filepath.Glob(path+"/*")//sorted + if err != nil { + fmt.Println(err) + return false + } + + for i,v := range file_paths { + if UI.IsDirectory(v) && self.EmulatorConfig.FILETYPE == "dir" { // like DOSBOX + gameshell_bat := self.EmulatorConfig.EXT[0] + if UI.GetGid(v) != FavGID { //only favs + continue + } + + if UI.FileExists( filepath.Join(v,gameshell_bat)) == true { + dirmap["gamedir"] = v + ret = append(ret,dirmap) + } + } + + if UI.IsFile(v) && self.EmulatorConfig.FILETYPE == "file" { + if UI.GetGid(v) != FavGID { //only favs + continue + } + + bname := filepath.Base(v) + if len(bname) > 1 { + pieces := strings.Split(bname,".") + if len(pieces) > 1 { + pieces_ext := strings.ToLower( pieces[len(pieces)-1]) + for _,v := range self.EmulatorConfig.EXT { + if pieces_ext == v { + dirmap["file"] = v + ret = append(ret,dirmap) + break + } + } + } + } + } + } + + return ret + +} + +func (self *FavListPage) SyncList( path string ) { + + alist := self.GeneratePathList(path) + + if alist == nil { + fmt.Println("listfiles return false") + return + } + + self.MyList = nil + + start_x := 0 + start_y := 0 + + hasparent := 0 + + if self.MyStack.Length() > 0 { + hasparent = 1 + + li := NewEmulatorListItem() + li.Parent = self + li.PosX = start_x + li.PosY = start_y + li.Width = UI.Width + li.Fonts["normal"] = self.ListFont + li.MyType = UI.ICON_TYPES["DIR"] + li.Init("[..]") + self.MyList = append(self.MyList,li) + } + + for i,v := range alist { + li := NewEmulatorListItem() + li.Parent = self + li.PosX = start_x + li.PosY = start_y + (i+hasparent)*li.Height + li.Fonts["normal"] = self.ListFont + li.MyType = UI.ICON_TYPES["FILE"] + + init_val = "NoName" + + if val, ok := v["directory"]; ok { + li.MyType = UI.ICON_TYPES["DIR"] + init_val = val + } + + if val, ok := v["file"]; ok { + init_val = val + } + + if val, ok := v["gamedir"]; ok { + init_val = val + } + + li.Init(init_val) + + self.MyList = append(self.MyList,li) + } +} + +func (self *FavListPage) Init() { + self.PosX = self.Index *self.Screen.Width + self.Width = self.Screen.Width + self.Height = self.Screen.Height + + sefl.CanvasHWND = self.Screen.CanvasHWND + + ps := UI.NewInfoPageSelector() + ps.Width = UI.Width - 12 + ps.PosX = 2 + ps.Parent = self + + self.Ps = ps + self.PsIndex = 0 + + self.SyncList( self.EmulatorConfig.ROM ) + + self.MyStack.EmulatorConfig = self.EmulatorConfig + + icon_for_list := UI.NewMultiIconItem() + icon_for_list.ImgSurf = UI.MyIconPool.GetImgSurf("sys") + icon_for_list.MyType = UI.ICON_TYPES["STAT"] + icon_for_list.Parent = self + + icon_for_list.Adjust(0,0,18,18,0) + + self.Icons["sys"] = icon_for_list + + bgpng := UI.NewIconItem() + bgpng.ImgSurf = UI.MyIconPool.GetImgSurf("star") + bgpng.MyType = UI.ICON_TYPES["STAT"] + bgpng.Parent = self + bgpng.AddLabel("my favourites games",UI.Fonts["varela22"]) + bgpng.SetLableColor(&color.Color{204,204,204,255} ) + bgpng.Adjust(0,0,self.BGwidth,self.BGheight,0) + + self.Icons["bg"] = bgpng + + self._Scroller = UI.NewListScroller() + self._Scroller.Parent = self + self._Scroller.PosX = self.Width - 10 + self._Scroller.PosY = 2 + self._Scroller.Init() + + rom_so_confirm_page := NewRomSoConfirmPage() + rom_so_confirm_page.Screen = self.Screen + rom_so_confirm_page.Name = "Download Confirm" + rom_so_confirm_page.Parent = self + rom_so_confirm_page.Init() + + self.RomSoConfirmDownloadPage = rom_so_confirm_page +} + + +func (self *FavListPage) ScrollUp() { + if len(self.MyList) == 0 { + return + } + + self.PsIndex -=1 + + if self.PsIndex < 0 { + self.PsIndex = 0 + } + + cur_li := self.MyList[self.PsIndex] + + if cur_li.PosY < 0 { + for i,_ := range self.MyList{ + self.MyList[i].PosY += self.MyList[i].Height + } + + self.Scrolled +=1 + } +} + + +func (self *FavListPage) ScrollDown(){ + if len(self.MyList) == 0 { + return + } + self.PsIndex +=1 + + if self.PsIndex >= len(self.MyList) { + self.PsIndex = len(self.MyList) - 1 + } + + cur_li := self.MyList[self.PsIndex] + + if cur_li.PosY + cur_li.Height > self.Height { + for i,_ := range self.MyList{ + self.MyList[i].PosY -= self.MyList[i].Height + } + self.Scrolled -=1 + } + +} + +func (self *FavListPage) SyncScroll() { + + if self.Scrolled == 0 { + return + } + + if self.PsIndex < len(self.MyList) { + cur_li := self.MyList[self.PsIndex] + if self.Scrolled > 0 { + if cur_li.PosY < 0 { + for i,_ := range self.MyList{ + self.MyList[i].PosY += self.Scrolled*self.MyList[i].Height + } + } + } if self.Scrolled < 0 { + if cur_li.PosY + cur_li.Height > self.Height{ + for i,_ := range self.MyList{ + self.MyList[i].PosY += self.Scrolled*self.MyList[i].Height + } + } + } + + } +} + + +func (self *FavListPage) Click() { + + if len(self.MyList) == 0 { + return + } + + + if self.PsIndex > len(self.MyList) - 1 { + return + } + + + cur_li := self.MyList[self.PsIndex] + + if cur_li.MyType == UI.ICON_TYPES["DIR"] { + if cur_li.Path = "[..]"{ + self.MyStack.Pop() + self.SyncList(self.MyStack.Last()) + self.PsIndex = 0 + }else{ + self.MyStack.Push(self.MyList[self.PsIndex].Path) + self.SyncList(self.MyStack.Last()) + self.PsIndex = 0 + } + } + + if cur_li.MyType == UI.ICON_TYPES["FILE"] { + self.Screen.MsgBox.SetText("Launching") + self.Screen.MsgBox.Draw() + self.Screen.SwapAndShow() + + path := "" + if self.EmulatorConfig.FILETYPE == "dir" { + path = filepath.Join(cur_li.Path,self.EmulatorConfig.EXT[0]) + }else{ + path = cur_li.Path + } + + fmt.Println("Run ",path) + + escaped_path := UI.CmdClean(path) + + if self.EmulatorConfig.FILETYPE == "dir" { + escaped_path = UI.CmdClean(path) + } + + custom_config := "" + + if self.EmulatorConfig.RETRO_CONFIG != "" && len(self.EmulatorConfig.RETRO_CONFIG) 5 { + custom_config = " -c " + self.EmulatorConfig.RETRO_CONFIG + } + + partsofpath := []string{self.EmulatorConfig.LAUNCHER,self.EmulatorConfig.ROM_SO,custom_config,escaped_path} + + cmdpath := strings.Join( partsofpath," ") + + if self.EmulatorConfig.ROM_SO =="" { //empty means No needs for rom so + event.POST(UI.RUNEVT,cmdpath) + }else{ + + if UI.FileExists(self.EmulatorConfig.ROM_SO) == true { + event.POST(UI.RUNEVT,cmdpath) + } else { + self.Screen.PushCurPage() + self.Screen.SetCurPage( self.RomSoConfirmDownloadPage) + self.Screen.Draw() + self.Screen.SwapAndShow() + } + } + + return + + } + + self.Screen.Draw() + self.Screen.SwapAndShow() +} + +func (self *FavListPage) ReScan() { + if self.MyStack.Length() == 0 { + self.SyncList(self.EmulatorConfig.ROM) + }else{ + self.SyncList(self.MyStack.Last()) + } + + + idx := self.PsIndex + + if idx > len(self.MyList) - 1 { + idx = len(self.MyList) + if idx > 0 { + idx -= 1 + }else if idx == 0 { + //nothing in MyList + } + } + + self.PsIndex = idx //sync PsIndex + + self.SyncScroll() +} + + +func (self *FavListPage) OnReturnBackCb() { + self.ReScan() + self.Screen.Draw() + self.Screen.SwapAndShow() +} + +func (self *FavListPage) OnLoadCb() { + self.ReScan() + self.Screen.Draw() + self.Screen.SwapAndShow() +} + +func (self *FavListPage) KeyDown(ev *event.Event) { + + if ev.Data["Key"] == UI.CurKeys["Menu"] || ev.Data["Key"] == UI.CurKeys["Left"] { + self.ReturnToUpLevelPage() + self.Screen.Draw() + self.Screen.SwapAndShow() + } + + if ev.Data["Key"] == UI.CurKeys["Up"]{ + self.ScrollUp() + self.Screen.Draw() + self.Screen.SwapAndShow() + } + + if ev.Data["Key"] == UI.CurKeys["Down"] { + self.ScrollDown() + self.Screen.Draw() + self.Screen.SwapAndShow() + } + + if ev.Data["Key"] == UI.CurKeys["Enter"] { + self.Click() + } + + if ev.Data["Key"] == UI.CurKeys["X"] { //Scan current + self.ReScan() + self.Screen.Draw() + self.Screen.SwapAndShow() + } + + if ev.Data["Key"] == UI.CurKeys["Y"] {// del + if len(self.MyList) == 0 { + return + } + + cur_li := self.MyList[self.PsIndex] + if cur_li.IsFile() { + uid := UI.GetUid(cur_li.Path) + os.Chown(cur_li.Path,uid ,uid) + self.Screen.MsgBox.SetText("Deleting") + self.Screen.MsgBox.Draw() + self.Screen.SwapAndShow() + time.BlockDelay(600) + self.ReScan() + self.Screen.Draw() + self.Screen.SwapAndShow() + } + } +} + +func (self *FavListPage) Draw() { + self.ClearCanvas() + + if len(self.MyList) == 0 { + self.Icons["bg"].NewCoord(self.Width/2,self.Height/2) + self.Icons["bg"].Draw() + }else{ + + if len(self.MyList) * HierListItemDefaultHeight > self.Height { + self.Ps.Width = self.Width - 10 + self.Ps.Draw() + + + for i,v := range self.MyList { + if v.PosY > self.Height + self.Height/2 { + break + } + + if v.PosY < 0 { + continue + } + + v.Draw() + } + + self.Scroller.UpdateSize( len(self.MyList)*HierListItemDefaultHeight, self.PsIndex*HierListItemDefaultHeight) + self.Scroller.Draw() + + + + }else { + self.Ps.Width = self.Width + self.Ps.Draw() + for _,v := range self.MyList { + v.Draw() + } + } + } +} +