diff --git a/default.nix b/default.nix index 42c7bae..cc97f35 100644 --- a/default.nix +++ b/default.nix @@ -18,6 +18,7 @@ pkgs.python3Packages.buildPythonApplication rec { pkgs.bash pkgs.coreutils pkgs.gnused + pkgs.steamtinkerlaunch ]; propagatedBuildInputs = with pkgs.python3Packages; [ diff --git a/packages/linux/dev/PKGBUILD b/packages/linux/dev/PKGBUILD index 24bdde0..7044b73 100644 --- a/packages/linux/dev/PKGBUILD +++ b/packages/linux/dev/PKGBUILD @@ -25,8 +25,9 @@ makedepends=( 'qt6-tools' ) optdepends=( - 'wine: Allow to launch non-Linux-native Minecraft LCE ports' + 'wine: Allow to launch non-Linux-native Minecraft LCE ports' 'steam: Allow for Steam integration' + 'steamtinkerlaunch: For better Stream integration on Linux' ) provides=("${pkgname%-dev}" "${pkgname%-beta}" "${pkgname%}") diff --git a/pyproject.toml b/pyproject.toml index cee4754..342cf0b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,7 +71,6 @@ files = [ "src/lce_qt_launcher/views/term_service.py", "src/lce_qt_launcher/views/cli.py", "src/lce_qt_launcher/views/launcher.py", - "src/lce_qt_launcher/views/theme.py", "src/lce_qt_launcher/views/launcher.py", "src/lce_qt_launcher/views/app_data.py", "src/lce_qt_launcher/managers/__init__.py", @@ -85,6 +84,7 @@ files = [ "src/lce_qt_launcher/models/__init__.py", "src/lce_qt_launcher/models/image_class.py", "src/lce_qt_launcher/models/preferences.py", + "src/lce_qt_launcher/models/theme.py", "src/lce_qt_launcher/utils/__init__.py", "src/lce_qt_launcher/utils/json_trans.py", "src/lce_qt_launcher/utils/holyday.py", diff --git a/src/lce_qt_launcher/app.py b/src/lce_qt_launcher/app.py index 183bd95..9891e2c 100644 --- a/src/lce_qt_launcher/app.py +++ b/src/lce_qt_launcher/app.py @@ -6,13 +6,13 @@ from PySide6.QtWidgets import QApplication, QMessageBox from lce_qt_launcher.app_context import AppContext from lce_qt_launcher.models.app_data import AppData from lce_qt_launcher.views.launcher import LauncherView -from lce_qt_launcher.views.theme import Theme +from lce_qt_launcher.models.theme import StrTheme import lce_qt_launcher.views.term_service as term_service class App(QApplication): """QApplication Main Instance""" def __init__(self, - theme : Theme, + theme : StrTheme, appContext : AppContext, argv : list[str] ) -> None: super().__init__(argv) @@ -26,7 +26,7 @@ class App(QApplication): self.set_theme(theme) - def set_theme(self, theme : Theme) -> None: + def set_theme(self, theme : StrTheme) -> None: """#Set Application Theme using a pretermined theme #TODO To Upgrade! """ diff --git a/src/lce_qt_launcher/app_context.py b/src/lce_qt_launcher/app_context.py index e06344f..04b03e5 100644 --- a/src/lce_qt_launcher/app_context.py +++ b/src/lce_qt_launcher/app_context.py @@ -9,11 +9,11 @@ from lce_qt_launcher.managers.system_manager import SystemManager from lce_qt_launcher.models.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.views.theme import Theme +from lce_qt_launcher.models.theme import StrTheme from lce_qt_launcher.utils.json_trans import JsonTrans _default_instance : Instance = Instance() -_default_theme : Theme = Theme.MINECRAFT +_default_theme : StrTheme = StrTheme.MINECRAFT _default_language : str = "en" class AppContext(): @@ -21,14 +21,14 @@ class AppContext(): """ def __init__(self, appData: AppData, - theme : Theme = _default_theme, + theme : StrTheme = _default_theme, instance : Instance = _default_instance, lang : str = _default_language) -> None: self.buildInfo: BuildInfo = BuildInfo() self.sys_man: SystemManager = SystemManager() self.userPref: UserPref = UserPref(self.buildInfo) self.instanceMan: InstanceManager = InstanceManager(instance, self.buildInfo, self) - self.theme: Theme = theme + self.theme: StrTheme = theme self.translator: JsonTrans = JsonTrans(appData, lang) self.accesibleModeEnabled : bool = self.userPref.default_accesibility_mode self.devModeEnabled : bool = self.userPref.default_developper_mode @@ -40,7 +40,7 @@ class AppContext(): self.MINECRAFT_WEBSITE : str = "https://minecraft.net" self.MINECRAFT_LCE_WEBSITE : str = "https://minecraftlegacy.com/" - def updateTheme(self, theme : Theme) -> None: + def updateTheme(self, theme : StrTheme) -> None: """_summary_ Update the theme Args: diff --git a/src/lce_qt_launcher/main.py b/src/lce_qt_launcher/main.py index ed68c94..33d9219 100755 --- a/src/lce_qt_launcher/main.py +++ b/src/lce_qt_launcher/main.py @@ -47,8 +47,8 @@ from lce_qt_launcher.views.cmd_arg import CmdArgAction, parse_args, argsDetected from lce_qt_launcher.app_context import AppContext from lce_qt_launcher.app import App from lce_qt_launcher.managers.system_manager import SystemManager -from lce_qt_launcher.views.theme import Theme -import lce_qt_launcher.views.theme as theme +from lce_qt_launcher.models.theme import StrTheme +import lce_qt_launcher.models.theme as theme import sys import os @@ -74,7 +74,7 @@ def main() -> None: accessible_mode: str = userPref.get_accesible_mode() try: - selected_theme: Theme = theme.from_str_to_theme(user_theme) + selected_theme: StrTheme = theme.from_str_to_strTheme(user_theme) appContext.updateTheme(selected_theme) appContext.updateShowHolidayStatus(show_holiday) appContext.updateSetDevMoodeStatus(developer_mode) diff --git a/src/lce_qt_launcher/managers/steam_manager.py b/src/lce_qt_launcher/managers/steam_manager.py index 2ea1100..026bb55 100644 --- a/src/lce_qt_launcher/managers/steam_manager.py +++ b/src/lce_qt_launcher/managers/steam_manager.py @@ -22,8 +22,9 @@ from PySide6.QtWidgets import ( ) import argparse -# import subprocess -# import os +import subprocess +import platform +import os import sys LEGAL_TEXT = """ @@ -33,7 +34,7 @@ LEGAL_TEXT = """ under certain conditions; type `show c' for details. """ -def add_instance_to_steam(instance_exe_path : str, instance_name : str, icon : str): +def add_instance_to_steam(abs_instance_exe_path : str, instance_name : str, icon : str): """#TODO _summary_ #TODO Args: @@ -42,7 +43,24 @@ def add_instance_to_steam(instance_exe_path : str, instance_name : str, icon : s icon (str): _description_ """ try: - QMessageBox.critical(None, "Critical Error", "Not Implemented Yet") + try: + QMessageBox.warning(None, "Warning", "For this operation, it is recommended to close steam. ") + except RuntimeError: + input("Warning : For this operation, it is recommended to close steam.") + QMessageBox.warning(None, "Warning", "For this operation, it is recommended to close steam. ") + if platform.uname().system == "Linux": + subprocess.run(["steamtinkerlaunch", "ansg", + f"-an=\"Minecraft LCE ({instance_name}\"", + f"-ep=\"{abs_instance_exe_path}\"", + f"-ip={icon}"]) + try: + QMessageBox.warning(None, "Warning", "This function is in work in progress and the id is not saved in the launcher. \n" \ + "Until this is added, a manual intervention is needed to found the id and put in the save file. ") + except RuntimeError: + print("Warning : This function is in work in progress and the id is not saved in the launcher. \n" \ + "Until this is added, a manual intervention is needed to found the id and put in the save file. ") + else : + QMessageBox.critical(None, "Critical Error", "Not Implemented Yet!") except RuntimeError as err: print(f"Error while adding program to steam : {err}") diff --git a/src/lce_qt_launcher/models/preferences.py b/src/lce_qt_launcher/models/preferences.py index 74432a0..17ef0f1 100644 --- a/src/lce_qt_launcher/models/preferences.py +++ b/src/lce_qt_launcher/models/preferences.py @@ -3,7 +3,7 @@ from PySide6.QtCore import QSettings from lce_qt_launcher.build_info import BuildInfo -from lce_qt_launcher.views.theme import Theme +from lce_qt_launcher.models.theme import StrTheme _THEME_OPTION : str = "customisation/theme" _INSTANCE_PATH_OPTION : str = "preferences/default_path" @@ -20,7 +20,7 @@ class UserPref (QSettings): """ def __init__(self, build_info : BuildInfo) -> None: super().__init__(QSettings.Format.IniFormat, QSettings.Scope.UserScope, "Xgui4", build_info.app_name) - self.default_theme : Theme = Theme.MINECRAFT + self.default_theme : StrTheme = StrTheme.MINECRAFT self.default_instance_path : str = "~/.local/share/lce_qt_launcher/default" self.default_language : str = "en" self.default_show_holiday : bool = True diff --git a/src/lce_qt_launcher/models/theme.py b/src/lce_qt_launcher/models/theme.py new file mode 100644 index 0000000..445ea3a --- /dev/null +++ b/src/lce_qt_launcher/models/theme.py @@ -0,0 +1,66 @@ +from ctypes import ArgumentError +from enum import StrEnum, Enum + +class StrTheme(StrEnum): + """_summary_ The QtApp Stylesheet theme""" + MINECRAFT = ":/styles/minecraft.qss" + DARK = ":/styles/dark.qss" + LIGHT = ":/sytles/light.qss" + SYSTEM = "SYSTEM" + +class ThemeEntity(Enum): + """ TODO _summary_ + + Args: + Enum (_type_): _description_ + """ + DEFAULT = 0 + MINECRAFT = 1 + LIGHT = 2 + DARK = 3 + SYSTEM = 4 + +def from_entity_to_strTheme(entity : ThemeEntity) -> StrTheme: + match entity: + case ThemeEntity.DEFAULT | ThemeEntity.MINECRAFT: + return StrTheme.MINECRAFT + case ThemeEntity.LIGHT: + return StrTheme.LIGHT + case ThemeEntity.DARK: + return StrTheme.DARK + case ThemeEntity.SYSTEM: + return StrTheme.SYSTEM + +def get_theme_file_name(strTheme : StrTheme) -> str: + """ TODO _summary_ + + Args: + strTheme (StrTheme): _description_ + + Returns: + _type_: _description_ + """ + match strTheme: + case StrTheme.MINECRAFT : return "minecraft.qss" + case StrTheme.DARK : return "dark.qss" + case StrTheme.LIGHT : return "light.qss" + case StrTheme.SYSTEM : return "SYSTEM" + +def from_str_to_strTheme(string : str) -> StrTheme: + """ TODO _summary_ + + Args: + string (str): _description_ + + Raises: + ArgumentError: _description_ + + Returns: + StrTheme: _description_ + """ + match string: + case ":/styles/minecraft.qss": return StrTheme.MINECRAFT + case ":/styles/dark.qss": return StrTheme.DARK + case ":/sytles/light.qss" : return StrTheme.LIGHT + case "": return StrTheme.SYSTEM + case _ : raise ArgumentError(f"{string} is not a valid theme") \ No newline at end of file diff --git a/src/lce_qt_launcher/views/setting_dialog.py b/src/lce_qt_launcher/views/setting_dialog.py index f327070..4935106 100644 --- a/src/lce_qt_launcher/views/setting_dialog.py +++ b/src/lce_qt_launcher/views/setting_dialog.py @@ -1,5 +1,7 @@ -from PySide6.QtWidgets import QDialog, QWidget +from PySide6.QtWidgets import QDialog, QWidget, QMessageBox +from PySide6.QtCore import Qt +import lce_qt_launcher.models.theme as theme from lce_qt_launcher.ui_settingDialog import Ui_settingDialog class SettingDialog(QDialog): @@ -9,4 +11,18 @@ class SettingDialog(QDialog): self.setting_dialog: QDialog = QDialog(parent) self.ui_setting: Ui_settingDialog = ui_setting self.ui_setting.setupUi(self.setting_dialog) # pyright: ignore[reportUnknownMemberType] - self.setting_dialog.show() \ No newline at end of file + self.setting_dialog.show() + + def applyButtonCommand(): + isDevelopperModeEnabled = self.ui_setting.developperModeDheckBox.isChecked() + isAccesbilityModeEnabled = self.ui_setting.accesibilitycheckBox.isChecked() + isHolidayEnabled = self.ui_setting.holydayDheckBox.isChecked() + themeSelectedIndex = self.ui_setting.themesComboBox.currentIndex() + languageSelectedIndex = self.ui_setting.languagesComboBox.currentData() + QMessageBox.information(self, "Setting", "Functionnal Setting Coming Later") + + self.ui_setting.settingsOptions.accepted.connect(applyButtonCommand) + + comingSoonMsgBox = lambda : QMessageBox().information(self, "Setting", "Not Implemented Yet!") + + self.ui_setting.settingsOptions.helpRequested.connect(comingSoonMsgBox) \ No newline at end of file diff --git a/src/lce_qt_launcher/views/theme.py b/src/lce_qt_launcher/views/theme.py deleted file mode 100644 index 2b8b8a5..0000000 --- a/src/lce_qt_launcher/views/theme.py +++ /dev/null @@ -1,17 +0,0 @@ -from ctypes import ArgumentError -from enum import StrEnum - -class Theme(StrEnum): - """_summary_ The QtApp Stylesheet theme""" - MINECRAFT = ":/styles/minecraft.qss" - DARK = ":/styles/dark.qss" - LIGHT = ":/sytles/light.qss" - SYSTEM = "" - -def from_str_to_theme(string : str) -> Theme: - match string: - case ":/styles/minecraft.qss": return Theme.MINECRAFT - case ":/styles/dark.qss": return Theme.DARK - case ":/sytles/light.qss" : return Theme.LIGHT - case "": return Theme.SYSTEM - case _ : raise ArgumentError(f"{string} is not a valid theme") \ No newline at end of file diff --git a/src/settingDialog.ui b/src/settingDialog.ui index 361401a..8a6f84f 100644 --- a/src/settingDialog.ui +++ b/src/settingDialog.ui @@ -16,9 +16,9 @@ - 30 + 430 240 - 661 + 261 32 @@ -26,7 +26,7 @@ Qt::Orientation::Horizontal - QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Close|QDialogButtonBox::StandardButton::Help|QDialogButtonBox::StandardButton::RestoreDefaults + QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Close|QDialogButtonBox::StandardButton::Help