mirror of
https://github.com/clockworkpi/launcher_deot.git
synced 2025-12-12 15:38:52 +01:00
242 lines
8.1 KiB
Python
242 lines
8.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
import os
|
|
import pygame
|
|
|
|
import gobject
|
|
import validators
|
|
|
|
|
|
from libs.roundrects import aa_round_rect
|
|
|
|
## local UI import
|
|
from UI.constants import Width,Height,ICON_TYPES,RUNEVT
|
|
from UI.page import Page,PageSelector
|
|
from UI.label import Label
|
|
from UI.icon_item import IconItem
|
|
from UI.util_funcs import midRect,CmdClean,FileExists
|
|
from UI.keys_def import CurKeys, IsKeyMenuOrB
|
|
from UI.multi_icon_item import MultiIconItem
|
|
from UI.icon_pool import MyIconPool
|
|
from UI.download import Download
|
|
from UI.skin_manager import MySkinManager
|
|
from UI.lang_manager import MyLangManager
|
|
|
|
from libs.DBUS import is_wifi_connected_now
|
|
|
|
import config
|
|
|
|
class DownloadProcessPage(Page):
|
|
_FootMsg = ["Nav.","","","Back",""]
|
|
_Downloader = None
|
|
_DownloaderTimer = -1
|
|
_Value = 0
|
|
|
|
_URL = ""
|
|
_DST_DIR = ""
|
|
|
|
_PngSize = {}
|
|
|
|
_FileNameLabel = None
|
|
_SizeLabel = None
|
|
|
|
_URLColor = MySkinManager.GiveColor('URL')
|
|
_TextColor = MySkinManager.GiveColor('Text')
|
|
|
|
def __init__(self):
|
|
Page.__init__(self)
|
|
self._Icons = {}
|
|
self._CanvasHWND = None
|
|
|
|
def Init(self):
|
|
self._PosX = self._Index * self._Screen._Width
|
|
self._Width = self._Screen._Width
|
|
self._Height = self._Screen._Height
|
|
|
|
self._CanvasHWND = self._Screen._CanvasHWND
|
|
|
|
self._PngSize["bg"] = (48,79)
|
|
self._PngSize["needwifi_bg"] = (253,132)
|
|
|
|
bgpng = IconItem()
|
|
bgpng._ImgSurf = MyIconPool.GiveIconSurface("rom_download")
|
|
bgpng._MyType = ICON_TYPES["STAT"]
|
|
bgpng._Parent = self
|
|
bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0)
|
|
self._Icons["bg"] = bgpng
|
|
|
|
needwifi_bg = IconItem()
|
|
needwifi_bg._ImgSurf = MyIconPool.GiveIconSurface("needwifi_bg")
|
|
needwifi_bg._MyType = ICON_TYPES["STAT"]
|
|
needwifi_bg._Parent = self
|
|
needwifi_bg.Adjust(0,0,self._PngSize["needwifi_bg"][0],self._PngSize["needwifi_bg"][1],0)
|
|
|
|
self._Icons["needwifi_bg"] = needwifi_bg
|
|
|
|
|
|
self._FileNameLabel = Label()
|
|
self._FileNameLabel.SetCanvasHWND(self._CanvasHWND)
|
|
self._FileNameLabel.Init("", MyLangManager.TrFont("Eurostile12"))
|
|
|
|
self._SizeLabel = Label()
|
|
self._SizeLabel.SetCanvasHWND(self._CanvasHWND)
|
|
self._SizeLabel.Init("0/0Kb",MyLangManager.TrFont("Eurostile12"))
|
|
self._SizeLabel.SetColor( self._URLColor )
|
|
|
|
|
|
def OnExitCb(self,event):
|
|
#print("DownloadProcessPage OnExitCb")
|
|
if self._Downloader == None:
|
|
return
|
|
try:
|
|
self._Downloader.stop()
|
|
except:
|
|
pass
|
|
return
|
|
|
|
def GObjectUpdateProcessInterval(self):
|
|
if self._Screen.CurPage() == self:
|
|
if self._Downloader.isFinished():
|
|
if self._Downloader.isSuccessful():
|
|
print("Download Success!")
|
|
# Do something with obj.get_dest()
|
|
filename = os.path.basename(self._Downloader.get_dest())
|
|
cur_dir = os.getcwd()
|
|
|
|
if filename.endswith(".zip"):
|
|
os.chdir(self._DST_DIR)
|
|
os.system( "unzip -o " + filename )
|
|
|
|
elif filename.endswith(".zsync"):
|
|
os.chdir(self._DST_DIR)
|
|
os.system( "rm -rf " + filename)
|
|
|
|
elif filename.endswith(".tar.xz"):
|
|
os.chdir(self._DST_DIR)
|
|
os.system( "tar xf " + filename)
|
|
os.system( "rm -rf " + filename)
|
|
|
|
os.chdir(cur_dir)
|
|
self.DownloadPostJob()
|
|
self.ReturnToUpLevelPage()
|
|
self._Screen.Draw()
|
|
self._Screen.SwapAndShow()
|
|
|
|
else:
|
|
print("Download failed with the following exceptions:")
|
|
for e in self._Downloader.get_errors():
|
|
print(unicode(e))
|
|
|
|
try:
|
|
self._Downloader.stop()
|
|
except:
|
|
pass
|
|
|
|
self._Screen._MsgBox.SetText("DownloadFailed")
|
|
self._Screen._MsgBox.Draw()
|
|
self._Screen.SwapAndShow()
|
|
return False
|
|
else:
|
|
self._Value = self._Downloader.get_progress()
|
|
|
|
filename = os.path.basename(self._Downloader.get_dest())
|
|
self._FileNameLabel.SetText( filename )
|
|
|
|
downloaded = self._Downloader.progress["downloaded"]
|
|
total = self._Downloader.progress["total"]
|
|
|
|
downloaded = downloaded/1000.0/1000.0
|
|
total = total/1000.0/1000.0
|
|
|
|
self._SizeLabel.SetText( "%.2f" % downloaded+"/"+ "%.2f" % total +"Mb")
|
|
|
|
print("Progress: %d%%" % (self._Value))
|
|
self._Screen.Draw()
|
|
self._Screen.SwapAndShow()
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def DownloadPostJob(self):
|
|
cur_dir = os.getcwd()
|
|
|
|
arr = self._URL.rsplit('/', 1)
|
|
if len(arr) > 1:
|
|
downloaded_filename = arr[1]
|
|
try:
|
|
os.chdir(os.path.join(cur_dir,"patches",downloaded_filename))
|
|
os.system("/bin/sh Run.sh")
|
|
except:
|
|
pass
|
|
|
|
os.chdir(cur_dir)
|
|
|
|
def StartDownload(self,url,dst_dir):
|
|
if is_wifi_connected_now() == False:
|
|
return
|
|
|
|
if validators.url(url) and os.path.isdir(dst_dir):
|
|
self._URL = url
|
|
self._DST_DIR = dst_dir
|
|
else:
|
|
self._Screen._MsgBox.SetText("Invaid")
|
|
self._Screen._MsgBox.Draw()
|
|
self._Screen.SwapAndShow()
|
|
print("url or dst dir error")
|
|
return
|
|
|
|
self._Downloader = Download(url,dst_dir,None)
|
|
self._Downloader.start()
|
|
|
|
self._DownloaderTimer = gobject.timeout_add(200, self.GObjectUpdateProcessInterval)
|
|
|
|
def KeyDown(self,event):
|
|
if IsKeyMenuOrB(event.key):
|
|
gobject.source_remove(self._DownloaderTimer)
|
|
self._DownloaderTimer = -1
|
|
|
|
if self._Downloader != None:
|
|
try:
|
|
self._Downloader.stop()
|
|
except:
|
|
print("user canceled ")
|
|
|
|
self.ReturnToUpLevelPage()
|
|
self._Screen.Draw()
|
|
self._Screen.SwapAndShow()
|
|
|
|
def Draw(self):
|
|
self.ClearCanvas()
|
|
|
|
if is_wifi_connected_now() == False:
|
|
self._Icons["needwifi_bg"].NewCoord(self._Width/2, self._Height/2)
|
|
self._Icons["needwifi_bg"].Draw()
|
|
return
|
|
|
|
self._Icons["bg"].NewCoord(self._Width/2,self._Height/2-20)
|
|
self._Icons["bg"].Draw()
|
|
|
|
percent = self._Value
|
|
if percent < 10:
|
|
percent = 10
|
|
|
|
|
|
rect_ = midRect(self._Width/2,self._Height/2+33,170,17, Width,Height)
|
|
aa_round_rect(self._CanvasHWND,rect_,MySkinManager.GiveColor('TitleBg'),5,0,MySkinManager.GiveColor('TitleBg'))
|
|
|
|
rect2 = midRect(self._Width/2,self._Height/2+33,int(170*(percent/100.0)),17, Width,Height)
|
|
rect2.left = rect_.left
|
|
rect2.top = rect_.top
|
|
aa_round_rect(self._CanvasHWND,rect2,MySkinManager.GiveColor('Front'),5,0,MySkinManager.GiveColor('Front'))
|
|
|
|
rect3 = midRect(self._Width/2,self._Height/2+53,self._FileNameLabel._Width, self._FileNameLabel._Height,Width,Height)
|
|
|
|
rect4 = midRect(self._Width/2,self._Height/2+70,self._SizeLabel._Width, self._SizeLabel._Height,Width,Height)
|
|
|
|
self._FileNameLabel.NewCoord(rect3.left,rect3.top)
|
|
self._SizeLabel.NewCoord(rect4.left, rect4.top)
|
|
|
|
self._FileNameLabel.Draw()
|
|
self._SizeLabel.Draw()
|
|
|
|
|