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())