1
0
Fork 0
mirror of synced 2024-06-26 10:11:19 +12:00

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
This commit is contained in:
loathingKernel 2023-12-17 01:20:07 +02:00
parent c9264c732e
commit dfa60aa99f
No known key found for this signature in database
GPG key ID: CE0C72D0B53821FD
3 changed files with 122 additions and 49 deletions

View file

@ -72,8 +72,10 @@ class ImportWorker(QRunnable):
def __init__( def __init__(
self, self,
core: LegendaryCore, path: str, core: LegendaryCore,
path: str,
app_name: str = None, app_name: str = None,
platform: Optional[str] = None,
import_folder: bool = False, import_folder: bool = False,
import_dlcs: bool = False, import_dlcs: bool = False,
import_force: bool = False import_force: bool = False
@ -86,6 +88,7 @@ class ImportWorker(QRunnable):
self.path = Path(path) self.path = Path(path)
self.app_name = app_name self.app_name = app_name
self.import_folder = import_folder 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_dlcs = import_dlcs
self.import_force = import_force self.import_force = import_force
@ -110,9 +113,13 @@ class ImportWorker(QRunnable):
result = ImportedGame(ImportResult.ERROR) result = ImportedGame(ImportResult.ERROR)
result.path = str(path) result.path = str(path)
if app_name or (app_name := find_app_name(str(path), self.core)): 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_name = app_name
result.app_title = self.core.get_game(app_name).app_title result.app_title = game.app_title
success, message = self.__import_game(path, app_name) 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: if not success:
result.result = ImportResult.FAILED result.result = ImportResult.FAILED
result.message = message result.message = message
@ -120,14 +127,9 @@ class ImportWorker(QRunnable):
result.result = ImportResult.SUCCESS result.result = ImportResult.SUCCESS
return result 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) cli = LegendaryCLI(self.core)
status = LgndrIndirectStatus() 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( args = LgndrImportGameArgs(
app_path=str(path), app_path=str(path),
app_name=app_name, app_name=app_name,
@ -212,6 +214,7 @@ class ImportGroup(QGroupBox):
self.app_name_edit = IndicatorLineEdit( self.app_name_edit = IndicatorLineEdit(
placeholder=self.tr("Use in case the app name was not found automatically"), placeholder=self.tr("Use in case the app name was not found automatically"),
edit_func=self.app_name_edit_callback, edit_func=self.app_name_edit_callback,
save_func=self.app_name_save_callback,
parent=self, parent=self,
) )
self.app_name_edit.textChanged.connect(self.app_name_changed) self.app_name_edit.textChanged.connect(self.app_name_changed)
@ -287,6 +290,12 @@ class ImportGroup(QGroupBox):
else: else:
return False, text, IndicatorReasonsCommon.NOT_INSTALLED 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) @pyqtSlot(str)
def app_name_changed(self, app_name: str): def app_name_changed(self, app_name: str):
self.info_label.setText("") self.info_label.setText("")
@ -302,6 +311,14 @@ class ImportGroup(QGroupBox):
@pyqtSlot(int) @pyqtSlot(int)
def import_folder_changed(self, state: Qt.CheckState): def import_folder_changed(self, state: Qt.CheckState):
self.app_name_edit.setEnabled(not state) 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_dlcs_check.setCheckState(Qt.Unchecked)
self.ui.import_force_check.setCheckState(Qt.Unchecked) self.ui.import_force_check.setCheckState(Qt.Unchecked)
self.ui.import_dlcs_check.setEnabled( self.ui.import_dlcs_check.setEnabled(
@ -330,10 +347,11 @@ class ImportGroup(QGroupBox):
self.worker = ImportWorker( self.worker = ImportWorker(
self.core, self.core,
path, path,
self.app_name_edit.text(), app_name=self.app_name_edit.text(),
self.ui.import_folder_check.isChecked(), platform=self.ui.platform_combo.currentText() if not self.ui.import_folder_check.isChecked() else None,
self.ui.import_dlcs_check.isChecked(), import_folder=self.ui.import_folder_check.isChecked(),
self.ui.import_force_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.progress.connect(self.__on_import_progress)
self.worker.signals.result.connect(self.__on_import_result) self.worker.signals.result.connect(self.__on_import_result)

View file

@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_ImportGroup(object): class Ui_ImportGroup(object):
def setupUi(self, ImportGroup): def setupUi(self, ImportGroup):
ImportGroup.setObjectName("ImportGroup") ImportGroup.setObjectName("ImportGroup")
ImportGroup.resize(506, 184) ImportGroup.resize(651, 218)
ImportGroup.setWindowTitle("ImportGroup") ImportGroup.setWindowTitle("ImportGroup")
ImportGroup.setWindowFilePath("") ImportGroup.setWindowFilePath("")
self.import_layout = QtWidgets.QFormLayout(ImportGroup) 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_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.app_name_label)
self.import_folder_label = QtWidgets.QLabel(ImportGroup) self.import_folder_label = QtWidgets.QLabel(ImportGroup)
self.import_folder_label.setObjectName("import_folder_label") 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) self.import_folder_check = QtWidgets.QCheckBox(ImportGroup)
font = QtGui.QFont() font = QtGui.QFont()
font.setItalic(True) font.setItalic(True)
self.import_folder_check.setFont(font) self.import_folder_check.setFont(font)
self.import_folder_check.setObjectName("import_folder_check") 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 = QtWidgets.QLabel(ImportGroup)
self.import_dlcs_label.setObjectName("import_dlcs_label") 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) self.import_dlcs_check = QtWidgets.QCheckBox(ImportGroup)
font = QtGui.QFont() font = QtGui.QFont()
font.setItalic(True) font.setItalic(True)
self.import_dlcs_check.setFont(font) self.import_dlcs_check.setFont(font)
self.import_dlcs_check.setObjectName("import_dlcs_check") 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 = QtWidgets.QLabel(ImportGroup)
self.import_button_label.setText("Error") self.import_button_label.setText("Error")
self.import_button_label.setObjectName("import_button_label") 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 = QtWidgets.QHBoxLayout()
self.button_info_layout.setObjectName("button_info_layout") self.button_info_layout.setObjectName("button_info_layout")
self.import_button = QtWidgets.QPushButton(ImportGroup) self.import_button = QtWidgets.QPushButton(ImportGroup)
@ -58,16 +67,27 @@ class Ui_ImportGroup(object):
self.import_button.setSizePolicy(sizePolicy) self.import_button.setSizePolicy(sizePolicy)
self.import_button.setObjectName("import_button") self.import_button.setObjectName("import_button")
self.button_info_layout.addWidget(self.import_button) self.button_info_layout.addWidget(self.import_button)
self.import_layout.setLayout(5, QtWidgets.QFormLayout.FieldRole, self.button_info_layout) self.import_layout.setLayout(6, QtWidgets.QFormLayout.FieldRole, self.button_info_layout)
self.import_force_label = QtWidgets.QLabel(ImportGroup) self.platform_label = QtWidgets.QLabel(ImportGroup)
self.import_force_label.setObjectName("import_force_label") self.platform_label.setObjectName("platform_label")
self.import_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.import_force_label) self.import_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.platform_label)
self.import_force_check = QtWidgets.QCheckBox(ImportGroup) 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 = QtGui.QFont()
font.setItalic(True) font.setItalic(True)
self.import_force_check.setFont(font) self.platform_tooltip.setFont(font)
self.import_force_check.setObjectName("import_force_check") self.platform_tooltip.setObjectName("platform_tooltip")
self.import_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.import_force_check) self.platform_layout.addWidget(self.platform_tooltip)
self.import_layout.setLayout(2, QtWidgets.QFormLayout.FieldRole, self.platform_layout)
self.retranslateUi(ImportGroup) 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_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_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_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_label.setText(_translate("ImportGroup", "Force import"))
self.import_force_check.setText(_translate("ImportGroup", "Import game despite missing files")) 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__": if __name__ == "__main__":

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>506</width> <width>651</width>
<height>184</height> <height>218</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -37,14 +37,14 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="3" column="0">
<widget class="QLabel" name="import_folder_label"> <widget class="QLabel" name="import_folder_label">
<property name="text"> <property name="text">
<string>Import all folders</string> <string>Import all folders</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="3" column="1">
<widget class="QCheckBox" name="import_folder_check"> <widget class="QCheckBox" name="import_folder_check">
<property name="font"> <property name="font">
<font> <font>
@ -56,14 +56,14 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="4" column="0">
<widget class="QLabel" name="import_dlcs_label"> <widget class="QLabel" name="import_dlcs_label">
<property name="text"> <property name="text">
<string>Import DLCs</string> <string>Import DLCs</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="4" column="1">
<widget class="QCheckBox" name="import_dlcs_check"> <widget class="QCheckBox" name="import_dlcs_check">
<property name="font"> <property name="font">
<font> <font>
@ -76,13 +76,32 @@
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="import_force_label">
<property name="text">
<string>Force import</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="import_force_check">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Import game despite missing files</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="import_button_label"> <widget class="QLabel" name="import_button_label">
<property name="text"> <property name="text">
<string notr="true">Error</string> <string notr="true">Error</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="6" column="1">
<layout class="QHBoxLayout" name="button_info_layout"> <layout class="QHBoxLayout" name="button_info_layout">
<item> <item>
<widget class="QPushButton" name="import_button"> <widget class="QPushButton" name="import_button">
@ -99,26 +118,40 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="4" column="0"> <item row="2" column="0">
<widget class="QLabel" name="import_force_label"> <widget class="QLabel" name="platform_label">
<property name="text"> <property name="text">
<string>Force import</string> <string>Platform</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="import_force_check"> <layout class="QHBoxLayout" name="platform_layout">
<item>
<widget class="QComboBox" name="platform_combo">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="platform_tooltip">
<property name="font"> <property name="font">
<font> <font>
<italic>true</italic> <italic>true</italic>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Import game despite missing files</string> <string>Select the native platform of the game</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item>
</layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>