12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010 |
- package Warehouse
- import (
- "context"
- "fmt"
- "log"
- gotime "time"
- "strconv"
- "strings"
- "os"
- "io/ioutil"
- "path/filepath"
- "encoding/json"
- "reflect"
- "database/sql"
- _ "github.com/mattn/go-sqlite3"
-
- "github.com/zyxar/argo/rpc"
- //"github.com/veandco/go-sdl2/sdl"
- "github.com/veandco/go-sdl2/ttf"
- "github.com/cuu/gogame/surface"
- "github.com/cuu/gogame/time"
- "github.com/cuu/gogame/event"
- "github.com/cuu/gogame/rect"
-
- "github.com/cuu/grab"
- "github.com/clockworkpi/LauncherGoDev/sysgo"
- "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
- )
- type WareHouse struct {
- UI.Page
- ListFontObj15 *ttf.Font
- ListFontObj12 *ttf.Font
- Icons map[string]UI.IconItemInterface
-
- BGwidth int
- BGheight int
- DrawOnce bool
- Scroller *UI.ListScroller
- RemovePage *UI.YesCancelConfirmPage
- Keyboard *UI.Keyboard
- PreviewPage *ImageDownloadProcessPage
- LoadHousePage *LoadHousePage
- WareHouseDB string
- MyStack *WareHouseStack
-
- rpcc rpc.Client
- rpcSecret string
- rpcURI string
- Aria2DownloadingGid string // the Downloading Gid of aria2c
-
- Downloading chan bool
- Downloader *grab.Client
- resp *grab.Response
- req *grab.Request
- ScrolledCnt int
-
- }
- func NewWareHouse() *WareHouse {
- p := &WareHouse{}
- p.ListFontObj12 = UI.MyLangManager.TrFont("notosanscjk12")
- p.ListFontObj15 = UI.MyLangManager.TrFont("varela15")
- p.Icons = make(map[string]UI.IconItemInterface)
-
- p.FootMsg = [5]string{"Nav","Update","Up","Back","Select"}
- p.WareHouseDB = sysgo.SQLDB
- p.BGwidth = 320
- p.BGheight = 240-24-20
-
- p.MyStack = NewWareHouseStack()
- repo := make(map[string]string)
- repo["title"] = "github.com/clockworkpi/warehouse"
- repo["file"] = "https://raw.githubusercontent.com/clockworkpi/warehouse/master/index.json"
- repo["type"] = "source"
- p.MyStack.Push(repo)
- p.rpcURI = sysgo.Aria2Url
-
- return p
- }
- func (self *WareHouse) GetAria2DownloadingPercent(url string) int {
-
- if resp,err := self.rpcc.TellActive();err == nil {
- for _,v := range resp {
- if uris,err := self.rpcc.GetURIs(v.Gid); err == nil {
- for _,x := range uris {
- if x.URI == url {
- comp_len,_ := strconv.ParseInt(v.CompletedLength,10,64)
- totl_len,_ := strconv.ParseInt(v.TotalLength,10,64)
- pct := float64(comp_len)/float64(totl_len)
- pct = pct * 100.0
- return int(pct)
- }
- }
- }
- }
- }
- return -1;///None
- }
- func (self *WareHouse) UpdateProcessInterval(ms int) {
- dirty := false
- RefreshTicker := gotime.NewTicker(gotime.Duration(ms)*gotime.Millisecond)
- defer RefreshTicker.Stop()
- L:
- for {
- select {
- case <- RefreshTicker.C:
- for _,i := range self.MyList {
- x := i.(*WareHouseListItem)
- if x.Type == "launcher" || x.Type == "pico8" || x.Type == "tic80" {
- percent := self.GetAria2DownloadingPercent(x.Value["file"])
- if percent < 0 {
- x.SetSmallText("")
- }else {
- x.SetSmallText(fmt.Sprintf("%d%%",percent))
- dirty = true
- }
- }
- }
- if self.Screen.CurPage() == self && dirty == true {
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- dirty = false
- case v:= <- self.Downloading:
- if v== false {
- break L
- }
- }
- }
- }
- func (self *WareHouse) SyncWareHouse() []map[string]string {
- db, err := sql.Open("sqlite3", self.WareHouseDB)
- if err != nil {
- log.Fatal(err)
- return nil
- }
- defer db.Close()
-
- //id,title,file,type
- rows, err := db.Query("select * from warehouse")
- if err != nil {
- log.Fatal(err)
- }
- defer rows.Close()
- var ret []map[string]string
-
- for rows.Next() {
- var id int
- var title string
- var file string
- var type_ string
-
- err = rows.Scan(&id, &title,&file,&type_)
- if err != nil {
- log.Fatal(err)
- }
- w_dbt := make(map[string]string)
- w_dbt["title"] = title
- w_dbt["file"] = file
- w_dbt["type"] = type_
- ret = append(ret,w_dbt)
- }
- return ret
- }
- func (self *WareHouse) SyncTasks() []map[string]string {
- db, err := sql.Open("sqlite3", self.WareHouseDB)
- if err != nil {
- log.Fatal(err)
- return nil
- }
- defer db.Close()
-
- //id,gid,title,file,type,status,totalLength,completedLength,fav
- rows, err := db.Query("select * from tasks")
- if err != nil {
- log.Fatal(err)
- }
- defer rows.Close()
- var ret []map[string]string
-
- for rows.Next() {
- var id int
- var gid string
- var title string
- var file string
- var type_ string
- var status string
- var totalLength string
- var completedLength string
- var fav string
-
- err = rows.Scan(&id,&gid, &title,&file,&type_,&status,&totalLength,&completedLength,&fav)
- if err != nil {
- log.Fatal(err)
- }
- w_dbt := make(map[string]string)
- w_dbt["gid"] = gid
- w_dbt["title"] = title
- w_dbt["file"] = file
- w_dbt["type"] = type_
- w_dbt["status"] = status
- w_dbt["totalLength"] = totalLength
- w_dbt["completedLength"] = completedLength
-
- ret = append(ret,w_dbt)
- }
- return ret
- }
- func IsSlice(v interface{}) bool {
- if reflect.TypeOf(v).Kind() == reflect.Slice || reflect.TypeOf(v).Kind() == reflect.Array {
- return true
- }
- return false
- }
- func (self *WareHouse) SyncList() {
- self.MyList = self.MyList[:0]
- start_x := 0
- start_y := 0
- last_height := 0
- var repos []map[string]string
-
- fmt.Printf("SyncList: %+v\n", self.MyStack)
-
- stk := self.MyStack.Last()
- stk_len := self.MyStack.Length()
- if IsSlice(stk) {
- repos = append(repos, stk.([]map[string]string)...)
- }else {
- repos = append(repos, stk.(map[string]string))
- }
-
- add_new_house := make(map[string]string)
- add_new_house["title"] = "Add new warehouse..."
- add_new_house["file"] = "master/index.json"
- add_new_house["type"] = "add_house"
- add_new_house["status"] = "complete"
-
- if stk_len == 1 {//on top
- ware_menu := self.SyncWareHouse()
- if len(ware_menu) > 0 {
- repos = append(repos,ware_menu...)
- }
- tasks_menu := self.SyncTasks()
- if len(tasks_menu) > 0 {
- repos = append(repos,tasks_menu...)
- }
- repos = append(repos,add_new_house)
- }
- for _, u := range repos {
- fmt.Printf("%+v\n",u)
- li := NewWareHouseListItem()
- li.Parent = self
- li.PosX = start_x
- li.PosY = start_y + last_height
- li.Width = UI.Width
- li.Fonts["normal"] = self.ListFontObj15
- li.Fonts["small"] = self.ListFontObj12
- li.ReadOnly = true
- li.Type = u["type"]
- li.Value = u
- li.Init(u["title"])
- if stk_len > 1 {
- remote_file_url := u["file"]
- menu_file := strings.Split(remote_file_url,"raw.githubusercontent.com")[1]
- home_path, err := os.UserHomeDir()
- if err != nil {
- log.Fatal( err )
- }
- local_menu_file := fmt.Sprintf(aria2dl_folder,home_path,menu_file)
- fmt.Println("for loop ",local_menu_file)
- if UI.FileExists(local_menu_file) {
- li.ReadOnly = false
- }else {
- li.ReadOnly = true
- }
- } else if stk_len == 1 {
- if _,ok := u["status"];ok {
- if u["status"] == "complete" {
- li.ReadOnly = false
- }
- }
- if u["type"] == "source" {
- li.ReadOnly = false
- }
- }
- last_height += li.Height
- if li.Type == "launcher" || li.Type == "pico8" || li.Type == "tic80" {
- li.SetSmallText("")
- }
- self.MyList = append(self.MyList,li)
- }
- self.RefreshPsIndex()
- }
- func (self *WareHouse) 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.BGheight)
- }
- self.PosX = self.Index * self.Screen.Width
- self.Width = self.Screen.Width //equal to screen width
- self.Height = self.Screen.Height
- done := UI.NewIconItem()
- done.ImgSurf = UI.MyIconPool.GetImgSurf("done")
- done.MyType = UI.ICON_TYPES["STAT"]
- done.Parent = self
- self.Icons["done"] = done
- ps := UI.NewInfoPageSelector()
- ps.Parent = self
- self.Ps = ps
- self.PsIndex = 0
- 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.CanvasHWND)
- self.RemovePage = UI.NewYesCancelConfirmPage()
- self.RemovePage.Screen = self.Screen
- self.RemovePage.StartOrAEvent = self.RemoveGame
- self.RemovePage.Name = "Are you sure?"
-
- self.RemovePage.Init()
-
- self.Keyboard = UI.NewKeyboard()
- self.Keyboard.Name = "Enter warehouse addr"
- self.Keyboard.FootMsg = [5]string{"Nav.","Add","ABC","Backspace","Enter"}
- self.Keyboard.Screen = self.Screen
- self.Keyboard.Init()
- self.Keyboard.SetPassword("github.com/clockworkpi/warehouse")
- self.Keyboard.Caller = self
-
- self.PreviewPage = NewImageDownloadProcessPage()
- self.PreviewPage.Screen = self.Screen
- self.PreviewPage.Name ="Preview"
- self.PreviewPage.Init()
- self.LoadHousePage = NewLoadHousePage()
- self.LoadHousePage.Screen = self.Screen
- self.LoadHousePage.Name = "Warehouse"
- self.LoadHousePage.Parent = self
- self.LoadHousePage.Init()
-
- rpcc, err := rpc.New(context.Background(),
- self.rpcURI,
- self.rpcSecret,
- gotime.Second, AppNotifier{Parent:self})
-
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(2)
- }
- self.rpcc = rpcc
- self.Downloader = grab.NewClient()
- self.Downloading = make(chan bool,1)
- }
- }
- func (self *WareHouse) SetDownloading(v bool) {
- for len(self.Downloading) > 0 {
- <- self.Downloading
- }
- self.Downloading <- v
- }
- func (self *WareHouse) ResetHouse() {
- if self.PsIndex > len(self.MyList) -1 {
- return
- }
- cur_li := self.MyList[self.PsIndex].(*WareHouseListItem)
- home_path, _ := os.UserHomeDir()
-
- if cur_li.Value["type"] == "source" {
- remote_file_url := cur_li.Value["file"]
- parts := strings.Split(remote_file_url,"raw.githubusercontent.com")
- menu_file := parts[1]
- local_menu_file := fmt.Sprintf(aria2dl_folder,home_path,menu_file)
- local_menu_file_path := filepath.Dir(local_menu_file)
-
- fmt.Println(local_menu_file)
- local_jsons,err := filepath.Glob(local_menu_file_path+"/**/*.json")
- if err != nil {
- fmt.Println(err)
- }
- if UI.FileExists(local_menu_file) {
- os.Remove(local_menu_file)
- }
- if UI.FileExists(local_menu_file+".aria2") {
- os.Remove(local_menu_file+".aria2")
- }
- for _,x := range local_jsons {
- os.Remove(x)
- }
- self.Screen.MsgBox.SetText("Done")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
-
- }
- }
- func (self *WareHouse) LoadHouse() {
- if self.PsIndex > len(self.MyList) -1 {
- return
- }
- cur_li := self.MyList[self.PsIndex].(*WareHouseListItem)
- if cur_li.Value["type"] == "source" || cur_li.Value["type"] == "dir" {
- self.LoadHousePage.URL = cur_li.Value["file"]
- self.Screen.PushPage(self.LoadHousePage)
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
-
- }
- func (self *WareHouse) PreviewGame() {
- if self.PsIndex > len(self.MyList) -1 {
- return
- }
- cur_li := self.MyList[self.PsIndex].(*WareHouseListItem)
- if cur_li.Value["type"] == "launcher" ||
- cur_li.Value["type"] == "pico8" ||
- cur_li.Value["type"] == "tic80" {
- if _,ok := cur_li.Value["shots"];ok {
- fmt.Println(cur_li.Value["shots"])
- self.PreviewPage.URL = cur_li.Value["shots"]
- self.Screen.PushPage(self.PreviewPage)
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- }
- }
- //check if an Url is downloading in aria2c
- func (self *WareHouse) UrlIsDownloading(url string) (string,bool) {
- if resp,err := self.rpcc.TellActive();err == nil {
- for _,v := range resp {
- if uris,err := self.rpcc.GetURIs(v.Gid);err == nil {
- for _,x := range uris {
- if x.URI == url {
- fmt.Println(x.URI," ",url)
- return v.Gid,true
- }
- }
- }
- }
- }else {
- log.Println(err)
- }
- return "",false
- }
- func (self *WareHouse) RemoveGame() {
- if self.PsIndex > len(self.MyList) -1 {
- return
- }
- fmt.Println("RemoveGame")
- cur_li := self.MyList[self.PsIndex].(*WareHouseListItem)
- fmt.Println("Remove cur_li._Value",cur_li.Value)
- home_path, _ := os.UserHomeDir()
-
- if cur_li.Value["type"] == "source" {
- db, err := sql.Open("sqlite3", self.WareHouseDB)
- if err != nil {
- log.Fatal(err)
- }
- defer db.Close()
- _, err = db.Exec(fmt.Sprintf("DELETE FROM warehouse WHERE file = '%s'",
- cur_li.Value["file"]))
-
- if err != nil {
- log.Println(err)
- }
-
- } else if cur_li.Value["type"] == "launcher" ||
- cur_li.Value["type"] == "pico8" ||
- cur_li.Value["type"] == "tic80" {
- remote_file_url := cur_li.Value["file"]
- parts := strings.Split(remote_file_url,"raw.githubusercontent.com")
- menu_file := parts[1]
- local_menu_file := fmt.Sprintf(aria2dl_folder,home_path,menu_file)
- local_menu_file_path := filepath.Dir(local_menu_file)
- gid,ret := self.UrlIsDownloading(remote_file_url)
- if ret == true {
- self.rpcc.Remove(gid)
- }
- if UI.FileExists(local_menu_file) {
- os.Remove(local_menu_file)
- }
- if UI.FileExists(local_menu_file+".aria2") {
- os.Remove(local_menu_file+".aria2")
- }
- if UI.FileExists(filepath.Join(local_menu_file_path,cur_li.Value["title"])) {
- os.RemoveAll(filepath.Join(local_menu_file_path,cur_li.Value["title"]))
- }
-
- }
- }
- func (self *WareHouse) Click() {
- if self.PsIndex > len(self.MyList) -1 {
- return
- }
- cur_li := self.MyList[self.PsIndex].(*WareHouseListItem)
- home_path, _ := os.UserHomeDir()
- fmt.Println("Click cur_li._Value",cur_li.Value)
- if cur_li.Value["type"] == "source" || cur_li.Value["type"] == "dir" {
- remote_file_url := cur_li.Value["file"]
- parts := strings.Split(remote_file_url,"raw.githubusercontent.com")//assume master branch
- menu_file := parts[1]
- local_menu_file := fmt.Sprintf(aria2dl_folder,home_path,menu_file)
- fmt.Println("warehouse click: ",local_menu_file)
- if UI.FileExists(local_menu_file) == false {
- self.LoadHouse()
- }else {
- //read the local_menu_file,push into stack,display menu
- self.Aria2DownloadingGid = ""
- var result WareHouseIndex
- jsonFile, err := os.Open(local_menu_file)
-
- if err != nil {
- fmt.Println(err)
- self.Screen.MsgBox.SetText("Open House failed")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
-
- }else {
- defer jsonFile.Close()
-
- byteValue, _ := ioutil.ReadAll(jsonFile)
- json.Unmarshal(byteValue, &result)
- self.MyStack.Push(result.List)
-
- self.SyncList()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
-
- }
- } else if cur_li.Value["type"] == "add_house" {
- fmt.Println("show keyboard to add warehouse")
- self.Screen.PushCurPage()
- self.Screen.SetCurPage(self.Keyboard)
-
- } else {
- //download the game probably
- remote_file_url := cur_li.Value["file"]
- parts := strings.Split(remote_file_url,"raw.githubusercontent.com")//assume master branch
- menu_file := parts[1]
- local_menu_file := fmt.Sprintf(aria2dl_folder,home_path,menu_file)
- fmt.Println("Click on game ", local_menu_file)
-
- if UI.FileExists(local_menu_file) == false {
- gid,ret := self.UrlIsDownloading(remote_file_url)
- if ret == false {
-
- outfile := struct {
- Out string `json:"out"`
-
- }{Out:menu_file}
-
- gid,err := self.rpcc.AddURI([]string{remote_file_url},outfile)
-
- if err != nil {
- log.Println(err)
- }else {
- fmt.Println("Warehouse Click game is downloading, ",gid)
- fmt.Println(remote_file_url)
- self.Aria2DownloadingGid = gid
- }
-
- } else {
- fmt.Println(self.rpcc.TellStatus(gid,"status","totalLength","completedLength"))
- self.Screen.MsgBox.SetText("Getting the game now")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
- time.BlockDelay(800)
- self.Screen.TitleBar.Redraw()
- }
- }else {
- fmt.Println("file downloaded ", cur_li.Value) //maybe check it if is installed fst,then execute it
- if cur_li.Value["type"] == "launcher" && cur_li.ReadOnly == false {
- local_menu_file_path := filepath.Dir(local_menu_file)
- game_sh := filepath.Join(local_menu_file_path,cur_li.Value["title"],cur_li.Value["title"]+".sh")
- fmt.Println("run game: ",game_sh, UI.FileExists(game_sh))
- self.Screen.RunEXE(game_sh)
-
- }
- if cur_li.Value["type"] == "pico8" && cur_li.ReadOnly == false {
- if UI.FileExists("/home/cpi/games/PICO-8/pico-8/pico8") {
- game_sh := "/home/cpi/launcher/Menu/GameShell/50_PICO-8/PICO-8.sh"
- self.Screen.RunEXE(game_sh) //pico8 manages its games self
- }
- }
- if cur_li.Value["type"] == "tic80" && cur_li.ReadOnly == false {
- game_sh := "/home/cpi/apps/Menu/51_TIC-80/TIC-80.sh"
- self.Screen.RunEXE(game_sh)
- }
- }
- }
- }
- func (self *WareHouse) OnAria2CompleteCb(gid string) {
- fmt.Println("OnAria2CompleteCb", gid)
- self.SyncList()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
-
- if gid == self.Aria2DownloadingGid {
- self.Aria2DownloadingGid = ""
- }
- }
- func (self *WareHouse) raw_github_com(url string) (bool,string) {
- if strings.HasPrefix(url,"github.com") == false {
- return false,""
- }
- parts := strings.Split(url,"/")
- if len(parts) != 3 {
- return false, ""
- }
- str := []string{"https://raw.githubusercontent.com",
- parts[1],
- parts[2],
- "master/index.json"}
-
- return true,strings.Join(str,"/")
-
- }
-
- func (self *WareHouse) OnKbdReturnBackCb() {
-
- inputed:= strings.Join(self.Keyboard.Textarea.MyWords,"")
- inputed = strings.Replace(inputed,"http://","",-1)
- inputed = strings.Replace(inputed,"https://","",-1)
- if strings.HasSuffix(inputed,".git") {
- inputed = inputed[:len(inputed)-4]
- }
- if strings.HasSuffix(inputed,"/") {
- inputed = inputed[:len(inputed)-1]
- }
- fmt.Println("last: ",inputed)
- db, err := sql.Open("sqlite3", self.WareHouseDB)
- if err != nil {
- log.Fatal(err)
- return
- }
- defer db.Close()
-
- stmt, err := db.Prepare("SELECT count(*) FROM warehouse WHERE title= ?")
- defer stmt.Close()
-
- if err != nil {
- log.Fatal(err)
- }
-
- var cnt_str string
- cnt := 0
- err = stmt.QueryRow(inputed).Scan(&cnt_str)
- if err != nil {
- log.Println(err)
- cnt_str = "0"
- }else {
- cnt,_= strconv.Atoi(cnt_str)
- }
-
- if cnt > 0 {
- self.Screen.MsgBox.SetText("Warehouse existed")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
- } else {
- if strings.Contains(inputed,"github.com/clockworkpi/warehouse") {
- self.Screen.MsgBox.SetText("Warehouse existed")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
- }else {
- valid_,_url := self.raw_github_com(inputed)
-
- if valid_ == false {
- self.Screen.MsgBox.SetText("Warehouse url error!")
- self.Screen.MsgBox.Draw()
- self.Screen.SwapAndShow()
- } else {
- sql_insert := fmt.Sprintf("INSERT INTO warehouse(title,file,type) VALUES('%s','%s','source');",
- inputed,_url)
- _, err = db.Exec(sql_insert)
- if err != nil {
- log.Println(err)
- }
- self.SyncList()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- }
- }
- }
- func (self *WareHouse) OnExitCb() {
-
- self.SetDownloading(false)
- self.rpcc.Close()
-
- }
- func (self *WareHouse) OnLoadCb() {
- if self.MyStack.Length() == 1 {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Update"
- }else {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Preview"
- }
- self.SetDownloading(true)
- go self.UpdateProcessInterval(500)
-
- self.SyncList()
- }
- func (self *WareHouse) OnReturnBackCb() {
- if self.MyStack.Length() == 1 {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Update"
- }else {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Preview"
- }
-
- self.SyncList()
- self.RestoreScrolled()
-
- self.Screen.Draw()
- self.Screen.SwapAndShow()
-
- }
- func (self *WareHouse) 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]
- x, y := cur_li.Coord()
- _, h := cur_li.Size()
-
- if y+h > self.Height {
- for i, _ := range self.MyList {
- x, y = self.MyList[i].Coord()
- _, h = self.MyList[i].Size()
- self.MyList[i].NewCoord(x, y-h)
- }
-
- self.ScrolledCnt -= h
- }
- }
- func (self *WareHouse) ScrollUp() {
- if len(self.MyList) == 0 {
- return
- }
- self.PsIndex -= 1
- if self.PsIndex < 0 {
- self.PsIndex = 0
- }
- cur_li := self.MyList[self.PsIndex]
- x, y := cur_li.Coord()
- _, h := cur_li.Size()
- if y < 0 {
- for i, _ := range self.MyList {
- x, y = self.MyList[i].Coord()
- _, h = self.MyList[i].Size()
- self.MyList[i].NewCoord(x, y+h)
- }
- self.ScrolledCnt += h
- }
- }
- func (self *WareHouse) RestoreScrolled() {
- for i,_ := range self.MyList {
- x,y := self.MyList[i].Coord()
- self.MyList[i].NewCoord(x, y+ self.ScrolledCnt)
- }
- }
- func (self *WareHouse) KeyDown(ev *event.Event) {
- if UI.IsKeyMenuOrB(ev.Data["Key"]) {
- if self.MyStack.Length() > 1 {
- self.MyStack.Pop()
- if self.MyStack.Length() == 1 {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Update"
-
- }else {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Preview"
- if self.MyStack.Length() == 2 {
- self.FootMsg[2] = ""
- self.FootMsg[1] = ""
- }
- }
- self.SyncList()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }else if self.MyStack.Length() == 1 {
- self.ReturnToUpLevelPage()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- self.SetDownloading(false)//shutdown UpdateProcessInterval
- }
- }
-
- if UI.IsKeyStartOrA(ev.Data["Key"]) {
- self.Click()
- if self.MyStack.Length() == 1 {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Update"
- }else {
- self.FootMsg[2] = "Remove"
- self.FootMsg[1] = "Preview"
- if self.MyStack.Length() == 2 {
- self.FootMsg[2] = ""
- self.FootMsg[1] = ""
- }
- }
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- if ev.Data["Key"] == UI.CurKeys["X"] {
- if self.PsIndex <= len(self.MyList) -1 {
- cur_li := self.MyList[self.PsIndex].(*WareHouseListItem)
- if cur_li.Type != "dir" {
- if self.MyStack.Length() ==1 && self.PsIndex == 0 {
- //pass
- }else {
- self.Screen.PushPage(self.RemovePage)
- self.RemovePage.StartOrAEvent = self.RemoveGame
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- }
- return
- }
- self.SyncList()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- if ev.Data["Key"] == UI.CurKeys["Y"] {
- if self.MyStack.Length() == 1 {
- self.ResetHouse()
- }else {
- self.PreviewGame()
- }
- }
- 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()
- }
-
- }
- func (self *WareHouse) Draw() {
- self.ClearCanvas()
- if self.PsIndex > len(self.MyList) -1 {
- self.PsIndex = len(self.MyList) -1
- }
- if self.PsIndex < 0 {
- self.PsIndex = 0
- }
- if len(self.MyList) == 0 {
- return
- } else {
- if len(self.MyList) * UI.DefaultInfoPageListItemHeight > self.Height {
- _,h := self.Ps.Size()
- self.Ps.NewSize(self.Width - 11,h)
- self.Ps.Draw()
- for _,v := range self.MyList {
- _,y := v.Coord()
- if y > (self.Height + self.Height/2) {
- break
- }
- if y < 0 {
- continue
- }
- v.Draw()
- }
- self.Scroller.UpdateSize(len(self.MyList)*UI.DefaultInfoPageListItemHeight,self.PsIndex*UI.DefaultInfoPageListItemHeight)
- self.Scroller.Draw()
- }else {
- _,h := self.Ps.Size()
- self.Ps.NewSize(self.Width,h)
- self.Ps.Draw()
- for _,v := range self.MyList {
- _,y := v.Coord()
- if y > self.Height + self.Height/2 {
- break
- }
- if y < 0 {
- continue
- }
- v.Draw()
- }
- }
- }
-
- if self.HWND != nil {
- surface.Fill(self.HWND, UI.MySkinManager.GiveColor("White"))
- rect_ := rect.Rect(self.PosX, self.PosY, self.Width, self.Height)
- surface.Blit(self.HWND, self.CanvasHWND, &rect_, nil)
- }
-
-
- }
|