You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
8.5 KiB
291 lines
8.5 KiB
|
|
import pygame |
|
import validators |
|
import commands |
|
from UI.constants import Width,Height,ICON_TYPES,RUNSYS |
|
from UI.simple_name_space import SimpleNamespace |
|
from UI.page import Page |
|
from UI.label import Label |
|
from UI.icon_item import IconItem |
|
from UI.keys_def import CurKeys, IsKeyMenuOrB, IsKeyStartOrA |
|
from UI.skin_manager import MySkinManager |
|
from UI.lang_manager import MyLangManager |
|
|
|
from libs.DBUS import is_wifi_connected_now,get_wifi_ip |
|
from collections import deque |
|
from enum import Enum |
|
import os |
|
import subprocess |
|
import pipes |
|
|
|
class DevilutionPage(Page): |
|
_FootMsg = ["Nav","Check","Upgrade","Back","Play"] |
|
|
|
_GameName = "devilutionX" |
|
_GamePath = "/home/cpi/games/devilutionX" |
|
_GameExecutable = _GamePath + "/build/devilutionx" |
|
_GameExecutableRevision = _GameExecutable + ".rev" |
|
_GameBuildScript = _GamePath + "/Packaging/cpi-gamesh/build.sh -t " + pipes.quote(os.path.dirname(os.path.abspath( __file__ ))) |
|
_GamePNG = _GamePath + "/Packaging/cpi-gamesh/Devilution.png" |
|
_DevilutionDiabdatmpq = "/home/cpi/.local/share/diasurgical/devilution/diabdat.mpq" |
|
_DevilutionDiabdatmpqPresent = False |
|
_GameInstalled = False |
|
|
|
_CiteNewUpdate = "Ahh... fresh meat!" |
|
_CiteCheckUpdate = "Lets search the books..." |
|
_CiteWelcome = "Well, what can I do for ya?" |
|
_CiteCompiling = "Stay awhile and listen." |
|
_CiteDone = "You must venture through the portal..." |
|
_CiteFailed = "Game Over. Better luck next time!" |
|
|
|
_GitURL = "https://github.com/diasurgical/devilutionX.git" |
|
_GitBranch = "master" |
|
_GitRevision = "" |
|
|
|
_GameIcon = None |
|
|
|
_Process = None |
|
_Labels = {} |
|
_Coords = {} |
|
|
|
_ListFontObj = MyLangManager.TrFont("varela13") |
|
_URLColor = MySkinManager.GiveColor('URL') |
|
_TextColor = MySkinManager.GiveColor('Text') |
|
|
|
def __init__(self): |
|
Page.__init__(self) |
|
|
|
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 GitGetRevision(self): |
|
if not os.path.exists(self._GamePath): |
|
return "game not installed" |
|
process = subprocess.Popen("cd " + pipes.quote(self._GamePath) + "; git rev-parse HEAD",stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=True) |
|
self._GitRevision = process.communicate()[0].strip() |
|
process.wait() |
|
return self._GitRevision |
|
|
|
def ExectuableGetRevision(self): |
|
try: |
|
with open(self._GameExecutableRevision, 'r') as file: |
|
executableRevsion = file.read().replace('\n', '') |
|
return executableRevsion |
|
except: |
|
return "unknown" |
|
|
|
def InitGameDirectory(self): |
|
try: |
|
os.makedirs(self._GamePath) |
|
except: |
|
pass |
|
self.StartShellProcess("cd " + pipes.quote(self._GamePath) + "; git clone --single-branch --branch " + pipes.quote(self._GitBranch) + " " + pipes.quote(self._GitURL) + " .") |
|
|
|
def CheckDevilutionMPQ(self): |
|
self._DevilutionDiabdatmpqPresent = os.path.isfile(self._DevilutionDiabdatmpq) |
|
|
|
def CheckGameInstalled(self): |
|
self._GameInstalled = os.path.isfile(self._GameExecutable) |
|
|
|
def UpdateFootMsg(self): |
|
if not self._GameInstalled: |
|
self._FootMsg = ["Nav","","Install","Back",""] |
|
self.UpdateLabel("status", "GIT Upgrade") |
|
self.UpdateLabel("comment", "Press X to install") |
|
elif not self._DevilutionDiabdatmpqPresent: |
|
self._FootMsg = ["Nav","","Upgrade","Back","Re-check"] |
|
self.UpdateLabel("status", "Gamefile diabdat.mpq missing") |
|
self.UpdateLabel("comment", "see readme") |
|
else: |
|
self._FootMsg = ["Nav","","Upgrade","Back","Play"] |
|
self.UpdateLabel("status", "Ready") |
|
self.UpdateLabel("comment", self._CiteDone) |
|
|
|
def Init(self): |
|
Page.Init(self) |
|
|
|
if self._Screen != None: |
|
if self._Screen._CanvasHWND != None and self._CanvasHWND == None: |
|
self._HWND = self._Screen._CanvasHWND |
|
self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._Screen._Height) ) |
|
|
|
if os.path.isfile(self._GamePNG): |
|
self._GameIcon = IconItem() |
|
self._GameIcon._ImageName = self._GamePNG |
|
self._GameIcon._MyType = ICON_TYPES["STAT"] |
|
self._GameIcon._Parent = self |
|
self._GameIcon.Adjust(290,70,128,128,0) |
|
|
|
self.InitLabels() |
|
self.CheckDevilutionMPQ() |
|
self.CheckGameInstalled() |
|
self.UpdateFootMsg() |
|
|
|
self.UpdateLabel("content_git_rev", self.GitGetRevision(), 24) |
|
self.UpdateLabel("content_bin_rev", self.ExectuableGetRevision(), 24) |
|
|
|
def UpdateLabel(self, label, msg, maxLen=38): |
|
print(label + ": " + msg) |
|
if len(msg) > maxLen: |
|
m = msg[:maxLen] + "..." |
|
else: |
|
m = msg |
|
self._Labels[label].SetText(m) |
|
|
|
def StartShellProcess(self, cmd): |
|
print("StartShellProcess " + cmd) |
|
proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=True) |
|
while(True): |
|
line = proc.stdout.readline() |
|
if line: |
|
self.UpdateLabel("console_out", line.strip(), 48) |
|
self._Screen.Draw() |
|
self._Screen.SwapAndShow() |
|
if line == '' and proc.poll() is not None: |
|
break |
|
self.UpdateLabel("console_out", "") |
|
self._Screen.Draw() |
|
self._Screen.SwapAndShow() |
|
|
|
def GitUpgrade(self): |
|
self.UpdateLabel("status", "GIT Upgrade") |
|
self.UpdateLabel("comment", self._CiteCheckUpdate) |
|
|
|
curRev = "unset" |
|
if not os.path.exists(self._GamePath): |
|
self.InitGameDirectory() |
|
else: |
|
curRev = self.GitGetRevision() |
|
self.StartShellProcess("cd " + pipes.quote(self._GamePath) + "; git pull") |
|
|
|
self._GitRevision = self.GitGetRevision() |
|
self.UpdateLabel("content_git_rev", self._GitRevision, 24) |
|
|
|
if curRev != self._GitRevision: |
|
self.UpdateLabel("comment", self._CiteNewUpdate) |
|
else: |
|
self.UpdateLabel("comment", self._CiteDone) |
|
|
|
self._Screen.Draw() |
|
self._Screen.SwapAndShow() |
|
|
|
def GitExectuableIsGitRevision(self): |
|
return self.GitGetRevision() == self.ExectuableGetRevision() |
|
|
|
def Build(self): |
|
self.UpdateLabel("status", "Building") |
|
self.StartShellProcess(self._GameBuildScript) |
|
|
|
def UpgradeAndBuild(self): |
|
self.GitUpgrade() |
|
self.UpdateLabel("comment", self._CiteCompiling) |
|
self._Screen.Draw() |
|
self._Screen.SwapAndShow() |
|
if not self.GitExectuableIsGitRevision(): |
|
self.Build() |
|
|
|
self.UpdateLabel("content_git_rev", self.GitGetRevision(), 24) |
|
self.UpdateLabel("content_bin_rev", self.ExectuableGetRevision(), 24) |
|
|
|
self.UpdateLabel("status", "Done") |
|
if self.GitExectuableIsGitRevision(): |
|
self.UpdateLabel("comment", self._CiteDone) |
|
else: |
|
self.UpdateLabel("comment", self._CiteFailed) |
|
|
|
self.CheckDevilutionMPQ() |
|
self.CheckGameInstalled() |
|
self.UpdateFootMsg() |
|
|
|
self._Screen.Draw() |
|
self._Screen.SwapAndShow() |
|
|
|
def KeyDown(self,event): |
|
|
|
if IsKeyMenuOrB(event.key): |
|
self.ReturnToUpLevelPage() |
|
self._Screen.Draw() |
|
self._Screen.SwapAndShow() |
|
|
|
if self._DevilutionDiabdatmpqPresent and self._GameInstalled: |
|
if IsKeyStartOrA(event.key): |
|
pygame.event.post( pygame.event.Event(RUNSYS, message=self._GameExecutable)) |
|
if event.key == CurKeys["X"]: |
|
self.UpgradeAndBuild() |
|
elif not self._GameInstalled: |
|
if event.key == CurKeys["X"]: |
|
self.UpgradeAndBuild() |
|
elif not self._DevilutionDiabdatmpqPresent: |
|
if IsKeyStartOrA(event.key): |
|
self.CheckDevilutionMPQ() |
|
self.CheckGameInstalled() |
|
self.UpdateFootMsg() |
|
self._Screen.Draw() |
|
self._Screen.SwapAndShow() |
|
|
|
def Draw(self): |
|
self.ClearCanvas() |
|
|
|
if self._GameIcon != None: |
|
self._GameIcon.Draw() |
|
|
|
for i in self._Labels: |
|
if i in self._Coords: |
|
self._Labels[i].NewCoord( self._Coords[i].x, self._Coords[i].y) |
|
self._Labels[i].Draw() |
|
|
|
if self._HWND != None: |
|
self._HWND.fill(MySkinManager.GiveColor('White')) |
|
self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) |
|
|
|
|
|
class APIOBJ(object): |
|
|
|
_Page = None |
|
def __init__(self): |
|
pass |
|
def Init(self,main_screen): |
|
self._Page = DevilutionPage() |
|
self._Page._Screen = main_screen |
|
self._Page._Name ="devilutionX" |
|
self._Page.Init() |
|
|
|
def API(self,main_screen): |
|
if main_screen !=None: |
|
main_screen.PushPage(self._Page) |
|
main_screen.Draw() |
|
main_screen.SwapAndShow() |
|
|
|
OBJ = APIOBJ() |
|
def Init(main_screen): |
|
OBJ.Init(main_screen) |
|
def API(main_screen): |
|
OBJ.API(main_screen)
|
|
|