diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index bff9806..5e254b3 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,3 +1,3 @@ -blank_issues_enabled: true +blank_issues_enabled: false 1-bug.yml 2-feature-request.yml diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index afaff2a..60f8d97 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -25,7 +25,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.x" + python-version: "3.12.x" - name: Install dependencies run: | diff --git a/src/ascii-art-text.png b/assets/ascii-art-text.png similarity index 100% rename from src/ascii-art-text.png rename to assets/ascii-art-text.png diff --git a/assets/pointer.png b/assets/pointer.png new file mode 100644 index 0000000..f26583e Binary files /dev/null and b/assets/pointer.png differ diff --git a/assets/styles/dark.qss b/assets/styles/dark.qss new file mode 100644 index 0000000..8e6a686 --- /dev/null +++ b/assets/styles/dark.qss @@ -0,0 +1,29 @@ +* { + color : white; + font-family : "Monocraft" +} + +QPushButton { + color : black; + border : none; +} + +QPushButton::pressed { + color : blue; + border : none; +} + +QPushButton::hover { + color : gray; + border : none; +} + +QMenuBar { + background-color : black +} + +QSatusBar + +QLineEdit { + background : black; +} \ No newline at end of file diff --git a/src/user_data.py b/assets/styles/light.qss similarity index 100% rename from src/user_data.py rename to assets/styles/light.qss diff --git a/assets/styles/minecraft.qss b/assets/styles/minecraft.qss index df3034a..07d31dd 100644 --- a/assets/styles/minecraft.qss +++ b/assets/styles/minecraft.qss @@ -1,6 +1,6 @@ * { color : white; - font-family : "Monocraft" + font-family : "Monocraft"; } QPushButton { @@ -10,9 +10,30 @@ QPushButton { QPushButton::pressed { border-image : url(":/assets/button-pressed.png"); + font : bold; border : none; } +QPushButton::hover { + border-image : url(":/assets/button-pressed.png"); + text-decoration : underline + border : none; +} + +QPushButton::disabled { + border-image : url(":/assets/button.png"); + color : black; + border : none; +} + +QMenuBar { + background-color : black +} + QLineEdit { background : black; +} + +QWidget { + background-color : black; } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 0ffa374..d920f68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,13 @@ [project] name = "LCE-Qt-Launcher" version = "0.0.1" -description = "This is a custom MCLCE Launcher written in python and Qt with Freedom and GNU/Linux support in mind." +description = "This is a custom Free/Libre Minecraft LCE Launcher written in Python and Qt." requires-python = "==3.12.*" +license = {text = "GPLv3"} + +[project.urls] +repository = "https://github.com/xgui4/LCE-QT-Launcher" +license = "https://www.gnu.org/licenses/gpl-3.0" dependencies = [ "pyside6", @@ -21,7 +26,8 @@ files = [ "src/instance_manager.py", "src/launcher.py", "src/system_manager.py", - "src/user_data.py", + "src/theme.py", + "src/setting_dialog.py", "src/form.ui", "src/system_info.ui", "src/json_trans.py", diff --git a/pysidedeploy.spec b/pysidedeploy.spec index 1c318d1..b7532e0 100644 --- a/pysidedeploy.spec +++ b/pysidedeploy.spec @@ -7,7 +7,7 @@ title = LCE Qt Launcher project_dir = . # source file entry point path. default = main.py -input_file = src/launcher.py +input_file = src/main.py # directory where the executable output is generated exec_directory = output/ diff --git a/res.qrc b/res.qrc index c180653..bc57bcb 100644 --- a/res.qrc +++ b/res.qrc @@ -9,8 +9,12 @@ assets/button.png assets/button-pressed.png assets/app.ico + assets/pointer.png + assets/ascii-art-text.png - assets/styles/minecraft.qss + assets/styles/minecraft.qss + assets/styles/dark.qss + assets/styles/light.qss diff --git a/src/build_info.py b/src/build_info.py index ee4666a..6c2d205 100644 --- a/src/build_info.py +++ b/src/build_info.py @@ -12,7 +12,7 @@ _APP_NAME = "Minecraft LCE QT Launcher" _VERSION_TYPE = "nighly" _VERSION_NUMBER = "0.0.1" _LICENSE = "GPLv3" -_LICENSE_LINK = "https://www.gnu.org/licenses/gpl-3.0.en.html" +_LICENSE_LINK = "https://www.gnu.org/licenses/gpl-3.0" _GIT_REPO_URL = "https://github.com/xgui4/LCE-QT-Launcher" _INSTANCE_EXTENSION = ".lce_inst" @@ -49,11 +49,11 @@ def get_version_info(): return f"{branch}-{date_info}_{commit_hash}" except Exception: - return f"{_VERSION_TYPE} {_VERSION_NUMBER}" + return "" class BuildInfo: def __init__(self): - self.version : str = _VERSION_NUMBER + "-" + get_version_info() + self.version : str = f"{_VERSION_TYPE} { _VERSION_NUMBER}-{get_version_info()}" self.app_name : str = _APP_NAME self.version_type : str = _VERSION_TYPE self.license : str = _LICENSE diff --git a/src/cli.py b/src/cli.py index d8fd57d..dfcde46 100755 --- a/src/cli.py +++ b/src/cli.py @@ -5,6 +5,10 @@ from rich import print from instance_manager import InstanceManager, Instance +import build_info + +import os + MENU_STR = """ 1. [bold green] Play [/bold green] 2. [bold green] Install [/bold green] @@ -12,7 +16,10 @@ MENU_STR = """ """ def launch_cli(): - image = from_file("/home/xgui4/Downloads/ascii-art-text.png") + + ascii_art = os.path.join(build_info.get_assets_dir(), "ascii-art-text.png") + + image = from_file(ascii_art) image.draw() diff --git a/src/main.py b/src/main.py index c60aa3d..ae32a23 100755 --- a/src/main.py +++ b/src/main.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QDialog, QMessageBox, QFileDialog, QInputDialog +from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QDialog, QMessageBox, QFileDialog, QInputDialog from PySide6.QtGui import QPalette, QPixmap, QBrush from PySide6.QtCore import qVersion from user_pref import UserPref @@ -9,6 +9,7 @@ from instance_manager import InstanceManager, Instance from cmd_arg import CmdArgAction, parse_args, argsDetected from browser_dialog import BrowserDialog +from setting_dialog import SettingDialog from cli import launch_cli import sys @@ -144,6 +145,9 @@ class launcher(QMainWindow): file_name = QFileDialog.getSaveFileName(self, "Set the instance save file path to load", f"{buildInfo.system_manager.found_default_save_path }(\"LCE Instance Save File\" (*{buildInfo.instance_extension}))") instanceManager.load_instance(file_name) + def show_setting_dialog(self): + SettingDialog(self) + def __init__(self, parent=None): super().__init__(parent) @@ -178,6 +182,7 @@ class launcher(QMainWindow): 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) @@ -217,7 +222,7 @@ if __name__ == "__main__": with open("assets/styles/minecraft.qss", "r") as file: app.setStyleSheet(file.read()) except FileNotFoundError: - print(f"Error : qrc:/styles/minecraft.qss file not found. Reverting to default theme") + print(f"Error : :/styles/minecraft.qss file not found. Reverting to default theme") widget = launcher() widget.show() diff --git a/src/setting_dialog.py b/src/setting_dialog.py new file mode 100644 index 0000000..a00c0b3 --- /dev/null +++ b/src/setting_dialog.py @@ -0,0 +1,15 @@ +from PySide6.QtWidgets import QDialog, QVBoxLayout, QLabel + +class SettingDialog(QDialog): + def __init__(self, parent): + setting_dialog = QDialog(parent) + layout = QVBoxLayout() + + label = QLabel("Setting") + layout.addWidget(label) + + label2 = QLabel("Coming Soon!") + layout.addWidget(label2) + + setting_dialog.setLayout(layout) + setting_dialog.show() \ No newline at end of file diff --git a/src/system_manager.py b/src/system_manager.py index 1f7bf3a..8e44456 100644 --- a/src/system_manager.py +++ b/src/system_manager.py @@ -19,21 +19,34 @@ class SystemManager(): self.name : str = None self.version : str = None - self.determine_os_type() + self.determine_os_info() - def determine_os_type(self): + def determine_os_info(self): if (platform.system() == "Linux") : self.type = OperatingSystemType.LINUX + self.name = self.type.name + self.version = platform.version() if (platform.system() == "Darwin") : self.type = OperatingSystemType.MACOS + self.name = self.type.name + self.version = platform.mac_ver() if (platform.system() == "Windows") : self.type = OperatingSystemType.WINDOWS + self.name = self.type.name + self.version = platform.win32_ver() if (platform.system() == "FreeBSD"): self.type = OperatingSystemType.FREEBSD + self.name = self.type.name + self.version = platform.version() if (platform.system() == "Android") : self.type = OperatingSystemType.ANDROID + self.name = self.type.name + self.version = platform.version() else: self.type = OperatingSystemType.UNKNOWN + self.name = self.type.name + self.version = platform.version() + def set_file_permission(self, file_abs_path : str) -> str: if self.type in [OperatingSystemType.LINUX, OperatingSystemType.FREEBSD, OperatingSystemType.MACOS]: diff --git a/src/theme.py b/src/theme.py new file mode 100644 index 0000000..2c566ab --- /dev/null +++ b/src/theme.py @@ -0,0 +1,9 @@ +from enum import StrEnum + +class Theme(StrEnum): + MINECRAFT = ":/styles/minecraft.qss" + SYSTEM = "" + DARK = ":/styles/minecraft.qss" + LIGHT = ":/sytles/light.qss" + CUSTOM = "" + diff --git a/src/user_pref.py b/src/user_pref.py index b60d42b..ec21ab3 100644 --- a/src/user_pref.py +++ b/src/user_pref.py @@ -1,58 +1,18 @@ from PySide6.QtCore import QSettings +from theme import Theme + class UserPref (QSettings): def __init__(self): super().__init__(QSettings.NativeFormat, QSettings.UserScope, "Xgui4", "LCE-QT-Laucher") - def set_instance_url(self, url_str : str): - super().setValue("instances/repo", url_str) - super().sync() - def set_instance_exe_name(self, filename : str): - super().setValue("instances/filename", filename) + def set_theme_pref(self, theme : str): + super().setValue("customisation/theme", theme) super().sync() - def set_instance_archive(self, archive : str): - super().setValue("instances/archive", archive) - super().sync() - - def set_instance_name(self, name : str): - super().setValue("instances/name", name) - super().sync() - - def set_instance_version(self, version : str): - super().setValue("instances/version", version) - super().sync() - - def set_profile_skin(self, skin_file_path : str): - super().setValue("profiles/skin_file_path", skin_file_path) - super().sync() - - def set_profile_name(self, name : str): - super().setValue("profiles/name", name) - super().sync() - - def get__instance_url(self) -> str: - return self.value("instances/repo", "https://github.com/smartcmd/MinecraftConsoles"); - def get_instance_name(self) -> str: - return self.value("instances/name", "default") - def get_instance_exe_name(self) -> str: - return self.value("instances/filename", "Minecraft.Client.exe") - def get_instance_archive(self) -> str: - return self.value("instances/archive", "LCEWindows64.zip") - def get_instance_version(self) -> str: - return self.value("instances/version", "default") - - def get_profile_skin(self) -> str: - return self.value("profiles/skin_file_path", "default") - - def get_profile_name(self) -> str: - return self.value("profiles/name", "default") + def get_theme_pref(self) -> str: + return self.value("ustomisation/theme", Theme.MINECRAFT); def generate_default_config(self): - self.set_instance_url("https://github.com/smartcmd/MinecraftConsoles") - self.set_instance_name("default") - self.set_instance_exe_name("Minecraft.Client.exe") - self.set_instance_archive("LCEWindows64.zip") - self.set_instance_version("nightly") - self.set_profile_skin("default") - self.set_profile_name("Steve") + super().setValue("customisation/theme", Theme.MINECRAFT) + super().sync()