time_zone_page.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. package TimeZone
  2. import (
  3. "fmt"
  4. "os/exec"
  5. "path/filepath"
  6. "github.com/veandco/go-sdl2/ttf"
  7. "github.com/cuu/gogame/color"
  8. "github.com/cuu/gogame/draw"
  9. "github.com/cuu/gogame/event"
  10. "github.com/cuu/gogame/rect"
  11. "github.com/cuu/gogame/time"
  12. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  13. )
  14. var TimeZonePath = "/usr/share/zoneinfo/posix"
  15. type ListPageSelector struct {
  16. UI.InfoPageSelector
  17. }
  18. func NewListPageSelector() *ListPageSelector {
  19. p := &ListPageSelector{}
  20. p.Width = UI.Width
  21. p.BackgroundColor = &color.Color{131, 199, 219, 255} //SkinManager().GiveColor('Front')
  22. return p
  23. }
  24. func (self *ListPageSelector) Draw() {
  25. idx := self.Parent.GetPsIndex()
  26. mylist := self.Parent.GetMyList()
  27. if idx < len(mylist) {
  28. x, y := mylist[idx].Coord()
  29. _, h := mylist[idx].Size()
  30. self.PosX = x + 2
  31. self.PosY = y + 1
  32. self.Height = h - 3
  33. canvas_ := self.Parent.GetCanvasHWND()
  34. rect_ := rect.Rect(self.PosX, self.PosY, self.Width-4, self.Height)
  35. draw.AARoundRect(canvas_, &rect_, self.BackgroundColor, 4, 0, self.BackgroundColor)
  36. }
  37. }
  38. type TimeZoneListPage struct {
  39. UI.Page
  40. Scroller *UI.ListScroller
  41. Icons map[string]UI.IconItemInterface
  42. ListFont *ttf.Font
  43. MyStack *UI.FolderStack
  44. BGpng *UI.IconItem
  45. BGwidth int
  46. BGheight int
  47. SwapMyList []UI.ListItemInterface
  48. }
  49. type ListEle struct {
  50. Name string
  51. FilePath string
  52. IsFile bool
  53. }
  54. func NewTimeZoneListPage() *TimeZoneListPage {
  55. p := &TimeZoneListPage{}
  56. p.BGwidth = 56
  57. p.BGheight = 70
  58. p.FootMsg = [5]string{"Nav", "", "", "Back", "Select"}
  59. p.ListFont = UI.Fonts["notosanscjk15"]
  60. p.MyStack = UI.NewFolderStack()
  61. p.MyStack.SetRootPath(TimeZonePath)
  62. p.Icons = make(map[string]UI.IconItemInterface)
  63. return p
  64. }
  65. func (self *TimeZoneListPage) GetMapIcons() map[string]UI.IconItemInterface {
  66. return self.Icons
  67. }
  68. func (self *TimeZoneListPage) buildDirectoryList(path string) []*ListEle {
  69. //[*ListEle{},*ListEle{}]
  70. var ret []*ListEle
  71. file_paths, err := filepath.Glob(path + "/*") //sorted
  72. if err == nil {
  73. for _, u := range file_paths {
  74. e := &ListEle{}
  75. e.Name = filepath.Base(u)
  76. e.FilePath = u
  77. if UI.IsAFile(u) {
  78. e.IsFile = true
  79. } else {
  80. e.IsFile = false
  81. }
  82. ret = append(ret, e)
  83. }
  84. }
  85. return ret
  86. }
  87. func (self *TimeZoneListPage) SyncList(path string) {
  88. alist := self.buildDirectoryList(path)
  89. if len(alist) == 0 {
  90. fmt.Println("buildDirectoryList empty")
  91. return
  92. }
  93. self.MyList = nil
  94. self.SwapMyList = nil
  95. start_x := 0
  96. start_y := 0
  97. hasparent := 0
  98. if self.MyStack.Length() > 0 {
  99. hasparent = 1
  100. li := NewTimeZoneListPageListItem()
  101. li.Parent = self
  102. li.PosX = start_x
  103. li.PosY = start_y
  104. li.Width = UI.Width
  105. li.Fonts["normal"] = self.ListFont
  106. li.MyType = UI.ICON_TYPES["DIR"]
  107. li.Init("[..]")
  108. self.MyList = append(self.MyList, li)
  109. }
  110. for i, v := range alist {
  111. li := NewTimeZoneListPageListItem()
  112. li.Parent = self
  113. li.PosX = start_x
  114. li.PosY = start_y + (i+hasparent)*TimeZoneListPageListItemDefaultHeight
  115. li.Width = UI.Width
  116. li.Fonts["normal"] = self.ListFont
  117. li.MyType = UI.ICON_TYPES["FILE"]
  118. if v.IsFile == false {
  119. li.MyType = UI.ICON_TYPES["DIR"]
  120. } else {
  121. li.MyType = UI.ICON_TYPES["FILE"]
  122. }
  123. li.Init(v.Name)
  124. li.Path = v.FilePath
  125. self.MyList = append(self.MyList, li)
  126. }
  127. for _, v := range self.MyList {
  128. self.SwapMyList = append(self.SwapMyList, v)
  129. }
  130. }
  131. func (self *TimeZoneListPage) Init() {
  132. self.PosX = self.Index * self.Screen.Width
  133. self.Width = self.Screen.Width
  134. self.Height = self.Screen.Height
  135. self.CanvasHWND = self.Screen.CanvasHWND
  136. ps := NewListPageSelector()
  137. ps.Parent = self
  138. self.Ps = ps
  139. self.PsIndex = 0
  140. self.SyncList(TimeZonePath)
  141. icon_for_list := UI.NewMultiIconItem()
  142. icon_for_list.ImgSurf = UI.MyIconPool.GetImgSurf("sys")
  143. icon_for_list.MyType = UI.ICON_TYPES["STAT"]
  144. icon_for_list.Parent = self
  145. icon_for_list.Adjust(0, 0, 18, 18, 0)
  146. self.Icons["sys"] = icon_for_list
  147. bgpng := UI.NewIconItem()
  148. bgpng.ImgSurf = UI.MyIconPool.GetImgSurf("empty")
  149. bgpng.MyType = UI.ICON_TYPES["STAT"]
  150. bgpng.Parent = self
  151. bgpng.AddLabel("No timezones found on system!", UI.MyLangManager.TrFont("varela22"))
  152. bgpng.SetLabelColor(UI.MySkinManager.GiveColor("Disabled"))
  153. bgpng.Adjust(0, 0, self.BGwidth, self.BGheight, 0)
  154. self.BGpng = bgpng
  155. self.Scroller = UI.NewListScroller()
  156. self.Scroller.Parent = self
  157. self.Scroller.PosX = self.Width - 10
  158. self.Scroller.PosY = 2
  159. self.Scroller.Init()
  160. }
  161. func (self *TimeZoneListPage) Click() {
  162. if len(self.MyList) == 0 {
  163. return
  164. }
  165. cur_li := self.MyList[self.PsIndex].(*TimeZoneListPageListItem)
  166. if cur_li.MyType == UI.ICON_TYPES["DIR"] {
  167. if cur_li.Path == "[..]" {
  168. self.MyStack.Pop()
  169. self.SyncList(self.MyStack.Last())
  170. self.PsIndex = 0
  171. } else {
  172. self.MyStack.Push(self.MyList[self.PsIndex].(*TimeZoneListPageListItem).Path)
  173. self.SyncList(self.MyStack.Last())
  174. self.PsIndex = 0
  175. }
  176. }
  177. if cur_li.MyType == UI.ICON_TYPES["FILE"] { //set the current timezone
  178. self.Screen.MsgBox.SetText("Applying")
  179. self.Screen.MsgBox.Draw()
  180. self.Screen.SwapAndShow()
  181. time.BlockDelay(300)
  182. cpCmd := exec.Command("sudo", "cp", cur_li.Path, "/etc/localtime")
  183. err := cpCmd.Run()
  184. if err != nil {
  185. fmt.Println(err)
  186. } else {
  187. self.Screen.TitleBar.UpdateTimeLocation()
  188. }
  189. fmt.Println("add ", cur_li.Path)
  190. }
  191. self.Screen.Refresh()
  192. }
  193. func (self *TimeZoneListPage) Rescan() {
  194. self.SyncList(TimeZonePath)
  195. self.PsIndex = 0
  196. }
  197. func (self *TimeZoneListPage) KeyDown(ev *event.Event) {
  198. if ev.Data["Key"] == UI.CurKeys["Menu"] || ev.Data["Key"] == UI.CurKeys["A"] {
  199. self.ReturnToUpLevelPage()
  200. self.Screen.Refresh()
  201. }
  202. if ev.Data["Key"] == UI.CurKeys["Up"] {
  203. self.ScrollUp()
  204. self.Screen.Refresh()
  205. }
  206. if ev.Data["Key"] == UI.CurKeys["Down"] {
  207. self.ScrollDown()
  208. self.Screen.Refresh()
  209. }
  210. if ev.Data["Key"] == UI.CurKeys["Right"] {
  211. self.FastScrollDown(5)
  212. self.Screen.Refresh()
  213. }
  214. if ev.Data["Key"] == UI.CurKeys["Left"] {
  215. self.FastScrollUp(5)
  216. self.Screen.Refresh()
  217. }
  218. if ev.Data["Key"] == UI.CurKeys["Enter"] {
  219. self.Click()
  220. }
  221. }
  222. func (self *TimeZoneListPage) Draw() {
  223. self.ClearCanvas()
  224. if len(self.MyList) == 0 {
  225. self.BGpng.NewCoord(self.Width/2, self.Height/2)
  226. self.BGpng.Draw()
  227. }
  228. if len(self.MyList)*TimeZoneListPageListItemDefaultHeight > self.Height {
  229. self.Ps.(*ListPageSelector).Width = self.Width - 11
  230. self.Ps.Draw()
  231. for _, v := range self.MyList {
  232. if v.(*TimeZoneListPageListItem).PosY > self.Height+self.Height/2 {
  233. break
  234. }
  235. if v.(*TimeZoneListPageListItem).PosY < 0 {
  236. continue
  237. }
  238. v.Draw()
  239. }
  240. self.Scroller.UpdateSize(len(self.MyList)*TimeZoneListPageListItemDefaultHeight,
  241. self.PsIndex*TimeZoneListPageListItemDefaultHeight)
  242. self.Scroller.Draw()
  243. } else {
  244. self.Ps.(*ListPageSelector).Width = self.Width
  245. self.Ps.Draw()
  246. for _, v := range self.MyList {
  247. if v.(*TimeZoneListPageListItem).PosY > self.Height+self.Height/2 {
  248. break
  249. }
  250. if v.(*TimeZoneListPageListItem).PosY < 0 {
  251. continue
  252. }
  253. v.Draw()
  254. }
  255. }
  256. }