__init__.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import pygame
  4. import platform
  5. #import commands
  6. import glob
  7. import json
  8. import gobject
  9. #from beeprint import pp
  10. from libs.roundrects import aa_round_rect
  11. ## local UI import
  12. from UI.constants import Width,Height,ICON_TYPES,RESTARTUI
  13. from UI.page import Page,PageSelector
  14. from UI.label import Label
  15. from UI.util_funcs import midRect,FileExists,ArmSystem
  16. from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB
  17. from UI.scroller import ListScroller
  18. from UI.icon_pool import MyIconPool
  19. from UI.icon_item import IconItem
  20. from UI.multilabel import MultiLabel
  21. from UI.skin_manager import MySkinManager
  22. from UI.lang_manager import MyLangManager
  23. from UI.info_page_list_item import InfoPageListItem
  24. from UI.info_page_selector import InfoPageSelector
  25. import config
  26. class RPCStack:
  27. def __init__(self):
  28. self.stack = list()
  29. def Push(self,data):
  30. if data not in self.stack:
  31. self.stack.append(data)
  32. return True
  33. return False
  34. def Pop(self):
  35. if len(self.stack)<=0:
  36. return None,False
  37. return self.stack.pop(),True
  38. def Last(self):
  39. idx = len(self.stack) -1
  40. if idx < 0:
  41. return None
  42. else:
  43. return self.stack[ idx ]
  44. def Length(self):
  45. return len(self.stack)
  46. class GameConfirmInstallPopupUpPage(Page):
  47. pass
  48. class Aria2DownloadProcessPage(Page):
  49. _FootMsg = ["Nav.","","Pause","Back","Cancel"]
  50. _DownloaderTimer = -1
  51. _Value = 0
  52. _GID = None
  53. _PngSize = {}
  54. _FileNameLabel = None
  55. _SizeLabel = None
  56. _URLColor = MySkinManager.GiveColor('URL')
  57. _TextColor = MySkinManager.GiveColor('Text')
  58. def __init__(self):
  59. Page.__init__(self)
  60. self._Icons = {}
  61. self._CanvasHWND = None
  62. def Init(self):
  63. self._PosX = self._Index * self._Screen._Width
  64. self._Width = self._Screen._Width
  65. self._Height = self._Screen._Height
  66. self._CanvasHWND = self._Screen._CanvasHWND
  67. bgpng = IconItem()
  68. bgpng._ImgSurf = MyIconPool.GiveIconSurface("rom_download")
  69. bgpng._MyType = ICON_TYPES["STAT"]
  70. bgpng._Parent = self
  71. bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0)
  72. self._Icons["bg"] = bgpng
  73. self._FileNameLabel = Label()
  74. self._FileNameLabel.SetCanvasHWND(self._CanvasHWND)
  75. self._FileNameLabel.Init("", MyLangManager.TrFont("varela12"))
  76. self._SizeLabel = Label()
  77. self._SizeLabel.SetCanvasHWND(self._CanvasHWND)
  78. self._SizeLabel.Init("0/0Kb",MyLangManager.TrFont("varela12"))
  79. self._SizeLabel.SetColor( self._URLColor )
  80. def GObjectUpdateProcessInterval(self):
  81. if self._Screen.CurPage() == self and self._GID is not None:
  82. self._Value = config.RPC.tellStatus(self._GID)
  83. downloaded = 0
  84. total = 0
  85. if self._Value["status"] == "waiting":
  86. self._FileNameLabel.SetText( "waiting to download..." )
  87. if self._Value["status"] == "paused":
  88. self._FileNameLabel.SetText( "download paused..." )
  89. if self._Value["status"] == "error":
  90. self._FileNameLabel.SetText("download errors,cancel it please")
  91. if self._Value["status"] == "active":
  92. downloaded = self._Value["completedLength"]
  93. total = self._Value["totalLength"]
  94. downloaded = downloaded/1000.0/1000.0
  95. total = total/1000.0/1000.0
  96. self._SizeLabel.SetText( "%.2f" % downloaded+"/"+ "%.2f" % total +"Mb")
  97. print("Progress: %d%%" % (self._Value))
  98. self._Screen.Draw()
  99. self._Screen.SwapAndShow()
  100. return True
  101. else:
  102. return False
  103. def CheckDownload(self,aria2_gid):
  104. self._GID = aria2_gid
  105. self._DownloaderTimer = gobject.timeout_add(123, self.GObjectUpdateProcessInterval)
  106. def KeyDown(self,event):
  107. if IsKeyMenuOrB(event.key):
  108. gobject.source_remove(self._DownloaderTimer)
  109. self._DownloaderTimer = -1
  110. #if self._Downloader != None:
  111. # try:
  112. # self._Downloader.stop()
  113. # except:
  114. # print("user canceled ")
  115. self.ReturnToUpLevelPage()
  116. self._Screen.Draw()
  117. self._Screen.SwapAndShow()
  118. def Draw(self):
  119. self.ClearCanvas()
  120. self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20)
  121. self._Icons["bg"].Draw()
  122. percent = self._Value
  123. if percent < 10:
  124. percent = 10
  125. rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height)
  126. aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg'))
  127. rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height)
  128. rect2.left = rect_.left
  129. rect2.top = rect_.top
  130. aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front'))
  131. rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height)
  132. rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height)
  133. self._FileNameLabel.NewCoord(rect3.left,rect3.top)
  134. self._SizeLabel.NewCoord(rect4.left, rect4.top)
  135. self._FileNameLabel.Draw()
  136. self._SizeLabel.Draw()
  137. class GameStorePage(Page):
  138. _FootMsg = ["Nav","","","Back","Select"]
  139. _MyList = []
  140. _ListFont = MyLangManager.TrFont("notosanscjk12")
  141. _AList = {}
  142. _Scrolled = 0
  143. _BGwidth = 320
  144. _BGheight = 240-24-20
  145. _DrawOnce = False
  146. _Scroller = None
  147. _InfoPage = None
  148. _Downloading = None
  149. def __init__(self):
  150. Page.__init__(self)
  151. self._Icons = {}
  152. self._MyStack = RPCStack()
  153. #title path type
  154. repos = [
  155. {"title":"github.com/cuu/gamestore","file":"https://raw.githubusercontent.com/cuu/gamestore/master/index.json","type":"dir"}
  156. ]
  157. self._MyStack.Push(repos)
  158. def SyncList(self):
  159. self._MyList = []
  160. start_x = 0
  161. start_y = 0
  162. last_height = 0
  163. repos = self._MyStack.Last()
  164. for i,u in enumerate( repos ):
  165. #print(i,u)
  166. li = InfoPageListItem()
  167. li._Parent = self
  168. li._PosX = start_x
  169. li._PosY = start_y + last_height
  170. li._Width = Width
  171. li._Fonts["normal"] = self._ListFont
  172. li._Active = False
  173. li._Value = u
  174. li.Init( u["title"] )
  175. last_height += li._Height
  176. self._MyList.append(li)
  177. self._MyStack.Push(repos)
  178. def Init(self):
  179. if self._Screen != None:
  180. if self._Screen._CanvasHWND != None and self._CanvasHWND == None:
  181. self._HWND = self._Screen._CanvasHWND
  182. self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) )
  183. self._PosX = self._Index*self._Screen._Width
  184. self._Width = self._Screen._Width ## equal to screen width
  185. self._Height = self._Screen._Height
  186. done = IconItem()
  187. done._ImgSurf = MyIconPool.GiveIconSurface("done")
  188. done._MyType = ICON_TYPES["STAT"]
  189. done._Parent = self
  190. self._Icons["done"] = done
  191. ps = InfoPageSelector()
  192. ps._Parent = self
  193. self._Ps = ps
  194. self._PsIndex = 0
  195. self.SyncList()
  196. self._Scroller = ListScroller()
  197. self._Scroller._Parent = self
  198. self._Scroller._PosX = self._Width - 10
  199. self._Scroller._PosY = 2
  200. self._Scroller.Init()
  201. self._Scroller.SetCanvasHWND(self._HWND)
  202. def Click(self):
  203. if len(self._MyList) == 0:
  204. return
  205. cur_li = self._MyList[self._PsIndex]
  206. if cur_li._Active == True:
  207. return
  208. print(cur_li._Value)
  209. if cur_li._Value["type"] == "dir":
  210. remote_file_url = cur_li._Value["file"]
  211. menu_file = remote_file_url.split("master")[1] #assume master branch
  212. local_menu_file = "%s/aria2Download%s" % (os.path.expanduser('~'),menu_file )
  213. if FileExists( local_menu_file ) == False:
  214. if config.RPC.urlDownloading(remote_file_url) == False:
  215. config.RPC.addUri( remote_file_url, options={"out": menu_file})
  216. self._Downloading = remote_file_url
  217. else:
  218. #read the local_menu_file, push into stack,display menu
  219. self._Downloading = None
  220. local_menu_json = json.load(local_menu_file)
  221. with open(local_menu_file) as json_file:
  222. local_menu_json = json.load(json_file)
  223. self._MyStack.Push(local_menu_json["lists"])
  224. self.SyncList()
  225. else:
  226. #download the game probably
  227. remote_file_url = cur_li._Value["file"]
  228. menu_file = remote_file_url.split("master")[1]
  229. local_menu_file = "%s/aria2Download%s" % (os.path.expanduser('~'),menu_file )
  230. print cur_li._Value["type"]
  231. def OnLoadCb(self):
  232. self._Scrolled = 0
  233. self._PosY = 0
  234. self._DrawOnce = False
  235. #sync
  236. def OnReturnBackCb(self):
  237. pass
  238. """
  239. self.ReturnToUpLevelPage()
  240. self._Screen.Draw()
  241. self._Screen.SwapAndShow()
  242. """
  243. def KeyDown(self,event):
  244. if IsKeyMenuOrB(event.key):
  245. self.ReturnToUpLevelPage()
  246. self._Screen.Draw()
  247. self._Screen.SwapAndShow()
  248. if IsKeyStartOrA(event.key):
  249. self.Click()
  250. if event.key == CurKeys["Up"]:
  251. self.ScrollUp()
  252. self._Screen.Draw()
  253. self._Screen.SwapAndShow()
  254. if event.key == CurKeys["Down"]:
  255. self.ScrollDown()
  256. self._Screen.Draw()
  257. self._Screen.SwapAndShow()
  258. def Draw(self):
  259. self.ClearCanvas()
  260. if len(self._MyList) == 0:
  261. return
  262. else:
  263. if len(self._MyList) * self._MyList[0]._Height > self._Height:
  264. self._Ps._Width = self._Width - 11
  265. self._Ps.Draw()
  266. for i in self._MyList:
  267. if i._PosY > self._Height + self._Height/2:
  268. break
  269. if i._PosY < 0:
  270. continue
  271. i.Draw()
  272. self._Scroller.UpdateSize( len(self._MyList)*self._MyList[0]._Height, self._PsIndex*self._MyList[0]._Height)
  273. self._Scroller.Draw()
  274. else:
  275. self._Ps._Width = self._Width
  276. self._Ps.Draw()
  277. for i in self._MyList:
  278. if i._PosY > self._Height + self._Height/2:
  279. break
  280. if i._PosY < 0:
  281. continue
  282. i.Draw()
  283. if self._HWND != None:
  284. self._HWND.fill(MySkinManager.GiveColor("White"))
  285. self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) )
  286. class APIOBJ(object):
  287. _Page = None
  288. def __init__(self):
  289. pass
  290. def Init(self,main_screen):
  291. self._Page = GameStorePage()
  292. self._Page._Screen = main_screen
  293. self._Page._Name ="Download games"
  294. self._Page.Init()
  295. def API(self,main_screen):
  296. if main_screen !=None:
  297. main_screen.PushPage(self._Page)
  298. main_screen.Draw()
  299. main_screen.SwapAndShow()
  300. OBJ = APIOBJ()
  301. def Init(main_screen):
  302. OBJ.Init(main_screen)
  303. def API(main_screen):
  304. OBJ.API(main_screen)