diff --git a/assets/images/jigsaw-ico.png b/assets/images/jigsaw-ico.png new file mode 100644 index 0000000..9fa3af4 Binary files /dev/null and b/assets/images/jigsaw-ico.png differ diff --git a/res.qrc b/res.qrc index 886ac1e..fc7b346 100644 --- a/res.qrc +++ b/res.qrc @@ -21,6 +21,7 @@ assets/images/chest.png assets/images/piston.png assets/images/aether.png + assets/images/jigsaw-ico.png assets/styles/minecraft.qss diff --git a/scripts/build.cmd b/scripts/build.cmd index a8050af..44b4d32 100644 --- a/scripts/build.cmd +++ b/scripts/build.cmd @@ -13,6 +13,7 @@ set ui[1]="system_info" set ui[2]="instance" set ui[3]="settingDialog" set ui[4]="about" +set ui[5]="contentInstaller" for /L %%i in (0,1,4) do ( set "filename=!ui[%%i]!" diff --git a/scripts/build.sh b/scripts/build.sh index c6c3fc3..b7ae64a 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -3,7 +3,7 @@ set -e QT_RESSOURCE="res.qrc" -UI_FILES=("form" "system_info" "instance" "settingDialog" "about") +UI_FILES=("form" "system_info" "instance" "settingDialog" "about" "contentInstaller") if [[ $(uname -s) != "FreeBSD" ]]; then if command -v pyside6-rcc &> /dev/null; then diff --git a/src/contentInstaller.ui b/src/contentInstaller.ui new file mode 100644 index 0000000..e705602 --- /dev/null +++ b/src/contentInstaller.ui @@ -0,0 +1,158 @@ + + + Dialog + + + + 0 + 0 + 400 + 473 + + + + LCE Content Installers + + + + :/assets/piston.png:/assets/piston.png + + + + + + + + + Explore + + + + + + + + 12 + true + + + + LCE Content Installer + + + + + + + + true + + + + Instance Path + + + + + + + + true + + + + Content to Install + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel + + + + + + + + + + Explore + + + + + + + + true + + + + Content Type + + + + + + + + World + + + + + DLC + + + + + Mod + + + + + + + + + + + + mainButtonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + mainButtonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/form.ui b/src/form.ui index fa151ab..4f9913d 100644 --- a/src/form.ui +++ b/src/form.ui @@ -106,20 +106,30 @@ + + + + + + Play On Steam + + + + Install - + Play - + false @@ -129,7 +139,7 @@ - + @@ -164,7 +174,7 @@ - + @@ -183,7 +193,7 @@ - + @@ -201,7 +211,17 @@ - + + + + + 0 + 0 + + + + + @@ -213,7 +233,17 @@ - + + + + + 0 + 0 + + + + + @@ -225,42 +255,7 @@ - - - - false - - - - true - - - - Server Name (Coming Soon) - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - + @@ -270,7 +265,7 @@ - + false @@ -285,7 +280,7 @@ - + false @@ -298,7 +293,22 @@ - + + + + false + + + + true + + + + Server Name (Coming Soon) + + + + false @@ -311,7 +321,7 @@ - + @@ -324,20 +334,35 @@ - + Save Instances Config + + + + + true + + + + Instance Name + + + + + + - + false @@ -381,7 +406,7 @@ - + @@ -415,13 +440,13 @@ - - - - - + + - Play On Steam + Change Instance Icon + + + @@ -601,6 +626,8 @@ + + @@ -792,7 +819,7 @@ - false + true Instances @@ -930,6 +957,14 @@ LegacyMods (Coming Soon) + + + + + + Install Content + + diff --git a/src/lce_qt_launcher/features.py b/src/lce_qt_launcher/features.py index d982946..546f077 100644 --- a/src/lce_qt_launcher/features.py +++ b/src/lce_qt_launcher/features.py @@ -49,7 +49,7 @@ def install_game(parent : QWidget, instance : Instance, instanceManager : Instan _ = progressBar.setEnabled(True) _ = progressLabel.setText(f"Downloading {instance.name} Progress") - #TODO - VERIFY THIS + #TODO - Verify this methodd def update_progress_bar(bytes_received, bytes_total) -> None: # pyright: ignore[reportUnknownParameterType, reportMissingParameterType] if bytes_total > 0: _ = progressBar.setMaximum(bytes_total) # pyright: ignore[reportUnknownArgumentType] diff --git a/src/lce_qt_launcher/managers/mod_manager.py b/src/lce_qt_launcher/managers/mod_manager.py index 1e632e5..262a755 100755 --- a/src/lce_qt_launcher/managers/mod_manager.py +++ b/src/lce_qt_launcher/managers/mod_manager.py @@ -34,6 +34,21 @@ class ContentType(StrEnum): NONE = "0" CUSTOM_SKIN = "-1" # Temporaly placeholder DO NOT USE, +def from_str_to_enum(string : str) -> ContentType: + match string: + case "DLC": + return ContentType.DLC + case "World": + return ContentType.WORLD + case "Mod": + return ContentType.MOD + case "None" : + return ContentType.NONE + case "Skin": + return ContentType.CUSTOM_SKIN + case _ : + raise RuntimeError("Invalid Argument") + LEGAL_TEXT = """ LCE Mods Managers Copyright (C) 2026 Xgui4 diff --git a/src/lce_qt_launcher/views/content_installer_dialog.py b/src/lce_qt_launcher/views/content_installer_dialog.py new file mode 100644 index 0000000..5e652a3 --- /dev/null +++ b/src/lce_qt_launcher/views/content_installer_dialog.py @@ -0,0 +1,42 @@ +from PySide6.QtWidgets import QDialog, QHBoxLayout, QWidget +from PySide6.QtWebEngineWidgets import QWebEngineView +from PySide6.QtCore import QUrl + +from lce_qt_launcher.managers import mod_manager +from lce_qt_launcher.build_info import BuildInfo +from lce_qt_launcher.ui_contentInstaller import Ui_Dialog +from lce_qt_launcher.views import term_service + + +class ContentInstallerView(QDialog): + """ #TODO _summary_ + + Args: + QDialog (_type_): _description_ inherited from QDialog + """ + def __init__(self) -> None: + super().__init__() + self.ui_dialog: Ui_Dialog = Ui_Dialog() + self.dialog: QDialog = QDialog() + self.ui_dialog.setupUi(self.dialog) + + self.contentToInstallPath = "" + self.instancePath = "" + self.contentTypeStr = "" + + self.contentToInstallPath = self.ui_dialog.contentToInstallInputBox.text() + self.contentTypeStr = self.ui_dialog.contentTypeListBoxlabel.selectedText() + self.instancePath = self.ui_dialog.instamcePathInputPath.text() + + try: + self.contentType = mod_manager.from_str_to_enum(self.contentTypeStr) + except RuntimeError: + term_service.print_information("Canno get Content Type.") + + def installContentCommand(): + mod_manager.install_content(self.instancePath, self.contentType, self.contentToInstallPath) + + self.ui_dialog.contentToInstallInputBoxExploreButton.pressed.connect(installContentCommand) + + self.dialog.show() + diff --git a/src/lce_qt_launcher/views/instance_view.py b/src/lce_qt_launcher/views/instance_view.py deleted file mode 100644 index b9303db..0000000 --- a/src/lce_qt_launcher/views/instance_view.py +++ /dev/null @@ -1,22 +0,0 @@ -from PySide6.QtWidgets import QDialog, QHBoxLayout, QWidget -from PySide6.QtWebEngineWidgets import QWebEngineView -from PySide6.QtCore import QUrl - -from lce_qt_launcher.build_info import BuildInfo - -class InstanceView(QDialog): - """_summary_ #TODO docstring - - Args: - QDialog (_type_): _description_ - """ - def __init__(self, parent : QWidget, url : str, build_info : BuildInfo) -> None: - super().__init__() - browser_dialog = QDialog(parent) - webview = QWebEngineView() - webview.load(QUrl(url)) - browser_dialog.setWindowTitle(build_info.app_name) - layout = QHBoxLayout() - layout.addWidget(webview) - browser_dialog.setLayout(layout) - browser_dialog.show() \ No newline at end of file diff --git a/src/lce_qt_launcher/views/launcher.py b/src/lce_qt_launcher/views/launcher.py index de6e814..8195cae 100644 --- a/src/lce_qt_launcher/views/launcher.py +++ b/src/lce_qt_launcher/views/launcher.py @@ -1,5 +1,8 @@ +import os + from PySide6.QtWidgets import ( - QApplication, + QApplication, + QFileDialog, QMainWindow, QLabel, QDialog, @@ -27,6 +30,7 @@ from lce_qt_launcher.app_context import AppContext from lce_qt_launcher.managers.instance_manager import Instance, InstanceManager from lce_qt_launcher.build_info import BuildInfo from lce_qt_launcher.models.app_data import AppData +from lce_qt_launcher.views.content_installer_dialog import ContentInstallerView from lce_qt_launcher.ui_about import Ui_AboutDialog from lce_qt_launcher.ui_instance import Ui_InstancesEditor from lce_qt_launcher.ui_settingDialog import Ui_settingDialog @@ -38,7 +42,7 @@ import lce_qt_launcher.views.term_service as term_service import lce_qt_launcher.features as features import lce_qt_launcher.utils.holiday as holiday -class playButtonCommander(QMainWindow): +class Launcher(QMainWindow): """_summary_ The Main Window / playButtonCommander of the QApplcation Args: @@ -61,14 +65,6 @@ class playButtonCommander(QMainWindow): self.instances : list[Instance] = list() - for inst in appData.instsList: - self.instances.append(inst) - item = QListWidgetItem() - item.setText(inst.name) - item.setIcon(QPixmap(inst.image)) - item.setData(Qt.ItemDataRole.FileInfoRole, inst) - self.ui.listWidget.addItem(item) - STARTING_GAME_MSG = translator.translate("start_game_msg") def generateInstanceFromForm() -> None: @@ -102,6 +98,15 @@ class playButtonCommander(QMainWindow): """ features.save_instance_to_file(self, instanceManager, appContext, buildInfo) + def changeInstanceIconButtonCommand() -> None: + file_name: str = QFileDialog.getOpenFileName( + self, + "Select the image file for the instance", + appContext.sys_man.found_default_save_path(), + f"{buildInfo.app_name} Instance File (*{buildInfo.instance_extension})")[0] + instanceManager.instance.image = file_name + self.ui.instance_img.setPixmap(QPixmap(file_name)) + def showInstanceEditorButtonCommand() -> None: features.show_instance_editor(self) @@ -124,6 +129,7 @@ class playButtonCommander(QMainWindow): """_summary_ Open the Load Save File Dialog """ features.load_instance(self, instanceManager, appContext, buildInfo, appData) + self.ui.instanceNameLabel.setText(instanceManager.instance.name) self.image_label = instanceManager.instance.image self.news_feed = instanceManager.instance.news_feed self.instance_name = instanceManager.instance.name @@ -150,6 +156,9 @@ class playButtonCommander(QMainWindow): """ features.show_about_app(self) + def installContentActionCommand() -> None: + ContentInstallerView() + background_pixmap = QPixmap(appContext.BACKGROUND_PIXMAP_IMG) if not background_pixmap.isNull(): palette: QPalette = self.palette() @@ -164,6 +173,14 @@ class playButtonCommander(QMainWindow): self.ui.setupUi(self) arguments: list[str] = QApplication.instance().arguments() if not None else "Error" # pyright: ignore[reportOptionalMemberAccess] + + for inst in appData.instsList: + self.instances.append(inst) + item = QListWidgetItem() + item.setText(inst.name) + item.setIcon(QPixmap(inst.image)) + item.setData(Qt.ItemDataRole.FileInfoRole, inst) + self.ui.listWidget.addItem(item) if len(arguments) > 1: file_arg: str = arguments[1] @@ -175,6 +192,7 @@ class playButtonCommander(QMainWindow): inst_dict: dict[str, str] = json.load(instance) # pyright: ignore[reportAny] instanceManager.instance.load_inst_from_dict(inst_dict) instanceManager.instance.display() + self.ui.instanceNameLabel.setText(instanceManager.instance.name) self.image_label = instanceManager.instance.image self.news_feed = instanceManager.instance.news_feed self.instance_name = instanceManager.instance.name @@ -245,6 +263,7 @@ class playButtonCommander(QMainWindow): _ = self.ui.savetInstanceButton.clicked.connect(saveInstanceButtonCommand) _ = self.ui.confirmChangesButton.clicked.connect(confirmChangesButtonCommand) _ = self.ui.openInstanceEditor.clicked.connect(showInstanceEditorButtonCommand) + _ = self.ui.changeInstanceIconButton.clicked.connect(changeInstanceIconButtonCommand) _ = self.ui.actionSetting.triggered.connect(showSettingDialogCommand) _ = self.ui.actionSetting_2.triggered.connect(showSettingDialogCommand) @@ -258,6 +277,10 @@ class playButtonCommander(QMainWindow): _ = self.ui.actionMore_Minecraft_LCE_Projects.triggered.connect(showMoreLCEProjectsActionCommand) _ = self.ui.actionSave.triggered.connect(saveInstanceButtonCommand) _ = self.ui.actionImport_Instance.triggered.connect(loadInstanceActionCommand) + _ = self.ui.actionInstall_Content.triggered.connect(installContentActionCommand) + + openAppInstancesData = lambda : systemManager.open_url_with_system(os.path.join(appData.appDataDirs[0], "instances")) + _ = self.ui.actionInstances.triggered.connect(openAppInstancesData) open_workshop = lambda : features.show_webbrowser(self, "https://lce-hub.github.io/piston/", buildInfo); _ = self.ui.actionLCE_Hub_Workshop.triggered.connect(open_workshop) @@ -274,7 +297,6 @@ class playButtonCommander(QMainWindow): open_github_issues = lambda : webbrowser.open(appContext.buildInfo.git_repo_url + "/issues") _ = self.ui.actionReport_a_Bugs_or_Sugess_a_feature.triggered.connect(open_github_issues) - self.versionlabel: QLabel = QLabel(f"Version {buildInfo.version}") self.ui.statusbar.addPermanentWidget(self.versionlabel) holyday_label: QLabel = QLabel(holiday.get_holiday())