From 6e8f2ac2eb835b5c0bd86822c5b726e72092f16c Mon Sep 17 00:00:00 2001 From: Wei Hong Date: Mon, 3 Aug 2026 22:15:55 +0800 Subject: [PATCH] Now game dir is the correct path. Add experimental manage profile page. --- app.py | 5 +- manager/profile.py | 4 +- manager/settings_models.py | 26 +++ pages/manage_profile.py | 312 ++++++++++++++++++++++++++++ resources/icons/profile_edit.png | Bin 0 -> 65916 bytes resources/styles/manage_profile.qss | 33 +++ resources/styles/settings.qss | 84 ++++++++ window.py | 25 ++- 8 files changed, 481 insertions(+), 8 deletions(-) create mode 100644 manager/settings_models.py create mode 100644 pages/manage_profile.py create mode 100644 resources/icons/profile_edit.png create mode 100644 resources/styles/manage_profile.qss create mode 100644 resources/styles/settings.qss diff --git a/app.py b/app.py index 37c5430..182d5cd 100644 --- a/app.py +++ b/app.py @@ -46,7 +46,7 @@ class Launcher(QApplication, LauncherObject): self.game_manager = GameManager(self) # Window config - self.setApplicationName("TestLauncher") + self.setApplicationName("TapLauncher") self.main_window = LauncherMainWindow( app=self ) @@ -139,7 +139,8 @@ class Launcher(QApplication, LauncherObject): @property def default_game_dir(self) -> Path: - return self.work_dir / "minecraft" if sys.platform.lower() == "darwin" else self.work_dir / ".minecraft" + # Completely with official Minecraft launcher + return self.work_dir @property def resources_dir(self): diff --git a/manager/profile.py b/manager/profile.py index b1df0c3..482ed9c 100644 --- a/manager/profile.py +++ b/manager/profile.py @@ -667,13 +667,13 @@ class ProfileManager(QObject): if not isinstance(request.icon, str): errors["icon"] = "Icon must be a string." - if request.game_dir is not _UNSET: + if request.game_dir is not _UNSET and request.game_dir is not None: try: Path(request.game_dir) except (TypeError, ValueError): errors["game_dir"] = "Game directory is invalid." - if request.game_dir is not _UNSET: + if request.resolution is not _UNSET and request.resolution is not None: if not isinstance(request.resolution, tuple) or len(request.resolution) != 2: errors["resolution"] = ( "Resolution must contain width and height." diff --git a/manager/settings_models.py b/manager/settings_models.py new file mode 100644 index 0000000..c270756 --- /dev/null +++ b/manager/settings_models.py @@ -0,0 +1,26 @@ +"""Launcher settings schemas persisted by SettingsManager.""" + +from typing import Literal +from uuid import UUID + +from pydantic import BaseModel, ConfigDict + +from constant import CLIENT_ID + + +class GeneralSettings(BaseModel): + model_config = ConfigDict(extra="forbid") + + language: Literal["en", "zh-TW"] = "zh-TW" + + +class AppearanceSettings(BaseModel): + model_config = ConfigDict(extra="forbid") + + theme: Literal["system", "light", "dark"] = "system" + + +class AccountSettings(BaseModel): + model_config = ConfigDict(extra="forbid") + + client_id: UUID = UUID(CLIENT_ID) diff --git a/pages/manage_profile.py b/pages/manage_profile.py new file mode 100644 index 0000000..29c4d4b --- /dev/null +++ b/pages/manage_profile.py @@ -0,0 +1,312 @@ +import shutil +from pathlib import Path + +from PySide6.QtCore import Qt, QUrl, Signal +from PySide6.QtGui import QDesktopServices, QIcon +from PySide6.QtWidgets import ( + QFileDialog, QFormLayout, QFrame, QHBoxLayout, QLabel, QLineEdit, + QMessageBox, QPushButton, QScrollArea, QSizePolicy, QSpinBox, + QVBoxLayout, QWidget, +) + +from manager.profile import ProfileDetail, ProfileManager, ProfileSummary, UpdateProfileRequest + + +class ManageProfileItem(QPushButton): + selected = Signal(object) + + def __init__(self, app, profile: ProfileSummary, parent=None): + super().__init__(parent) + self.profile = profile + self.setObjectName("manageProfileItem") + self.setCheckable(True) + self.setCursor(Qt.CursorShape.PointingHandCursor) + self.setMinimumHeight(64) + + layout = QHBoxLayout(self) + layout.setContentsMargins(12, 8, 12, 8) + layout.setSpacing(12) + + icon_path = Path(profile.icon) + if not icon_path.is_file(): + icon_path = Path(app.icon_dir, "profile_default.png") + icon = QLabel() + icon.setFixedSize(40, 40) + icon.setPixmap(QIcon(icon_path.as_posix()).pixmap(36, 36)) + icon.setAlignment(Qt.AlignmentFlag.AlignCenter) + + texts = QVBoxLayout() + texts.setSpacing(1) + name = QLabel(profile.display_name) + name.setObjectName("itemName") + version = QLabel(profile.version_id) + version.setObjectName("itemVersion") + texts.addWidget(name) + texts.addWidget(version) + + layout.addWidget(icon) + layout.addLayout(texts, 1) + self.clicked.connect(lambda: self.selected.emit(self.profile)) + + +class ManageProfilePage(QWidget): + """Select a profile on the left and edit its launcher settings on the right.""" + + def __init__(self, app, parent=None): + super().__init__(parent) + self.app = app + self.profile_manager: ProfileManager = app.profile_manager + self.selected_profile_id: str | None = None + self.profile_items: dict[str, ManageProfileItem] = {} + + root = QVBoxLayout(self) + title = QLabel("Manage Profiles (Experimental)") + title.setObjectName("manageTitle") + root.addWidget(title) + + columns = QHBoxLayout() + columns.setSpacing(12) + root.addLayout(columns, 1) + + self.list_scroll = self._scroll_area("manageProfileListScroll") + self.list_content = QWidget() + self.list_layout = QVBoxLayout(self.list_content) + self.list_layout.setContentsMargins(6, 6, 6, 6) + self.list_layout.setSpacing(4) + self.list_layout.setAlignment(Qt.AlignmentFlag.AlignTop) + self.list_scroll.setWidget(self.list_content) + self.list_scroll.setMinimumWidth(260) + self.list_scroll.setMaximumWidth(380) + columns.addWidget(self.list_scroll, 2) + + self.options_scroll = self._scroll_area("manageProfileOptionsScroll") + self.options_content = QWidget() + self.options_layout = QVBoxLayout(self.options_content) + self.options_layout.setContentsMargins(20, 16, 20, 20) + self.options_layout.setSpacing(14) + self.options_scroll.setWidget(self.options_content) + columns.addWidget(self.options_scroll, 3) + + self.empty_label = QLabel("Select a profile from the list to edit its settings.") + self.empty_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.empty_label.setWordWrap(True) + self.options_layout.addWidget(self.empty_label, 1) + + self.editor = QFrame() + self.editor.setObjectName("profileEditor") + editor_layout = QVBoxLayout(self.editor) + editor_layout.setSpacing(14) + form = QFormLayout() + form.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) + form.setVerticalSpacing(12) + + self.name_edit = QLineEdit() + self.version_edit = QLineEdit() + self.type_edit = QLineEdit() + self.game_dir_edit = QLineEdit() + self.java_args_edit = QLineEdit() + self.icon_edit = QLineEdit() + self.width_spin = self._dimension_spin() + self.height_spin = self._dimension_spin() + + form.addRow("Profile name", self.name_edit) + form.addRow("Version ID", self.version_edit) + form.addRow("Profile type", self.type_edit) + form.addRow("Game directory", self.game_dir_edit) + form.addRow("Java arguments", self.java_args_edit) + form.addRow("Icon", self.icon_edit) + + resolution = QHBoxLayout() + resolution.addWidget(self.width_spin) + resolution.addWidget(QLabel("×")) + resolution.addWidget(self.height_spin) + form.addRow("Resolution", resolution) + editor_layout.addLayout(form) + + file_actions = QHBoxLayout() + open_button = QPushButton("Open Profile Folder") + open_button.clicked.connect(self.open_profile_folder) + import_button = QPushButton("Import Mods…") + import_button.clicked.connect(self.import_mods) + file_actions.addWidget(open_button) + file_actions.addWidget(import_button) + file_actions.addStretch() + editor_layout.addLayout(file_actions) + + actions = QHBoxLayout() + duplicate_button = QPushButton("Duplicate") + duplicate_button.clicked.connect(self.duplicate_profile) + delete_button = QPushButton("Delete") + delete_button.setObjectName("dangerButton") + delete_button.clicked.connect(self.delete_profile) + save_button = QPushButton("Save Changes") + save_button.setObjectName("saveProfileButton") + save_button.clicked.connect(self.save_profile) + actions.addWidget(duplicate_button) + actions.addWidget(delete_button) + actions.addStretch() + actions.addWidget(save_button) + editor_layout.addLayout(actions) + + self.options_layout.addWidget(self.editor) + self.options_layout.addStretch() + self.editor.hide() + + self.profile_manager.profiles_changed.connect(self.load_profiles) + self.app.apply_qss(Path("manage_profile.qss"), self.setStyleSheet) + self.load_profiles() + + @staticmethod + def _scroll_area(name: str) -> QScrollArea: + area = QScrollArea() + area.setObjectName(name) + area.setWidgetResizable(True) + area.setFrameShape(QFrame.Shape.NoFrame) + area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + return area + + @staticmethod + def _dimension_spin() -> QSpinBox: + spin = QSpinBox() + spin.setRange(0, 16384) + spin.setSpecialValueText("Default") + spin.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + return spin + + def load_profiles(self) -> None: + while self.list_layout.count(): + item = self.list_layout.takeAt(0) + if item.widget(): + item.widget().deleteLater() + self.profile_items.clear() + + profiles = self.profile_manager.list_profiles() + for profile in profiles: + item = ManageProfileItem(self.app, profile, self.list_content) + item.selected.connect(self.select_profile) + self.profile_items[profile.id] = item + self.list_layout.addWidget(item) + + available_ids = {profile.id for profile in profiles} + if self.selected_profile_id not in available_ids: + self.selected_profile_id = None + if self.selected_profile_id is None and profiles: + current = self.profile_manager.get_current_profile_id() + selected = next((p for p in profiles if p.id == current), profiles[0]) + self.select_profile(selected) + elif self.selected_profile_id: + profile = next(p for p in profiles if p.id == self.selected_profile_id) + self.select_profile(profile) + else: + self.editor.hide() + self.empty_label.show() + + def select_profile(self, profile: ProfileSummary) -> None: + detail = self.profile_manager.get_profile(profile.id) + if detail is None: + return + self.selected_profile_id = profile.id + for profile_id, item in self.profile_items.items(): + item.setChecked(profile_id == profile.id) + self._set_detail(detail) + self.empty_label.hide() + self.editor.show() + + def _set_detail(self, profile: ProfileDetail) -> None: + self.name_edit.setText(profile.name) + self.version_edit.setText(profile.version_id) + self.type_edit.setText(profile.version_type) + self.game_dir_edit.setText(str(profile.game_dir or "")) + self.java_args_edit.setText(profile.java_args) + self.icon_edit.setText(profile.icon) + width, height = profile.resolution or (0, 0) + self.width_spin.setValue(width) + self.height_spin.setValue(height) + + def _profile_dir(self) -> Path | None: + if self.selected_profile_id is None: + return None + detail = self.profile_manager.get_profile(self.selected_profile_id) + if detail is None: + return None + return detail.game_dir or Path(self.app.default_game_dir) + + def save_profile(self) -> None: + if self.selected_profile_id is None: + return + width, height = self.width_spin.value(), self.height_spin.value() + if (width == 0) != (height == 0): + self.app.widget_manager.signal.show_warning_message.emit( + "Set both resolution values, or set both to Default." + ) + return + game_dir_text = self.game_dir_edit.text().strip() + request = UpdateProfileRequest( + name=self.name_edit.text().strip(), + version_id=self.version_edit.text().strip(), + version_type=self.type_edit.text().strip(), + game_dir=Path(game_dir_text) if game_dir_text else None, + java_args=self.java_args_edit.text(), + icon=self.icon_edit.text().strip(), + resolution=(width, height) if width and height else None, + ) + if self.profile_manager.validate_update(request).is_valid and self.profile_manager.update_profile( + self.selected_profile_id, request + ): + self.profile_manager.save() + self.app.widget_manager.signal.show_info_message.emit("Profile settings saved.") + else: + errors = self.profile_manager.validate_update(request).errors + if errors: + self.app.widget_manager.signal.show_warning_message.emit("\n".join(errors.values())) + + def open_profile_folder(self) -> None: + profile_dir = self._profile_dir() + if profile_dir is None: + return + profile_dir.mkdir(parents=True, exist_ok=True) + QDesktopServices.openUrl(QUrl.fromLocalFile(str(profile_dir.resolve()))) + + def import_mods(self) -> None: + profile_dir = self._profile_dir() + if profile_dir is None: + return + files, _ = QFileDialog.getOpenFileNames( + self, "Import Mods", "", "Minecraft mods (*.jar *.zip);;All files (*)" + ) + if not files: + return + mods_dir = profile_dir / "mods" + mods_dir.mkdir(parents=True, exist_ok=True) + try: + for source in files: + shutil.copy2(source, mods_dir / Path(source).name) + except OSError as error: + self.app.widget_manager.signal.show_error_message.emit(f"Unable to import mod: {error}") + return + self.app.widget_manager.signal.show_info_message.emit( + f"Imported {len(files)} mod(s) into {mods_dir}." + ) + + def duplicate_profile(self) -> None: + if self.selected_profile_id is None: + return + new_id = self.profile_manager.duplicate_profile(self.selected_profile_id) + if new_id: + self.selected_profile_id = new_id + self.load_profiles() + self.profile_manager.save() + + def delete_profile(self) -> None: + if self.selected_profile_id is None: + return + answer = QMessageBox.question( + self, "Delete Profile", "Delete this profile? Game files will not be removed.", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.No, + ) + if answer == QMessageBox.StandardButton.Yes: + profile_id = self.selected_profile_id + self.selected_profile_id = None + if self.profile_manager.remove_profile(profile_id): + self.profile_manager.save() diff --git a/resources/icons/profile_edit.png b/resources/icons/profile_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7db3573f5c7b760bab1c8c53cf3b19838cc57c GIT binary patch literal 65916 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

