power_options_page.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  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.Refresh()
  210. }
  211. if ev.Data["Key"] == UI.CurKeys["Up"] {
  212. self.ScrollUp()
  213. self.Screen.Refresh()
  214. }
  215. if ev.Data["Key"] == UI.CurKeys["Down"] {
  216. self.ScrollDown()
  217. self.Screen.Refresh()
  218. }
  219. }
  220. func (self *InfoPage) Draw() {
  221. self.ClearCanvas()
  222. self.Ps.Draw()
  223. for _, v := range self.MyList {
  224. v.Draw()
  225. }
  226. }
  227. type PowerOptionsPage struct {
  228. UI.Page
  229. ListFont *ttf.Font
  230. BGwidth int
  231. BGheight int
  232. AList map[string]map[string]string
  233. DrawOnce bool
  234. InfoPage *InfoPage
  235. Scroller *UI.ListScroller
  236. Icons map[string]UI.IconItemInterface
  237. }
  238. func NewPowerOptionsPage() *PowerOptionsPage {
  239. p := &PowerOptionsPage{}
  240. p.BGwidth = UI.Width
  241. p.BGheight = UI.Height - 24 - 20
  242. p.AList = make(map[string]map[string]string)
  243. p.Icons = make(map[string]UI.IconItemInterface)
  244. p.ListFont = UI.Fonts["notosanscjk15"]
  245. p.FootMsg = [5]string{"Nav", "", "Detail", "Back", "Select"}
  246. return p
  247. }
  248. func (self *PowerOptionsPage) GenList() {
  249. self.MyList = nil
  250. start_x := 0
  251. start_y := 0
  252. last_height := 0
  253. supersaving := make(map[string]string)
  254. supersaving["key"] = "super"
  255. supersaving["label"] = "Power saving"
  256. supersaving["value"] = "supersaving"
  257. powersaving := make(map[string]string)
  258. powersaving["key"] = "saving"
  259. powersaving["label"] = "Balanced"
  260. powersaving["value"] = "powersaving"
  261. performance := make(map[string]string)
  262. performance["key"] = "performance"
  263. performance["label"] = "Performance"
  264. performance["value"] = "performance"
  265. server_saving := make(map[string]string)
  266. server_saving["key"] = "server"
  267. server_saving["label"] = "Server"
  268. server_saving["value"] = "server"
  269. self.AList["supersaving"] = supersaving
  270. self.AList["powersaving"] = powersaving
  271. self.AList["server"] = server_saving
  272. self.AList["performance"] = performance
  273. for _, u := range [4]string{"supersaving", "powersaving", "server", "performance"} {
  274. v := self.AList[u]
  275. li := NewPageListItem()
  276. li.Parent = self
  277. li.PosX = start_x
  278. li.PosY = start_y + last_height
  279. li.Width = UI.Width
  280. li.Fonts["normal"] = self.ListFont
  281. li.Active = false
  282. li.Value = v["value"]
  283. if v["label"] != "" {
  284. li.Init(v["label"])
  285. } else {
  286. li.Init(v["key"])
  287. }
  288. last_height += li.Height
  289. self.MyList = append(self.MyList, li)
  290. }
  291. }
  292. func (self *PowerOptionsPage) Init() {
  293. if self.Screen != nil {
  294. if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
  295. self.HWND = self.Screen.CanvasHWND
  296. self.CanvasHWND = surface.Surface(self.Screen.Width, self.Screen.Height)
  297. }
  298. }
  299. self.PosX = self.Index * self.Screen.Width
  300. self.Width = self.Screen.Width
  301. self.Height = self.Screen.Height
  302. done := UI.NewIconItem()
  303. done.ImgSurf = UI.MyIconPool.GetImgSurf("done")
  304. done.MyType = UI.ICON_TYPES["STAT"]
  305. done.Parent = self
  306. self.Icons["done"] = done
  307. ps := NewListPageSelector()
  308. ps.Parent = self
  309. self.Ps = ps
  310. self.PsIndex = 0
  311. self.GenList()
  312. self.Scroller = UI.NewListScroller()
  313. self.Scroller.Parent = self
  314. self.Scroller.PosX = self.Width - 10
  315. self.Scroller.PosY = 2
  316. self.Scroller.Init()
  317. self.Scroller.SetCanvasHWND(self.HWND)
  318. self.InfoPage = NewInfoPage()
  319. self.InfoPage.Screen = self.Screen
  320. self.InfoPage.Name = "Power option detail"
  321. self.InfoPage.Init()
  322. }
  323. func (self *PowerOptionsPage) Click() {
  324. if len(self.MyList) == 0 {
  325. return
  326. }
  327. cur_li := self.MyList[self.PsIndex].(*PageListItem)
  328. if cur_li.Active == true {
  329. return
  330. }
  331. for i, _ := range self.MyList {
  332. self.MyList[i].(*PageListItem).Active = false
  333. }
  334. cur_li.Active = true
  335. fmt.Println(cur_li.Value)
  336. d := []byte(cur_li.Value)
  337. err := ioutil.WriteFile("sysgo/.powerlevel", d, 0644)
  338. if err != nil {
  339. fmt.Println(err)
  340. }
  341. sysgo.CurPowerLevel = cur_li.Value
  342. if sysgo.CurPowerLevel == "supersaving" {
  343. UI.System(fmt.Sprintf("sudo iw %s set power_save on >/dev/null", sysgo.WifiDev))
  344. } else {
  345. UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
  346. }
  347. self.Screen.MsgBox.SetText("Applying")
  348. self.Screen.MsgBox.Draw()
  349. self.Screen.SwapAndShow()
  350. event.Post(UI.POWEROPT, "")
  351. time.BlockDelay(1000)
  352. self.Screen.Refresh()
  353. }
  354. func (self *PowerOptionsPage) OnLoadCb() {
  355. self.PosY = 0
  356. self.DrawOnce = false
  357. for i, _ := range self.MyList {
  358. if self.MyList[i].(*PageListItem).Value == sysgo.CurPowerLevel {
  359. self.MyList[i].(*PageListItem).Active = true
  360. }
  361. }
  362. }
  363. func (self *PowerOptionsPage) KeyDown(ev *event.Event) {
  364. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  365. self.ReturnToUpLevelPage()
  366. self.Screen.Refresh()
  367. }
  368. if ev.Data["Key"] == UI.CurKeys["B"] {
  369. self.Click()
  370. }
  371. if ev.Data["Key"] == UI.CurKeys["Up"] {
  372. self.ScrollUp()
  373. self.Screen.Refresh()
  374. }
  375. if ev.Data["Key"] == UI.CurKeys["Down"] {
  376. self.ScrollDown()
  377. self.Screen.Refresh()
  378. }
  379. if ev.Data["Key"] == UI.CurKeys["Y"] {
  380. cur_li := self.MyList[self.PsIndex].(*PageListItem)
  381. time1 := sysgo.PowerLevels[cur_li.Value].Dim
  382. time2 := sysgo.PowerLevels[cur_li.Value].Close
  383. time3 := sysgo.PowerLevels[cur_li.Value].PowerOff
  384. self.InfoPage.Time1 = time1
  385. self.InfoPage.Time2 = time2
  386. self.InfoPage.Time3 = time3
  387. self.Screen.PushPage(self.InfoPage)
  388. self.Screen.Refresh()
  389. }
  390. }
  391. func (self *PowerOptionsPage) Draw() {
  392. self.ClearCanvas()
  393. if len(self.MyList) == 0 {
  394. return
  395. }
  396. if len(self.MyList)*UI.DefaultInfoPageListItemHeight > self.Height {
  397. self.Ps.(*ListPageSelector).Width = self.Width - 11
  398. self.Ps.Draw()
  399. for _, v := range self.MyList {
  400. if v.(*PageListItem).PosY > self.Height+self.Height/2 {
  401. break
  402. }
  403. if v.(*PageListItem).PosY < 0 {
  404. continue
  405. }
  406. v.Draw()
  407. }
  408. self.Scroller.UpdateSize(len(self.MyList)*UI.DefaultInfoPageListItemHeight,
  409. self.PsIndex*UI.DefaultInfoPageListItemHeight)
  410. self.Scroller.Draw()
  411. } else {
  412. self.Ps.(*ListPageSelector).Width = self.Width
  413. self.Ps.Draw()
  414. for _, v := range self.MyList {
  415. if v.(*PageListItem).PosY > self.Height+self.Height/2 {
  416. break
  417. }
  418. if v.(*PageListItem).PosY < 0 {
  419. continue
  420. }
  421. v.Draw()
  422. }
  423. }
  424. if self.HWND != nil {
  425. surface.Fill(self.HWND, &color.Color{255, 255, 255, 255})
  426. rect_ := rect.Rect(self.PosX, self.PosY, self.Width, self.Height)
  427. surface.Blit(self.HWND, self.CanvasHWND, &rect_, nil)
  428. }
  429. }