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
+
+
+
+