jR4lYyG&SQ!B6JoB=S$uP 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 QWidget > QWidget { + background-color: palette(window); +} + +QLabel#settingsPageTitle { + font-size: 18pt; + font-weight: bold; +} + +QPushButton#settingsItem { + min-height: 68px; + border: 1px solid palette(mid); + border-radius: 8px; + background-color: palette(button); + text-align: left; +} + +QPushButton#settingsItem:hover { + background-color: palette(midlight); +} + +QPushButton#settingsItem:pressed { + background-color: palette(dark); +} + +QLabel#settingsItemTitle { + color: palette(button-text); + font-size: 11pt; + font-weight: bold; +} + +QLabel#settingsItemDescription { + color: palette(placeholder-text); + font-size: 9pt; +} + +QLabel#settingsHelpText { + color: palette(placeholder-text); + font-size: 9pt; +} + +QPushButton#settingsBackButton { + border: none; + border-radius: 8px; + background-color: transparent; + font-size: 22px; +} + +QPushButton#settingsBackButton:hover { + background-color: palette(button); +} + +QPushButton#settingsBackButton:pressed { + background-color: palette(midlight); +} + +QLabel#settingsSubPageTitle { + font-size: 15pt; + font-weight: bold; +} + +QLabel#settingsBrand { + font-size: 20px; + font-weight: bold; +} + +QLabel#settingsVersion { + font-size: 12px; +} + +QPlainTextEdit#settingsDescription { + font-size: 13px; +} diff --git a/window.py b/window.py index 21bbea5..40de299 100644 --- a/window.py +++ b/window.py @@ -16,6 +16,7 @@ from manager.widgets import AskForRequest, SelectPathRequest from pages.account import AccountPage from pages.create_profile import CreateProfilePage from pages.launch_profile import LaunchProfilePage +from pages.manage_profile import ManageProfilePage from pages.test import TestPage from pages.settings import SettingsPage @@ -163,6 +164,9 @@ class LauncherMainWindow(QMainWindow): # Profile page self.create_profile_page = CreateProfilePage(self.app, self) + # Profile management page + self.manage_profile_page = ManageProfilePage(self.app, self) + # Settings page self.settings_page = SettingsPage(self.app, self) @@ -172,6 +176,7 @@ class LauncherMainWindow(QMainWindow): self.central.addWidget(self.account_page) self.central.addWidget(self.settings_page) self.central.addWidget(self.create_profile_page) + self.central.addWidget(self.manage_profile_page) self.central.addWidget(self.launch_profile_page) # Bind toolbar and center widget @@ -193,24 +198,32 @@ class LauncherMainWindow(QMainWindow): icon=self.app.get_icon(Path(self.app.icon_dir, "profile_default.png"), True)) # Home btn - self.home_button = self.toolbar.add_button(icon=self.app.get_icon(Path(self.app.icon_dir, "home.png"))) + self.home_button = self.toolbar.add_button(" Home", icon=self.app.get_icon(Path(self.app.icon_dir, "home.png"))) # Settings btn (will be moved to the bottom of the toolbar) - self.open_settings_page = self.toolbar.add_button(icon=self.app.get_icon(Path(self.app.icon_dir, "settings.png"))) + self.open_settings_page = self.toolbar.add_button(" Settings", icon=self.app.get_icon(Path(self.app.icon_dir, "settings.png"))) # Account btn (will be moved to the bottom (or last one item) of the toolbar - self.open_account_page = self.toolbar.add_button(icon=self.app.get_icon(Path(self.app.icon_dir, "head.png"), True)) + self.open_account_page = self.toolbar.add_button(" Accounts", icon=self.app.get_icon(Path(self.app.icon_dir, "head.png"), True)) self.account_page.set_related_button(self.open_account_page) # AccountPage require this to set button icon to # current account's avatar # Profile btn - self.open_create_profile_page = self.toolbar.add_button(icon=self.app.get_icon(Path(self.app.icon_dir, "add.png"))) + self.open_create_profile_page = self.toolbar.add_button("Create Profile", + icon=self.app.get_icon(Path(self.app.icon_dir, "add.png"))) + + # manage profile + self.open_manage_profile_page = self.toolbar.add_button( + " Manage Profiles", + icon=self.app.get_icon(Path(self.app.icon_dir, "profile_edit.png"), True), + ) # Bind tool buttons self.toolbar.addWidget(self.home_button) self.toolbar.addWidget(self.open_test_page) self.toolbar.addWidget(self.open_create_profile_page) self.toolbar.addWidget(self.open_launch_profile_page) + self.toolbar.addWidget(self.open_manage_profile_page) self.toolbar.setMovable(True) self.toolbar.setFloatable(False) self.toolbar.setAllowedAreas(Qt.ToolBarArea.AllToolBarAreas) @@ -245,6 +258,10 @@ class LauncherMainWindow(QMainWindow): lambda: self.set_current_page(self.create_profile_page, self.open_create_profile_page) ) + self.open_manage_profile_page.clicked.connect( + lambda: self.set_current_page(self.manage_profile_page, self.open_manage_profile_page) + ) + # Bind signal event self.bind_event()