mirror of
https://github.com/FAUSheppy/homelab_gamevault
synced 2025-12-05 22:51:34 +01:00
feat: implement substitute/absolute paths
This commit is contained in:
@@ -4,6 +4,7 @@ import customtkinter
|
|||||||
import imagetools
|
import imagetools
|
||||||
import os
|
import os
|
||||||
import statekeeper
|
import statekeeper
|
||||||
|
import localaction
|
||||||
|
|
||||||
def show_large_picture(app, path):
|
def show_large_picture(app, path):
|
||||||
'''Show a full-window version of the clicked picture'''
|
'''Show a full-window version of the clicked picture'''
|
||||||
@@ -159,7 +160,8 @@ def create_details_page(app, software, backswitch_function, infowidget_window):
|
|||||||
# install button #
|
# install button #
|
||||||
print(software.run_exe)
|
print(software.run_exe)
|
||||||
print(os.path.join(software.backend.install_dir, software.run_exe or ""))
|
print(os.path.join(software.backend.install_dir, software.run_exe or ""))
|
||||||
if not software.run_exe or not (os.path.isfile(software.run_exe)
|
if not software.run_exe or not (os.path.isfile(software.run_exe)
|
||||||
|
or localaction.check_substitute_path_exists(software.run_exe)
|
||||||
or os.path.isfile(os.path.join(software.backend.install_dir, software.title, software.run_exe))):
|
or os.path.isfile(os.path.join(software.backend.install_dir, software.title, software.run_exe))):
|
||||||
run_button.configure(state=tkinter.DISABLED)
|
run_button.configure(state=tkinter.DISABLED)
|
||||||
run_button.configure(fg_color="gray")
|
run_button.configure(fg_color="gray")
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
import win32com.client
|
||||||
|
import pythoncom
|
||||||
|
|
||||||
# windows imports #
|
# windows imports #
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
@@ -43,6 +45,19 @@ def resolve_lnk(lnk_file_path):
|
|||||||
else:
|
else:
|
||||||
return lnk_file_path # not required on linux
|
return lnk_file_path # not required on linux
|
||||||
|
|
||||||
|
def substitute_win_paths(path):
|
||||||
|
|
||||||
|
pythoncom.CoInitialize()
|
||||||
|
shell = win32com.client.Dispatch("WScript.Shell")
|
||||||
|
common_programs = shell.SpecialFolders("AllUsersPrograms")
|
||||||
|
path = path.replace("%ProgramData%", common_programs)
|
||||||
|
return path
|
||||||
|
|
||||||
|
def check_substitute_path_exists(path):
|
||||||
|
|
||||||
|
if "%" in path:
|
||||||
|
return os.path.isfile(substitute_win_paths(path))
|
||||||
|
|
||||||
def run_exe(path, synchronous=False):
|
def run_exe(path, synchronous=False):
|
||||||
'''Launches a given software'''
|
'''Launches a given software'''
|
||||||
|
|
||||||
@@ -65,13 +80,23 @@ def run_exe(path, synchronous=False):
|
|||||||
if synchronous:
|
if synchronous:
|
||||||
raise NotImplementedError("SYNC not yet implemented")
|
raise NotImplementedError("SYNC not yet implemented")
|
||||||
|
|
||||||
|
print("Raw paths:", paths)
|
||||||
|
|
||||||
|
# substitute program data #
|
||||||
|
paths = [ substitute_win_paths(p) for p in paths ]
|
||||||
|
|
||||||
|
# substituted paths #
|
||||||
|
print("Subs paths:", paths)
|
||||||
|
|
||||||
|
# resolve links #
|
||||||
paths = [resolve_lnk(p) if p.endswith(".lnk") else p for p in paths]
|
paths = [resolve_lnk(p) if p.endswith(".lnk") else p for p in paths]
|
||||||
|
|
||||||
print("Executing:", paths)
|
print("Executing prepared:", paths)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if paths[0].endswith(".reg"):
|
if paths[0].endswith(".reg"):
|
||||||
raise OSError("WinError 740")
|
raise OSError("WinError 740")
|
||||||
|
path = paths[0].replace("\\\\", "\\")
|
||||||
subprocess.Popen(path, cwd=os.path.dirname(paths[0])) # TODO fix this BS
|
subprocess.Popen(path, cwd=os.path.dirname(paths[0])) # TODO fix this BS
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
if "WinError 740" in str(e):
|
if "WinError 740" in str(e):
|
||||||
|
|||||||
@@ -184,8 +184,10 @@ class Software:
|
|||||||
s.install()
|
s.install()
|
||||||
|
|
||||||
# run installer if set #
|
# run installer if set #
|
||||||
|
print("self.installer", self.installer)
|
||||||
if self.installer:
|
if self.installer:
|
||||||
installer_path = os.path.join(self.backend.install_dir, self.title, self.installer)
|
installer_path = os.path.join(self.backend.install_dir, self.title, self.installer)
|
||||||
|
print("installer path in if", installer_path)
|
||||||
if os.name != "nt" and not os.path.isabs(installer_path):
|
if os.name != "nt" and not os.path.isabs(installer_path):
|
||||||
# need abs path for wine #
|
# need abs path for wine #
|
||||||
installer_path = os.path.join(os.getcwd(), installer_path)
|
installer_path = os.path.join(os.getcwd(), installer_path)
|
||||||
@@ -228,6 +230,9 @@ class Software:
|
|||||||
|
|
||||||
if self.run_exe:
|
if self.run_exe:
|
||||||
if os.name == "nt" or not ".lnk" in self.run_exe:
|
if os.name == "nt" or not ".lnk" in self.run_exe:
|
||||||
localaction.run_exe(os.path.join(self.backend.install_dir, self.title, self.run_exe))
|
if self.run_exe.startswith("%") or self.run_exe[1] == ":":
|
||||||
|
localaction.run_exe(self.run_exe)
|
||||||
|
else:
|
||||||
|
localaction.run_exe(os.path.join(self.backend.install_dir, self.title, self.run_exe))
|
||||||
else:
|
else:
|
||||||
localaction.run_exe(self.run_exe)
|
localaction.run_exe(self.run_exe)
|
||||||
|
|||||||
Reference in New Issue
Block a user