From d05f74b286d6410200cf6835020cf77ff7e3109b Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 14 Jul 2022 12:01:57 +0300 Subject: [PATCH] ImportGroup: Add option to import DLCs --- .../tabs/games/import_sync/import_group.py | 64 ++++++++++--------- .../tabs/games/import_sync/import_group.py | 16 ++++- .../tabs/games/import_sync/import_group.ui | 24 ++++++- 3 files changed, 71 insertions(+), 33 deletions(-) diff --git a/rare/components/tabs/games/import_sync/import_group.py b/rare/components/tabs/games/import_sync/import_group.py index a19a9ed4..3e276367 100644 --- a/rare/components/tabs/games/import_sync/import_group.py +++ b/rare/components/tabs/games/import_sync/import_group.py @@ -15,7 +15,6 @@ from rare.lgndr.api_arguments import LgndrImportGameArgs from rare.lgndr.api_exception import LgndrException from rare.shared import LegendaryCLISingleton, LegendaryCoreSingleton, GlobalSignalsSingleton, ApiResultsSingleton from rare.ui.components.tabs.games.import_sync.import_group import Ui_ImportGroup -from rare.utils import legendary_utils from rare.utils.extra_widgets import IndicatorLineEdit, PathEdit logger = getLogger("Import") @@ -56,15 +55,17 @@ class ImportWorker(QRunnable): finished = pyqtSignal(list) progress = pyqtSignal(int) - def __init__(self, path: str, import_folder: bool = False, app_name: str = None): + def __init__(self, path: str, app_name: str = None, import_folder: bool = False, import_dlcs: bool = False): super(ImportWorker, self).__init__() self.signals = self.Signals() self.core = LegendaryCoreSingleton() - self.path = Path(path) - self.import_folder = import_folder - self.app_name = app_name self.tr = lambda message: qApp.translate("ImportThread", message) + self.path = Path(path) + self.app_name = app_name + self.import_folder = import_folder + self.import_dlcs = import_dlcs + def run(self) -> None: result_list: List = [] if self.import_folder: @@ -85,8 +86,8 @@ class ImportWorker(QRunnable): result = ImportedGame(ImportResult.ERROR, None, None) if app_name or (app_name := find_app_name(str(path), self.core)): result.app_name = app_name - err = self.__import_game(app_name, path) app_title = self.core.get_game(app_name).app_title + err = self.__import_game(path, app_name, app_title) if err: result.result = ImportResult.FAILED result.message = f"{app_title} - {err}" @@ -97,24 +98,12 @@ class ImportWorker(QRunnable): result.message = self.tr("Could not find AppName for {}").format(str(path)) return result - # def __import_game(self, app_name: str, path: Path) -> str: - # if not (err := legendary_utils.import_game(self.core, app_name=app_name, path=str(path))): - # igame = self.core.get_installed_game(app_name) - # logger.info(f"Successfully imported {igame.title}") - # return "" - # else: - # return err - - def get_boolean_choice(self, a0): - choice = QMessageBox.question(None, "Import DLCs?", a0) - return True if choice == QMessageBox.StandardButton.Yes else False - - def __import_game(self, app_name: str, path: Path): + def __import_game(self, path: Path, app_name: str, app_title: str): cli = LegendaryCLISingleton() args = LgndrImportGameArgs( app_path=str(path), app_name=app_name, - get_boolean_choice=self.get_boolean_choice + get_boolean_choice=lambda a0: self.import_dlcs ) try: cli.import_game(args) @@ -202,17 +191,13 @@ class ImportGroup(QGroupBox): self.app_name_edit.textChanged.connect(self.app_name_changed) self.ui.app_name_layout.addWidget(self.app_name_edit) + self.ui.import_folder_check.stateChanged.connect(self.import_folder_changed) + self.ui.import_dlcs_check.setEnabled(False) + self.ui.import_button.setEnabled(False) self.ui.import_button.clicked.connect( lambda: self.import_pressed(self.path_edit.text()) ) - - self.ui.import_folder_check.stateChanged.connect( - lambda s: self.ui.import_button.setEnabled(s or (not s and self.app_name_edit.is_valid)) - ) - self.ui.import_folder_check.stateChanged.connect( - lambda s: self.app_name_edit.setEnabled(not s) - ) self.threadpool = QThreadPool.globalInstance() def path_edit_cb(self, path) -> Tuple[bool, str, str]: @@ -227,7 +212,7 @@ class ImportGroup(QGroupBox): def path_changed(self, path): self.ui.info_label.setText("") - self.ui.import_folder_check.setChecked(False) + self.ui.import_folder_check.setCheckState(Qt.Unchecked) if self.path_edit.is_valid: self.app_name_edit.setText(find_app_name(path, self.core)) else: @@ -241,17 +226,36 @@ class ImportGroup(QGroupBox): else: return False, text, IndicatorLineEdit.reasons.game_not_installed - def app_name_changed(self, text): + def app_name_changed(self, app_name: str): self.ui.info_label.setText("") + self.ui.import_dlcs_check.setCheckState(Qt.Unchecked) if self.app_name_edit.is_valid: + self.ui.import_dlcs_check.setEnabled( + bool(self.core.get_dlc_for_game(app_name)) + ) self.ui.import_button.setEnabled(True) else: + self.ui.import_dlcs_check.setEnabled(False) self.ui.import_button.setEnabled(False) + def import_folder_changed(self, state): + self.app_name_edit.setEnabled(not state) + self.ui.import_dlcs_check.setCheckState(Qt.Unchecked) + self.ui.import_dlcs_check.setEnabled( + state + or (self.app_name_edit.is_valid and bool(self.core.get_dlc_for_game(self.app_name_edit.text()))) + ) + self.ui.import_button.setEnabled(state or (not state and self.app_name_edit.is_valid)) + def import_pressed(self, path=None): if not path: path = self.path_edit.text() - worker = ImportWorker(path, self.ui.import_folder_check.isChecked(), self.app_name_edit.text()) + worker = ImportWorker( + path, + self.app_name_edit.text(), + self.ui.import_folder_check.isChecked(), + self.ui.import_dlcs_check.isChecked(), + ) worker.signals.finished.connect(self.import_finished) worker.signals.progress.connect(self.import_progress) self.threadpool.start(worker) diff --git a/rare/ui/components/tabs/games/import_sync/import_group.py b/rare/ui/components/tabs/games/import_sync/import_group.py index a7b7bc1d..fbb0f031 100644 --- a/rare/ui/components/tabs/games/import_sync/import_group.py +++ b/rare/ui/components/tabs/games/import_sync/import_group.py @@ -14,10 +14,11 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ImportGroup(object): def setupUi(self, ImportGroup): ImportGroup.setObjectName("ImportGroup") - ImportGroup.resize(501, 136) + ImportGroup.resize(501, 162) ImportGroup.setWindowTitle("ImportGroup") ImportGroup.setWindowFilePath("") self.formLayout = QtWidgets.QFormLayout(ImportGroup) + self.formLayout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.formLayout.setObjectName("formLayout") self.path_edit_label = QtWidgets.QLabel(ImportGroup) self.path_edit_label.setObjectName("path_edit_label") @@ -40,6 +41,15 @@ class Ui_ImportGroup(object): self.import_folder_check.setFont(font) self.import_folder_check.setObjectName("import_folder_check") self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.import_folder_check) + self.import_dlcs_label = QtWidgets.QLabel(ImportGroup) + self.import_dlcs_label.setObjectName("import_dlcs_label") + self.formLayout.setWidget(3, 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.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.import_dlcs_check) self.button_info_layout = QtWidgets.QHBoxLayout() self.button_info_layout.setObjectName("button_info_layout") self.import_button = QtWidgets.QPushButton(ImportGroup) @@ -54,7 +64,7 @@ class Ui_ImportGroup(object): self.info_label.setText("") self.info_label.setObjectName("info_label") self.button_info_layout.addWidget(self.info_label) - self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.button_info_layout) + self.formLayout.setLayout(4, QtWidgets.QFormLayout.FieldRole, self.button_info_layout) self.retranslateUi(ImportGroup) QtCore.QMetaObject.connectSlotsByName(ImportGroup) @@ -66,6 +76,8 @@ class Ui_ImportGroup(object): self.app_name_label.setText(_translate("ImportGroup", "Override app name")) self.import_folder_label.setText(_translate("ImportGroup", "Import all folders")) 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")) diff --git a/rare/ui/components/tabs/games/import_sync/import_group.ui b/rare/ui/components/tabs/games/import_sync/import_group.ui index f85fb386..870d0512 100644 --- a/rare/ui/components/tabs/games/import_sync/import_group.ui +++ b/rare/ui/components/tabs/games/import_sync/import_group.ui @@ -7,7 +7,7 @@ 0 0 501 - 136 + 162 @@ -20,6 +20,9 @@ Import EGL game from a directory + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -59,7 +62,26 @@ + + + + Import DLCs + + + + + + + true + + + + If a game has DLCs, try to import them too + + + +