def InitLabels(self): y = 15 x = 11 yInc = 19 xGitRefLabelWidth = 48 labels = \ [["greeting",self._CiteWelcome, self._TextColor, x, y], ["status", "", self._URLColor, x, y + 72-yInc], ["comment", "", self._TextColor, x, y + 72], ["console_out","",self._URLColor, x, y + 72 + yInc], ["label_rev","GIT Revisions: ", self._TextColor, x, 132], ["label_git_rev","Source: ", self._TextColor, x, 151], ["content_git_rev","", self._URLColor, x + xGitRefLabelWidth, 151], ["label_bin_rev","Bin: ", self._TextColor, x, 170], ["content_bin_rev","", self._URLColor, x + xGitRefLabelWidth, 170] ] for i in labels: l = Label() l.SetCanvasHWND(self._CanvasHWND) l.Init(i[1], self._ListFontObj) l.SetColor(i[2]) self._Labels[i[0]] = l c = SimpleNamespace() c.x = i[3] c.y = i[4] self._Coords[i[0]] = c
def SetLabels(self): if is_wifi_connected_now(): self._IP = get_wifi_ip() print("TinyCould : %s" % self._IP) try: if validators.ip_address.ipv4(self._IP) == False: self._IP = "xxx.xxx.xxx.xxx" except: print("ip error %s " % self._IP) self._IP = "xxx.xxx.xxx.xxx" else: self._IP = "xxx.xxx.xxx.xxx" labels = \ [["forssh","For ssh and scp:",self._ListFontObj,self._TextColor], ["ssh_addr","ssh cpi@%s" % self._IP, self._ListFontObj,self._URLColor], ["forwin", "For Windows network:", self._ListFontObj, self._TextColor], ["samba_games", "\\\\%s\games" % self._IP, self._ListFontObj,self._URLColor], ["samba_music", "\\\\%s\music" % self._IP, self._ListFontObj,self._URLColor], ["forID", "ID:", self._ListFontObj, self._TextColor], ["forKey", "Key:", self._ListFontObj, self._TextColor], ["key_and_pass", "cpi", self._ListFontObj, self._URLColor], ["for_airplay", "Airplay:", self._ListFontObj, self._TextColor], ["airplay_name","clockworkpi", self._ListFontObj, self._URLColor]] for i in labels: l = Label() l.SetCanvasHWND(self._CanvasHWND) l.Init(i[1], i[2]) l.SetColor(i[3]) self._Labels[i[0]] = l self.SetCoords() ##
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._Icons["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._Icons["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("varela12")) self._SizeLabel = Label() self._SizeLabel.SetCanvasHWND(self._CanvasHWND) self._SizeLabel.Init("0/0Kb", MyLangManager.TrFont("varela12")) 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("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 " + 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.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 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( 100, 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()
class StoragePage(Page): _Icons = {} _BGpng = None _BGwidth = 96 _BGheight = 73 _BGlabel = None _FreeLabel = None _BGmsg = "%.1fGB of %.1fGB Used" _DskUsg = None _HighColor = MySkinManager.GiveColor('High') _FootMsg = ["Nav.", "", "", "Back", ""] def __init__(self): Page.__init__(self) self._Icons = {} def DiskUsage(self): statvfs = os.statvfs('/') total_space = (statvfs.f_frsize * statvfs.f_blocks) / 1024.0 / 1024.0 / 1024.0 avail_space = (statvfs.f_frsize * statvfs.f_bavail) / 1024.0 / 1024.0 / 1024.0 return avail_space, total_space def Init(self): self._DskUsg = self.DiskUsage() self._CanvasHWND = self._Screen._CanvasHWND self._Width = self._Screen._Width self._Height = self._Screen._Height self._BGpng = IconItem() self._BGpng._ImgSurf = MyIconPool._Icons["icon_sd"] self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel( self._BGmsg % (self._DskUsg[1] - self._DskUsg[0], self._DskUsg[1]), fonts["varela15"]) self._BGpng.Adjust(0, 0, self._BGwidth, self._BGheight, 0) self._BGlabel = Label() self._BGlabel.SetCanvasHWND(self._CanvasHWND) usage_percent = (self._DskUsg[0] / self._DskUsg[1]) * 100.0 self._BGlabel.Init("%d%%" % int(usage_percent), fonts["varela25"]) self._BGlabel.SetColor(self._HighColor) self._FreeLabel = Label() self._FreeLabel.SetCanvasHWND(self._CanvasHWND) self._FreeLabel.Init("Free", fonts["varela13"]) self._FreeLabel.SetColor(self._BGlabel._Color) def OnLoadCb(self): pass def Draw(self): self.ClearCanvas() self._BGpng.NewCoord(self._Width / 2, self._Height / 2 - 10) self._BGpng.Draw() self._BGlabel.NewCoord(self._Width / 2 - 28, self._Height / 2 - 30) self._BGlabel.Draw() self._FreeLabel.NewCoord(self._BGlabel._PosX + 10, self._Height / 2) self._FreeLabel.Draw() #bgcolor = (238,238,238), fgcolor = (126,206,244) #aa_round_rect usage_percent = (self._DskUsg[0] / self._DskUsg[1]) if usage_percent < 0.1: usage_percent = 0.1 rect_ = midRect(self._Width / 2, self._Height - 30, 170, 17, Width, Height) aa_round_rect(self._CanvasHWND, rect_, MySkinManager.GiveColor('Line'), 5, 0, MySkinManager.GiveColor('Line')) rect2 = midRect(self._Width / 2, self._Height - 30, int(170 * (1.0 - usage_percent)), 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'))
class BSlider(Slider): OnChangeCB = None _Parent = None _Icons = {} def __init__(self): Slider.__init__(self) self._Icons = {} def Init(self): self._Width = self._Parent._Width self._Height = self._Parent._Height self._BrightnessLabel = Label() self._BrightnessLabel.SetCanvasHWND(self._CanvasHWND) self._BrightnessLabel.Init("BRIGHT",MySkinManager.GiveFont("EurostileBold13")) self._BrightnessLabel.SetColor(MySkinManager.GiveColor('Text')) def SetValue(self,brt): self._Value = brt def Further(self): self._Value+=1 if self._Value > 9: self._Value = 9 if self.OnChangeCB != None: if callable(self.OnChangeCB): self.OnChangeCB(self._Value) def StepBack(self): self._Value-=1 if self._Value < 1: self._Value = 1 if self.OnChangeCB != None: if callable(self.OnChangeCB): self.OnChangeCB(self._Value) def Draw(self): start_x = 82 start_y = self._Parent._Screen._Height/2-5 height = 30 width = 4 padding = 15 seg = self._Value-1 for i in range(0,9): rect = pygame.Rect(start_x+i*(width+padding),start_y,width,height) if i > seg: pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),rect, 1) #aa_round_rect(self._CanvasHWND,rect, MySkinManager.GiveColor('Text'),1,1, MySkinManager.GiveColor('White')) else: pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),rect, 0) #aa_round_rect(self._CanvasHWND,rect, MySkinManager.GiveColor('Text'),1,0, MySkinManager.GiveColor('White')) self._BrightnessLabel.NewCoord(118,self._Parent._Screen._Height/2-30) self._BrightnessLabel.Draw(True) minus_box_rect = pygame.Rect(start_x- (4+6)*4,start_y,6*4,30) pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),minus_box_rect, 0) minus_rect = pygame.Rect(start_x-8*4,start_y+14,2*4,2) pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),minus_rect, 0) plus_box_rect = pygame.Rect(start_x + 39*4 +4*4,start_y,6*4,30) pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('Text'),plus_box_rect, 0) cross1_rect = pygame.Rect(start_x+39*4+4*4+2*4,start_y+14,2*4,2) pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),cross1_rect, 0) cross2_rect = pygame.Rect(start_x+39*4+4*4+2*4+3,start_y+14-3,2,2*4) pygame.draw.rect(self._CanvasHWND,MySkinManager.GiveColor('White'),cross2_rect, 0)
class LoadHousePage(Page): _FootMsg = ["Nav.", "", "", "Back", "Cancel"] _Value = 0 _URL = None _ListFontObj = MyLangManager.TrFont("varela18") _URLColor = MySkinManager.GiveColor('URL') _TextColor = MySkinManager.GiveColor('Text') _Caller = None _img = None _Downloader = None _DownloaderTimer = -1 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._LoadingLabel = Label() self._LoadingLabel.SetCanvasHWND(self._CanvasHWND) self._LoadingLabel.Init("Loading", self._ListFontObj) self._LoadingLabel.SetColor(self._TextColor) def OnLoadCb(self): if self._URL is None: return self._img = None self.ClearCanvas() self._Screen.Draw() self._Screen.SwapAndShow() filename = self._URL.split("/")[-1].strip() local_dir = self._URL.split("raw.githubusercontent.com") if len(local_dir) > 1: menu_file = local_dir[1] local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'), menu_file) if FileExists(local_menu_file): #load json with open(local_menu_file) as json_file: try: local_menu_json = json.load(json_file) self._Caller._MyStack.Push(local_menu_json["list"]) except: pass self.Leave() else: self._Downloader = Download(self._URL, "/tmp", None) self._Downloader.start() self._DownloaderTimer = gobject.timeout_add( 400, self.GObjectUpdateProcessInterval) def GObjectUpdateProcessInterval(self): ret = True if self._Screen.CurPage() == self: if self._Downloader._stop == True: ret = False dst_filename = self._Downloader.get_dest() if self._Downloader.isFinished(): if self._Downloader.isSuccessful(): filename = self._URL.split("/")[-1].strip() local_dir = self._URL.split("raw.githubusercontent.com") menu_file = local_dir[1] local_menu_file = "%s/aria2download%s" % ( os.path.expanduser('~'), menu_file) dl_file = os.path.join("/tmp", filename) if not os.path.exists(os.path.dirname(local_menu_file)): os.makedirs(os.path.dirname(local_menu_file)) copyfile(dl_file, local_menu_file) with open(local_menu_file) as json_file: try: local_menu_json = json.load(json_file) self._Caller._MyStack.Push(local_menu_json["list"]) except: pass ret = False self.Leave() else: self._Screen._MsgBox.SetText("Fetch house failed") self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() ret = False return ret else: return False def Leave(self): if self._DownloaderTimer != -1: 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() self._URL = None def KeyDown(self, event): if IsKeyMenuOrB(event.key): self.Leave() def Draw(self): self.ClearCanvas() self._LoadingLabel.NewCoord((Width - self._LoadingLabel._Width) / 2, (Height - 44) / 2) self._LoadingLabel.Draw() if self._img is not None: self._CanvasHWND.blit( self._img, midRect(Width / 2, (Height - 44) / 2, pygame.Surface.get_width(self._img), pygame.Surface.get_height(self._img), Width, Height - 44))
class Aria2DownloadProcessPage(Page): _FootMsg = ["Nav.", "", "Pause", "Back", "Cancel"] _DownloaderTimer = -1 _Value = 0 _GID = None _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 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 self._FileNameLabel = Label() self._FileNameLabel.SetCanvasHWND(self._CanvasHWND) self._FileNameLabel.Init("", MyLangManager.TrFont("varela12")) self._SizeLabel = Label() self._SizeLabel.SetCanvasHWND(self._CanvasHWND) self._SizeLabel.Init("0/0Kb", MyLangManager.TrFont("varela12")) self._SizeLabel.SetColor(self._URLColor) @property def GObjectUpdateProcessInterval(self): downloaded = 0 if self._Screen.CurPage() == self and self._GID is not None: self._Value = config.RPC.tellStatus(self._GID) downloaded = 0 total = 0 if self._Value["status"] == "waiting": self._FileNameLabel.SetText("waiting to download...") if self._Value["status"] == "paused": self._FileNameLabel.SetText("download paused...") if self._Value["status"] == "error": self._FileNameLabel.SetText("download errors,cancel it please") if self._Value["status"] == "active": downloaded = self._Value["completedLength"] total = self._Value["totalLength"] 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 def CheckDownload(self, aria2_gid): self._GID = aria2_gid self._DownloaderTimer = gobject.timeout_add( 234, 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() 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()
class StoragePage(Page): _Icons = {} _BGpng = None _BGwidth = 96 _BGheight = 73 _BGlabel = None _FreeLabel = None _GBmsg = "%.1fGB of %.1fGB Used" _DskUsg = None _TextColor = MySkinManager.GiveColor('Text') _FootMsg = ["Nav.", "", "", "Back", ""] def __init__(self): Page.__init__(self) self._Icons = {} def DiskUsage(self): statvfs = os.statvfs('/') total_space = (statvfs.f_frsize * statvfs.f_blocks) / 1024.0 / 1024.0 / 1024.0 avail_space = (statvfs.f_frsize * statvfs.f_bavail) / 1024.0 / 1024.0 / 1024.0 return avail_space, total_space def Init(self): self._DskUsg = self.DiskUsage() self._CanvasHWND = self._Screen._CanvasHWND self._Width = self._Screen._Width self._Height = self._Screen._Height self._GBLabel = Label() self._GBLabel.SetCanvasHWND(self._CanvasHWND) self._GBLabel.Init( self._GBmsg % (self._DskUsg[1] - self._DskUsg[0], self._DskUsg[1]), MySkinManager.GiveFont("varela11")) self._GBLabel.SetColor(self._TextColor) self._PctLabel = Label() self._PctLabel.SetCanvasHWND(self._CanvasHWND) usage_percent = (self._DskUsg[0] / self._DskUsg[1]) * 100.0 self._PctLabel.Init("%d%%" % int(usage_percent), MySkinManager.GiveFont("EurostileBold30")) self._PctLabel.SetColor(self._TextColor) self._FreeLabel = Label() self._FreeLabel.SetCanvasHWND(self._CanvasHWND) self._FreeLabel.Init("FREE", MySkinManager.GiveFont("varela12")) self._FreeLabel.SetColor(self._PctLabel._Color) def OnLoadCb(self): pass def Draw(self): self.ClearCanvas() self._PctLabel.NewCoord(32, 102 - 33) self._PctLabel.Draw() self._FreeLabel.NewCoord(33, 130 - 25) self._FreeLabel.Draw() self._GBLabel.NewCoord(145, 103 - 29) self._GBLabel.Draw() #bgcolor = (238,238,238), fgcolor = (126,206,244) usage_percent = (self._DskUsg[0] / self._DskUsg[1]) if usage_percent < 0.1: usage_percent = 0.1 rect_ = pygame.Rect(144, 118 - 25, 283 - 144, 139 - 117) pygame.draw.rect(self._CanvasHWND, MySkinManager.GiveColor('Text'), rect_, 1) rect2 = pygame.Rect(144, 118 - 25, int((283 - 144) * (1.0 - usage_percent)), 139 - 117) rect2.left = rect_.left rect2.top = rect_.top pygame.draw.rect(self._CanvasHWND, MySkinManager.GiveColor('Text'), rect2, 0) sep_rect = pygame.Rect(129, 99 - 25, 2, 42) pygame.draw.rect(self._CanvasHWND, MySkinManager.GiveColor('Text'), sep_rect, 0) ##4 cross self.DrawCross(10, 10) self.DrawCross(self._Screen._Width - 20, 10) self.DrawCross(10, self._Screen._Height - 20) self.DrawCross(self._Screen._Width - 20, self._Screen._Height - 20)