From dfa60aa99f59ab8e71024257d90d1497094b66b7 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Sun, 17 Dec 2023 01:20:07 +0200 Subject: [PATCH] ImportGroup: Add platform selection when importing games. If we are importing multiple games, default to importing the native platform if the game supports it, otherwise fallback to the Windows platform --- .../tabs/games/integrations/import_group.py | 44 +++++++---- .../tabs/games/integrations/import_group.py | 52 +++++++++---- .../tabs/games/integrations/import_group.ui | 75 +++++++++++++------ 3 files changed, 122 insertions(+), 49 deletions(-) diff --git a/rare/components/tabs/games/integrations/import_group.py b/rare/components/tabs/games/integrations/import_group.py index ae4eede6..f61f96d3 100644 --- a/rare/components/tabs/games/integrations/import_group.py +++ b/rare/components/tabs/games/integrations/import_group.py @@ -72,8 +72,10 @@ class ImportWorker(QRunnable): def __init__( self, - core: LegendaryCore, path: str, + core: LegendaryCore, + path: str, app_name: str = None, + platform: Optional[str] = None, import_folder: bool = False, import_dlcs: bool = False, import_force: bool = False @@ -86,6 +88,7 @@ class ImportWorker(QRunnable): self.path = Path(path) self.app_name = app_name self.import_folder = import_folder + self.platform = platform if platform is not None else self.core.default_platform self.import_dlcs = import_dlcs self.import_force = import_force @@ -110,9 +113,13 @@ class ImportWorker(QRunnable): result = ImportedGame(ImportResult.ERROR) result.path = str(path) if app_name or (app_name := find_app_name(str(path), self.core)): + game = self.core.get_game(app_name) result.app_name = app_name - result.app_title = self.core.get_game(app_name).app_title - success, message = self.__import_game(path, app_name) + result.app_title = game.app_title + platform = self.platform + if platform not in self.core.get_game(app_name, update_meta=False).asset_infos: + platform = "Windows" + success, message = self.__import_game(path, app_name, platform) if not success: result.result = ImportResult.FAILED result.message = message @@ -120,14 +127,9 @@ class ImportWorker(QRunnable): result.result = ImportResult.SUCCESS return result - def __import_game(self, path: Path, app_name: str): + def __import_game(self, path: Path, app_name: str, platform: str): cli = LegendaryCLI(self.core) status = LgndrIndirectStatus() - # FIXME: Add override option in import form - platform = self.core.default_platform - if platform not in self.core.get_game(app_name, update_meta=False).asset_infos: - platform = "Windows" - args = LgndrImportGameArgs( app_path=str(path), app_name=app_name, @@ -212,6 +214,7 @@ class ImportGroup(QGroupBox): self.app_name_edit = IndicatorLineEdit( placeholder=self.tr("Use in case the app name was not found automatically"), edit_func=self.app_name_edit_callback, + save_func=self.app_name_save_callback, parent=self, ) self.app_name_edit.textChanged.connect(self.app_name_changed) @@ -287,6 +290,12 @@ class ImportGroup(QGroupBox): else: return False, text, IndicatorReasonsCommon.NOT_INSTALLED + def app_name_save_callback(self, text) -> None: + rgame = self.rcore.get_game(text) + self.ui.platform_combo.clear() + self.ui.platform_combo.addItems(rgame.platforms) + self.ui.platform_combo.setCurrentText(rgame.default_platform) + @pyqtSlot(str) def app_name_changed(self, app_name: str): self.info_label.setText("") @@ -302,6 +311,14 @@ class ImportGroup(QGroupBox): @pyqtSlot(int) def import_folder_changed(self, state: Qt.CheckState): self.app_name_edit.setEnabled(not state) + self.ui.platform_combo.setEnabled(not state) + self.ui.platform_combo.setToolTip( + self.tr( + "When importing multiple games, the current OS will be used at the" + " platform for the games that support it, otherwise the Windows version" + " will be imported." + ) if state else "" + ) self.ui.import_dlcs_check.setCheckState(Qt.Unchecked) self.ui.import_force_check.setCheckState(Qt.Unchecked) self.ui.import_dlcs_check.setEnabled( @@ -330,10 +347,11 @@ class ImportGroup(QGroupBox): self.worker = ImportWorker( self.core, path, - self.app_name_edit.text(), - self.ui.import_folder_check.isChecked(), - self.ui.import_dlcs_check.isChecked(), - self.ui.import_force_check.isChecked() + app_name=self.app_name_edit.text(), + platform=self.ui.platform_combo.currentText() if not self.ui.import_folder_check.isChecked() else None, + import_folder=self.ui.import_folder_check.isChecked(), + import_dlcs=self.ui.import_dlcs_check.isChecked(), + import_force=self.ui.import_force_check.isChecked() ) self.worker.signals.progress.connect(self.__on_import_progress) self.worker.signals.result.connect(self.__on_import_result) diff --git a/rare/ui/components/tabs/games/integrations/import_group.py b/rare/ui/components/tabs/games/integrations/import_group.py index cc28fda1..ccd97153 100644 --- a/rare/ui/components/tabs/games/integrations/import_group.py +++ b/rare/ui/components/tabs/games/integrations/import_group.py @@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ImportGroup(object): def setupUi(self, ImportGroup): ImportGroup.setObjectName("ImportGroup") - ImportGroup.resize(506, 184) + ImportGroup.resize(651, 218) ImportGroup.setWindowTitle("ImportGroup") ImportGroup.setWindowFilePath("") self.import_layout = QtWidgets.QFormLayout(ImportGroup) @@ -28,26 +28,35 @@ class Ui_ImportGroup(object): self.import_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.app_name_label) self.import_folder_label = QtWidgets.QLabel(ImportGroup) self.import_folder_label.setObjectName("import_folder_label") - self.import_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.import_folder_label) + self.import_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.import_folder_label) self.import_folder_check = QtWidgets.QCheckBox(ImportGroup) font = QtGui.QFont() font.setItalic(True) self.import_folder_check.setFont(font) self.import_folder_check.setObjectName("import_folder_check") - self.import_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.import_folder_check) + self.import_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.import_folder_check) self.import_dlcs_label = QtWidgets.QLabel(ImportGroup) self.import_dlcs_label.setObjectName("import_dlcs_label") - self.import_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.import_dlcs_label) + self.import_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.import_dlcs_label) self.import_dlcs_check = QtWidgets.QCheckBox(ImportGroup) font = QtGui.QFont() font.setItalic(True) self.import_dlcs_check.setFont(font) self.import_dlcs_check.setObjectName("import_dlcs_check") - self.import_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.import_dlcs_check) + self.import_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.import_dlcs_check) + self.import_force_label = QtWidgets.QLabel(ImportGroup) + self.import_force_label.setObjectName("import_force_label") + self.import_layout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.import_force_label) + self.import_force_check = QtWidgets.QCheckBox(ImportGroup) + font = QtGui.QFont() + font.setItalic(True) + self.import_force_check.setFont(font) + self.import_force_check.setObjectName("import_force_check") + self.import_layout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.import_force_check) self.import_button_label = QtWidgets.QLabel(ImportGroup) self.import_button_label.setText("Error") self.import_button_label.setObjectName("import_button_label") - self.import_layout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.import_button_label) + self.import_layout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.import_button_label) self.button_info_layout = QtWidgets.QHBoxLayout() self.button_info_layout.setObjectName("button_info_layout") self.import_button = QtWidgets.QPushButton(ImportGroup) @@ -58,16 +67,27 @@ class Ui_ImportGroup(object): self.import_button.setSizePolicy(sizePolicy) self.import_button.setObjectName("import_button") self.button_info_layout.addWidget(self.import_button) - self.import_layout.setLayout(5, QtWidgets.QFormLayout.FieldRole, self.button_info_layout) - self.import_force_label = QtWidgets.QLabel(ImportGroup) - self.import_force_label.setObjectName("import_force_label") - self.import_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.import_force_label) - self.import_force_check = QtWidgets.QCheckBox(ImportGroup) + self.import_layout.setLayout(6, QtWidgets.QFormLayout.FieldRole, self.button_info_layout) + self.platform_label = QtWidgets.QLabel(ImportGroup) + self.platform_label.setObjectName("platform_label") + self.import_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.platform_label) + self.platform_layout = QtWidgets.QHBoxLayout() + self.platform_layout.setObjectName("platform_layout") + self.platform_combo = QtWidgets.QComboBox(ImportGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.platform_combo.sizePolicy().hasHeightForWidth()) + self.platform_combo.setSizePolicy(sizePolicy) + self.platform_combo.setObjectName("platform_combo") + self.platform_layout.addWidget(self.platform_combo) + self.platform_tooltip = QtWidgets.QLabel(ImportGroup) font = QtGui.QFont() font.setItalic(True) - self.import_force_check.setFont(font) - self.import_force_check.setObjectName("import_force_check") - self.import_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.import_force_check) + self.platform_tooltip.setFont(font) + self.platform_tooltip.setObjectName("platform_tooltip") + self.platform_layout.addWidget(self.platform_tooltip) + self.import_layout.setLayout(2, QtWidgets.QFormLayout.FieldRole, self.platform_layout) self.retranslateUi(ImportGroup) @@ -80,9 +100,11 @@ class Ui_ImportGroup(object): self.import_folder_check.setText(_translate("ImportGroup", "Scan the installation path for game folders and import them")) self.import_dlcs_label.setText(_translate("ImportGroup", "Import DLCs")) self.import_dlcs_check.setText(_translate("ImportGroup", "If a game has DLCs, try to import them too")) - self.import_button.setText(_translate("ImportGroup", "Import Game")) self.import_force_label.setText(_translate("ImportGroup", "Force import")) self.import_force_check.setText(_translate("ImportGroup", "Import game despite missing files")) + self.import_button.setText(_translate("ImportGroup", "Import Game")) + self.platform_label.setText(_translate("ImportGroup", "Platform")) + self.platform_tooltip.setText(_translate("ImportGroup", "Select the native platform of the game")) if __name__ == "__main__": diff --git a/rare/ui/components/tabs/games/integrations/import_group.ui b/rare/ui/components/tabs/games/integrations/import_group.ui index 43ed7e5e..60dbd349 100644 --- a/rare/ui/components/tabs/games/integrations/import_group.ui +++ b/rare/ui/components/tabs/games/integrations/import_group.ui @@ -6,8 +6,8 @@ 0 0 - 506 - 184 + 651 + 218 @@ -37,14 +37,14 @@ - + Import all folders - + @@ -56,14 +56,14 @@ - + Import DLCs - + @@ -76,13 +76,32 @@ + + + Force import + + + + + + + + true + + + + Import game despite missing files + + + + Error - + @@ -99,24 +118,38 @@ - - + + - Force import + Platform - - - - - true - - - - Import game despite missing files - - + + + + + + + 0 + 0 + + + + + + + + + true + + + + Select the native platform of the game + + + +