power_options_page.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. package PowerOptions
  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"
  15. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  16. )
  17. type ListPageSelector struct {
  18. UI.InfoPageSelector
  19. }
  20. func NewListPageSelector() *ListPageSelector {
  21. p := &ListPageSelector{}
  22. p.Width = UI.Width
  23. p.BackgroundColor = &color.Color{131, 199, 219, 255} //SkinManager().GiveColor('Front')
  24. return p
  25. }
  26. func (self *ListPageSelector) Draw() {
  27. idx := self.Parent.GetPsIndex()
  28. mylist := self.Parent.GetMyList()
  29. if idx < len(mylist) {
  30. x, y := mylist[idx].Coord()
  31. _, h := mylist[idx].Size()
  32. self.PosX = x + 2
  33. self.PosY = y + 1
  34. self.Height = h - 3
  35. canvas_ := self.Parent.GetCanvasHWND()
  36. rect_ := rect.Rect(self.PosX, self.PosY, self.Width-4, self.Height)
  37. draw.AARoundRect(canvas_, &rect_, self.BackgroundColor, 4, 0, self.BackgroundColor)
  38. }
  39. }
  40. type PageListItem struct {
  41. UI.InfoPageListItem
  42. Active bool
  43. Value string
  44. }
  45. func NewPageListItem() *PageListItem {
  46. p := &PageListItem{}
  47. p.Height = UI.DefaultInfoPageListItemHeight
  48. p.ReadOnly = false
  49. p.Labels = make(map[string]UI.LabelInterface)
  50. p.Icons = make(map[string]UI.IconItemInterface)
  51. p.Fonts = make(map[string]*ttf.Font)
  52. return p
  53. }
  54. func (self *PageListItem) Draw() {
  55. x, _ := self.Labels["Text"].Coord()
  56. w, h := self.Labels["Text"].Size()
  57. self.Labels["Text"].NewCoord(x, self.PosY+(self.Height-h)/2)
  58. if self.Active == true {
  59. self.Parent.(*PowerOptionsPage).Icons["done"].NewCoord(self.Parent.(*PowerOptionsPage).Width-30, self.PosY+5)
  60. self.Parent.(*PowerOptionsPage).Icons["done"].Draw()
  61. }
  62. self.Labels["Text"].SetBold(self.Active)
  63. self.Labels["Text"].Draw()
  64. if _, ok := self.Labels["Small"]; ok {
  65. x, _ = self.Labels["Small"].Coord()
  66. w, h = self.Labels["Small"].Size()
  67. self.Labels["Small"].NewCoord(self.Width-w-10, self.PosY+(self.Height-h)/2)
  68. self.Labels["Small"].Draw()
  69. }
  70. canvas_ := self.Parent.GetCanvasHWND()
  71. draw.Line(canvas_, &color.Color{169, 169, 169, 255},
  72. self.PosX, self.PosY+self.Height-1,
  73. self.PosX+self.Width, self.PosY+self.Height-1, 1)
  74. }
  75. type InfoPage struct {
  76. UI.Page
  77. ListFontObj *ttf.Font
  78. Time1 int
  79. Time2 int
  80. Time3 int
  81. AList map[string]map[string]string
  82. }
  83. func NewInfoPage() *InfoPage {
  84. p := &InfoPage{}
  85. p.ListFontObj = UI.MyLangManager.TrFont("varela15")
  86. p.FootMsg = [5]string{"Nav", "", "", "Back", ""}
  87. p.Time1 = 40
  88. p.Time2 = 120 // 120 secs
  89. p.Time3 = 300 // 5 minutes
  90. p.AList = make(map[string]map[string]string)
  91. return p
  92. }
  93. func (self *InfoPage) ConvertSecToMin(secs int) string {
  94. sec_str := ""
  95. min_str := ""
  96. if secs > 60 {
  97. m := int(secs / 60)
  98. s := secs % 60
  99. if m > 1 {
  100. min_str = fmt.Sprintf("%d "+UI.MyLangManager.Tr("minutes")+" ", m)
  101. } else {
  102. min_str = fmt.Sprintf("%d "+UI.MyLangManager.Tr("minute")+" ", m)
  103. }
  104. if s == 1 {
  105. sec_str = fmt.Sprintf("%d "+UI.MyLangManager.Tr("second"), s)
  106. } else if s > 1 {
  107. sec_str = fmt.Sprintf("%d "+UI.MyLangManager.Tr("seconds"), s)
  108. }
  109. } else if secs <= 60 && secs > 0 {
  110. if secs > 1 {
  111. sec_str = fmt.Sprintf("%d "+UI.MyLangManager.Tr("seconds"), secs)
  112. } else {
  113. sec_str = fmt.Sprintf("%d "+UI.MyLangManager.Tr("second"), secs)
  114. }
  115. } else if secs == 0 {
  116. sec_str = UI.MyLangManager.Tr("Never")
  117. }
  118. return min_str + sec_str
  119. }
  120. func (self *InfoPage) RefreshList() {
  121. self.AList["time1"]["value"] = self.ConvertSecToMin(self.Time1)
  122. self.AList["time2"]["value"] = self.ConvertSecToMin(self.Time2)
  123. self.AList["time3"]["value"] = self.ConvertSecToMin(self.Time3)
  124. i := 0
  125. for _, v := range self.AList {
  126. self.MyList[i].(*PageListItem).SetSmallText(v["value"])
  127. i += 1
  128. }
  129. }
  130. func (self *InfoPage) GenList() {
  131. time1 := make(map[string]string)
  132. time1["key"] = "time1"
  133. if self.Time1 == 0 {
  134. time1["value"] = UI.MyLangManager.Tr("Never")
  135. } else {
  136. time1["value"] = fmt.Sprintf("%d secs", self.Time1)
  137. }
  138. time1["label"] = "Screen dimming"
  139. time2 := make(map[string]string)
  140. time2["key"] = "time2"
  141. if self.Time2 == 0 {
  142. time2["value"] = UI.MyLangManager.Tr("Never")
  143. } else {
  144. time2["value"] = fmt.Sprintf("%d secs", self.Time2)
  145. }
  146. time2["label"] = "Screen OFF"
  147. time3 := make(map[string]string)
  148. time3["key"] = "time3"
  149. if self.Time3 == 0 {
  150. time3["value"] = UI.MyLangManager.Tr("Never")
  151. } else {
  152. time3["value"] = fmt.Sprintf("%d secs", self.Time3)
  153. }
  154. time3["label"] = "Power OFF"
  155. self.AList["time1"] = time1
  156. self.AList["time2"] = time2
  157. self.AList["time3"] = time3
  158. self.MyList = nil
  159. start_x := 0
  160. start_y := 0
  161. i := 0
  162. for _, v := range self.AList {
  163. li := NewPageListItem()
  164. li.Parent = self
  165. li.PosX = start_x
  166. li.PosY = start_y + i*UI.DefaultInfoPageListItemHeight
  167. li.Width = UI.Width
  168. li.Fonts["normal"] = self.ListFontObj
  169. li.Fonts["small"] = UI.MyLangManager.TrFont("varela12")
  170. if v["label"] != "" {
  171. li.Init(v["label"])
  172. } else {
  173. li.Init(v["key"])
  174. }
  175. li.Flag = v["key"]
  176. li.SetSmallText(v["value"])
  177. self.MyList = append(self.MyList, li)
  178. i += 1
  179. }
  180. }
  181. func (self *InfoPage) Init() {
  182. if self.Screen != nil {
  183. if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
  184. self.CanvasHWND = self.Screen.CanvasHWND
  185. }
  186. }
  187. self.PosX = self.Index * self.Screen.Width
  188. self.Width = self.Screen.Width
  189. self.Height = self.Screen.Height
  190. ps := NewListPageSelector()
  191. ps.Parent = self
  192. self.Ps = ps
  193. self.PsIndex = 0
  194. self.GenList()
  195. }
  196. func (self *InfoPage) Click() {
  197. if self.PsIndex >= len(self.MyList) {
  198. return
  199. }
  200. cur_li := self.MyList[self.PsIndex]
  201. fmt.Println(cur_li.(*PageListItem).Flag)
  202. }
  203. func (self *InfoPage) OnLoadCb() {
  204. self.RefreshList()
  205. }
  206. func (self *InfoPage) KeyDown(ev *event.Event) {
  207. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  208. self.ReturnToUpLevelPage()
  209. self.Screen.Draw()
  210. self.Screen.SwapAndShow()
  211. }
  212. if ev.Data["Key"] == UI.CurKeys["Up"] {
  213. self.ScrollUp()
  214. self.Screen.Draw()
  215. self.Screen.SwapAndShow()
  216. }
  217. if ev.Data["Key"] == UI.CurKeys["Down"] {
  218. self.ScrollDown()
  219. self.Screen.Draw()
  220. self.Screen.SwapAndShow()
  221. }
  222. }
  223. func (self *InfoPage) Draw() {
  224. self.ClearCanvas()
  225. self.Ps.Draw()
  226. for _, v := range self.MyList {
  227. v.Draw()
  228. }
  229. }
  230. type PowerOptionsPage struct {
  231. UI.Page
  232. ListFont *ttf.Font
  233. BGwidth int
  234. BGheight int
  235. AList map[string]map[string]string
  236. DrawOnce bool
  237. InfoPage *InfoPage
  238. Scroller *UI.ListScroller
  239. Icons map[string]UI.IconItemInterface
  240. }
  241. func NewPowerOptionsPage() *PowerOptionsPage {
  242. p := &PowerOptionsPage{}
  243. p.BGwidth = UI.Width
  244. p.BGheight = UI.Height - 24 - 20
  245. p.AList = make(map[string]map[string]string)
  246. p.Icons = make(map[string]UI.IconItemInterface)
  247. p.ListFont = UI.Fonts["notosanscjk15"]
  248. p.FootMsg = [5]string{"Nav", "", "Detail", "Back", "Select"}
  249. return p
  250. }
  251. func (self *PowerOptionsPage) GenList() {
  252. self.MyList = nil
  253. start_x := 0
  254. start_y := 0
  255. last_height := 0
  256. supersaving := make(map[string]string)
  257. supersaving["key"] = "super"
  258. supersaving["label"] = "Power saving"
  259. supersaving["value"] = "supersaving"
  260. powersaving := make(map[string]string)
  261. powersaving["key"] = "saving"
  262. powersaving["label"] = "Balanced"
  263. powersaving["value"] = "powersaving"
  264. performance := make(map[string]string)
  265. performance["key"] = "performance"
  266. performance["label"] = "Performance"
  267. performance["value"] = "performance"
  268. server_saving := make(map[string]string)
  269. server_saving["key"] = "server"
  270. server_saving["label"] = "Server"
  271. server_saving["value"] = "server"
  272. self.AList["supersaving"] = supersaving
  273. self.AList["powersaving"] = powersaving
  274. self.AList["server"] = server_saving
  275. self.AList["performance"] = performance
  276. for _, u := range [4]string{"supersaving", "powersaving", "server", "performance"} {
  277. v := self.AList[u]
  278. li := NewPageListItem()
  279. li.Parent = self
  280. li.PosX = start_x
  281. li.PosY = start_y + last_height
  282. li.Width = UI.Width
  283. li.Fonts["normal"] = self.ListFont
  284. li.Active = false
  285. li.Value = v["value"]
  286. if v["label"] != "" {
  287. li.Init(v["label"])
  288. } else {
  289. li.Init(v["key"])
  290. }
  291. last_height += li.Height
  292. self.MyList = append(self.MyList, li)
  293. }
  294. }
  295. func (self *PowerOptionsPage) Init() {
  296. if self.Screen != nil {
  297. if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
  298. self.HWND = self.Screen.CanvasHWND
  299. self.CanvasHWND = surface.Surface(self.Screen.Width, self.Screen.Height)
  300. }
  301. }
  302. self.PosX = self.Index * self.Screen.Width
  303. self.Width = self.Screen.Width
  304. self.Height = self.Screen.Height
  305. done := UI.NewIconItem()
  306. done.ImgSurf = UI.MyIconPool.GetImgSurf("done")
  307. done.MyType = UI.ICON_TYPES["STAT"]
  308. done.Parent = self
  309. self.Icons["done"] = done
  310. ps := NewListPageSelector()
  311. ps.Parent = self
  312. self.Ps = ps
  313. self.PsIndex = 0
  314. self.GenList()
  315. self.Scroller = UI.NewListScroller()
  316. self.Scroller.Parent = self
  317. self.Scroller.PosX = self.Width - 10
  318. self.Scroller.PosY = 2
  319. self.Scroller.Init()
  320. self.Scroller.SetCanvasHWND(self.HWND)
  321. self.InfoPage = NewInfoPage()
  322. self.InfoPage.Screen = self.Screen
  323. self.InfoPage.Name = "Power option detail"
  324. self.InfoPage.Init()
  325. }
  326. func (self *PowerOptionsPage) Click() {
  327. if len(self.MyList) == 0 {
  328. return
  329. }
  330. cur_li := self.MyList[self.PsIndex].(*PageListItem)
  331. if cur_li.Active == true {
  332. return
  333. }
  334. for i, _ := range self.MyList {
  335. self.MyList[i].(*PageListItem).Active = false
  336. }
  337. cur_li.Active = true
  338. fmt.Println(cur_li.Value)
  339. d := []byte(cur_li.Value)
  340. err := ioutil.WriteFile("sysgo/.powerlevel", d, 0644)
  341. if err != nil {
  342. fmt.Println(err)
  343. }
  344. sysgo.CurPowerLevel = cur_li.Value
  345. if sysgo.CurPowerLevel == "supersaving" {
  346. UI.System(fmt.Sprintf("sudo iw %s set power_save on >/dev/null", sysgo.WifiDev))
  347. } else {
  348. UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
  349. }
  350. self.Screen.MsgBox.SetText("Applying")
  351. self.Screen.MsgBox.Draw()
  352. self.Screen.SwapAndShow()
  353. event.Post(UI.POWEROPT, "")
  354. time.BlockDelay(1000)
  355. self.Screen.Draw()
  356. self.Screen.SwapAndShow()
  357. }
  358. func (self *PowerOptionsPage) OnLoadCb() {
  359. self.PosY = 0
  360. self.DrawOnce = false
  361. for i, _ := range self.MyList {
  362. if self.MyList[i].(*PageListItem).Value == sysgo.CurPowerLevel {
  363. self.MyList[i].(*PageListItem).Active = true
  364. }
  365. }
  366. }
  367. func (self *PowerOptionsPage) KeyDown(ev *event.Event) {
  368. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  369. self.ReturnToUpLevelPage()
  370. self.Screen.Draw()
  371. self.Screen.SwapAndShow()
  372. }
  373. if ev.Data["Key"] == UI.CurKeys["B"] {
  374. self.Click()
  375. }
  376. if ev.Data["Key"] == UI.CurKeys["Up"] {
  377. self.ScrollUp()
  378. self.Screen.Draw()
  379. self.Screen.SwapAndShow()
  380. }
  381. if ev.Data["Key"] == UI.CurKeys["Down"] {
  382. self.ScrollDown()
  383. self.Screen.Draw()
  384. self.Screen.SwapAndShow()
  385. }
  386. if ev.Data["Key"] == UI.CurKeys["Y"] {
  387. cur_li := self.MyList[self.PsIndex].(*PageListItem)
  388. time1 := sysgo.PowerLevels[cur_li.Value].Dim
  389. time2 := sysgo.PowerLevels[cur_li.Value].Close
  390. time3 := sysgo.PowerLevels[cur_li.Value].PowerOff
  391. self.InfoPage.Time1 = time1
  392. self.InfoPage.Time2 = time2
  393. self.InfoPage.Time3 = time3
  394. self.Screen.PushPage(self.InfoPage)
  395. self.Screen.Draw()
  396. self.Screen.SwapAndShow()
  397. }
  398. }
  399. func (self *PowerOptionsPage) Draw() {
  400. self.ClearCanvas()
  401. if len(self.MyList) == 0 {
  402. return
  403. }
  404. if len(self.MyList)*UI.DefaultInfoPageListItemHeight > self.Height {
  405. self.Ps.(*ListPageSelector).Width = self.Width - 11
  406. self.Ps.Draw()
  407. for _, v := range self.MyList {
  408. if v.(*PageListItem).PosY > self.Height+self.Height/2 {
  409. break
  410. }
  411. if v.(*PageListItem).PosY < 0 {
  412. continue
  413. }
  414. v.Draw()
  415. }
  416. self.Scroller.UpdateSize(len(self.MyList)*UI.DefaultInfoPageListItemHeight,
  417. self.PsIndex*UI.DefaultInfoPageListItemHeight)
  418. self.Scroller.Draw()
  419. } else {
  420. self.Ps.(*ListPageSelector).Width = self.Width
  421. self.Ps.Draw()
  422. for _, v := range self.MyList {
  423. if v.(*PageListItem).PosY > self.Height+self.Height/2 {
  424. break
  425. }
  426. if v.(*PageListItem).PosY < 0 {
  427. continue
  428. }
  429. v.Draw()
  430. }
  431. }
  432. if self.HWND != nil {
  433. surface.Fill(self.HWND, &color.Color{255, 255, 255, 255})
  434. rect_ := rect.Rect(self.PosX, self.PosY, self.Width, self.Height)
  435. surface.Blit(self.HWND, self.CanvasHWND, &rect_, nil)
  436. }
  437. }