languages_page.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. package Languages
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "path/filepath"
  6. "strings"
  7. "github.com/veandco/go-sdl2/ttf"
  8. "github.com/cuu/gogame/color"
  9. "github.com/cuu/gogame/draw"
  10. "github.com/cuu/gogame/event"
  11. "github.com/cuu/gogame/rect"
  12. "github.com/cuu/gogame/surface"
  13. "github.com/cuu/gogame/time"
  14. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  15. )
  16. type ListPageSelector struct {
  17. UI.InfoPageSelector
  18. }
  19. func NewListPageSelector() *ListPageSelector {
  20. p := &ListPageSelector{}
  21. p.Width = UI.Width
  22. p.BackgroundColor = &color.Color{131, 199, 219, 255} //SkinManager().GiveColor('Front')
  23. return p
  24. }
  25. func (self *ListPageSelector) Draw() {
  26. idx := self.Parent.GetPsIndex()
  27. mylist := self.Parent.GetMyList()
  28. if idx < len(mylist) {
  29. x, y := mylist[idx].Coord()
  30. _, h := mylist[idx].Size()
  31. self.PosX = x + 2
  32. self.PosY = y + 1
  33. self.Height = h - 3
  34. canvas_ := self.Parent.GetCanvasHWND()
  35. rect_ := rect.Rect(self.PosX, self.PosY, self.Width-4, self.Height)
  36. draw.AARoundRect(canvas_, &rect_, self.BackgroundColor, 4, 0, self.BackgroundColor)
  37. }
  38. }
  39. type PageListItem struct {
  40. UI.InfoPageListItem
  41. Active bool
  42. Value string
  43. }
  44. func NewPageListItem() *PageListItem {
  45. p := &PageListItem{}
  46. p.Height = UI.DefaultInfoPageListItemHeight
  47. p.ReadOnly = false
  48. p.Labels = make(map[string]UI.LabelInterface)
  49. p.Icons = make(map[string]UI.IconItemInterface)
  50. p.Fonts = make(map[string]*ttf.Font)
  51. return p
  52. }
  53. func (self *PageListItem) Draw() {
  54. x, _ := self.Labels["Text"].Coord()
  55. w, h := self.Labels["Text"].Size()
  56. self.Labels["Text"].NewCoord(x, self.PosY+(self.Height-h)/2)
  57. if self.Active == true {
  58. self.Parent.(*LanguagesPage).Icons["done"].NewCoord(self.Parent.(*LanguagesPage).Width-30, self.PosY+5)
  59. self.Parent.(*LanguagesPage).Icons["done"].Draw()
  60. }
  61. self.Labels["Text"].SetBold(self.Active)
  62. self.Labels["Text"].Draw()
  63. if _, ok := self.Labels["Small"]; ok {
  64. x, _ = self.Labels["Small"].Coord()
  65. w, h = self.Labels["Small"].Size()
  66. self.Labels["Small"].NewCoord(self.Width-w-10, self.PosY+(self.Height-h)/2)
  67. self.Labels["Small"].Draw()
  68. }
  69. canvas_ := self.Parent.GetCanvasHWND()
  70. draw.Line(canvas_, &color.Color{169, 169, 169, 255},
  71. self.PosX, self.PosY+self.Height-1,
  72. self.PosX+self.Width, self.PosY+self.Height-1, 1)
  73. }
  74. type LanguagesPage struct {
  75. UI.Page
  76. ListFont *ttf.Font
  77. BGwidth int
  78. BGheight int
  79. DrawOnce bool
  80. Scroller *UI.ListScroller
  81. Icons map[string]UI.IconItemInterface
  82. }
  83. func NewLanguagesPage() *LanguagesPage {
  84. p := &LanguagesPage{}
  85. p.ListFont = UI.Fonts["notosanscjk15"]
  86. p.FootMsg = [5]string{"Nav", "", "", "Back", "Select"}
  87. p.BGwidth = UI.Width
  88. p.BGheight = UI.Height - 24 - 20
  89. p.Icons = make(map[string]UI.IconItemInterface)
  90. return p
  91. }
  92. func (self *LanguagesPage) GenList() {
  93. self.MyList = nil
  94. start_x := 0
  95. start_y := 0
  96. last_height := 0
  97. file_paths, err := filepath.Glob("sysgo/langs/*.ini") //sorted
  98. if err == nil {
  99. for _, u := range file_paths {
  100. parts := strings.Split(filepath.Base(u), "_")
  101. if len(parts) > 1 {
  102. li := NewPageListItem()
  103. li.Parent = self
  104. li.PosX = start_x
  105. li.PosY = start_y + last_height
  106. li.Width = UI.Width
  107. li.Fonts["normal"] = self.ListFont
  108. li.Active = false
  109. li.Value = filepath.Base(u)
  110. lang_name := parts[1]
  111. parts = strings.Split(lang_name, ".")
  112. lang_name = parts[0]
  113. li.Init(lang_name)
  114. last_height += li.Height
  115. self.MyList = append(self.MyList, li)
  116. }
  117. }
  118. }
  119. }
  120. func (self *LanguagesPage) Init() {
  121. if self.Screen != nil {
  122. if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
  123. self.HWND = self.Screen.CanvasHWND
  124. self.CanvasHWND = surface.Surface(self.Screen.Width, self.Screen.Height)
  125. }
  126. }
  127. self.PosX = self.Index * self.Screen.Width
  128. self.Width = self.Screen.Width
  129. self.Height = self.Screen.Height
  130. done := UI.NewIconItem()
  131. done.ImgSurf = UI.MyIconPool.GetImgSurf("done")
  132. done.MyType = UI.ICON_TYPES["STAT"]
  133. done.Parent = self
  134. self.Icons["done"] = done
  135. ps := NewListPageSelector()
  136. ps.Parent = self
  137. self.Ps = ps
  138. self.PsIndex = 0
  139. self.GenList()
  140. self.Scroller = UI.NewListScroller()
  141. self.Scroller.Parent = self
  142. self.Scroller.PosX = self.Width - 10
  143. self.Scroller.PosY = 2
  144. self.Scroller.Init()
  145. self.Scroller.SetCanvasHWND(self.HWND)
  146. }
  147. func (self *LanguagesPage) Click() {
  148. if len(self.MyList) == 0 {
  149. return
  150. }
  151. if self.PsIndex >= len(self.MyList) {
  152. self.PsIndex = len(self.MyList) - 1
  153. }
  154. cur_li := self.MyList[self.PsIndex]
  155. if cur_li.(*PageListItem).Active == true {
  156. return
  157. }
  158. for i, _ := range self.MyList {
  159. self.MyList[i].(*PageListItem).Active = false
  160. }
  161. cur_li.(*PageListItem).Active = true
  162. d := []byte(fmt.Sprintf("%s", cur_li.(*PageListItem).Value))
  163. err := ioutil.WriteFile("sysgo/.lang", d, 0644)
  164. if err != nil {
  165. fmt.Println(err)
  166. }
  167. self.Screen.MsgBox.SetText("Applying")
  168. self.Screen.MsgBox.Draw()
  169. self.Screen.SwapAndShow()
  170. UI.MyLangManager.UpdateLang()
  171. event.Post(UI.RESTARTUI, "")
  172. time.BlockDelay(1000)
  173. self.Screen.Refresh()
  174. }
  175. func (self *LanguagesPage) OnLoadCb() {
  176. self.PosY = 0
  177. self.DrawOnce = false
  178. fname := "sysgo/.lang"
  179. thelang := ""
  180. if UI.FileExists(fname) {
  181. config_bytes, err := ioutil.ReadFile(fname)
  182. if err == nil {
  183. thelang = strings.Trim(string(config_bytes), "\r\n ")
  184. if len(thelang) < 3 {
  185. thelang = "English"
  186. }
  187. }
  188. for i, v := range self.MyList {
  189. if strings.Contains(v.(*PageListItem).Value, thelang) {
  190. self.MyList[i].(*PageListItem).Active = true
  191. break
  192. }
  193. }
  194. }
  195. }
  196. func (self *LanguagesPage) KeyDown(ev *event.Event) {
  197. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  198. self.ReturnToUpLevelPage()
  199. self.Screen.Refresh()
  200. }
  201. if ev.Data["Key"] == UI.CurKeys["B"] {
  202. self.Click()
  203. }
  204. if ev.Data["Key"] == UI.CurKeys["Up"] {
  205. self.ScrollUp()
  206. self.Screen.Refresh()
  207. }
  208. if ev.Data["Key"] == UI.CurKeys["Down"] {
  209. self.ScrollDown()
  210. self.Screen.Refresh()
  211. }
  212. }
  213. func (self *LanguagesPage) Draw() {
  214. self.ClearCanvas()
  215. if len(self.MyList) == 0 {
  216. return
  217. }
  218. if len(self.MyList)*UI.DefaultInfoPageListItemHeight > self.Height {
  219. self.Ps.(*ListPageSelector).Width = self.Width - 11
  220. self.Ps.Draw()
  221. for _, v := range self.MyList {
  222. if v.(*PageListItem).PosY > self.Height+self.Height/2 {
  223. break
  224. }
  225. if v.(*PageListItem).PosY < 0 {
  226. continue
  227. }
  228. v.Draw()
  229. }
  230. self.Scroller.UpdateSize(len(self.MyList)*UI.DefaultInfoPageListItemHeight,
  231. self.PsIndex*UI.DefaultInfoPageListItemHeight)
  232. self.Scroller.Draw()
  233. } else {
  234. self.Ps.(*ListPageSelector).Width = self.Width
  235. self.Ps.Draw()
  236. for _, v := range self.MyList {
  237. if v.(*PageListItem).PosY > self.Height+self.Height/2 {
  238. break
  239. }
  240. if v.(*PageListItem).PosY < 0 {
  241. continue
  242. }
  243. v.Draw()
  244. }
  245. }
  246. if self.HWND != nil {
  247. surface.Fill(self.HWND, &color.Color{255, 255, 255, 255})
  248. rect_ := rect.Rect(self.PosX, self.PosY, self.Width, self.Height)
  249. surface.Blit(self.HWND, self.CanvasHWND, &rect_, nil)
  250. }
  251. }