From 6249e568495d5eeec337f6c053d186f73ffe1096 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Sat, 16 Dec 2023 00:49:51 +0200 Subject: [PATCH] InstallDialog: Oooooooof.gif * Infer the displayed to reflect where the affected directory is If base_path is set outside of InstallDialog, display that. If the game is already installed, show the installation directory If neither of the above is true, use legendary's inference based on the default platform if the game supports it. Fallback to Windows. * Disable irrelevant and potentially harmful options when the game is already installed, such as the installation path, the platform selection and creating a shortcut. * Infer the correct platform based on the existing installation. If it is not installed, use the default platform if the game supports it and fallback to windows. * Move the horrible lambda used to populate the error box when the platform was unsupported into a separate method. --- rare/components/dialogs/install_dialog.py | 91 ++++++++++++++--------- 1 file changed, 56 insertions(+), 35 deletions(-) diff --git a/rare/components/dialogs/install_dialog.py b/rare/components/dialogs/install_dialog.py index 52e0aab2..681cdbad 100644 --- a/rare/components/dialogs/install_dialog.py +++ b/rare/components/dialogs/install_dialog.py @@ -73,13 +73,17 @@ class InstallDialog(QDialog): self.ui.install_dialog_label.setText(f'

{header} "{self.rgame.app_title}"

') self.setWindowTitle(f'{header} "{self.rgame.app_title}" - {QCoreApplication.instance().applicationName()}') - if not self.options.base_path: - self.options.base_path = self.core.lgd.config.get( - "Legendary", "install_dir", fallback=os.path.expanduser("~/legendary") + if options.base_path: + base_path = options.base_path + elif rgame.is_installed: + base_path = rgame.install_path + else: + base_path = self.core.get_default_install_dir( + self.core.default_platform if self.core.default_platform in rgame.platforms else "Windows" ) self.install_dir_edit = PathEdit( - path=self.options.base_path, + path=base_path, file_mode=QFileDialog.DirectoryOnly, edit_func=self.option_changed, save_func=self.save_install_edit, @@ -90,36 +94,30 @@ class InstallDialog(QDialog): QFormLayout.FieldRole, self.install_dir_edit ) - if self.options.update: - self.ui.install_dir_label.setEnabled(False) - self.install_dir_edit.setEnabled(False) - self.ui.shortcut_label.setEnabled(False) - self.ui.shortcut_check.setEnabled(False) - else: - self.ui.shortcut_check.setChecked(QSettings().value("create_shortcut", True, bool)) + self.install_dir_edit.setDisabled(rgame.is_installed) + self.ui.install_dir_label.setDisabled(rgame.is_installed) + self.ui.shortcut_label.setDisabled(rgame.is_installed) + self.ui.shortcut_check.setDisabled(rgame.is_installed) + self.ui.shortcut_check.setChecked(not rgame.is_installed and QSettings().value("create_shortcut", True, bool)) self.error_box() - platforms = self.rgame.platforms - self.ui.platform_combo.addItems(reversed(platforms)) - self.ui.platform_combo.currentIndexChanged.connect(lambda: self.option_changed(None)) - self.ui.platform_combo.currentIndexChanged.connect(lambda: self.error_box()) - self.ui.platform_combo.currentIndexChanged.connect( - lambda i: self.error_box( - self.tr("Warning"), - self.tr("You will not be able to run the game if you select {} as platform").format( - self.ui.platform_combo.itemText(i) - ), - ) - if (self.ui.platform_combo.currentText() == "Mac" and pf.system() != "Darwin") - else None + self.ui.platform_combo.addItems(reversed(rgame.platforms)) + combo_text = ( + rgame.igame.platform + if rgame.is_installed + else self.core.default_platform + if self.core.default_platform in rgame.platforms + else "Windows" ) - self.ui.platform_combo.setCurrentIndex( - self.ui.platform_combo.findText( - "Mac" if (pf.system() == "Darwin" and "Mac" in platforms) else "Windows" - ) - ) - self.ui.platform_combo.currentTextChanged.connect(self.setup_sdl_list) + self.ui.platform_combo.setCurrentIndex(self.ui.platform_combo.findText(combo_text)) + self.ui.platform_combo.currentIndexChanged.connect(lambda i: self.option_changed(None)) + self.ui.platform_combo.currentIndexChanged.connect(self.check_incompatible_platform) + self.ui.platform_combo.currentIndexChanged.connect(self.reset_install_dir) + self.ui.platform_combo.currentIndexChanged.connect(self.reset_sdl_list) + + self.ui.platform_label.setDisabled(rgame.is_installed) + self.ui.platform_combo.setDisabled(rgame.is_installed) self.advanced.ui.max_workers_spin.setValue(self.core.lgd.config.getint("Legendary", "max_workers", fallback=0)) self.advanced.ui.max_workers_spin.valueChanged.connect(self.option_changed) @@ -139,7 +137,10 @@ class InstallDialog(QDialog): self.selectable_checks: List[TagCheckBox] = [] self.config_tags: Optional[List[str]] = None - self.setup_sdl_list(self.ui.platform_combo.currentText()) + + self.reset_install_dir(self.ui.platform_combo.currentIndex()) + self.reset_sdl_list(self.ui.platform_combo.currentIndex()) + self.check_incompatible_platform(self.ui.platform_combo.currentIndex()) self.ui.install_button.setEnabled(False) @@ -155,9 +156,10 @@ class InstallDialog(QDialog): self.selectable.setEnabled(False) if pf.system() == "Darwin": + self.ui.shortcut_label.setDisabled(True) self.ui.shortcut_check.setDisabled(True) self.ui.shortcut_check.setChecked(False) - self.ui.shortcut_check.setToolTip(self.tr("Creating a shortcut is not supported on MacOS")) + self.ui.shortcut_check.setToolTip(self.tr("Creating a shortcut is not supported on macOS")) self.advanced.ui.install_prereqs_label.setEnabled(False) self.advanced.ui.install_prereqs_check.setEnabled(False) @@ -190,8 +192,16 @@ class InstallDialog(QDialog): self.__on_verify() self.show() - @pyqtSlot(str) - def setup_sdl_list(self, platform="Windows"): + @pyqtSlot(int) + def reset_install_dir(self, index: int): + if not self.rgame.is_installed: + platform = self.ui.platform_combo.itemText(index) + default_dir = self.core.get_default_install_dir(platform) + self.install_dir_edit.setText(default_dir) + + @pyqtSlot(int) + def reset_sdl_list(self, index: int): + platform = self.ui.platform_combo.itemText(index) for cb in self.selectable_checks: cb.disconnect() cb.deleteLater() @@ -223,8 +233,19 @@ class InstallDialog(QDialog): else: self.selectable.setDisabled(True) + @pyqtSlot(int) + def check_incompatible_platform(self, index: int): + platform = self.ui.platform_combo.itemText(index) + if platform == "Mac" and pf.system() != "Darwin": + self.error_box( + self.tr("Warning"), + self.tr("You will not be able to run the game if you select {} as platform").format(platform) + ) + else: + self.error_box() + def get_options(self): - self.options.base_path = self.install_dir_edit.text() if not self.options.update else None + self.options.base_path = "" if self.rgame.is_installed else self.install_dir_edit.text() self.options.max_workers = self.advanced.ui.max_workers_spin.value() self.options.shared_memory = self.advanced.ui.max_memory_spin.value() self.options.order_opt = self.advanced.ui.dl_optimizations_check.isChecked()