diff --git a/assets/styles/minecraft.qss b/assets/styles/minecraft.qss index a6c0b43..f1540ab 100644 --- a/assets/styles/minecraft.qss +++ b/assets/styles/minecraft.qss @@ -1,6 +1,5 @@ * { font-family : "Monocraft"; - background-image : ":/assets/background.png" } QLabel:disabled { diff --git a/pyproject.toml b/pyproject.toml index da1b865..66ba26d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "LCE-Qt-Launcher" -version = "26.4.2a1" +version = "26.4.3a1" description = "This is a custom Free/Libre Minecraft LCE Launcher written in Python and Qt. (Nighly Build)" requires-python = ">3.10, <3.13" license = "GPL-3.0-or-later" @@ -33,18 +33,10 @@ artifacts = [ "src/res_rc.py", ] -[tool.nuitka] -product-name = "LCE-Qt-Launcher" -include-distribution-metadata = "LCE-Qt-Launcher" -include-module = [ - "res_rc", - "ui_form", - "ui_system_info" -] - [tool.pyside6-project] files = [ "src/lce_qt_launcher/__init__.py", + "src/lce_qt_launcher/app.py", "src/lce_qt_launcher/build_info.py", "src/lce_qt_launcher/preferences.py", "src/lce_qt_launcher/downloader.py", @@ -55,6 +47,7 @@ files = [ "src/lce_qt_launcher/utils.py", "src/lce_qt_launcher/term_service.py", "src/lce_qt_launcher/features.py", + "src/lce_qt_launcher/gui/launcher.py", "src/lce_qt_launcher/gui/__init__.py", "src/lce_qt_launcher/gui/setting_dialog.py", "src/lce_qt_launcher/gui/browser_dialog.py", diff --git a/src/form.ui b/src/form.ui index 8c25a6f..0952631 100644 --- a/src/form.ui +++ b/src/form.ui @@ -217,16 +217,16 @@ - false + true - Open Instances Editor (Coming Soon) + Open Instances Editor false - true + false false diff --git a/src/lce_qt_launcher/app.py b/src/lce_qt_launcher/app.py new file mode 100644 index 0000000..f78287d --- /dev/null +++ b/src/lce_qt_launcher/app.py @@ -0,0 +1,49 @@ +from PySide6.QtWidgets import ( + QApplication, + QMessageBox, +) +from PySide6.QtCore import ( + QFile, + QIODevice +) + +from lce_qt_launcher.gui.theme import Theme +from lce_qt_launcher.gui.launcher import Launcher +from lce_qt_launcher.app_context import AppContext + +import lce_qt_launcher.utils as utils +import lce_qt_launcher.term_service as term_service + +import os + +class App(QApplication): + def __init__(self, + theme : Theme, + launcher_ui : object, + sys_diag_ui : object, + instance_editor_ui : object, + appContext : AppContext, + argv : list ): + super().__init__(argv) + self.appContext = appContext + + _ = self.setStyle("Fusion") + + self.widget = Launcher(self.appContext, launcher_ui, sys_diag_ui, instance_editor_ui, self) + self.widget.show() + + try: + theme_file : str = theme.value if theme is not None else Theme.MINECRAFT + file = QFile(theme_file) + if file.open(QIODevice.OpenModeFlag.ReadOnly | QIODevice.OpenModeFlag.Text): + content = file.readAll() + stylesheet = str(content, encoding='utf-8') # pyright: ignore[reportArgumentType] + self.setStyleSheet(stylesheet) + except FileNotFoundError: + print(FileNotFoundError.with_traceback) + term_service.print_warning("Theme ({theme}) not found in ressource, searching in the local storage.") + try: + with open(os.path.join(utils.get_assets_dir(), "styles", "minecraft.qss"), "r") as file: + self.setStyleSheet(file.read()) + except FileNotFoundError: + _ = QMessageBox.warning(None,"Error", f"{theme} file not found. Reverting to default theme") \ No newline at end of file diff --git a/src/lce_qt_launcher/app_context.py b/src/lce_qt_launcher/app_context.py new file mode 100644 index 0000000..0cd1ad3 --- /dev/null +++ b/src/lce_qt_launcher/app_context.py @@ -0,0 +1,32 @@ +from lce_qt_launcher.preferences import UserPref +from lce_qt_launcher.build_info import BuildInfo +from lce_qt_launcher.managers.instance_manager import InstanceManager, Instance +from lce_qt_launcher.gui.theme import Theme +from lce_qt_launcher.json_trans import JsonTrans + +_default_instance : Instance = Instance() +_default_theme : Theme = Theme.MINECRAFT +_default_language : str = "en" + +class AppContext(): + def __init__(self, theme = _default_theme, instance = _default_instance , lang : str = _default_language): + self.buildInfo = BuildInfo() + self.sys_man = self.buildInfo.system_manager + self.userPref = UserPref(self.buildInfo) + self.instanceMan = InstanceManager(instance, self.buildInfo) + self.theme = theme + self.translator = JsonTrans(lang) + + self.BACKGROUND_PIXMAP_IMG = ":/assets/background.png" + self.ICON = ":/assets/launcher_small.png" + self.MINECRAFT_WEBSITE = "https://minecraft.net" + self.MINECRAFT_LCE_WEBSITE = "https://minecraftlegacy.com/" + + def updateTheme(self, theme : Theme): + self.theme = theme + + def updateInstance(self, instnce : Instance): + self.instanceMan.load_instance(instnce) + + def updateLanguage(self, lang : str): + self.translator.load_lang(lang) \ No newline at end of file diff --git a/src/lce_qt_launcher/cli.py b/src/lce_qt_launcher/cli.py index 306c670..abd7fbd 100644 --- a/src/lce_qt_launcher/cli.py +++ b/src/lce_qt_launcher/cli.py @@ -1,6 +1,8 @@ from lce_qt_launcher.managers.instance_manager import InstanceManager from lce_qt_launcher.build_info import BuildInfo +from lce_qt_launcher.cmd_arg import CmdArgAction +import lce_qt_launcher.features as features import lce_qt_launcher.term_service as term_service MENU_STR = """ @@ -9,6 +11,22 @@ MENU_STR = """ 3. [bold red] Others : Coming Soon ! [/bold red] """ +def parse_cmd_arg(action, appContext): + if action == CmdArgAction.GEN_CONFIG: + features.generate_user_config(appContext.userPref) + if action == CmdArgAction.PRINT_LICENSE: + features.display_license(appContext.buildInfo) + if action == CmdArgAction.PRINT_HELP: + features.display_help(appContext.translator.translate("help-message")) + if action == CmdArgAction.PRINT_ABOUT_INFO: + features.display_about(appContext.translator.translate("about_message")) + if action == CmdArgAction.PRINT_VERSION: + features.display_version(appContext.buildInfo) + if action == CmdArgAction.CLI_VERSION: + features.launch_cli_interface(appContext.instanceManager) + else: + term_service.print_information("Not Implemented Yet!") + def launch_cli(instance_man : InstanceManager, build_info : BuildInfo, argv : set = {}): term_service.print_pretty(build_info.app_name) diff --git a/src/lce_qt_launcher/features.py b/src/lce_qt_launcher/features.py index 4de49ef..5691573 100644 --- a/src/lce_qt_launcher/features.py +++ b/src/lce_qt_launcher/features.py @@ -1,5 +1,4 @@ from PySide6.QtWidgets import( - QApplication, QMainWindow, QLabel, QProgressBar, @@ -22,7 +21,6 @@ from lce_qt_launcher.gui.setting_dialog import SettingDialog from lce_qt_launcher.preferences import UserPref from lce_qt_launcher.build_info import BuildInfo from lce_qt_launcher.managers.instance_manager import InstanceManager, Instance -from main import buildInfo def install_game(parent : QWidget, instance : Instance, instanceManager : InstanceManager) -> None: button_reply = QMessageBox.question(parent, 'Confirm Installation', @@ -56,6 +54,9 @@ def show_setting(parent : QWidget) -> None: def show_system_info(parent : QWidget) -> None: parent.sysinfo_dialog.show() +def show_instance_editor(parent : QWidget) -> None: + parent.instance_window.show() + def load_instance(parent : QWidget, instanceManager : InstanceManager, buildInfo : BuildInfo) -> None: file_name: str = QFileDialog.getSaveFileName(parent, "Set the instance save file path to load", f"{buildInfo.system_manager.found_default_save_path }(\"LCE Instance Save File\" (*{buildInfo.instance_extension}))")[0] instanceManager.load_instance(file_name) diff --git a/src/lce_qt_launcher/gui/launcher.py b/src/lce_qt_launcher/gui/launcher.py new file mode 100644 index 0000000..b6b62d5 --- /dev/null +++ b/src/lce_qt_launcher/gui/launcher.py @@ -0,0 +1,129 @@ +from PySide6.QtWidgets import ( + QApplication, + QMainWindow, + QLabel, + QDialog, + QWidget +) +from PySide6.QtGui import ( + QPalette, + QPixmap, + QBrush +) +from PySide6.QtCore import ( + qVersion, +) + +from lce_qt_launcher.app_context import AppContext + +import lce_qt_launcher.term_service as term_service +import lce_qt_launcher.features as features + +import sys + +class Launcher(QMainWindow): + def __init__(self, appContext : AppContext, launcher_ui : object, sys_dialog_ui: object, instance_ui_editor: object, app : QApplication, parent=None) -> None: + super().__init__(parent) + + translator = appContext.translator + + instanceManager = appContext.instanceMan + + buildInfo = appContext.buildInfo + + STARTING_GAME_MSG = translator.translate("start_game_msg") + + def gen_inst_from_form(): + instanceManager.instance = features.new_instance_from_form(self) + + def confirm_changes_button(): + gen_inst_from_form(self) + + def update_page(): + features.show_webbrowser(self, buildInfo.git_repo_url, buildInfo) + + def launch(): + features.launch_game(instanceManager, STARTING_GAME_MSG) + + def install(): + features.install_game(self, instanceManager.instance, instanceManager) + + def show_aboutQt() -> None: + features.show_about_qt(self) + + def show_about() -> None: + features.show_about_app(self, buildInfo, appContext.ICON) + + def show_system_information() -> None: + features.show_system_info(self) + + def show_about_minecraft() -> None: + features.show_webbrowser(self, appContext.MINECRAFT_WEBSITE, buildInfo) + + def show_more_lce_projects() -> None: + features.show_webbrowser(self, appContext.MINECRAFT_LCE_WEBSITE, buildInfo) + + def save_instance() -> None: + features.save_instance(self, instanceManager, buildInfo) + + def load_instance() -> None: + features.load_instance(self, instanceManager, buildInfo) + + def show_setting_dialog() -> None: + features.show_setting(self) + + def show_instance_editor() -> None: + features.show_instance_editor(self) + + background_pixmap = QPixmap(appContext.BACKGROUND_PIXMAP_IMG) + if not background_pixmap.isNull(): + palette = self.palette() + palette.setBrush(QPalette.ColorRole.Window, QBrush(background_pixmap)) + self.setPalette(palette) + self.setAutoFillBackground(True) + else: + term_service.print_error("Cannot set the background") + + self.ui = launcher_ui() + + self.ui.setupUi(self) + + self.sysinfo_dialog = QDialog() + self.dialog_ui = sys_dialog_ui() + self.dialog_ui.setupUi(self.sysinfo_dialog) + + self.instance_window = QMainWindow() + self.instance_editor = instance_ui_editor() + self.instance_editor.setupUi(self.instance_window) + + systemManager = buildInfo.system_manager + + self.dialog_ui.appVersion.setText(f"{buildInfo.app_name} Version {buildInfo.version_type} {buildInfo.version}") + self.dialog_ui.qVersionLabel.setText(f"Qt Version {qVersion()}") + self.dialog_ui.pyVersionLabel.setText(f"Python Version : {sys.version}") + self.dialog_ui.osInfoLabel.setText(f"OS : {systemManager.name} \n Version : {systemManager.version}") + self.dialog_ui.pluginsInfoLabel.setText("") + self.dialog_ui.runnersLabel.setText("") + + self.ui.progressLabel.setVisible(False) + self.ui.progressBar.setVisible(False) + self.ui.progressBar.setEnabled(False) + + _ = self.ui.playButton.clicked.connect(launch) + _ = self.ui.installButton.clicked.connect(install) + _ = self.ui.confirmChangesButton.clicked.connect(confirm_changes_button) + _ = self.ui.settingButton.clicked.connect(show_setting_dialog) + _ = self.ui.openInstanceEditor.clicked.connect(show_instance_editor) + + _ = self.ui.actionQuit.triggered.connect(app.quit) + _ = self.ui.actionUpdate.triggered.connect(update_page) + _ = self.ui.actionSystem_Information.triggered.connect(show_system_information) + _ = self.ui.actionAbout.triggered.connect(show_about) + _ = self.ui.actionAbout_QT.triggered.connect(show_aboutQt) + _ = self.ui.actionAbout_Minecraft.triggered.connect(show_about_minecraft) + _ = self.ui.actionMore_Minecraft_LCE_Projects.triggered.connect(show_more_lce_projects) + _ = self.ui.actionSave.triggered.connect(save_instance) + _ = self.ui.actionImport_Instance.triggered.connect(load_instance) + + self.versionlabel = QLabel(f"Version {buildInfo.version}") + self.ui.statusbar.addPermanentWidget(self.versionlabel) \ No newline at end of file diff --git a/src/lce_qt_launcher/managers/instance_manager.py b/src/lce_qt_launcher/managers/instance_manager.py index 960f62d..87b83c4 100644 --- a/src/lce_qt_launcher/managers/instance_manager.py +++ b/src/lce_qt_launcher/managers/instance_manager.py @@ -1,10 +1,9 @@ -from enum import Enum - from lce_qt_launcher.downloader import Downloader from lce_qt_launcher.build_info import BuildInfo import lce_qt_launcher.term_service as term_service +from enum import Enum from subprocess import TimeoutExpired import subprocess diff --git a/src/lce_qt_launcher/managers/system_manager.py b/src/lce_qt_launcher/managers/system_manager.py index 8e44456..7faff3a 100644 --- a/src/lce_qt_launcher/managers/system_manager.py +++ b/src/lce_qt_launcher/managers/system_manager.py @@ -46,8 +46,19 @@ class SystemManager(): self.type = OperatingSystemType.UNKNOWN self.name = self.type.name self.version = platform.version() - + def adapt_qt_system_theme(self): + if platform.system() == "Linux": + _LINUX_QT6_PATH = "/usr/lib/qt6/plugins" + os.environ["QT_PLUGIN_PATH"] = _LINUX_QT6_PATH + + if platform.system() == "FreeBSD": + _FREEBSD_QT6_PATH = "/usr/local/lib/qt6/plugins" + os.environ["QT_PLUGIN_PATH"] = _FREEBSD_QT6_PATH + + if os.name == "nt": + os.environ["QT_QPA_PLATFORM"] = "windows:darkmode=2" + def set_file_permission(self, file_abs_path : str) -> str: if self.type in [OperatingSystemType.LINUX, OperatingSystemType.FREEBSD, OperatingSystemType.MACOS]: curr_perm = os.stat(file_abs_path) diff --git a/src/lce_qt_launcher/preferences.py b/src/lce_qt_launcher/preferences.py index dade2a4..4a5fdb0 100644 --- a/src/lce_qt_launcher/preferences.py +++ b/src/lce_qt_launcher/preferences.py @@ -1,21 +1,45 @@ from PySide6.QtCore import QSettings +from lce_qt_launcher.build_info import BuildInfo from lce_qt_launcher.gui.theme import Theme +import lce_qt_launcher.utils as utils + _THEME_OPTION : str = "customisation/theme" +_INSTANCE_PATH_OPTION : str = "preferences/default_path" + +_LANGUAGE_OPTION : str = "preferences/languages" + class UserPref (QSettings): - def __init__(self): + def __init__(self, build_info : BuildInfo): + super().__init__(QSettings.NativeFormat, QSettings.UserScope, "Xgui4", build_info.app_name) self.default_theme = Theme.MINECRAFT - super().__init__(QSettings.NativeFormat, QSettings.UserScope, "Xgui4", "LCE-QT-Laucher") + self.default_instance_path = utils.get_source_dir() + self.defaul_language = "en" def set_theme_pref(self, theme : str): super().setValue(_THEME_OPTION, theme) super().sync() def get_theme_pref(self) -> str: - return self.value(_THEME_OPTION, self.default_theme); + return self.value(_THEME_OPTION, self.default_theme) + + def set_language_pref(self, language : str): + super().setValue(_LANGUAGE_OPTION, language) + super().sync() + + def get_language_pref(self) -> str: + return self.value(_LANGUAGE_OPTION, self.default_theme) + + def set_instance_path_pref(self, instance_path : str): + super().setValue(_INSTANCE_PATH_OPTION, instance_path) + super().sync() + + def get_instance_path(self) -> str: + return self.value(_INSTANCE_PATH_OPTION, self.default_instance_path) def generate_default_config(self): super().setValue(_THEME_OPTION, self.default_theme) + super().setValue(_INSTANCE_PATH_OPTION, self.default_instance_path) super().sync() diff --git a/src/lce_qt_launcher/utils.py b/src/lce_qt_launcher/utils.py index 9002155..68c3659 100644 --- a/src/lce_qt_launcher/utils.py +++ b/src/lce_qt_launcher/utils.py @@ -1,5 +1,6 @@ import os -import sys + +from lce_qt_launcher.gui.theme import Theme from pathlib import Path diff --git a/src/main.py b/src/main.py index d9b18fa..040f973 100755 --- a/src/main.py +++ b/src/main.py @@ -6,226 +6,63 @@ # nuitka-project: --include-data-dir=assets=assets # nuitka-project: --include-qt-plugins=sensible # nuitka-project: --windows-console-mode=force -# nuitka-project: --product-version="0.26.4.2" -# nuitka-project: --file-version="0.26.4.2" +# nuitka-project: --product-version="0.26.4.3" +# nuitka-project: --file-version="0.26.4.3" +# nuitka-project: --include-distribution-metadata=LCE-Qt-Launcher +# nuitka-project: --project-name=LCE-Qt-Launcher # nuitka-project: --file-description="Custom Free/Libre Minecraft LCE Launcher (Nightly)" # nuitka-project: --copyright="Copyleft Xgui4 2026 (GPLv3)" -from PySide6.QtWidgets import ( - QApplication, - QMainWindow, - QLabel, - QDialog, - QMessageBox, - QFileDialog, - QWidget -) -from PySide6.QtGui import ( - QPalette, - QPixmap, - QBrush -) -from PySide6.QtCore import ( - qVersion, - QFile, - QIODevice -) +from PySide6.QtWidgets import QMainWindow + +from PySide6.QtWidgets import QMessageBox, QFileDialog -from lce_qt_launcher.preferences import UserPref -from lce_qt_launcher.build_info import BuildInfo -from lce_qt_launcher.managers.instance_manager import InstanceManager, Instance from lce_qt_launcher.cmd_arg import CmdArgAction, parse_args, argsDetected -from lce_qt_launcher.gui.theme import Theme -from lce_qt_launcher.json_trans import JsonTrans +from lce_qt_launcher.app_context import AppContext +from lce_qt_launcher.app import App +from lce_qt_launcher.cli import parse_cmd_arg -import lce_qt_launcher.term_service as term_service -import lce_qt_launcher.features as features -import lce_qt_launcher.utils as utils - -import platform import sys import os -userPref = UserPref() -buildInfo = BuildInfo() - -translator = JsonTrans() - -defaultInstance = Instance() -instanceManager = InstanceManager(defaultInstance, buildInfo) - -BACKGROUND_PIXMAP_IMG = ":/assets/background.png" -ICON = ":/assets/launcher_small.png" -MINECRAFT_WEBSITE = "https://minecraft.net" -MINECRAFT_LCE_WEBSITE = "https://minecraftlegacy.com/" - -theme : Theme = Theme.MINECRAFT - -if platform.system() == "Linux": - _LINUX_QT6_PATH = "/usr/lib/qt6/plugins" - os.environ["QT_PLUGIN_PATH"] = _LINUX_QT6_PATH - -if platform.system() == "FreeBSD": - _FREEBSD_QT6_PATH = "/usr/local/lib/qt6/plugins" - os.environ["QT_PLUGIN_PATH"] = _FREEBSD_QT6_PATH - -os.environ["QTWEBENGINE_DISABLE_SANDBOX"] = "1" - -PLAY_BUTTON_LABEL = "play" - -HELP_STR = "help-message" - -ABOUT_STR = "about-message" - -INSTANCE_MANAGER_LABEL = translator.translate("instance_manager_label") -SAVE_INSTANCE_MSG_BOX_LABEL = translator.translate("save_instance_msg_box_label") -STARTING_GAME_MSG = translator.translate("start_game_msg") - -SAVE_FILEDIALOG_TITLE = "save_filedialog_title" - -QUESTIONS_OPTIONS = QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - from ui_form import Ui_launcher +from ui_instance import Ui_InstancesEditor from ui_system_info import Ui_sys_info_dialog -def gen_inst_from_form(parent : QWidget): - instanceManager.instance = features.new_instance_from_form(parent) - -def about_to_quit_event(): - anwser = QMessageBox.question(None, INSTANCE_MANAGER_LABEL, SAVE_INSTANCE_MSG_BOX_LABEL, QUESTIONS_OPTIONS) - if anwser == QMessageBox.StandardButton.Yes: - file_name: str = QFileDialog.getSaveFileName(None, SAVE_FILEDIALOG_TITLE, f"{buildInfo.system_manager.found_default_save_path }(\"LCE Instance Save File\" (*{buildInfo.instance_extension}))")[0] - instanceManager.save_instance(file_name) - -class launcher(QMainWindow): - def confirm_changes_button(self): - gen_inst_from_form(self) - - def update_page(self): - features.show_webbrowser(self, buildInfo.git_repo_url, buildInfo) - - def launch(self): - features.launch_game(instanceManager, STARTING_GAME_MSG) - - def install(self): - features.install_game(self, defaultInstance, instanceManager) - - def show_aboutQt(self) -> None: - features.show_about_qt(self) - - def show_about(self) -> None: - features.show_about_app(self, buildInfo, ICON) - - def show_system_information(self) -> None: - features.show_system_info(self) - - def show_about_minecraft(self) -> None: - features.show_webbrowser(self, MINECRAFT_WEBSITE, buildInfo) - - def show_more_lce_projects(self) -> None: - features.show_webbrowser(self, MINECRAFT_LCE_WEBSITE, buildInfo) - - def save_instance(self) -> None: - features.save_instance(self, instanceManager, buildInfo) - - def load_instance(self) -> None: - features.load_instance(self, instanceManager, buildInfo) - - def show_setting_dialog(self) -> None: - features.show_setting(self) - - def __init__(self, parent=None) -> None: - super().__init__(parent) - - background_pixmap = QPixmap(BACKGROUND_PIXMAP_IMG) - if not background_pixmap.isNull(): - palette = self.palette() - palette.setBrush(QPalette.ColorRole.Window, QBrush(background_pixmap)) - self.setPalette(palette) - self.setAutoFillBackground(True) - else: - term_service.print_error("Cannot set the background") - - self.ui = Ui_launcher() - - self.ui.setupUi(self) - - self.sysinfo_dialog = QDialog() - self.dialog_ui = Ui_sys_info_dialog() - self.dialog_ui.setupUi(self.sysinfo_dialog) - - systemManager = buildInfo.system_manager - - self.dialog_ui.appVersion.setText(f"{buildInfo.app_name} Version {buildInfo.version_type} {buildInfo.version}") - self.dialog_ui.qVersionLabel.setText(f"Qt Version {qVersion()}") - self.dialog_ui.pyVersionLabel.setText(f"Python Version : {sys.version}") - self.dialog_ui.osInfoLabel.setText(f"OS : {systemManager.name} \n Version : {systemManager.version}") - self.dialog_ui.pluginsInfoLabel.setText("") - self.dialog_ui.runnersLabel.setText("") - - self.ui.progressLabel.setVisible(False) - self.ui.progressBar.setVisible(False) - self.ui.progressBar.setEnabled(False) - - _ = self.ui.playButton.clicked.connect(self.launch) - _ = self.ui.installButton.clicked.connect(self.install) - _ = self.ui.confirmChangesButton.clicked.connect(self.confirm_changes_button) - _ = self.ui.settingButton.clicked.connect(self.show_setting_dialog) - - _ = self.ui.actionQuit.triggered.connect(app.quit) - _ = self.ui.actionUpdate.triggered.connect(self.update_page) - _ = self.ui.actionSystem_Information.triggered.connect(self.show_system_information) - _ = self.ui.actionAbout.triggered.connect(self.show_about) - _ = self.ui.actionAbout_QT.triggered.connect(self.show_aboutQt) - _ = self.ui.actionAbout_Minecraft.triggered.connect(self.show_about_minecraft) - _ = self.ui.actionMore_Minecraft_LCE_Projects.triggered.connect(self.show_more_lce_projects) - _ = self.ui.actionSave.triggered.connect(self.save_instance) - _ = self.ui.actionImport_Instance.triggered.connect(self.load_instance) - - self.versionlabel = QLabel(f"Version {buildInfo.version}") - self.ui.statusbar.addPermanentWidget(self.versionlabel) - if __name__ == "__main__": + appContext = AppContext() + + sys_man = appContext.buildInfo.system_manager + sys_man.adapt_qt_system_theme() + + # user_language = appContext.userPref.get_language_pref() + # user_theme = appContext.userPref.get_theme_pref() + + # appContext.updateLanguage(user_language) + # appContext.updateTheme(user_theme) + + def about_to_quit_event(): + instance_manager_label = appContext.translator.translate("instance_manager_label") + save_instance_msg_box_label = appContext.translator.translate("save_instance_msg_box_label") + save_filedialog_title = appContext.translator.translate("save_filedialog_title") + question_options = QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + anwser = QMessageBox.question(None, instance_manager_label, save_instance_msg_box_label, question_options) + if anwser == QMessageBox.StandardButton.Yes: + file_name: str = QFileDialog.getSaveFileName( + None, save_filedialog_title, + f"{appContext.buildInfo.system_manager.found_default_save_path }(\"LCE Instance Save File\" (*{appContext.buildInfo.instance_extension}))")[0] + appContext.instanceMan.save_instance(file_name) + action : CmdArgAction = parse_args(sys.argv) if argsDetected(action): - if action == CmdArgAction.GEN_CONFIG: - features.generate_user_config(userPref) - if action == CmdArgAction.PRINT_LICENSE: - features.display_license(buildInfo) - if action == CmdArgAction.PRINT_HELP: - features.display_help(translator.translate(HELP_STR)) - if action == CmdArgAction.PRINT_ABOUT_INFO: - features.display_about(translator.translate("about_message")) - if action == CmdArgAction.PRINT_VERSION: - features.display_version(buildInfo) - if action == CmdArgAction.CLI_VERSION: - features.launch_cli_interface(instanceManager) - else: - term_service.print_information("Not Implemented Yet!") + parse_cmd_arg(action, appContext) else: - app = QApplication(sys.argv) + os.environ["QTWEBENGINE_DISABLE_SANDBOX"] = "1" + + app = App(appContext.theme, Ui_launcher, Ui_sys_info_dialog, Ui_InstancesEditor, appContext, sys.argv) _ = app.setStyle("Fusion") - widget = launcher() - widget.show() - - if os.name == "nt": - os.environ["QT_QPA_PLATFORM"] = "windows:darkmode=2" - try: - theme_file : str = theme.value - file = QFile(theme_file) - if file.open(QIODevice.OpenModeFlag.ReadOnly | QIODevice.OpenModeFlag.Text): - content = file.readAll() - stylesheet = str(content, encoding='utf-8') # pyright: ignore[reportArgumentType] - app.setStyleSheet(stylesheet) - except FileNotFoundError: - print(FileNotFoundError.with_traceback) - term_service.print_warning("Theme ({theme}) not found in ressource, searching in the local storage.") - try: - with open(os.path.join(utils.get_assets_dir(), "styles", "minecraft.qss"), "r") as file: - app.setStyleSheet(file.read()) - except FileNotFoundError: - _ = QMessageBox.warning(None,"Error", f"{theme} file not found. Reverting to default theme") + app.aboutToQuit.connect(about_to_quit_event) sys.exit(app.exec()) \ No newline at end of file diff --git a/uv.lock b/uv.lock index dab7836..8f7aa9c 100644 --- a/uv.lock +++ b/uv.lock @@ -465,7 +465,7 @@ wheels = [ [[package]] name = "lce-qt-launcher" -version = "26.4.2a1" +version = "26.4.3a1" source = { editable = "." } dependencies = [ { name = "hatch" },