From 436c7e02a3956134ef26cc37f55a9b0cbdc7bd27 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 6 Aug 2026 18:52:03 +0300 Subject: [PATCH 01/16] rare: keep compatibility with legendary-gl 0.21.0 --- rare/lgndr/core.py | 9 ++++++++- rare/models/game_slim.py | 12 +++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/rare/lgndr/core.py b/rare/lgndr/core.py index efa61b3cb..27376862f 100644 --- a/rare/lgndr/core.py +++ b/rare/lgndr/core.py @@ -102,7 +102,14 @@ def update_notice_enabled(self): # return super(LegendaryCore, self).get_installed_game(app_name, skip_sync) def prepare_download(self, *args, **kwargs) -> tuple[DLManager, AnalysisResult, InstalledGame]: - dlm, analysis, igame = super(LegendaryCore, self).prepare_download(*args, **kwargs) + # FIXME: Legendary 0.21.0 compatibility + try: + dlm, analysis, igame = super(LegendaryCore, self).prepare_download(*args, **kwargs) + except TypeError: + _kwargs = kwargs + if "read_files" in _kwargs: + _kwargs.pop("read_files") + dlm, analysis, igame = super(LegendaryCore, self).prepare_download(*args, **_kwargs) # lk: monkeypatch run_real (the method that emits the stats) into DLManager # pylint: disable=E1111 dlm.run_real = DLManager.run_real.__get__(dlm, DLManager) diff --git a/rare/models/game_slim.py b/rare/models/game_slim.py index f2a49fa37..9c1c5d2d7 100644 --- a/rare/models/game_slim.py +++ b/rare/models/game_slim.py @@ -262,9 +262,15 @@ def save_game_state( latest = self.latest_save # lk: if the save path wasn't known at startup, dt_local will be None # In that case resolve the save again before returning - latest.status, (latest.dt_local, latest.dt_remote) = self.core.check_savegame_state( - self.save_path, self.igame.save_timestamp, latest.file - ) + # FIXME: Legendary 0.21.0 compatibility + if hasattr(self.igame, "save_timestamp"): + latest.status, (latest.dt_local, latest.dt_remote) = self.core.check_savegame_state( + self.save_path, self.igame.save_timestamp, latest.file + ) + else: + latest.status, (latest.dt_local, latest.dt_remote) = self.core.check_savegame_state( + self.save_path, latest.file + ) return latest.status, (latest.dt_local, latest.dt_remote) return SaveGameStatus.NO_SAVE, (None, None) From 6c22bacca06c3e2b31bd4b97f7b9e42041c1eab2 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 6 Aug 2026 18:55:16 +0300 Subject: [PATCH 02/16] RareGame: update EULA methods --- rare/models/game.py | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/rare/models/game.py b/rare/models/game.py index 72ed82995..5e0e41c47 100644 --- a/rare/models/game.py +++ b/rare/models/game.py @@ -502,26 +502,38 @@ def achievements(self) -> Namespace | None: ret = Namespace(**ret) return ret - @property - def eulas(self) -> list: + def pending_eulas(self) -> list: eulas = self.game.metadata.get('eulaIds') or ['$'] - pattern = r'\w+' keys = [] for eula in eulas: keys += re.findall(pattern, eula) - not_accepted_eulas = [] for key in keys: - # if args.skip_epic and key == 'egstore': - # continue - self.logger.debug(f'Fetching eula status for "{key}"') - eula = self.core.egs.eula_get_status(key) + self.logger.debug(f'Fetching EULA status for "{key}"') + # FIXME: Legendary 0.21.0 compatibility + try: + eula = self.core.egs.eula_get_status(key) + except Exception as e: + self.logger.error(f'Failed to fetch EULA status for "{key}" {e!r}') + continue if eula: not_accepted_eulas.append(eula) - return not_accepted_eulas + def accept_eulas(self, eulas: list) -> bool: + for eula in eulas: + key = eula.get('key') + version = eula.get('version') + locale = eula.get('locale') + self.logger.debug(f'Accepting "{key}" version {version}') + try: + self.core.egs.eula_accept(key, version, locale) + except Exception as e: + self.logger.error(f'Failed to accept EULA "{key}" {e!r}') + return False + return True + def sdl_data(self, platform: str) -> dict[str, dict] | None: sdl_data = {} @@ -883,6 +895,12 @@ def disable(self, prefix: str | None = None) -> bool: return False return True + def pending_eulas(self) -> list: + return [] + + def accept_euals(self, eulas: list): + return True + def sdl_data(self, platform: str) -> dict[str, dict] | None: return None From 057c5f9398063cdfcaf58a707e4977f15ca4fa18 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:09:58 +0300 Subject: [PATCH 03/16] InstallDialog: make informative labels follow global style --- rare/components/dialogs/install/advanced.py | 10 ++++++++++ rare/components/dialogs/install/dialog.py | 1 + 2 files changed, 11 insertions(+) diff --git a/rare/components/dialogs/install/advanced.py b/rare/components/dialogs/install/advanced.py index 9893d613c..f47f5a15a 100644 --- a/rare/components/dialogs/install/advanced.py +++ b/rare/components/dialogs/install/advanced.py @@ -14,6 +14,16 @@ def __init__(self, parent=None): self.widget = QWidget(parent=self) self.ui = Ui_InstallDialogAdvanced() self.ui.setupUi(self.widget) + + self.ui.max_workers_info.setObjectName('InfoLabel') + self.ui.max_memory_info.setObjectName('InfoLabel') + self.ui.install_prereqs_check.setObjectName('InfoLabel') + self.ui.read_files_check.setObjectName('InfoLabel') + self.ui.dl_optimizations_check.setObjectName('InfoLabel') + self.ui.force_download_check.setObjectName('InfoLabel') + self.ui.ignore_space_check.setObjectName('InfoLabel') + self.ui.download_only_check.setObjectName('InfoLabel') + self.setWidget(self.widget) diff --git a/rare/components/dialogs/install/dialog.py b/rare/components/dialogs/install/dialog.py index 9d68a5623..148455fa3 100644 --- a/rare/components/dialogs/install/dialog.py +++ b/rare/components/dialogs/install/dialog.py @@ -100,6 +100,7 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal self.install_dir_edit.setDisabled(rgame.is_installed or rgame.is_dlc) self.ui.install_dir_label.setDisabled(rgame.is_installed or rgame.is_dlc) self.ui.shortcut_label.setDisabled(rgame.is_installed or rgame.is_dlc or 'WINEUSERNAME' in os.environ) + self.ui.shortcut_check.setObjectName('InfoLabel') self.ui.shortcut_check.setDisabled(rgame.is_installed or rgame.is_dlc or 'WINEUSERNAME' in os.environ) self.ui.shortcut_check.setChecked(not rgame.is_installed and self.settings.get_value(app_settings.create_shortcut)) self.ui.shortcut_check.checkStateChanged.connect(self._on_option_changed_no_reload) From 2ceeeaa67dfeaa5479db9e8094daf9e40324aef5 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:21:27 +0300 Subject: [PATCH 04/16] CloudSaves: remove Qt Designer form for the settings groupbox --- .../tabs/library/details/cloud_saves.py | 60 ++++++++++--------- .../library/details/cloud_settings_widget.py | 53 ---------------- .../library/details/cloud_settings_widget.ui | 53 ---------------- 3 files changed, 31 insertions(+), 135 deletions(-) delete mode 100644 rare/ui/components/tabs/library/details/cloud_settings_widget.py delete mode 100644 rare/ui/components/tabs/library/details/cloud_settings_widget.ui diff --git a/rare/components/tabs/library/details/cloud_saves.py b/rare/components/tabs/library/details/cloud_saves.py index 340fe8d3a..32deac05a 100644 --- a/rare/components/tabs/library/details/cloud_saves.py +++ b/rare/components/tabs/library/details/cloud_saves.py @@ -6,6 +6,7 @@ from legendary.models.game import SaveGameStatus from PySide6.QtCore import Qt, QThreadPool, Slot from PySide6.QtWidgets import ( + QCheckBox, QFileDialog, QFormLayout, QGroupBox, @@ -24,9 +25,6 @@ from rare.shared import RareCore from rare.shared.workers.cloud_sync import CloudSyncWorker from rare.shared.workers.wine_resolver import WineSavePathResolver -from rare.ui.components.tabs.library.details.cloud_settings_widget import ( - Ui_CloudSettingsWidget, -) from rare.ui.components.tabs.library.details.cloud_sync_widget import Ui_CloudSyncWidget from rare.utils.metrics import timelogger from rare.utils.misc import qta_icon @@ -60,9 +58,8 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): self.rgame: RareGame = None self.save_path_spec: str = None - self.cloud_widget = QGroupBox(self) - self.cloud_ui = Ui_CloudSettingsWidget() - self.cloud_ui.setupUi(self.cloud_widget) + self.settings_widget = QGroupBox(self) + self.settings_widget.setTitle(self.tr('Settings')) self.cloud_save_path_edit = PathEdit( path='', @@ -72,24 +69,29 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): save_func=self.save_save_path, ) self.cloud_save_path_edit.setReadOnly(True) - self.cloud_ui.main_layout.setWidget( - self.cloud_ui.main_layout.getWidgetPosition(self.cloud_ui.path_label)[0], - QFormLayout.ItemRole.FieldRole, - self.cloud_save_path_edit, - ) self.compute_save_path_button = QPushButton(qta_icon('fa.magic', 'fa5s.magic'), self.tr('Resolve path')) self.compute_save_path_button.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) - self.compute_save_path_button.clicked.connect(self.__compute_save_path) - self.cloud_ui.main_layout.addRow(None, self.compute_save_path_button) + self.compute_save_path_button.clicked.connect(self._compute_save_path) + + font = self.font() + font.setItalic(True) + + self.cloud_sync_check = QCheckBox(self.tr('Automatically synchronize saves with the cloud')) + self.cloud_sync_check.setObjectName('InfoLabel') + self.cloud_sync_check.setFont(font) + self.cloud_sync_check.checkStateChanged.connect(self._sync_check_changed) - self.cloud_ui.sync_check.checkStateChanged.connect(self.__sync_check_changed) + settings_layout = QFormLayout(self.settings_widget) + settings_layout.addRow(self.tr('Enable sync'), self.cloud_sync_check) + settings_layout.addRow(self.tr('Saves path'), self.cloud_save_path_edit) + settings_layout.addRow('', self.compute_save_path_button) self.info_label = QLabel(parent=self) layout = QVBoxLayout(self) layout.addWidget(self.sync_widget) - layout.addWidget(self.cloud_widget) + layout.addWidget(self.settings_widget) layout.addWidget(self.info_label) layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding)) @@ -124,7 +126,7 @@ def download(self): worker = CloudSyncWorker(self.rgame, CloudSyncWorker.Mode.DOWNLOAD) self.rcore.enqueue_worker(self.rgame, worker) - def __compute_save_path(self): + def _compute_save_path(self): if self.rgame.is_installed and self.rgame.game.supports_cloud_saves: try: with timelogger(self.logger, 'Detecting save path'): @@ -143,18 +145,18 @@ def __compute_save_path(self): self.cloud_save_path_edit.setDisabled(True) self.compute_save_path_button.setDisabled(True) - resolver.signals.result_ready.connect(self.__on_wine_resolver_result) + resolver.signals.result_ready.connect(self._on_wine_resolver_result) QThreadPool.globalInstance().start(resolver) return else: self.cloud_save_path_edit.setText(new_path) @Slot(Qt.CheckState) - def __sync_check_changed(self, state: Qt.CheckState): + def _sync_check_changed(self, state: Qt.CheckState): self.settings.set_with_global(app_settings.auto_sync_cloud, state != Qt.CheckState.Unchecked, self.rgame.app_name) @Slot(str, str) - def __on_wine_resolver_result(self, path, app_name): + def _on_wine_resolver_result(self, path, app_name): self.logger.info('Wine resolver finished for %s', app_name) self.logger.info('Computed save path: %s', path) if app_name == self.rgame.app_name: @@ -178,13 +180,13 @@ def __on_wine_resolver_result(self, path, app_name): return self.cloud_save_path_edit.setText(path) - def __update_widget(self): + def _update_widget(self): supports_saves = self.rgame.game.supports_cloud_saves or self.rgame.game.supports_mac_cloud_saves saves_ready = self.rgame.igame is not None and supports_saves self.sync_widget.setEnabled(bool(saves_ready and self.rgame.save_path)) # and not self.rgame.is_save_up_to_date)) - self.cloud_widget.setEnabled(saves_ready) + self.settings_widget.setEnabled(saves_ready) info_text = ( self.tr("This game doesn't support cloud saves") if not supports_saves @@ -197,7 +199,7 @@ def __update_widget(self): self.sync_ui.age_label_local.setText('None') self.sync_ui.date_info_remote.setText('None') self.sync_ui.age_label_remote.setText('None') - self.cloud_ui.sync_check.setChecked(False) + self.cloud_sync_check.setChecked(False) self.cloud_save_path_edit.setText('') return @@ -224,22 +226,22 @@ def __update_widget(self): self.sync_ui.upload_button.setDisabled(not dt_local) self.sync_ui.download_button.setDisabled(not dt_remote) - self.cloud_ui.sync_check.blockSignals(True) - self.cloud_ui.sync_check.setChecked(self.rgame.auto_sync_saves) - self.cloud_ui.sync_check.blockSignals(False) + self.cloud_sync_check.blockSignals(True) + self.cloud_sync_check.setChecked(self.rgame.auto_sync_saves) + self.cloud_sync_check.blockSignals(False) self.cloud_save_path_edit.setText(self.rgame.save_path if self.rgame.save_path else '') if platform.system() == 'Windows' and not self.rgame.save_path: - self.__compute_save_path() + self._compute_save_path() def update_game(self, rgame: RareGame): if self.rgame: - self.rgame.signals.widget.refresh.disconnect(self.__update_widget) + self.rgame.signals.widget.refresh.disconnect(self._update_widget) self.rgame = rgame self.save_path_spec = PathSpec(self.core, self.rgame.igame).resolve_egl_path_vars(self.rgame.raw_save_path) self.set_title.emit(rgame.app_title) - rgame.signals.widget.refresh.connect(self.__update_widget) + rgame.signals.widget.refresh.connect(self._update_widget) - self.__update_widget() + self._update_widget() diff --git a/rare/ui/components/tabs/library/details/cloud_settings_widget.py b/rare/ui/components/tabs/library/details/cloud_settings_widget.py deleted file mode 100644 index ecf4a8bfe..000000000 --- a/rare/ui/components/tabs/library/details/cloud_settings_widget.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'cloud_settings_widget.ui' -## -## Created by: Qt User Interface Compiler version 6.9.1 -## -## WARNING! All changes made in this file will be lost when recompiling UI file! -################################################################################ - -from PySide6.QtCore import QCoreApplication, Qt -from PySide6.QtGui import QFont -from PySide6.QtWidgets import QCheckBox, QFormLayout, QLabel - - -class Ui_CloudSettingsWidget(object): - def setupUi(self, CloudSettingsWidget): - if not CloudSettingsWidget.objectName(): - CloudSettingsWidget.setObjectName(u"CloudSettingsWidget") - CloudSettingsWidget.resize(388, 78) - CloudSettingsWidget.setWindowTitle(u"CloudSettingsWidget") - self.main_layout = QFormLayout(CloudSettingsWidget) - self.main_layout.setObjectName(u"main_layout") - self.main_layout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - self.sync_label = QLabel(CloudSettingsWidget) - self.sync_label.setObjectName(u"sync_label") - - self.main_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.sync_label) - - self.sync_check = QCheckBox(CloudSettingsWidget) - self.sync_check.setObjectName(u"sync_check") - font = QFont() - font.setItalic(True) - self.sync_check.setFont(font) - self.sync_check.setText(u"Automatically synchronize saves with the cloud") - - self.main_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.sync_check) - - self.path_label = QLabel(CloudSettingsWidget) - self.path_label.setObjectName(u"path_label") - - self.main_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.path_label) - - - self.retranslateUi(CloudSettingsWidget) - # setupUi - - def retranslateUi(self, CloudSettingsWidget): - CloudSettingsWidget.setTitle(QCoreApplication.translate("CloudSettingsWidget", u"Settings", None)) - self.sync_label.setText(QCoreApplication.translate("CloudSettingsWidget", u"Enable sync", None)) - self.path_label.setText(QCoreApplication.translate("CloudSettingsWidget", u"Saves path", None)) - # retranslateUi - diff --git a/rare/ui/components/tabs/library/details/cloud_settings_widget.ui b/rare/ui/components/tabs/library/details/cloud_settings_widget.ui deleted file mode 100644 index b4bbb26da..000000000 --- a/rare/ui/components/tabs/library/details/cloud_settings_widget.ui +++ /dev/null @@ -1,53 +0,0 @@ - - - CloudSettingsWidget - - - - 0 - 0 - 388 - 78 - - - - CloudSettingsWidget - - - Settings - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - Enable sync - - - - - - - - true - - - - Automatically synchronize saves with the cloud - - - - - - - Saves path - - - - - - - - From d5e80e986082a46f3b4974d6a0a38d33115f6118 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:24:19 +0300 Subject: [PATCH 05/16] chore: regenerate UI python files --- rare/ui/commands/launcher/console_env.py | 22 ++-- .../ui/components/dialogs/install/advanced.py | 96 +++++++------- .../dialogs/install/file_filters.py | 26 ++-- rare/ui/components/dialogs/launch_dialog.py | 2 +- .../components/dialogs/login/browser_login.py | 48 ++++--- .../components/dialogs/login/import_login.py | 40 +++--- .../components/dialogs/login/landing_page.py | 36 +++--- .../components/dialogs/login/login_dialog.py | 31 +++-- rare/ui/components/dialogs/move_dialog.py | 60 +++++---- .../tabs/downloads/download_widget.py | 58 ++++----- .../tabs/downloads/queue_base_widget.py | 54 ++++---- .../tabs/downloads/queue_info_widget.py | 50 ++++---- .../tabs/integrations/egl_sync_group.py | 31 +++-- .../tabs/integrations/egl_sync_list_group.py | 36 +++--- .../tabs/integrations/eos_widget.py | 51 ++++---- .../tabs/integrations/import_group.py | 2 +- .../tabs/library/details/cloud_sync_widget.py | 54 ++++---- .../tabs/library/details/details.py | 3 +- .../tabs/library/details/dlc_widget.py | 44 +++---- .../components/tabs/library/details/dlcs.py | 42 +++--- rare/ui/components/tabs/settings/about.py | 67 +++++----- rare/ui/components/tabs/settings/legendary.py | 3 +- rare/ui/components/tabs/settings/rare.py | 120 +++++++++--------- .../tabs/settings/widgets/discord_rpc.py | 31 +++-- .../tabs/settings/widgets/overlay.py | 42 +++--- rare/ui/components/tabs/store/details.py | 110 ++++++++-------- rare/ui/components/tabs/store/landing.py | 84 ++++++------ rare/ui/components/tabs/store/search.py | 84 ++++++------ .../tabs/store/widgets/wishlist_widget.py | 36 +++--- rare/ui/components/tabs/store/wishlist.py | 34 +++-- 30 files changed, 674 insertions(+), 723 deletions(-) diff --git a/rare/ui/commands/launcher/console_env.py b/rare/ui/commands/launcher/console_env.py index 7bbd5ee5c..5cef01c3d 100644 --- a/rare/ui/commands/launcher/console_env.py +++ b/rare/ui/commands/launcher/console_env.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'console_env.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,14 +12,14 @@ from PySide6.QtWidgets import QAbstractItemView, QDialogButtonBox, QTableWidget, QTableWidgetItem, QVBoxLayout -class Ui_ConsoleEnv(object): +class Ui_ConsoleEnv: def setupUi(self, ConsoleEnv): if not ConsoleEnv.objectName(): - ConsoleEnv.setObjectName(u"ConsoleEnv") + ConsoleEnv.setObjectName("ConsoleEnv") ConsoleEnv.resize(600, 400) - ConsoleEnv.setWindowTitle(u"ConsoleEnv") + ConsoleEnv.setWindowTitle("ConsoleEnv") self.layout = QVBoxLayout(ConsoleEnv) - self.layout.setObjectName(u"layout") + self.layout.setObjectName("layout") self.table = QTableWidget(ConsoleEnv) if (self.table.columnCount() < 2): self.table.setColumnCount(2) @@ -28,9 +27,9 @@ def setupUi(self, ConsoleEnv): self.table.setHorizontalHeaderItem(0, __qtablewidgetitem) __qtablewidgetitem1 = QTableWidgetItem() self.table.setHorizontalHeaderItem(1, __qtablewidgetitem1) - self.table.setObjectName(u"table") + self.table.setObjectName("table") font = QFont() - font.setFamilies([u"Monospace"]) + font.setFamilies(["Monospace"]) self.table.setFont(font) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table.setAlternatingRowColors(True) @@ -45,7 +44,7 @@ def setupUi(self, ConsoleEnv): self.layout.addWidget(self.table) self.buttons = QDialogButtonBox(ConsoleEnv) - self.buttons.setObjectName(u"buttons") + self.buttons.setObjectName("buttons") self.buttons.setOrientation(Qt.Horizontal) self.buttons.setStandardButtons(QDialogButtonBox.Close) @@ -59,9 +58,8 @@ def setupUi(self, ConsoleEnv): def retranslateUi(self, ConsoleEnv): ___qtablewidgetitem = self.table.horizontalHeaderItem(0) - ___qtablewidgetitem.setText(QCoreApplication.translate("ConsoleEnv", u"Variable", None)) + ___qtablewidgetitem.setText(QCoreApplication.translate("ConsoleEnv", "Variable", None)) ___qtablewidgetitem1 = self.table.horizontalHeaderItem(1) - ___qtablewidgetitem1.setText(QCoreApplication.translate("ConsoleEnv", u"Value", None)) - pass + ___qtablewidgetitem1.setText(QCoreApplication.translate("ConsoleEnv", "Value", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/install/advanced.py b/rare/ui/components/dialogs/install/advanced.py index c3e82051f..035178fd4 100644 --- a/rare/ui/components/dialogs/install/advanced.py +++ b/rare/ui/components/dialogs/install/advanced.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'advanced.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,25 +12,25 @@ from PySide6.QtWidgets import QCheckBox, QFormLayout, QHBoxLayout, QLabel, QSizePolicy, QSpinBox -class Ui_InstallDialogAdvanced(object): +class Ui_InstallDialogAdvanced: def setupUi(self, InstallDialogAdvanced): if not InstallDialogAdvanced.objectName(): - InstallDialogAdvanced.setObjectName(u"InstallDialogAdvanced") + InstallDialogAdvanced.setObjectName("InstallDialogAdvanced") InstallDialogAdvanced.resize(393, 209) - InstallDialogAdvanced.setWindowTitle(u"InstallDialogAdvanced") + InstallDialogAdvanced.setWindowTitle("InstallDialogAdvanced") self.main_layout = QFormLayout(InstallDialogAdvanced) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.main_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.max_workers_label = QLabel(InstallDialogAdvanced) - self.max_workers_label.setObjectName(u"max_workers_label") + self.max_workers_label.setObjectName("max_workers_label") self.max_workers_label.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.main_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.max_workers_label) self.max_workers_layout = QHBoxLayout() - self.max_workers_layout.setObjectName(u"max_workers_layout") + self.max_workers_layout.setObjectName("max_workers_layout") self.max_workers_spin = QSpinBox(InstallDialogAdvanced) - self.max_workers_spin.setObjectName(u"max_workers_spin") + self.max_workers_spin.setObjectName("max_workers_spin") sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -41,7 +40,7 @@ def setupUi(self, InstallDialogAdvanced): self.max_workers_layout.addWidget(self.max_workers_spin) self.max_workers_info = QLabel(InstallDialogAdvanced) - self.max_workers_info.setObjectName(u"max_workers_info") + self.max_workers_info.setObjectName("max_workers_info") font = QFont() font.setItalic(True) self.max_workers_info.setFont(font) @@ -52,15 +51,15 @@ def setupUi(self, InstallDialogAdvanced): self.main_layout.setLayout(0, QFormLayout.ItemRole.FieldRole, self.max_workers_layout) self.max_memory_label = QLabel(InstallDialogAdvanced) - self.max_memory_label.setObjectName(u"max_memory_label") + self.max_memory_label.setObjectName("max_memory_label") self.max_memory_label.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.main_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.max_memory_label) self.max_memory_layout = QHBoxLayout() - self.max_memory_layout.setObjectName(u"max_memory_layout") + self.max_memory_layout.setObjectName("max_memory_layout") self.max_memory_spin = QSpinBox(InstallDialogAdvanced) - self.max_memory_spin.setObjectName(u"max_memory_spin") + self.max_memory_spin.setObjectName("max_memory_spin") sizePolicy.setHeightForWidth(self.max_memory_spin.sizePolicy().hasHeightForWidth()) self.max_memory_spin.setSizePolicy(sizePolicy) self.max_memory_spin.setMinimum(0) @@ -71,7 +70,7 @@ def setupUi(self, InstallDialogAdvanced): self.max_memory_layout.addWidget(self.max_memory_spin) self.max_memory_info = QLabel(InstallDialogAdvanced) - self.max_memory_info.setObjectName(u"max_memory_info") + self.max_memory_info.setObjectName("max_memory_info") self.max_memory_info.setFont(font) self.max_memory_layout.addWidget(self.max_memory_info) @@ -80,69 +79,69 @@ def setupUi(self, InstallDialogAdvanced): self.main_layout.setLayout(1, QFormLayout.ItemRole.FieldRole, self.max_memory_layout) self.install_prereqs_label = QLabel(InstallDialogAdvanced) - self.install_prereqs_label.setObjectName(u"install_prereqs_label") + self.install_prereqs_label.setObjectName("install_prereqs_label") self.main_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.install_prereqs_label) self.install_prereqs_check = QCheckBox(InstallDialogAdvanced) - self.install_prereqs_check.setObjectName(u"install_prereqs_check") + self.install_prereqs_check.setObjectName("install_prereqs_check") self.install_prereqs_check.setFont(font) self.install_prereqs_check.setChecked(False) self.main_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.install_prereqs_check) self.read_files_label = QLabel(InstallDialogAdvanced) - self.read_files_label.setObjectName(u"read_files_label") + self.read_files_label.setObjectName("read_files_label") self.main_layout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.read_files_label) self.read_files_check = QCheckBox(InstallDialogAdvanced) - self.read_files_check.setObjectName(u"read_files_check") + self.read_files_check.setObjectName("read_files_check") self.read_files_check.setFont(font) self.main_layout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.read_files_check) self.dl_optimizations_label = QLabel(InstallDialogAdvanced) - self.dl_optimizations_label.setObjectName(u"dl_optimizations_label") + self.dl_optimizations_label.setObjectName("dl_optimizations_label") self.main_layout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.dl_optimizations_label) self.dl_optimizations_check = QCheckBox(InstallDialogAdvanced) - self.dl_optimizations_check.setObjectName(u"dl_optimizations_check") + self.dl_optimizations_check.setObjectName("dl_optimizations_check") self.dl_optimizations_check.setFont(font) self.dl_optimizations_check.setChecked(False) self.main_layout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.dl_optimizations_check) self.force_download_label = QLabel(InstallDialogAdvanced) - self.force_download_label.setObjectName(u"force_download_label") + self.force_download_label.setObjectName("force_download_label") self.main_layout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.force_download_label) self.force_download_check = QCheckBox(InstallDialogAdvanced) - self.force_download_check.setObjectName(u"force_download_check") + self.force_download_check.setObjectName("force_download_check") self.force_download_check.setFont(font) self.main_layout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.force_download_check) self.ignore_space_label = QLabel(InstallDialogAdvanced) - self.ignore_space_label.setObjectName(u"ignore_space_label") + self.ignore_space_label.setObjectName("ignore_space_label") self.main_layout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.ignore_space_label) self.ignore_space_check = QCheckBox(InstallDialogAdvanced) - self.ignore_space_check.setObjectName(u"ignore_space_check") + self.ignore_space_check.setObjectName("ignore_space_check") self.ignore_space_check.setFont(font) self.main_layout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.ignore_space_check) self.download_only_label = QLabel(InstallDialogAdvanced) - self.download_only_label.setObjectName(u"download_only_label") + self.download_only_label.setObjectName("download_only_label") self.main_layout.setWidget(7, QFormLayout.ItemRole.LabelRole, self.download_only_label) self.download_only_check = QCheckBox(InstallDialogAdvanced) - self.download_only_check.setObjectName(u"download_only_check") + self.download_only_check.setObjectName("download_only_check") self.download_only_check.setFont(font) self.main_layout.setWidget(7, QFormLayout.ItemRole.FieldRole, self.download_only_check) @@ -152,47 +151,46 @@ def setupUi(self, InstallDialogAdvanced): # setupUi def retranslateUi(self, InstallDialogAdvanced): - self.max_workers_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Max workers", None)) + self.max_workers_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Max workers", None)) #if QT_CONFIG(tooltip) - self.max_workers_spin.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", u"Maximum amount of download workers, default: min(2 * CPUs, 16).", None)) + self.max_workers_spin.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", "Maximum amount of download workers, default: min(2 * CPUs, 16).", None)) #endif // QT_CONFIG(tooltip) - self.max_workers_info.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Less is slower. (0: Default)", None)) - self.max_memory_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Max shared memory", None)) + self.max_workers_info.setText(QCoreApplication.translate("InstallDialogAdvanced", "Less is slower. (0: Default)", None)) + self.max_memory_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Max shared memory", None)) #if QT_CONFIG(tooltip) - self.max_memory_spin.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", u"Maximum amount of shared memory to use (in MiB), default: 1 GiB.", None)) + self.max_memory_spin.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", "Maximum amount of shared memory to use (in MiB), default: 1 GiB.", None)) #endif // QT_CONFIG(tooltip) - self.max_memory_spin.setSuffix(QCoreApplication.translate("InstallDialogAdvanced", u"MiB", None)) - self.max_memory_info.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Less is slower (0: Default)", None)) - self.install_prereqs_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Install prerequisites", None)) + self.max_memory_spin.setSuffix(QCoreApplication.translate("InstallDialogAdvanced", "MiB", None)) + self.max_memory_info.setText(QCoreApplication.translate("InstallDialogAdvanced", "Less is slower (0: Default)", None)) + self.install_prereqs_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Install prerequisites", None)) #if QT_CONFIG(tooltip) self.install_prereqs_check.setToolTip("") #endif // QT_CONFIG(tooltip) self.install_prereqs_check.setText("") - self.read_files_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Read from files", None)) + self.read_files_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Read from files", None)) #if QT_CONFIG(tooltip) - self.read_files_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", u"Read duplicated parts from already saved files, do not keep them in memory.", None)) + self.read_files_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", "Read duplicated parts from already saved files, do not keep them in memory.", None)) #endif // QT_CONFIG(tooltip) - self.read_files_check.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Increases storage I/O, reduces RAM usage.", None)) - self.dl_optimizations_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Enable reordering", None)) + self.read_files_check.setText(QCoreApplication.translate("InstallDialogAdvanced", "Increases storage I/O, reduces RAM usage.", None)) + self.dl_optimizations_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Enable reordering", None)) #if QT_CONFIG(tooltip) - self.dl_optimizations_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", u"Enable reordering optimization to reduce RAM requirements during download (may have adverse results for some titles).", None)) + self.dl_optimizations_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", "Enable reordering optimization to reduce RAM requirements during download (may have adverse results for some titles).", None)) #endif // QT_CONFIG(tooltip) - self.dl_optimizations_check.setText(QCoreApplication.translate("InstallDialogAdvanced", u"May cause issues!", None)) - self.force_download_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Force redownload", None)) + self.dl_optimizations_check.setText(QCoreApplication.translate("InstallDialogAdvanced", "May cause issues!", None)) + self.force_download_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Force redownload", None)) #if QT_CONFIG(tooltip) - self.force_download_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", u"Download all files / ignore existing (overwrite).", None)) + self.force_download_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", "Download all files / ignore existing (overwrite).", None)) #endif // QT_CONFIG(tooltip) self.force_download_check.setText("") - self.ignore_space_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Ignore free space", None)) + self.ignore_space_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Ignore free space", None)) #if QT_CONFIG(tooltip) - self.ignore_space_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", u"Do not abort if not enough free space is available.", None)) + self.ignore_space_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", "Do not abort if not enough free space is available.", None)) #endif // QT_CONFIG(tooltip) - self.ignore_space_check.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Use with caution!", None)) - self.download_only_label.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Download only", None)) + self.ignore_space_check.setText(QCoreApplication.translate("InstallDialogAdvanced", "Use with caution!", None)) + self.download_only_label.setText(QCoreApplication.translate("InstallDialogAdvanced", "Download only", None)) #if QT_CONFIG(tooltip) - self.download_only_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", u"Do not install app and do not run prerequisite installers after download.", None)) + self.download_only_check.setToolTip(QCoreApplication.translate("InstallDialogAdvanced", "Do not install app and do not run prerequisite installers after download.", None)) #endif // QT_CONFIG(tooltip) - self.download_only_check.setText(QCoreApplication.translate("InstallDialogAdvanced", u"Do not try to install.", None)) - pass + self.download_only_check.setText(QCoreApplication.translate("InstallDialogAdvanced", "Do not try to install.", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/install/file_filters.py b/rare/ui/components/dialogs/install/file_filters.py index e0f03e6d0..dba7f70a5 100644 --- a/rare/ui/components/dialogs/install/file_filters.py +++ b/rare/ui/components/dialogs/install/file_filters.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'file_filters.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -19,24 +18,24 @@ ) -class Ui_InstallDialogFileFilters(object): +class Ui_InstallDialogFileFilters: def setupUi(self, InstallDialogFileFilters): if not InstallDialogFileFilters.objectName(): - InstallDialogFileFilters.setObjectName(u"InstallDialogFileFilters") + InstallDialogFileFilters.setObjectName("InstallDialogFileFilters") InstallDialogFileFilters.resize(274, 246) - InstallDialogFileFilters.setWindowTitle(u"InstallDialogFileFilters") + InstallDialogFileFilters.setWindowTitle("InstallDialogFileFilters") self.main_layout = QFormLayout(InstallDialogFileFilters) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.main_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.exclude_prefix_label = QLabel(InstallDialogFileFilters) - self.exclude_prefix_label.setObjectName(u"exclude_prefix_label") + self.exclude_prefix_label.setObjectName("exclude_prefix_label") self.main_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.exclude_prefix_label) self.exclude_prefix_layout = QHBoxLayout() - self.exclude_prefix_layout.setObjectName(u"exclude_prefix_layout") + self.exclude_prefix_layout.setObjectName("exclude_prefix_layout") self.exclude_prefix_info = QLabel(InstallDialogFileFilters) - self.exclude_prefix_info.setObjectName(u"exclude_prefix_info") + self.exclude_prefix_info.setObjectName("exclude_prefix_info") self.exclude_prefix_info.setFrameShape(QFrame.Shape.StyledPanel) self.exclude_prefix_info.setFrameShadow(QFrame.Shadow.Sunken) self.exclude_prefix_info.setWordWrap(True) @@ -44,7 +43,7 @@ def setupUi(self, InstallDialogFileFilters): self.exclude_prefix_layout.addWidget(self.exclude_prefix_info) self.exclude_prefix_button = QPushButton(InstallDialogFileFilters) - self.exclude_prefix_button.setObjectName(u"exclude_prefix_button") + self.exclude_prefix_button.setObjectName("exclude_prefix_button") self.exclude_prefix_layout.addWidget(self.exclude_prefix_button) @@ -53,7 +52,7 @@ def setupUi(self, InstallDialogFileFilters): self.main_layout.setLayout(0, QFormLayout.ItemRole.FieldRole, self.exclude_prefix_layout) self.exclude_list = QListWidget(InstallDialogFileFilters) - self.exclude_list.setObjectName(u"exclude_list") + self.exclude_list.setObjectName("exclude_list") self.main_layout.setWidget(1, QFormLayout.ItemRole.SpanningRole, self.exclude_list) @@ -62,9 +61,8 @@ def setupUi(self, InstallDialogFileFilters): # setupUi def retranslateUi(self, InstallDialogFileFilters): - self.exclude_prefix_label.setText(QCoreApplication.translate("InstallDialogFileFilters", u"Excluded files", None)) + self.exclude_prefix_label.setText(QCoreApplication.translate("InstallDialogFileFilters", "Excluded files", None)) self.exclude_prefix_info.setText("") - self.exclude_prefix_button.setText(QCoreApplication.translate("InstallDialogFileFilters", u"Select...", None)) - pass + self.exclude_prefix_button.setText(QCoreApplication.translate("InstallDialogFileFilters", "Select...", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/launch_dialog.py b/rare/ui/components/dialogs/launch_dialog.py index 28113a873..03f7e676c 100644 --- a/rare/ui/components/dialogs/launch_dialog.py +++ b/rare/ui/components/dialogs/launch_dialog.py @@ -2,7 +2,7 @@ ################################################################################ ## Form generated from reading UI file 'launch_dialog.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ diff --git a/rare/ui/components/dialogs/login/browser_login.py b/rare/ui/components/dialogs/login/browser_login.py index c0ca47942..a6bcac23b 100644 --- a/rare/ui/components/dialogs/login/browser_login.py +++ b/rare/ui/components/dialogs/login/browser_login.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'browser_login.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -24,16 +23,16 @@ ) -class Ui_BrowserLogin(object): +class Ui_BrowserLogin: def setupUi(self, BrowserLogin): if not BrowserLogin.objectName(): - BrowserLogin.setObjectName(u"BrowserLogin") + BrowserLogin.setObjectName("BrowserLogin") BrowserLogin.resize(310, 237) - BrowserLogin.setWindowTitle(u"BrowserLogin") + BrowserLogin.setWindowTitle("BrowserLogin") self.main_layout = QVBoxLayout(BrowserLogin) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.title_label = QLabel(BrowserLogin) - self.title_label.setObjectName(u"title_label") + self.title_label.setObjectName("title_label") sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -46,30 +45,30 @@ def setupUi(self, BrowserLogin): self.main_layout.addWidget(self.title_label, 0, Qt.AlignmentFlag.AlignTop) self.form_widget = QWidget(BrowserLogin) - self.form_widget.setObjectName(u"form_widget") + self.form_widget.setObjectName("form_widget") self.form_layout = QFormLayout(self.form_widget) - self.form_layout.setObjectName(u"form_layout") + self.form_layout.setObjectName("form_layout") self.form_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.form_layout.setContentsMargins(0, 0, 0, 0) self.open_button = QPushButton(self.form_widget) - self.open_button.setObjectName(u"open_button") + self.open_button.setObjectName("open_button") self.form_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.open_button) self.link_layout = QHBoxLayout() - self.link_layout.setObjectName(u"link_layout") + self.link_layout.setObjectName("link_layout") self.link_layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize) self.link_text = QLineEdit(self.form_widget) - self.link_text.setObjectName(u"link_text") - self.link_text.setText(u"") + self.link_text.setObjectName("link_text") + self.link_text.setText("") self.link_text.setReadOnly(True) - self.link_text.setPlaceholderText(u"") + self.link_text.setPlaceholderText("") self.link_layout.addWidget(self.link_text) self.copy_button = QPushButton(self.form_widget) - self.copy_button.setObjectName(u"copy_button") - self.copy_button.setText(u"") + self.copy_button.setObjectName("copy_button") + self.copy_button.setText("") self.link_layout.addWidget(self.copy_button) @@ -78,23 +77,23 @@ def setupUi(self, BrowserLogin): self.form_layout.setLayout(0, QFormLayout.ItemRole.FieldRole, self.link_layout) self.sid_label = QLabel(self.form_widget) - self.sid_label.setObjectName(u"sid_label") - self.sid_label.setText(u"authorizationCode") + self.sid_label.setObjectName("sid_label") + self.sid_label.setText("authorizationCode") self.sid_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.form_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.sid_label) self.status_field = QLabel(self.form_widget) - self.status_field.setObjectName(u"status_field") + self.status_field.setObjectName("status_field") self.status_field.setFrameShape(QFrame.Shape.StyledPanel) self.status_field.setFrameShadow(QFrame.Shadow.Sunken) - self.status_field.setText(u"") + self.status_field.setText("") self.status_field.setWordWrap(True) self.form_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.status_field) self.status_label = QLabel(self.form_widget) - self.status_label.setObjectName(u"status_label") + self.status_label.setObjectName("status_label") self.form_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.status_label) @@ -107,9 +106,8 @@ def setupUi(self, BrowserLogin): # setupUi def retranslateUi(self, BrowserLogin): - self.title_label.setText(QCoreApplication.translate("BrowserLogin", u"Login through browser", None)) - self.open_button.setText(QCoreApplication.translate("BrowserLogin", u"Open Browser", None)) - self.status_label.setText(QCoreApplication.translate("BrowserLogin", u"Status", None)) - pass + self.title_label.setText(QCoreApplication.translate("BrowserLogin", "Login through browser", None)) + self.open_button.setText(QCoreApplication.translate("BrowserLogin", "Open Browser", None)) + self.status_label.setText(QCoreApplication.translate("BrowserLogin", "Status", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/login/import_login.py b/rare/ui/components/dialogs/login/import_login.py index ae1e74706..c56b99198 100644 --- a/rare/ui/components/dialogs/login/import_login.py +++ b/rare/ui/components/dialogs/login/import_login.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'import_login.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,16 +12,16 @@ from PySide6.QtWidgets import QComboBox, QFormLayout, QFrame, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QVBoxLayout, QWidget -class Ui_ImportLogin(object): +class Ui_ImportLogin: def setupUi(self, ImportLogin): if not ImportLogin.objectName(): - ImportLogin.setObjectName(u"ImportLogin") + ImportLogin.setObjectName("ImportLogin") ImportLogin.resize(256, 128) - ImportLogin.setWindowTitle(u"ImportLogin") + ImportLogin.setWindowTitle("ImportLogin") self.main_layout = QVBoxLayout(ImportLogin) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.title_label = QLabel(ImportLogin) - self.title_label.setObjectName(u"title_label") + self.title_label.setObjectName("title_label") sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -35,20 +34,20 @@ def setupUi(self, ImportLogin): self.main_layout.addWidget(self.title_label) self.form_widget = QWidget(ImportLogin) - self.form_widget.setObjectName(u"form_widget") + self.form_widget.setObjectName("form_widget") self.form_layout = QFormLayout(self.form_widget) - self.form_layout.setObjectName(u"form_layout") + self.form_layout.setObjectName("form_layout") self.form_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.form_layout.setContentsMargins(0, 0, 0, 0) self.prefix_label = QLabel(self.form_widget) - self.prefix_label.setObjectName(u"prefix_label") + self.prefix_label.setObjectName("prefix_label") self.form_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.prefix_label) self.prefix_layout = QHBoxLayout() - self.prefix_layout.setObjectName(u"prefix_layout") + self.prefix_layout.setObjectName("prefix_layout") self.prefix_combo = QComboBox(self.form_widget) - self.prefix_combo.setObjectName(u"prefix_combo") + self.prefix_combo.setObjectName("prefix_combo") self.prefix_combo.setEditable(True) self.prefix_combo.setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon) self.prefix_combo.setFrame(True) @@ -56,7 +55,7 @@ def setupUi(self, ImportLogin): self.prefix_layout.addWidget(self.prefix_combo) self.prefix_button = QPushButton(self.form_widget) - self.prefix_button.setObjectName(u"prefix_button") + self.prefix_button.setObjectName("prefix_button") self.prefix_layout.addWidget(self.prefix_button) @@ -65,16 +64,16 @@ def setupUi(self, ImportLogin): self.form_layout.setLayout(0, QFormLayout.ItemRole.FieldRole, self.prefix_layout) self.status_field = QLabel(self.form_widget) - self.status_field.setObjectName(u"status_field") + self.status_field.setObjectName("status_field") self.status_field.setFrameShape(QFrame.Shape.StyledPanel) self.status_field.setFrameShadow(QFrame.Shadow.Sunken) - self.status_field.setText(u"") + self.status_field.setText("") self.status_field.setWordWrap(True) self.form_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.status_field) self.status_label = QLabel(self.form_widget) - self.status_label.setObjectName(u"status_label") + self.status_label.setObjectName("status_label") self.form_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.status_label) @@ -87,10 +86,9 @@ def setupUi(self, ImportLogin): # setupUi def retranslateUi(self, ImportLogin): - self.title_label.setText(QCoreApplication.translate("ImportLogin", u"Import existing session from EGL", None)) - self.prefix_label.setText(QCoreApplication.translate("ImportLogin", u"Select prefix", None)) - self.prefix_button.setText(QCoreApplication.translate("ImportLogin", u"Browse...", None)) - self.status_label.setText(QCoreApplication.translate("ImportLogin", u"Status", None)) - pass + self.title_label.setText(QCoreApplication.translate("ImportLogin", "Import existing session from EGL", None)) + self.prefix_label.setText(QCoreApplication.translate("ImportLogin", "Select prefix", None)) + self.prefix_button.setText(QCoreApplication.translate("ImportLogin", "Browse...", None)) + self.status_label.setText(QCoreApplication.translate("ImportLogin", "Status", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/login/landing_page.py b/rare/ui/components/dialogs/login/landing_page.py index 9099a2a6e..aa1231459 100644 --- a/rare/ui/components/dialogs/login/landing_page.py +++ b/rare/ui/components/dialogs/login/landing_page.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'landing_page.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,16 +12,16 @@ from PySide6.QtWidgets import QFormLayout, QLabel, QRadioButton, QSizePolicy, QVBoxLayout, QWidget -class Ui_LandingPage(object): +class Ui_LandingPage: def setupUi(self, LandingPage): if not LandingPage.objectName(): - LandingPage.setObjectName(u"LandingPage") + LandingPage.setObjectName("LandingPage") LandingPage.resize(300, 95) - LandingPage.setWindowTitle(u"LandingPage") + LandingPage.setWindowTitle("LandingPage") self.main_layout = QVBoxLayout(LandingPage) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.login_label = QLabel(LandingPage) - self.login_label.setObjectName(u"login_label") + self.login_label.setObjectName("login_label") sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -35,15 +34,15 @@ def setupUi(self, LandingPage): self.main_layout.addWidget(self.login_label) self.form_widget = QWidget(LandingPage) - self.form_widget.setObjectName(u"form_widget") + self.form_widget.setObjectName("form_widget") self.form_widget.setMinimumSize(QSize(0, 20)) self.form_layout = QFormLayout(self.form_widget) - self.form_layout.setObjectName(u"form_layout") + self.form_layout.setObjectName("form_layout") self.form_layout.setHorizontalSpacing(15) self.form_layout.setVerticalSpacing(5) self.form_layout.setContentsMargins(0, 0, 0, 0) self.login_browser_radio = QRadioButton(self.form_widget) - self.login_browser_radio.setObjectName(u"login_browser_radio") + self.login_browser_radio.setObjectName("login_browser_radio") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) @@ -53,7 +52,7 @@ def setupUi(self, LandingPage): self.form_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.login_browser_radio) self.login_browser_label = QLabel(self.form_widget) - self.login_browser_label.setObjectName(u"login_browser_label") + self.login_browser_label.setObjectName("login_browser_label") font1 = QFont() font1.setItalic(True) self.login_browser_label.setFont(font1) @@ -61,14 +60,14 @@ def setupUi(self, LandingPage): self.form_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.login_browser_label) self.login_import_radio = QRadioButton(self.form_widget) - self.login_import_radio.setObjectName(u"login_import_radio") + self.login_import_radio.setObjectName("login_import_radio") sizePolicy1.setHeightForWidth(self.login_import_radio.sizePolicy().hasHeightForWidth()) self.login_import_radio.setSizePolicy(sizePolicy1) self.form_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.login_import_radio) self.login_import_label = QLabel(self.form_widget) - self.login_import_label.setObjectName(u"login_import_label") + self.login_import_label.setObjectName("login_import_label") self.login_import_label.setFont(font1) self.form_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.login_import_label) @@ -81,11 +80,10 @@ def setupUi(self, LandingPage): # setupUi def retranslateUi(self, LandingPage): - self.login_label.setText(QCoreApplication.translate("LandingPage", u"Select login method", None)) - self.login_browser_radio.setText(QCoreApplication.translate("LandingPage", u"Browser", None)) - self.login_browser_label.setText(QCoreApplication.translate("LandingPage", u"Login using a browser.", None)) - self.login_import_radio.setText(QCoreApplication.translate("LandingPage", u"Import", None)) - self.login_import_label.setText(QCoreApplication.translate("LandingPage", u"Import from Epic Games Launcher", None)) - pass + self.login_label.setText(QCoreApplication.translate("LandingPage", "Select login method", None)) + self.login_browser_radio.setText(QCoreApplication.translate("LandingPage", "Browser", None)) + self.login_browser_label.setText(QCoreApplication.translate("LandingPage", "Login using a browser.", None)) + self.login_import_radio.setText(QCoreApplication.translate("LandingPage", "Import", None)) + self.login_import_label.setText(QCoreApplication.translate("LandingPage", "Import from Epic Games Launcher", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/login/login_dialog.py b/rare/ui/components/dialogs/login/login_dialog.py index f808dcd33..ddb56429e 100644 --- a/rare/ui/components/dialogs/login/login_dialog.py +++ b/rare/ui/components/dialogs/login/login_dialog.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'login_dialog.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -20,19 +19,19 @@ ) -class Ui_LoginDialog(object): +class Ui_LoginDialog: def setupUi(self, LoginDialog): if not LoginDialog.objectName(): - LoginDialog.setObjectName(u"LoginDialog") + LoginDialog.setObjectName("LoginDialog") LoginDialog.resize(242, 146) self.main_layout = QVBoxLayout(LoginDialog) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.login_vspacer_top = QSpacerItem(17, 17, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) self.main_layout.addItem(self.login_vspacer_top) self.welcome_label = QLabel(LoginDialog) - self.welcome_label.setObjectName(u"welcome_label") + self.welcome_label.setObjectName("welcome_label") self.main_layout.addWidget(self.welcome_label) @@ -41,7 +40,7 @@ def setupUi(self, LoginDialog): self.main_layout.addItem(self.login_vspacer_bottom) self.info_label = QLabel(LoginDialog) - self.info_label.setObjectName(u"info_label") + self.info_label.setObjectName("info_label") self.info_label.setFrameShape(QFrame.Shape.StyledPanel) self.info_label.setFrameShadow(QFrame.Shadow.Sunken) self.info_label.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignTop) @@ -50,9 +49,9 @@ def setupUi(self, LoginDialog): self.main_layout.addWidget(self.info_label) self.button_layout = QHBoxLayout() - self.button_layout.setObjectName(u"button_layout") + self.button_layout.setObjectName("button_layout") self.exit_button = QPushButton(LoginDialog) - self.exit_button.setObjectName(u"exit_button") + self.exit_button.setObjectName("exit_button") self.button_layout.addWidget(self.exit_button) @@ -61,12 +60,12 @@ def setupUi(self, LoginDialog): self.button_layout.addItem(self.button_hspacer) self.back_button = QPushButton(LoginDialog) - self.back_button.setObjectName(u"back_button") + self.back_button.setObjectName("back_button") self.button_layout.addWidget(self.back_button) self.next_button = QPushButton(LoginDialog) - self.next_button.setObjectName(u"next_button") + self.next_button.setObjectName("next_button") self.button_layout.addWidget(self.next_button) @@ -78,11 +77,11 @@ def setupUi(self, LoginDialog): # setupUi def retranslateUi(self, LoginDialog): - LoginDialog.setWindowTitle(QCoreApplication.translate("LoginDialog", u"Login", None)) - self.welcome_label.setText(QCoreApplication.translate("LoginDialog", u"

Welcome to Rare

", None)) + LoginDialog.setWindowTitle(QCoreApplication.translate("LoginDialog", "Login", None)) + self.welcome_label.setText(QCoreApplication.translate("LoginDialog", "

Welcome to Rare

", None)) self.info_label.setText("") - self.exit_button.setText(QCoreApplication.translate("LoginDialog", u"Exit", None)) - self.back_button.setText(QCoreApplication.translate("LoginDialog", u"Back", None)) - self.next_button.setText(QCoreApplication.translate("LoginDialog", u"Next", None)) + self.exit_button.setText(QCoreApplication.translate("LoginDialog", "Exit", None)) + self.back_button.setText(QCoreApplication.translate("LoginDialog", "Back", None)) + self.next_button.setText(QCoreApplication.translate("LoginDialog", "Next", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/move_dialog.py b/rare/ui/components/dialogs/move_dialog.py index b14a4860d..867e21fb2 100644 --- a/rare/ui/components/dialogs/move_dialog.py +++ b/rare/ui/components/dialogs/move_dialog.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'move_dialog.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,22 +12,22 @@ from PySide6.QtWidgets import QCheckBox, QFormLayout, QFrame, QLabel -class Ui_MoveDialog(object): +class Ui_MoveDialog: def setupUi(self, MoveDialog): if not MoveDialog.objectName(): - MoveDialog.setObjectName(u"MoveDialog") + MoveDialog.setObjectName("MoveDialog") MoveDialog.resize(572, 149) - MoveDialog.setWindowTitle(u"MoveDialog") + MoveDialog.setWindowTitle("MoveDialog") self.main_layout = QFormLayout(MoveDialog) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.main_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.target_path_label = QLabel(MoveDialog) - self.target_path_label.setObjectName(u"target_path_label") + self.target_path_label.setObjectName("target_path_label") self.main_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.target_path_label) self.full_path_label = QLabel(MoveDialog) - self.full_path_label.setObjectName(u"full_path_label") + self.full_path_label.setObjectName("full_path_label") font = QFont() font.setItalic(True) self.full_path_label.setFont(font) @@ -36,67 +35,67 @@ def setupUi(self, MoveDialog): self.main_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.full_path_label) self.required_space_label = QLabel(MoveDialog) - self.required_space_label.setObjectName(u"required_space_label") + self.required_space_label.setObjectName("required_space_label") self.main_layout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.required_space_label) self.available_space_label = QLabel(MoveDialog) - self.available_space_label.setObjectName(u"available_space_label") + self.available_space_label.setObjectName("available_space_label") self.main_layout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.available_space_label) self.required_space_text = QLabel(MoveDialog) - self.required_space_text.setObjectName(u"required_space_text") + self.required_space_text.setObjectName("required_space_text") font1 = QFont() font1.setBold(True) self.required_space_text.setFont(font1) - self.required_space_text.setText(u"") + self.required_space_text.setText("") self.main_layout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.required_space_text) self.available_space_text = QLabel(MoveDialog) - self.available_space_text.setObjectName(u"available_space_text") + self.available_space_text.setObjectName("available_space_text") self.available_space_text.setFont(font1) - self.available_space_text.setText(u"") + self.available_space_text.setText("") self.main_layout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.available_space_text) self.warning_label = QLabel(MoveDialog) - self.warning_label.setObjectName(u"warning_label") + self.warning_label.setObjectName("warning_label") self.main_layout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.warning_label) self.warning_text = QLabel(MoveDialog) - self.warning_text.setObjectName(u"warning_text") + self.warning_text.setObjectName("warning_text") self.warning_text.setFont(font) self.warning_text.setFrameShape(QFrame.Shape.StyledPanel) self.warning_text.setFrameShadow(QFrame.Shadow.Sunken) - self.warning_text.setText(u"None") + self.warning_text.setText("None") self.warning_text.setWordWrap(True) self.warning_text.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByMouse) self.main_layout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.warning_text) self.rename_path_label = QLabel(MoveDialog) - self.rename_path_label.setObjectName(u"rename_path_label") + self.rename_path_label.setObjectName("rename_path_label") self.rename_path_label.setEnabled(True) self.main_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.rename_path_label) self.reset_name_label = QLabel(MoveDialog) - self.reset_name_label.setObjectName(u"reset_name_label") + self.reset_name_label.setObjectName("reset_name_label") self.main_layout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.reset_name_label) self.reset_name_check = QCheckBox(MoveDialog) - self.reset_name_check.setObjectName(u"reset_name_check") + self.reset_name_check.setObjectName("reset_name_check") self.reset_name_check.setEnabled(True) self.reset_name_check.setFont(font) self.main_layout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.reset_name_check) self.rename_path_check = QCheckBox(MoveDialog) - self.rename_path_check.setObjectName(u"rename_path_check") + self.rename_path_check.setObjectName("rename_path_check") self.rename_path_check.setEnabled(True) self.rename_path_check.setFont(font) @@ -107,15 +106,14 @@ def setupUi(self, MoveDialog): # setupUi def retranslateUi(self, MoveDialog): - self.target_path_label.setText(QCoreApplication.translate("MoveDialog", u"Target folder", None)) - self.full_path_label.setText(QCoreApplication.translate("MoveDialog", u"Destination", None)) - self.required_space_label.setText(QCoreApplication.translate("MoveDialog", u"Required space", None)) - self.available_space_label.setText(QCoreApplication.translate("MoveDialog", u"Available space", None)) - self.warning_label.setText(QCoreApplication.translate("MoveDialog", u"Warning", None)) - self.rename_path_label.setText(QCoreApplication.translate("MoveDialog", u"Rename folder", None)) - self.reset_name_label.setText(QCoreApplication.translate("MoveDialog", u"Reset name", None)) - self.reset_name_check.setText(QCoreApplication.translate("MoveDialog", u"Reset the game's install folder name to the default", None)) - self.rename_path_check.setText(QCoreApplication.translate("MoveDialog", u"Do not create a sub-directory, use 'target folder' as the game's install folder", None)) - pass + self.target_path_label.setText(QCoreApplication.translate("MoveDialog", "Target folder", None)) + self.full_path_label.setText(QCoreApplication.translate("MoveDialog", "Destination", None)) + self.required_space_label.setText(QCoreApplication.translate("MoveDialog", "Required space", None)) + self.available_space_label.setText(QCoreApplication.translate("MoveDialog", "Available space", None)) + self.warning_label.setText(QCoreApplication.translate("MoveDialog", "Warning", None)) + self.rename_path_label.setText(QCoreApplication.translate("MoveDialog", "Rename folder", None)) + self.reset_name_label.setText(QCoreApplication.translate("MoveDialog", "Reset name", None)) + self.reset_name_check.setText(QCoreApplication.translate("MoveDialog", "Reset the game's install folder name to the default", None)) + self.rename_path_check.setText(QCoreApplication.translate("MoveDialog", "Do not create a sub-directory, use 'target folder' as the game's install folder", None)) # retranslateUi diff --git a/rare/ui/components/tabs/downloads/download_widget.py b/rare/ui/components/tabs/downloads/download_widget.py index 27983a11e..325f3e9ec 100644 --- a/rare/ui/components/tabs/downloads/download_widget.py +++ b/rare/ui/components/tabs/downloads/download_widget.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'download_widget.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,17 +12,17 @@ from PySide6.QtWidgets import QGridLayout, QLabel, QProgressBar, QPushButton, QSizePolicy -class Ui_DownloadWidget(object): +class Ui_DownloadWidget: def setupUi(self, DownloadWidget): if not DownloadWidget.objectName(): - DownloadWidget.setObjectName(u"DownloadWidget") + DownloadWidget.setObjectName("DownloadWidget") DownloadWidget.resize(479, 86) - DownloadWidget.setWindowTitle(u"DownloadWidget") + DownloadWidget.setWindowTitle("DownloadWidget") self.active_download_layout = QGridLayout(DownloadWidget) - self.active_download_layout.setObjectName(u"active_download_layout") + self.active_download_layout.setObjectName("active_download_layout") self.active_download_layout.setContentsMargins(0, 0, 0, 0) self.dl_name = QLabel(DownloadWidget) - self.dl_name.setObjectName(u"dl_name") + self.dl_name.setObjectName("dl_name") sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -32,12 +31,12 @@ def setupUi(self, DownloadWidget): font = QFont() font.setBold(False) self.dl_name.setFont(font) - self.dl_name.setText(u"dl_name") + self.dl_name.setText("dl_name") self.active_download_layout.addWidget(self.dl_name, 0, 1, 1, 3) self.dl_name_label = QLabel(DownloadWidget) - self.dl_name_label.setObjectName(u"dl_name_label") + self.dl_name_label.setObjectName("dl_name_label") font1 = QFont() font1.setBold(True) self.dl_name_label.setFont(font1) @@ -46,76 +45,76 @@ def setupUi(self, DownloadWidget): self.active_download_layout.addWidget(self.dl_name_label, 0, 0, 1, 1) self.cache_used = QLabel(DownloadWidget) - self.cache_used.setObjectName(u"cache_used") + self.cache_used.setObjectName("cache_used") sizePolicy.setHeightForWidth(self.cache_used.sizePolicy().hasHeightForWidth()) self.cache_used.setSizePolicy(sizePolicy) - self.cache_used.setText(u"cache_used") + self.cache_used.setText("cache_used") self.active_download_layout.addWidget(self.cache_used, 2, 1, 1, 1) self.dl_speed_label = QLabel(DownloadWidget) - self.dl_speed_label.setObjectName(u"dl_speed_label") + self.dl_speed_label.setObjectName("dl_speed_label") self.dl_speed_label.setFont(font1) self.dl_speed_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.active_download_layout.addWidget(self.dl_speed_label, 1, 2, 1, 1) self.downloaded_label = QLabel(DownloadWidget) - self.downloaded_label.setObjectName(u"downloaded_label") + self.downloaded_label.setObjectName("downloaded_label") self.downloaded_label.setFont(font1) self.downloaded_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.active_download_layout.addWidget(self.downloaded_label, 2, 2, 1, 1) self.dl_speed = QLabel(DownloadWidget) - self.dl_speed.setObjectName(u"dl_speed") + self.dl_speed.setObjectName("dl_speed") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth(self.dl_speed.sizePolicy().hasHeightForWidth()) self.dl_speed.setSizePolicy(sizePolicy1) - self.dl_speed.setText(u"dl_speed") + self.dl_speed.setText("dl_speed") self.active_download_layout.addWidget(self.dl_speed, 1, 3, 1, 1) self.time_left_label = QLabel(DownloadWidget) - self.time_left_label.setObjectName(u"time_left_label") + self.time_left_label.setObjectName("time_left_label") self.time_left_label.setFont(font1) self.time_left_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.active_download_layout.addWidget(self.time_left_label, 1, 0, 1, 1) self.downloaded = QLabel(DownloadWidget) - self.downloaded.setObjectName(u"downloaded") + self.downloaded.setObjectName("downloaded") sizePolicy1.setHeightForWidth(self.downloaded.sizePolicy().hasHeightForWidth()) self.downloaded.setSizePolicy(sizePolicy1) - self.downloaded.setText(u"downloaded") + self.downloaded.setText("downloaded") self.active_download_layout.addWidget(self.downloaded, 2, 3, 1, 1) self.time_left = QLabel(DownloadWidget) - self.time_left.setObjectName(u"time_left") + self.time_left.setObjectName("time_left") sizePolicy.setHeightForWidth(self.time_left.sizePolicy().hasHeightForWidth()) self.time_left.setSizePolicy(sizePolicy) - self.time_left.setText(u"time_left") + self.time_left.setText("time_left") self.active_download_layout.addWidget(self.time_left, 1, 1, 1, 1) self.cache_used_label = QLabel(DownloadWidget) - self.cache_used_label.setObjectName(u"cache_used_label") + self.cache_used_label.setObjectName("cache_used_label") self.cache_used_label.setFont(font1) self.cache_used_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.active_download_layout.addWidget(self.cache_used_label, 2, 0, 1, 1) self.progress_bar = QProgressBar(DownloadWidget) - self.progress_bar.setObjectName(u"progress_bar") + self.progress_bar.setObjectName("progress_bar") self.progress_bar.setValue(0) self.active_download_layout.addWidget(self.progress_bar, 3, 0, 1, 4) self.kill_button = QPushButton(DownloadWidget) - self.kill_button.setObjectName(u"kill_button") + self.kill_button.setObjectName("kill_button") self.active_download_layout.addWidget(self.kill_button, 3, 4, 1, 1) @@ -126,12 +125,11 @@ def setupUi(self, DownloadWidget): # setupUi def retranslateUi(self, DownloadWidget): - self.dl_name_label.setText(QCoreApplication.translate("DownloadWidget", u"Current download:", None)) - self.dl_speed_label.setText(QCoreApplication.translate("DownloadWidget", u"Download speed:", None)) - self.downloaded_label.setText(QCoreApplication.translate("DownloadWidget", u"Downloaded:", None)) - self.time_left_label.setText(QCoreApplication.translate("DownloadWidget", u"Time left:", None)) - self.cache_used_label.setText(QCoreApplication.translate("DownloadWidget", u"Cache size:", None)) - self.kill_button.setText(QCoreApplication.translate("DownloadWidget", u"Stop Download", None)) - pass + self.dl_name_label.setText(QCoreApplication.translate("DownloadWidget", "Current download:", None)) + self.dl_speed_label.setText(QCoreApplication.translate("DownloadWidget", "Download speed:", None)) + self.downloaded_label.setText(QCoreApplication.translate("DownloadWidget", "Downloaded:", None)) + self.time_left_label.setText(QCoreApplication.translate("DownloadWidget", "Time left:", None)) + self.cache_used_label.setText(QCoreApplication.translate("DownloadWidget", "Cache size:", None)) + self.kill_button.setText(QCoreApplication.translate("DownloadWidget", "Stop Download", None)) # retranslateUi diff --git a/rare/ui/components/tabs/downloads/queue_base_widget.py b/rare/ui/components/tabs/downloads/queue_base_widget.py index 3581a7533..53cd15805 100644 --- a/rare/ui/components/tabs/downloads/queue_base_widget.py +++ b/rare/ui/components/tabs/downloads/queue_base_widget.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'queue_base_widget.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -12,44 +11,44 @@ from PySide6.QtWidgets import QFrame, QHBoxLayout, QPushButton, QSizePolicy, QVBoxLayout, QWidget -class Ui_QueueBaseWidget(object): +class Ui_QueueBaseWidget: def setupUi(self, QueueBaseWidget): if not QueueBaseWidget.objectName(): - QueueBaseWidget.setObjectName(u"QueueBaseWidget") + QueueBaseWidget.setObjectName("QueueBaseWidget") QueueBaseWidget.resize(380, 62) - QueueBaseWidget.setWindowTitle(u"QueueBaseWidget") + QueueBaseWidget.setWindowTitle("QueueBaseWidget") QueueBaseWidget.setFrameShape(QFrame.StyledPanel) self.queue_base_layout = QHBoxLayout(QueueBaseWidget) - self.queue_base_layout.setObjectName(u"queue_base_layout") + self.queue_base_layout.setObjectName("queue_base_layout") self.queue_base_layout.setContentsMargins(0, 0, 0, 0) self.info_layout = QHBoxLayout() - self.info_layout.setObjectName(u"info_layout") + self.info_layout.setObjectName("info_layout") self.queue_base_layout.addLayout(self.info_layout) self.move_buttons = QWidget(QueueBaseWidget) - self.move_buttons.setObjectName(u"move_buttons") + self.move_buttons.setObjectName("move_buttons") self.move_buttons_layout = QVBoxLayout(self.move_buttons) - self.move_buttons_layout.setObjectName(u"move_buttons_layout") + self.move_buttons_layout.setObjectName("move_buttons_layout") self.move_buttons_layout.setContentsMargins(0, 0, 0, 0) self.move_up_button = QPushButton(self.move_buttons) - self.move_up_button.setObjectName(u"move_up_button") + self.move_up_button.setObjectName("move_up_button") sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.move_up_button.sizePolicy().hasHeightForWidth()) self.move_up_button.setSizePolicy(sizePolicy) - self.move_up_button.setText(u"") - self.move_up_button.setProperty(u"isSquare", 1) + self.move_up_button.setText("") + self.move_up_button.setProperty("isSquare", 1) self.move_buttons_layout.addWidget(self.move_up_button, 0, Qt.AlignLeft|Qt.AlignTop) self.move_down_button = QPushButton(self.move_buttons) - self.move_down_button.setObjectName(u"move_down_button") + self.move_down_button.setObjectName("move_down_button") sizePolicy.setHeightForWidth(self.move_down_button.sizePolicy().hasHeightForWidth()) self.move_down_button.setSizePolicy(sizePolicy) - self.move_down_button.setText(u"") - self.move_down_button.setProperty(u"isSquare", 1) + self.move_down_button.setText("") + self.move_down_button.setProperty("isSquare", 1) self.move_buttons_layout.addWidget(self.move_down_button, 0, Qt.AlignLeft|Qt.AlignBottom) @@ -57,17 +56,17 @@ def setupUi(self, QueueBaseWidget): self.queue_base_layout.addWidget(self.move_buttons) self.queue_buttons = QWidget(QueueBaseWidget) - self.queue_buttons.setObjectName(u"queue_buttons") + self.queue_buttons.setObjectName("queue_buttons") self.queue_buttons_layout = QVBoxLayout(self.queue_buttons) - self.queue_buttons_layout.setObjectName(u"queue_buttons_layout") + self.queue_buttons_layout.setObjectName("queue_buttons_layout") self.queue_buttons_layout.setContentsMargins(0, 0, 0, 0) self.force_button = QPushButton(self.queue_buttons) - self.force_button.setObjectName(u"force_button") + self.force_button.setObjectName("force_button") self.queue_buttons_layout.addWidget(self.force_button) self.remove_button = QPushButton(self.queue_buttons) - self.remove_button.setObjectName(u"remove_button") + self.remove_button.setObjectName("remove_button") self.queue_buttons_layout.addWidget(self.remove_button, 0, Qt.AlignBottom) @@ -75,17 +74,17 @@ def setupUi(self, QueueBaseWidget): self.queue_base_layout.addWidget(self.queue_buttons) self.update_buttons = QWidget(QueueBaseWidget) - self.update_buttons.setObjectName(u"update_buttons") + self.update_buttons.setObjectName("update_buttons") self.update_buttons_layout = QVBoxLayout(self.update_buttons) - self.update_buttons_layout.setObjectName(u"update_buttons_layout") + self.update_buttons_layout.setObjectName("update_buttons_layout") self.update_buttons_layout.setContentsMargins(0, 0, 0, 0) self.update_button = QPushButton(self.update_buttons) - self.update_button.setObjectName(u"update_button") + self.update_button.setObjectName("update_button") self.update_buttons_layout.addWidget(self.update_button) self.settings_button = QPushButton(self.update_buttons) - self.settings_button.setObjectName(u"settings_button") + self.settings_button.setObjectName("settings_button") self.update_buttons_layout.addWidget(self.settings_button, 0, Qt.AlignBottom) @@ -98,10 +97,9 @@ def setupUi(self, QueueBaseWidget): # setupUi def retranslateUi(self, QueueBaseWidget): - self.force_button.setText(QCoreApplication.translate("QueueBaseWidget", u"Download now", None)) - self.remove_button.setText(QCoreApplication.translate("QueueBaseWidget", u"Remove from queue", None)) - self.update_button.setText(QCoreApplication.translate("QueueBaseWidget", u"Update game", None)) - self.settings_button.setText(QCoreApplication.translate("QueueBaseWidget", u"Update with settings", None)) - pass + self.force_button.setText(QCoreApplication.translate("QueueBaseWidget", "Download now", None)) + self.remove_button.setText(QCoreApplication.translate("QueueBaseWidget", "Remove from queue", None)) + self.update_button.setText(QCoreApplication.translate("QueueBaseWidget", "Update game", None)) + self.settings_button.setText(QCoreApplication.translate("QueueBaseWidget", "Update with settings", None)) # retranslateUi diff --git a/rare/ui/components/tabs/downloads/queue_info_widget.py b/rare/ui/components/tabs/downloads/queue_info_widget.py index d47eed803..68a0e24a9 100644 --- a/rare/ui/components/tabs/downloads/queue_info_widget.py +++ b/rare/ui/components/tabs/downloads/queue_info_widget.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'queue_info_widget.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,22 +12,22 @@ from PySide6.QtWidgets import QGridLayout, QLabel, QLayout, QSizePolicy, QSpacerItem, QVBoxLayout -class Ui_QueueInfoWidget(object): +class Ui_QueueInfoWidget: def setupUi(self, QueueInfoWidget): if not QueueInfoWidget.objectName(): - QueueInfoWidget.setObjectName(u"QueueInfoWidget") + QueueInfoWidget.setObjectName("QueueInfoWidget") QueueInfoWidget.resize(624, 60) sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(QueueInfoWidget.sizePolicy().hasHeightForWidth()) QueueInfoWidget.setSizePolicy(sizePolicy) - QueueInfoWidget.setWindowTitle(u"QueueInfoWidget") + QueueInfoWidget.setWindowTitle("QueueInfoWidget") self.queue_info_layout = QGridLayout(QueueInfoWidget) - self.queue_info_layout.setObjectName(u"queue_info_layout") + self.queue_info_layout.setObjectName("queue_info_layout") self.queue_info_layout.setContentsMargins(0, 0, 0, 0) self.dl_size_label = QLabel(QueueInfoWidget) - self.dl_size_label.setObjectName(u"dl_size_label") + self.dl_size_label.setObjectName("dl_size_label") font = QFont() font.setBold(True) self.dl_size_label.setFont(font) @@ -37,36 +36,36 @@ def setupUi(self, QueueInfoWidget): self.queue_info_layout.addWidget(self.dl_size_label, 1, 3, 1, 1) self.title = QLabel(QueueInfoWidget) - self.title.setObjectName(u"title") + self.title.setObjectName("title") self.title.setFont(font) - self.title.setText(u"title") + self.title.setText("title") self.queue_info_layout.addWidget(self.title, 0, 1, 1, 4) self.local_version_label = QLabel(QueueInfoWidget) - self.local_version_label.setObjectName(u"local_version_label") + self.local_version_label.setObjectName("local_version_label") self.local_version_label.setFont(font) self.local_version_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.queue_info_layout.addWidget(self.local_version_label, 2, 1, 1, 1) self.image_layout = QVBoxLayout() - self.image_layout.setObjectName(u"image_layout") + self.image_layout.setObjectName("image_layout") self.image_layout.setSizeConstraint(QLayout.SetFixedSize) self.queue_info_layout.addLayout(self.image_layout, 0, 0, 3, 1) self.install_size_label = QLabel(QueueInfoWidget) - self.install_size_label.setObjectName(u"install_size_label") + self.install_size_label.setObjectName("install_size_label") self.install_size_label.setFont(font) self.install_size_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.queue_info_layout.addWidget(self.install_size_label, 2, 3, 1, 1) self.install_size = QLabel(QueueInfoWidget) - self.install_size.setObjectName(u"install_size") + self.install_size.setObjectName("install_size") self.install_size.setMinimumSize(QSize(160, 0)) - self.install_size.setText(u"install_size") + self.install_size.setText("install_size") self.queue_info_layout.addWidget(self.install_size, 2, 4, 1, 1) @@ -75,32 +74,32 @@ def setupUi(self, QueueInfoWidget): self.queue_info_layout.addItem(self.info_hspacer, 0, 5, 3, 1) self.dl_size = QLabel(QueueInfoWidget) - self.dl_size.setObjectName(u"dl_size") + self.dl_size.setObjectName("dl_size") self.dl_size.setMinimumSize(QSize(160, 0)) - self.dl_size.setText(u"dl_size") + self.dl_size.setText("dl_size") self.queue_info_layout.addWidget(self.dl_size, 1, 4, 1, 1) self.remote_version_label = QLabel(QueueInfoWidget) - self.remote_version_label.setObjectName(u"remote_version_label") + self.remote_version_label.setObjectName("remote_version_label") self.remote_version_label.setFont(font) self.remote_version_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.queue_info_layout.addWidget(self.remote_version_label, 1, 1, 1, 1) self.local_version = QLabel(QueueInfoWidget) - self.local_version.setObjectName(u"local_version") + self.local_version.setObjectName("local_version") self.local_version.setMinimumSize(QSize(160, 0)) self.local_version.setMaximumSize(QSize(160, 16777215)) - self.local_version.setText(u"local_version") + self.local_version.setText("local_version") self.queue_info_layout.addWidget(self.local_version, 2, 2, 1, 1) self.remote_version = QLabel(QueueInfoWidget) - self.remote_version.setObjectName(u"remote_version") + self.remote_version.setObjectName("remote_version") self.remote_version.setMinimumSize(QSize(160, 0)) self.remote_version.setMaximumSize(QSize(160, 16777215)) - self.remote_version.setText(u"remote_version") + self.remote_version.setText("remote_version") self.queue_info_layout.addWidget(self.remote_version, 1, 2, 1, 1) @@ -109,10 +108,9 @@ def setupUi(self, QueueInfoWidget): # setupUi def retranslateUi(self, QueueInfoWidget): - self.dl_size_label.setText(QCoreApplication.translate("QueueInfoWidget", u"Download size", None)) - self.local_version_label.setText(QCoreApplication.translate("QueueInfoWidget", u"Local version", None)) - self.install_size_label.setText(QCoreApplication.translate("QueueInfoWidget", u"Installed size", None)) - self.remote_version_label.setText(QCoreApplication.translate("QueueInfoWidget", u"Remote version", None)) - pass + self.dl_size_label.setText(QCoreApplication.translate("QueueInfoWidget", "Download size", None)) + self.local_version_label.setText(QCoreApplication.translate("QueueInfoWidget", "Local version", None)) + self.install_size_label.setText(QCoreApplication.translate("QueueInfoWidget", "Installed size", None)) + self.remote_version_label.setText(QCoreApplication.translate("QueueInfoWidget", "Remote version", None)) # retranslateUi diff --git a/rare/ui/components/tabs/integrations/egl_sync_group.py b/rare/ui/components/tabs/integrations/egl_sync_group.py index 68fb5df34..0f301ba63 100644 --- a/rare/ui/components/tabs/integrations/egl_sync_group.py +++ b/rare/ui/components/tabs/integrations/egl_sync_group.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'egl_sync_group.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,29 +12,29 @@ from PySide6.QtWidgets import QCheckBox, QFormLayout, QLabel, QVBoxLayout -class Ui_EGLSyncGroup(object): +class Ui_EGLSyncGroup: def setupUi(self, EGLSyncGroup): if not EGLSyncGroup.objectName(): - EGLSyncGroup.setObjectName(u"EGLSyncGroup") + EGLSyncGroup.setObjectName("EGLSyncGroup") EGLSyncGroup.resize(424, 106) - EGLSyncGroup.setWindowTitle(u"EGLSyncGroup") + EGLSyncGroup.setWindowTitle("EGLSyncGroup") EGLSyncGroup.setCheckable(False) EGLSyncGroup.setChecked(False) self.egl_sync_layout = QFormLayout(EGLSyncGroup) - self.egl_sync_layout.setObjectName(u"egl_sync_layout") + self.egl_sync_layout.setObjectName("egl_sync_layout") self.egl_sync_layout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.egl_path_edit_label = QLabel(EGLSyncGroup) - self.egl_path_edit_label.setObjectName(u"egl_path_edit_label") + self.egl_path_edit_label.setObjectName("egl_path_edit_label") self.egl_sync_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.egl_path_edit_label) self.egl_sync_check_label = QLabel(EGLSyncGroup) - self.egl_sync_check_label.setObjectName(u"egl_sync_check_label") + self.egl_sync_check_label.setObjectName("egl_sync_check_label") self.egl_sync_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.egl_sync_check_label) self.egl_sync_check = QCheckBox(EGLSyncGroup) - self.egl_sync_check.setObjectName(u"egl_sync_check") + self.egl_sync_check.setObjectName("egl_sync_check") font = QFont() font.setItalic(True) self.egl_sync_check.setFont(font) @@ -43,12 +42,12 @@ def setupUi(self, EGLSyncGroup): self.egl_sync_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.egl_sync_check) self.import_export_layout = QVBoxLayout() - self.import_export_layout.setObjectName(u"import_export_layout") + self.import_export_layout.setObjectName("import_export_layout") self.egl_sync_layout.setLayout(3, QFormLayout.ItemRole.SpanningRole, self.import_export_layout) self.egl_path_info_label = QLabel(EGLSyncGroup) - self.egl_path_info_label.setObjectName(u"egl_path_info_label") + self.egl_path_info_label.setObjectName("egl_path_info_label") self.egl_sync_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.egl_path_info_label) @@ -57,10 +56,10 @@ def setupUi(self, EGLSyncGroup): # setupUi def retranslateUi(self, EGLSyncGroup): - EGLSyncGroup.setTitle(QCoreApplication.translate("EGLSyncGroup", u"Sync with Epic Games Launcher", None)) - self.egl_path_edit_label.setText(QCoreApplication.translate("EGLSyncGroup", u"Manifest path", None)) - self.egl_sync_check_label.setText(QCoreApplication.translate("EGLSyncGroup", u"Enable automatic sync", None)) - self.egl_sync_check.setText(QCoreApplication.translate("EGLSyncGroup", u"This will immediately synchronize with EGL", None)) - self.egl_path_info_label.setText(QCoreApplication.translate("EGLSyncGroup", u"Estimated path", None)) + EGLSyncGroup.setTitle(QCoreApplication.translate("EGLSyncGroup", "Sync with Epic Games Launcher", None)) + self.egl_path_edit_label.setText(QCoreApplication.translate("EGLSyncGroup", "Manifest path", None)) + self.egl_sync_check_label.setText(QCoreApplication.translate("EGLSyncGroup", "Enable automatic sync", None)) + self.egl_sync_check.setText(QCoreApplication.translate("EGLSyncGroup", "This will immediately synchronize with EGL", None)) + self.egl_path_info_label.setText(QCoreApplication.translate("EGLSyncGroup", "Estimated path", None)) # retranslateUi diff --git a/rare/ui/components/tabs/integrations/egl_sync_list_group.py b/rare/ui/components/tabs/integrations/egl_sync_list_group.py index 4b530f8fd..9473b693a 100644 --- a/rare/ui/components/tabs/integrations/egl_sync_list_group.py +++ b/rare/ui/components/tabs/integrations/egl_sync_list_group.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'egl_sync_list_group.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -21,23 +20,23 @@ ) -class Ui_EGLSyncListGroup(object): +class Ui_EGLSyncListGroup: def setupUi(self, EGLSyncListGroup): if not EGLSyncListGroup.objectName(): - EGLSyncListGroup.setObjectName(u"EGLSyncListGroup") + EGLSyncListGroup.setObjectName("EGLSyncListGroup") EGLSyncListGroup.resize(461, 206) - EGLSyncListGroup.setWindowTitle(u"EGLSyncListGroup") - EGLSyncListGroup.setTitle(u"") + EGLSyncListGroup.setWindowTitle("EGLSyncListGroup") + EGLSyncListGroup.setTitle("") self.egl_sync_list_layout = QVBoxLayout(EGLSyncListGroup) - self.egl_sync_list_layout.setObjectName(u"egl_sync_list_layout") + self.egl_sync_list_layout.setObjectName("egl_sync_list_layout") self.label = QLabel(EGLSyncListGroup) - self.label.setObjectName(u"label") - self.label.setText(u"") + self.label.setObjectName("label") + self.label.setText("") self.egl_sync_list_layout.addWidget(self.label) self.list = QListWidget(EGLSyncListGroup) - self.list.setObjectName(u"list") + self.list.setObjectName("list") self.list.setAlternatingRowColors(True) self.list.setSpacing(1) self.list.setSortingEnabled(True) @@ -45,22 +44,22 @@ def setupUi(self, EGLSyncListGroup): self.egl_sync_list_layout.addWidget(self.list) self.buttons_widget = QWidget(EGLSyncListGroup) - self.buttons_widget.setObjectName(u"buttons_widget") + self.buttons_widget.setObjectName("buttons_widget") sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.buttons_widget.sizePolicy().hasHeightForWidth()) self.buttons_widget.setSizePolicy(sizePolicy) self.buttons_layout = QHBoxLayout(self.buttons_widget) - self.buttons_layout.setObjectName(u"buttons_layout") + self.buttons_layout.setObjectName("buttons_layout") self.buttons_layout.setContentsMargins(0, 0, 0, 0) self.select_all_button = QPushButton(self.buttons_widget) - self.select_all_button.setObjectName(u"select_all_button") + self.select_all_button.setObjectName("select_all_button") self.buttons_layout.addWidget(self.select_all_button) self.select_none_button = QPushButton(self.buttons_widget) - self.select_none_button.setObjectName(u"select_none_button") + self.select_none_button.setObjectName("select_none_button") self.buttons_layout.addWidget(self.select_none_button) @@ -69,8 +68,8 @@ def setupUi(self, EGLSyncListGroup): self.buttons_layout.addItem(self.buttons_hspacer) self.action_button = QPushButton(self.buttons_widget) - self.action_button.setObjectName(u"action_button") - self.action_button.setText(u"Action") + self.action_button.setObjectName("action_button") + self.action_button.setText("Action") self.buttons_layout.addWidget(self.action_button) @@ -82,8 +81,7 @@ def setupUi(self, EGLSyncListGroup): # setupUi def retranslateUi(self, EGLSyncListGroup): - self.select_all_button.setText(QCoreApplication.translate("EGLSyncListGroup", u"Select all", None)) - self.select_none_button.setText(QCoreApplication.translate("EGLSyncListGroup", u"Select none", None)) - pass + self.select_all_button.setText(QCoreApplication.translate("EGLSyncListGroup", "Select all", None)) + self.select_none_button.setText(QCoreApplication.translate("EGLSyncListGroup", "Select none", None)) # retranslateUi diff --git a/rare/ui/components/tabs/integrations/eos_widget.py b/rare/ui/components/tabs/integrations/eos_widget.py index 39a27fcfb..6ce867cdf 100644 --- a/rare/ui/components/tabs/integrations/eos_widget.py +++ b/rare/ui/components/tabs/integrations/eos_widget.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'eos_widget.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -21,32 +20,32 @@ ) -class Ui_EosWidget(object): +class Ui_EosWidget: def setupUi(self, EosWidget): if not EosWidget.objectName(): - EosWidget.setObjectName(u"EosWidget") + EosWidget.setObjectName("EosWidget") EosWidget.resize(245, 95) - EosWidget.setWindowTitle(u"GroupBox") + EosWidget.setWindowTitle("GroupBox") self.eos_layout = QVBoxLayout(EosWidget) - self.eos_layout.setObjectName(u"eos_layout") + self.eos_layout.setObjectName("eos_layout") self.eos_layout.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint) self.overlay_widget = QWidget(EosWidget) - self.overlay_widget.setObjectName(u"overlay_widget") + self.overlay_widget.setObjectName("overlay_widget") self.overlay_widget_layout = QHBoxLayout(self.overlay_widget) - self.overlay_widget_layout.setObjectName(u"overlay_widget_layout") + self.overlay_widget_layout.setObjectName("overlay_widget_layout") self.overlay_widget_layout.setContentsMargins(0, 0, 0, 0) self.info_layout = QFormLayout() - self.info_layout.setObjectName(u"info_layout") + self.info_layout.setObjectName("info_layout") self.info_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTop|Qt.AlignmentFlag.AlignTrailing) self.info_layout.setFormAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignTop) self.version_label = QLabel(self.overlay_widget) - self.version_label.setObjectName(u"version_label") + self.version_label.setObjectName("version_label") self.version_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.info_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.version_label) self.path_label = QLabel(self.overlay_widget) - self.path_label.setObjectName(u"path_label") + self.path_label.setObjectName("path_label") self.path_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.info_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.path_label) @@ -55,32 +54,32 @@ def setupUi(self, EosWidget): self.overlay_widget_layout.addLayout(self.info_layout) self.button_stack = QStackedWidget(self.overlay_widget) - self.button_stack.setObjectName(u"button_stack") + self.button_stack.setObjectName("button_stack") self.install_page = QWidget() - self.install_page.setObjectName(u"install_page") + self.install_page.setObjectName("install_page") self.install_page_layout = QHBoxLayout(self.install_page) - self.install_page_layout.setObjectName(u"install_page_layout") + self.install_page_layout.setObjectName("install_page_layout") self.install_page_layout.setContentsMargins(0, 0, 0, 0) self.install_button = QPushButton(self.install_page) - self.install_button.setObjectName(u"install_button") + self.install_button.setObjectName("install_button") self.install_button.setMinimumSize(QSize(140, 0)) self.install_page_layout.addWidget(self.install_button) self.button_stack.addWidget(self.install_page) self.update_page = QWidget() - self.update_page.setObjectName(u"update_page") + self.update_page.setObjectName("update_page") self.update_page_layout = QVBoxLayout(self.update_page) - self.update_page_layout.setObjectName(u"update_page_layout") + self.update_page_layout.setObjectName("update_page_layout") self.update_page_layout.setContentsMargins(0, 0, 0, 0) self.update_button = QPushButton(self.update_page) - self.update_button.setObjectName(u"update_button") + self.update_button.setObjectName("update_button") self.update_button.setMinimumSize(QSize(140, 0)) self.update_page_layout.addWidget(self.update_button) self.uninstall_button = QPushButton(self.update_page) - self.uninstall_button.setObjectName(u"uninstall_button") + self.uninstall_button.setObjectName("uninstall_button") self.uninstall_button.setMinimumSize(QSize(140, 0)) self.update_page_layout.addWidget(self.uninstall_button) @@ -96,16 +95,16 @@ def setupUi(self, EosWidget): self.retranslateUi(EosWidget) - self.button_stack.setCurrentIndex(1) + self.button_stack.setCurrentIndex(0) # setupUi def retranslateUi(self, EosWidget): - EosWidget.setTitle(QCoreApplication.translate("EosWidget", u"Epic Overlay", None)) - self.version_label.setText(QCoreApplication.translate("EosWidget", u"Version", None)) - self.path_label.setText(QCoreApplication.translate("EosWidget", u"Install folder", None)) - self.install_button.setText(QCoreApplication.translate("EosWidget", u"Install", None)) - self.update_button.setText(QCoreApplication.translate("EosWidget", u"Update", None)) - self.uninstall_button.setText(QCoreApplication.translate("EosWidget", u"Uninstall", None)) + EosWidget.setTitle(QCoreApplication.translate("EosWidget", "Epic Overlay", None)) + self.version_label.setText(QCoreApplication.translate("EosWidget", "Version", None)) + self.path_label.setText(QCoreApplication.translate("EosWidget", "Install folder", None)) + self.install_button.setText(QCoreApplication.translate("EosWidget", "Install", None)) + self.update_button.setText(QCoreApplication.translate("EosWidget", "Update", None)) + self.uninstall_button.setText(QCoreApplication.translate("EosWidget", "Uninstall", None)) # retranslateUi diff --git a/rare/ui/components/tabs/integrations/import_group.py b/rare/ui/components/tabs/integrations/import_group.py index 13ba62ef5..70553cb63 100644 --- a/rare/ui/components/tabs/integrations/import_group.py +++ b/rare/ui/components/tabs/integrations/import_group.py @@ -2,7 +2,7 @@ ################################################################################ ## Form generated from reading UI file 'import_group.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ diff --git a/rare/ui/components/tabs/library/details/cloud_sync_widget.py b/rare/ui/components/tabs/library/details/cloud_sync_widget.py index af07408fd..1b8553306 100644 --- a/rare/ui/components/tabs/library/details/cloud_sync_widget.py +++ b/rare/ui/components/tabs/library/details/cloud_sync_widget.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'cloud_sync_widget.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -12,51 +11,51 @@ from PySide6.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QVBoxLayout -class Ui_CloudSyncWidget(object): +class Ui_CloudSyncWidget: def setupUi(self, CloudSyncWidget): if not CloudSyncWidget.objectName(): - CloudSyncWidget.setObjectName(u"CloudSyncWidget") + CloudSyncWidget.setObjectName("CloudSyncWidget") CloudSyncWidget.resize(438, 137) sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(CloudSyncWidget.sizePolicy().hasHeightForWidth()) CloudSyncWidget.setSizePolicy(sizePolicy) - CloudSyncWidget.setWindowTitle(u"SyncWidget") + CloudSyncWidget.setWindowTitle("SyncWidget") self.main_layout = QHBoxLayout(CloudSyncWidget) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.main_layout.setContentsMargins(0, 0, 0, 0) self.local_group = QGroupBox(CloudSyncWidget) - self.local_group.setObjectName(u"local_group") + self.local_group.setObjectName("local_group") self.local_layout = QVBoxLayout(self.local_group) - self.local_layout.setObjectName(u"local_layout") + self.local_layout.setObjectName("local_layout") self.date_info_local = QLabel(self.local_group) - self.date_info_local.setObjectName(u"date_info_local") - self.date_info_local.setText(u"") + self.date_info_local.setObjectName("date_info_local") + self.date_info_local.setText("") self.date_info_local.setAlignment(Qt.AlignCenter) self.local_layout.addWidget(self.date_info_local) self.icon_local = QLabel(self.local_group) - self.icon_local.setObjectName(u"icon_local") + self.icon_local.setObjectName("icon_local") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth(self.icon_local.sizePolicy().hasHeightForWidth()) self.icon_local.setSizePolicy(sizePolicy1) - self.icon_local.setText(u"") + self.icon_local.setText("") self.icon_local.setAlignment(Qt.AlignCenter) self.local_layout.addWidget(self.icon_local) self.age_label_local = QLabel(self.local_group) - self.age_label_local.setObjectName(u"age_label_local") + self.age_label_local.setObjectName("age_label_local") self.age_label_local.setAlignment(Qt.AlignCenter) self.local_layout.addWidget(self.age_label_local) self.upload_button = QPushButton(self.local_group) - self.upload_button.setObjectName(u"upload_button") + self.upload_button.setObjectName("upload_button") self.upload_button.setMinimumSize(QSize(192, 0)) self.local_layout.addWidget(self.upload_button) @@ -65,34 +64,34 @@ def setupUi(self, CloudSyncWidget): self.main_layout.addWidget(self.local_group) self.cloud_group = QGroupBox(CloudSyncWidget) - self.cloud_group.setObjectName(u"cloud_group") + self.cloud_group.setObjectName("cloud_group") self.cloud_layout = QVBoxLayout(self.cloud_group) - self.cloud_layout.setObjectName(u"cloud_layout") + self.cloud_layout.setObjectName("cloud_layout") self.date_info_remote = QLabel(self.cloud_group) - self.date_info_remote.setObjectName(u"date_info_remote") - self.date_info_remote.setText(u"") + self.date_info_remote.setObjectName("date_info_remote") + self.date_info_remote.setText("") self.date_info_remote.setAlignment(Qt.AlignCenter) self.cloud_layout.addWidget(self.date_info_remote) self.icon_remote = QLabel(self.cloud_group) - self.icon_remote.setObjectName(u"icon_remote") + self.icon_remote.setObjectName("icon_remote") sizePolicy1.setHeightForWidth(self.icon_remote.sizePolicy().hasHeightForWidth()) self.icon_remote.setSizePolicy(sizePolicy1) - self.icon_remote.setText(u"") + self.icon_remote.setText("") self.icon_remote.setAlignment(Qt.AlignCenter) self.cloud_layout.addWidget(self.icon_remote) self.age_label_remote = QLabel(self.cloud_group) - self.age_label_remote.setObjectName(u"age_label_remote") - self.age_label_remote.setText(u"") + self.age_label_remote.setObjectName("age_label_remote") + self.age_label_remote.setText("") self.age_label_remote.setAlignment(Qt.AlignCenter) self.cloud_layout.addWidget(self.age_label_remote) self.download_button = QPushButton(self.cloud_group) - self.download_button.setObjectName(u"download_button") + self.download_button.setObjectName("download_button") self.download_button.setMinimumSize(QSize(192, 0)) self.cloud_layout.addWidget(self.download_button) @@ -105,11 +104,10 @@ def setupUi(self, CloudSyncWidget): # setupUi def retranslateUi(self, CloudSyncWidget): - self.local_group.setTitle(QCoreApplication.translate("CloudSyncWidget", u"Local", None)) + self.local_group.setTitle(QCoreApplication.translate("CloudSyncWidget", "Local", None)) self.age_label_local.setText("") - self.upload_button.setText(QCoreApplication.translate("CloudSyncWidget", u"Upload", None)) - self.cloud_group.setTitle(QCoreApplication.translate("CloudSyncWidget", u"Cloud", None)) - self.download_button.setText(QCoreApplication.translate("CloudSyncWidget", u"Download", None)) - pass + self.upload_button.setText(QCoreApplication.translate("CloudSyncWidget", "Upload", None)) + self.cloud_group.setTitle(QCoreApplication.translate("CloudSyncWidget", "Cloud", None)) + self.download_button.setText(QCoreApplication.translate("CloudSyncWidget", "Download", None)) # retranslateUi diff --git a/rare/ui/components/tabs/library/details/details.py b/rare/ui/components/tabs/library/details/details.py index cab795073..c82270a1d 100644 --- a/rare/ui/components/tabs/library/details/details.py +++ b/rare/ui/components/tabs/library/details/details.py @@ -2,7 +2,7 @@ ################################################################################ ## Form generated from reading UI file 'details.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -437,6 +437,5 @@ def retranslateUi(self, GameDetails): self.uninstall_button.setText(QCoreApplication.translate("GameDetails", "Uninstall", None)) self.install_button.setText(QCoreApplication.translate("GameDetails", "Install", None)) self.import_button.setText(QCoreApplication.translate("GameDetails", "Import", None)) - pass # retranslateUi diff --git a/rare/ui/components/tabs/library/details/dlc_widget.py b/rare/ui/components/tabs/library/details/dlc_widget.py index d50da0501..68723ebbe 100644 --- a/rare/ui/components/tabs/library/details/dlc_widget.py +++ b/rare/ui/components/tabs/library/details/dlc_widget.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'dlc_widget.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,30 +12,30 @@ from PySide6.QtWidgets import QFormLayout, QFrame, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QSpacerItem, QWidget -class Ui_GameDlcWidget(object): +class Ui_GameDlcWidget: def setupUi(self, GameDlcWidget): if not GameDlcWidget.objectName(): - GameDlcWidget.setObjectName(u"GameDlcWidget") + GameDlcWidget.setObjectName("GameDlcWidget") GameDlcWidget.resize(454, 58) sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(GameDlcWidget.sizePolicy().hasHeightForWidth()) GameDlcWidget.setSizePolicy(sizePolicy) - GameDlcWidget.setWindowTitle(u"GameDlcWidget") + GameDlcWidget.setWindowTitle("GameDlcWidget") GameDlcWidget.setFrameShape(QFrame.StyledPanel) GameDlcWidget.setFrameShadow(QFrame.Plain) self.dlc_layout = QHBoxLayout(GameDlcWidget) - self.dlc_layout.setObjectName(u"dlc_layout") + self.dlc_layout.setObjectName("dlc_layout") self.dlc_layout.setContentsMargins(0, 0, 0, 0) self.dlc_info = QWidget(GameDlcWidget) - self.dlc_info.setObjectName(u"dlc_info") + self.dlc_info.setObjectName("dlc_info") self.dlc_info_layout = QFormLayout(self.dlc_info) - self.dlc_info_layout.setObjectName(u"dlc_info_layout") + self.dlc_info_layout.setObjectName("dlc_info_layout") self.dlc_info_layout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.dlc_info_layout.setContentsMargins(0, 0, 0, 0) self.dlc_name_label = QLabel(self.dlc_info) - self.dlc_name_label.setObjectName(u"dlc_name_label") + self.dlc_name_label.setObjectName("dlc_name_label") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) @@ -49,15 +48,15 @@ def setupUi(self, GameDlcWidget): self.dlc_info_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.dlc_name_label) self.dlc_name = QLabel(self.dlc_info) - self.dlc_name.setObjectName(u"dlc_name") + self.dlc_name.setObjectName("dlc_name") self.dlc_name.setMinimumSize(QSize(160, 0)) - self.dlc_name.setText(u"dlc_name") + self.dlc_name.setText("dlc_name") self.dlc_name.setTextInteractionFlags(Qt.LinksAccessibleByMouse|Qt.TextSelectableByMouse) self.dlc_info_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.dlc_name) self.version_label = QLabel(self.dlc_info) - self.version_label.setObjectName(u"version_label") + self.version_label.setObjectName("version_label") sizePolicy1.setHeightForWidth(self.version_label.sizePolicy().hasHeightForWidth()) self.version_label.setSizePolicy(sizePolicy1) self.version_label.setFont(font) @@ -65,15 +64,15 @@ def setupUi(self, GameDlcWidget): self.dlc_info_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.version_label) self.version = QLabel(self.dlc_info) - self.version.setObjectName(u"version") + self.version.setObjectName("version") self.version.setMinimumSize(QSize(160, 0)) - self.version.setText(u"version") + self.version.setText("version") self.version.setTextInteractionFlags(Qt.LinksAccessibleByMouse|Qt.TextSelectableByMouse) self.dlc_info_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.version) self.app_name_label = QLabel(self.dlc_info) - self.app_name_label.setObjectName(u"app_name_label") + self.app_name_label.setObjectName("app_name_label") sizePolicy1.setHeightForWidth(self.app_name_label.sizePolicy().hasHeightForWidth()) self.app_name_label.setSizePolicy(sizePolicy1) self.app_name_label.setFont(font) @@ -81,9 +80,9 @@ def setupUi(self, GameDlcWidget): self.dlc_info_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.app_name_label) self.app_name = QLabel(self.dlc_info) - self.app_name.setObjectName(u"app_name") + self.app_name.setObjectName("app_name") self.app_name.setMinimumSize(QSize(160, 0)) - self.app_name.setText(u"app_name") + self.app_name.setText("app_name") self.app_name.setTextInteractionFlags(Qt.LinksAccessibleByMouse|Qt.TextSelectableByMouse) self.dlc_info_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.app_name) @@ -96,14 +95,14 @@ def setupUi(self, GameDlcWidget): self.dlc_layout.addItem(self.hspacer) self.action_button = QPushButton(GameDlcWidget) - self.action_button.setObjectName(u"action_button") + self.action_button.setObjectName("action_button") sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) sizePolicy2.setHeightForWidth(self.action_button.sizePolicy().hasHeightForWidth()) self.action_button.setSizePolicy(sizePolicy2) self.action_button.setMinimumSize(QSize(160, 0)) - self.action_button.setText(u"Action") + self.action_button.setText("Action") self.dlc_layout.addWidget(self.action_button, 0, Qt.AlignBottom) @@ -113,9 +112,8 @@ def setupUi(self, GameDlcWidget): # setupUi def retranslateUi(self, GameDlcWidget): - self.dlc_name_label.setText(QCoreApplication.translate("GameDlcWidget", u"DLC Name", None)) - self.version_label.setText(QCoreApplication.translate("GameDlcWidget", u"Version", None)) - self.app_name_label.setText(QCoreApplication.translate("GameDlcWidget", u"Application", None)) - pass + self.dlc_name_label.setText(QCoreApplication.translate("GameDlcWidget", "DLC Name", None)) + self.version_label.setText(QCoreApplication.translate("GameDlcWidget", "Version", None)) + self.app_name_label.setText(QCoreApplication.translate("GameDlcWidget", "Application", None)) # retranslateUi diff --git a/rare/ui/components/tabs/library/details/dlcs.py b/rare/ui/components/tabs/library/details/dlcs.py index f6005a98c..c8915b831 100644 --- a/rare/ui/components/tabs/library/details/dlcs.py +++ b/rare/ui/components/tabs/library/details/dlcs.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'dlcs.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -12,66 +11,65 @@ from PySide6.QtWidgets import QFrame, QLabel, QVBoxLayout, QWidget -class Ui_GameDlcs(object): +class Ui_GameDlcs: def setupUi(self, GameDlcs): if not GameDlcs.objectName(): - GameDlcs.setObjectName(u"GameDlcs") + GameDlcs.setObjectName("GameDlcs") GameDlcs.resize(271, 141) - GameDlcs.setWindowTitle(u"GameDlcs") + GameDlcs.setWindowTitle("GameDlcs") GameDlcs.setFrameShape(QFrame.StyledPanel) GameDlcs.setFrameShadow(QFrame.Sunken) GameDlcs.setLineWidth(0) self.installed_dlc_page = QWidget() - self.installed_dlc_page.setObjectName(u"installed_dlc_page") + self.installed_dlc_page.setObjectName("installed_dlc_page") self.installed_dlc_page.setGeometry(QRect(0, 0, 287, 62)) self.installed_dlc_page_layout = QVBoxLayout(self.installed_dlc_page) - self.installed_dlc_page_layout.setObjectName(u"installed_dlc_page_layout") + self.installed_dlc_page_layout.setObjectName("installed_dlc_page_layout") self.installed_dlc_page_layout.setContentsMargins(0, 0, 0, 0) self.installed_dlc_label = QLabel(self.installed_dlc_page) - self.installed_dlc_label.setObjectName(u"installed_dlc_label") + self.installed_dlc_label.setObjectName("installed_dlc_label") self.installed_dlc_page_layout.addWidget(self.installed_dlc_label, 0, Qt.AlignTop) self.installed_dlc_container = QWidget(self.installed_dlc_page) - self.installed_dlc_container.setObjectName(u"installed_dlc_container") + self.installed_dlc_container.setObjectName("installed_dlc_container") self.installed_dlc_container_layout = QVBoxLayout(self.installed_dlc_container) - self.installed_dlc_container_layout.setObjectName(u"installed_dlc_container_layout") + self.installed_dlc_container_layout.setObjectName("installed_dlc_container_layout") self.installed_dlc_container_layout.setContentsMargins(0, 0, 3, 0) self.installed_dlc_page_layout.addWidget(self.installed_dlc_container, 0, Qt.AlignTop) self.installed_dlc_page_layout.setStretch(1, 1) - GameDlcs.addItem(self.installed_dlc_page, u"Installed DLCs") + GameDlcs.addItem(self.installed_dlc_page, "Installed DLCs") self.available_dlc_page = QWidget() - self.available_dlc_page.setObjectName(u"available_dlc_page") + self.available_dlc_page.setObjectName("available_dlc_page") self.available_dlc_page.setGeometry(QRect(0, 0, 271, 83)) self.available_dlc_page_layou = QVBoxLayout(self.available_dlc_page) - self.available_dlc_page_layou.setObjectName(u"available_dlc_page_layou") + self.available_dlc_page_layou.setObjectName("available_dlc_page_layou") self.available_dlc_page_layou.setContentsMargins(0, 0, 0, 0) self.available_dlc_label = QLabel(self.available_dlc_page) - self.available_dlc_label.setObjectName(u"available_dlc_label") + self.available_dlc_label.setObjectName("available_dlc_label") self.available_dlc_page_layou.addWidget(self.available_dlc_label, 0, Qt.AlignTop) self.available_dlc_container = QWidget(self.available_dlc_page) - self.available_dlc_container.setObjectName(u"available_dlc_container") + self.available_dlc_container.setObjectName("available_dlc_container") self.available_dlc_container_layout = QVBoxLayout(self.available_dlc_container) - self.available_dlc_container_layout.setObjectName(u"available_dlc_container_layout") + self.available_dlc_container_layout.setObjectName("available_dlc_container_layout") self.available_dlc_container_layout.setContentsMargins(0, 0, 3, 0) self.available_dlc_page_layou.addWidget(self.available_dlc_container, 0, Qt.AlignTop) self.available_dlc_page_layou.setStretch(1, 1) - GameDlcs.addItem(self.available_dlc_page, u"Available DLCs") + GameDlcs.addItem(self.available_dlc_page, "Available DLCs") self.retranslateUi(GameDlcs) # setupUi def retranslateUi(self, GameDlcs): - self.installed_dlc_label.setText(QCoreApplication.translate("GameDlcs", u"No Downloadable Content has been installed.", None)) - GameDlcs.setItemText(GameDlcs.indexOf(self.installed_dlc_page), QCoreApplication.translate("GameDlcs", u"Installed DLCs", None)) - self.available_dlc_label.setText(QCoreApplication.translate("GameDlcs", u"No Downloadable Content is available", None)) - GameDlcs.setItemText(GameDlcs.indexOf(self.available_dlc_page), QCoreApplication.translate("GameDlcs", u"Available DLCs", None)) - pass + self.installed_dlc_label.setText(QCoreApplication.translate("GameDlcs", "No Downloadable Content has been installed.", None)) + GameDlcs.setItemText(GameDlcs.indexOf(self.installed_dlc_page), QCoreApplication.translate("GameDlcs", "Installed DLCs", None)) + self.available_dlc_label.setText(QCoreApplication.translate("GameDlcs", "No Downloadable Content is available", None)) + GameDlcs.setItemText(GameDlcs.indexOf(self.available_dlc_page), QCoreApplication.translate("GameDlcs", "Available DLCs", None)) # retranslateUi diff --git a/rare/ui/components/tabs/settings/about.py b/rare/ui/components/tabs/settings/about.py index 686843f8d..70a5d30d6 100644 --- a/rare/ui/components/tabs/settings/about.py +++ b/rare/ui/components/tabs/settings/about.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'about.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,16 +12,16 @@ from PySide6.QtWidgets import QFormLayout, QLabel, QPushButton, QSizePolicy -class Ui_About(object): +class Ui_About: def setupUi(self, About): if not About.objectName(): - About.setObjectName(u"About") + About.setObjectName("About") About.resize(542, 215) self.about_layout = QFormLayout(About) - self.about_layout.setObjectName(u"about_layout") + self.about_layout.setObjectName("about_layout") self.about_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.version_label = QLabel(About) - self.version_label.setObjectName(u"version_label") + self.version_label.setObjectName("version_label") font = QFont() font.setBold(True) self.version_label.setFont(font) @@ -30,25 +29,25 @@ def setupUi(self, About): self.about_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.version_label) self.version = QLabel(About) - self.version.setObjectName(u"version") - self.version.setText(u"error") + self.version.setObjectName("version") + self.version.setText("error") self.about_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.version) self.update_label = QLabel(About) - self.update_label.setObjectName(u"update_label") + self.update_label.setObjectName("update_label") self.update_label.setFont(font) self.about_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.update_label) self.update_field = QLabel(About) - self.update_field.setObjectName(u"update_field") - self.update_field.setText(u"error") + self.update_field.setObjectName("update_field") + self.update_field.setText("error") self.about_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.update_field) self.open_browser = QPushButton(About) - self.open_browser.setObjectName(u"open_browser") + self.open_browser.setObjectName("open_browser") sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -58,14 +57,14 @@ def setupUi(self, About): self.about_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.open_browser) self.dev_label = QLabel(About) - self.dev_label.setObjectName(u"dev_label") + self.dev_label.setObjectName("dev_label") self.dev_label.setFont(font) self.about_layout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.dev_label) self.dev = QLabel(About) - self.dev.setObjectName(u"dev") - self.dev.setText(u"Dummerle\n" + self.dev.setObjectName("dev") + self.dev.setText("Dummerle\n" "
\n" "loathingkernel") self.dev.setOpenExternalLinks(True) @@ -73,38 +72,38 @@ def setupUi(self, About): self.about_layout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.dev) self.lgd_dev_label = QLabel(About) - self.lgd_dev_label.setObjectName(u"lgd_dev_label") + self.lgd_dev_label.setObjectName("lgd_dev_label") self.lgd_dev_label.setFont(font) self.about_layout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.lgd_dev_label) self.lgd_dev = QLabel(About) - self.lgd_dev.setObjectName(u"lgd_dev") - self.lgd_dev.setText(u"derrod") + self.lgd_dev.setObjectName("lgd_dev") + self.lgd_dev.setText("derrod") self.lgd_dev.setOpenExternalLinks(True) self.about_layout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.lgd_dev) self.license_label = QLabel(About) - self.license_label.setObjectName(u"license_label") + self.license_label.setObjectName("license_label") self.license_label.setFont(font) self.about_layout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.license_label) self.license = QLabel(About) - self.license.setObjectName(u"license") + self.license.setObjectName("license") self.about_layout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.license) self.contrib_label = QLabel(About) - self.contrib_label.setObjectName(u"contrib_label") + self.contrib_label.setObjectName("contrib_label") self.contrib_label.setFont(font) self.about_layout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.contrib_label) self.label = QLabel(About) - self.label.setObjectName(u"label") - self.label.setText(u"CommandMC author of original Rare, the very early base of this project\n" + self.label.setObjectName("label") + self.label.setText("CommandMC author of original Rare, the very early base of this project\n" "
\n" "MultisampledNight artwork, bug hunting, testing\n" "
\n" @@ -121,20 +120,20 @@ def setupUi(self, About): # setupUi def retranslateUi(self, About): - About.setWindowTitle(QCoreApplication.translate("About", u"About", None)) - self.version_label.setText(QCoreApplication.translate("About", u"Version", None)) - self.update_label.setText(QCoreApplication.translate("About", u"Update", None)) - self.open_browser.setText(QCoreApplication.translate("About", u"Download latest release", None)) - self.dev_label.setText(QCoreApplication.translate("About", u"Rare Developers", None)) + About.setWindowTitle(QCoreApplication.translate("About", "About", None)) + self.version_label.setText(QCoreApplication.translate("About", "Version", None)) + self.update_label.setText(QCoreApplication.translate("About", "Update", None)) + self.open_browser.setText(QCoreApplication.translate("About", "Download latest release", None)) + self.dev_label.setText(QCoreApplication.translate("About", "Rare Developers", None)) #if QT_CONFIG(tooltip) - self.dev.setToolTip(QCoreApplication.translate("About", u"Github", None)) + self.dev.setToolTip(QCoreApplication.translate("About", "Github", None)) #endif // QT_CONFIG(tooltip) - self.lgd_dev_label.setText(QCoreApplication.translate("About", u"Legendary Developer", None)) + self.lgd_dev_label.setText(QCoreApplication.translate("About", "Legendary Developer", None)) #if QT_CONFIG(tooltip) - self.lgd_dev.setToolTip(QCoreApplication.translate("About", u"Github", None)) + self.lgd_dev.setToolTip(QCoreApplication.translate("About", "Github", None)) #endif // QT_CONFIG(tooltip) - self.license_label.setText(QCoreApplication.translate("About", u"License", None)) - self.license.setText(QCoreApplication.translate("About", u"GNU General Public License v3.0", None)) - self.contrib_label.setText(QCoreApplication.translate("About", u"Rare Contributors", None)) + self.license_label.setText(QCoreApplication.translate("About", "License", None)) + self.license.setText(QCoreApplication.translate("About", "GNU General Public License v3.0", None)) + self.contrib_label.setText(QCoreApplication.translate("About", "Rare Contributors", None)) # retranslateUi diff --git a/rare/ui/components/tabs/settings/legendary.py b/rare/ui/components/tabs/settings/legendary.py index 9c9cf41fb..902945ced 100644 --- a/rare/ui/components/tabs/settings/legendary.py +++ b/rare/ui/components/tabs/settings/legendary.py @@ -2,7 +2,7 @@ ################################################################################ ## Form generated from reading UI file 'legendary.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -251,6 +251,5 @@ def retranslateUi(self, LegendarySettings): self.exclude_non_asset_check.setText(QCoreApplication.translate("LegendarySettings", "Exclude non-asset games", None)) self.metadata_info.setText(QCoreApplication.translate("LegendarySettings", "Restart Rare to apply", None)) self.refresh_metadata_button.setText(QCoreApplication.translate("LegendarySettings", "Refresh metadata", None)) - pass # retranslateUi diff --git a/rare/ui/components/tabs/settings/rare.py b/rare/ui/components/tabs/settings/rare.py index b7c6911e0..003bce69f 100644 --- a/rare/ui/components/tabs/settings/rare.py +++ b/rare/ui/components/tabs/settings/rare.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'rare.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -25,59 +24,59 @@ ) -class Ui_RareSettings(object): +class Ui_RareSettings: def setupUi(self, RareSettings): if not RareSettings.objectName(): - RareSettings.setObjectName(u"RareSettings") + RareSettings.setObjectName("RareSettings") RareSettings.resize(629, 447) - RareSettings.setWindowTitle(u"RareSettings") + RareSettings.setWindowTitle("RareSettings") self.main_layout = QHBoxLayout(RareSettings) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.left_layout = QVBoxLayout() - self.left_layout.setObjectName(u"left_layout") + self.left_layout.setObjectName("left_layout") self.interface_group = QGroupBox(RareSettings) - self.interface_group.setObjectName(u"interface_group") + self.interface_group.setObjectName("interface_group") sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.interface_group.sizePolicy().hasHeightForWidth()) self.interface_group.setSizePolicy(sizePolicy) self.interface_layout = QFormLayout(self.interface_group) - self.interface_layout.setObjectName(u"interface_layout") + self.interface_layout.setObjectName("interface_layout") self.interface_layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.FieldsStayAtSizeHint) self.interface_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.lang_label = QLabel(self.interface_group) - self.lang_label.setObjectName(u"lang_label") + self.lang_label.setObjectName("lang_label") self.interface_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.lang_label) self.lang_select = QComboBox(self.interface_group) - self.lang_select.setObjectName(u"lang_select") + self.lang_select.setObjectName("lang_select") self.interface_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.lang_select) self.color_label = QLabel(self.interface_group) - self.color_label.setObjectName(u"color_label") + self.color_label.setObjectName("color_label") self.interface_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.color_label) self.color_select = QComboBox(self.interface_group) - self.color_select.setObjectName(u"color_select") + self.color_select.setObjectName("color_select") self.interface_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.color_select) self.style_label = QLabel(self.interface_group) - self.style_label.setObjectName(u"style_label") + self.style_label.setObjectName("style_label") self.interface_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.style_label) self.style_select = QComboBox(self.interface_group) - self.style_select.setObjectName(u"style_select") + self.style_select.setObjectName("style_select") self.interface_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.style_select) self.interface_info = QLabel(self.interface_group) - self.interface_info.setObjectName(u"interface_info") + self.interface_info.setObjectName("interface_info") font = QFont() font.setItalic(True) self.interface_info.setFont(font) @@ -86,12 +85,12 @@ def setupUi(self, RareSettings): self.interface_layout.setWidget(4, QFormLayout.ItemRole.SpanningRole, self.interface_info) self.view_label = QLabel(self.interface_group) - self.view_label.setObjectName(u"view_label") + self.view_label.setObjectName("view_label") self.interface_layout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.view_label) self.view_combo = QComboBox(self.interface_group) - self.view_combo.setObjectName(u"view_combo") + self.view_combo.setObjectName("view_combo") self.interface_layout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.view_combo) @@ -99,36 +98,36 @@ def setupUi(self, RareSettings): self.left_layout.addWidget(self.interface_group) self.settings_group = QGroupBox(RareSettings) - self.settings_group.setObjectName(u"settings_group") + self.settings_group.setObjectName("settings_group") self.behavior_layout = QGridLayout(self.settings_group) - self.behavior_layout.setObjectName(u"behavior_layout") + self.behavior_layout.setObjectName("behavior_layout") self.confirm_start = QCheckBox(self.settings_group) - self.confirm_start.setObjectName(u"confirm_start") + self.confirm_start.setObjectName("confirm_start") self.behavior_layout.addWidget(self.confirm_start, 3, 0, 1, 1) self.sys_tray_close = QCheckBox(self.settings_group) - self.sys_tray_close.setObjectName(u"sys_tray_close") + self.sys_tray_close.setObjectName("sys_tray_close") self.behavior_layout.addWidget(self.sys_tray_close, 0, 0, 1, 1) self.log_games = QCheckBox(self.settings_group) - self.log_games.setObjectName(u"log_games") + self.log_games.setObjectName("log_games") self.behavior_layout.addWidget(self.log_games, 7, 0, 1, 1) self.auto_sync_cloud = QCheckBox(self.settings_group) - self.auto_sync_cloud.setObjectName(u"auto_sync_cloud") + self.auto_sync_cloud.setObjectName("auto_sync_cloud") self.behavior_layout.addWidget(self.auto_sync_cloud, 4, 0, 1, 1) self.save_size = QCheckBox(self.settings_group) - self.save_size.setObjectName(u"save_size") + self.save_size.setObjectName("save_size") self.behavior_layout.addWidget(self.save_size, 6, 0, 1, 1) self.auto_update = QCheckBox(self.settings_group) - self.auto_update.setObjectName(u"auto_update") + self.auto_update.setObjectName("auto_update") self.behavior_layout.addWidget(self.auto_update, 2, 0, 1, 1) @@ -137,12 +136,12 @@ def setupUi(self, RareSettings): self.behavior_layout.addItem(self.settings_hspacer, 3, 1, 2, 1) self.notification = QCheckBox(self.settings_group) - self.notification.setObjectName(u"notification") + self.notification.setObjectName("notification") self.behavior_layout.addWidget(self.notification, 5, 0, 1, 1) self.sys_tray_start = QCheckBox(self.settings_group) - self.sys_tray_start.setObjectName(u"sys_tray_start") + self.sys_tray_start.setObjectName("sys_tray_start") self.behavior_layout.addWidget(self.sys_tray_start, 1, 0, 1, 1) @@ -157,29 +156,29 @@ def setupUi(self, RareSettings): self.main_layout.addLayout(self.left_layout) self.right_layout = QVBoxLayout() - self.right_layout.setObjectName(u"right_layout") + self.right_layout.setObjectName("right_layout") self.log_dir_group = QGroupBox(RareSettings) - self.log_dir_group.setObjectName(u"log_dir_group") + self.log_dir_group.setObjectName("log_dir_group") self.log_dir_layout = QVBoxLayout(self.log_dir_group) - self.log_dir_layout.setObjectName(u"log_dir_layout") + self.log_dir_layout.setObjectName("log_dir_layout") self.log_dir_open_button = QPushButton(self.log_dir_group) - self.log_dir_open_button.setObjectName(u"log_dir_open_button") + self.log_dir_open_button.setObjectName("log_dir_open_button") self.log_dir_layout.addWidget(self.log_dir_open_button) self.log_dir_clean_button = QPushButton(self.log_dir_group) - self.log_dir_clean_button.setObjectName(u"log_dir_clean_button") + self.log_dir_clean_button.setObjectName("log_dir_clean_button") self.log_dir_layout.addWidget(self.log_dir_clean_button) self.log_dir_size_label = QLabel(self.log_dir_group) - self.log_dir_size_label.setObjectName(u"log_dir_size_label") + self.log_dir_size_label.setObjectName("log_dir_size_label") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Maximum) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth(self.log_dir_size_label.sizePolicy().hasHeightForWidth()) self.log_dir_size_label.setSizePolicy(sizePolicy1) - self.log_dir_size_label.setText(u"") + self.log_dir_size_label.setText("") self.log_dir_size_label.setWordWrap(True) self.log_dir_layout.addWidget(self.log_dir_size_label) @@ -188,16 +187,16 @@ def setupUi(self, RareSettings): self.right_layout.addWidget(self.log_dir_group) self.groupBox = QGroupBox(RareSettings) - self.groupBox.setObjectName(u"groupBox") + self.groupBox.setObjectName("groupBox") self.shortcuts_layout = QVBoxLayout(self.groupBox) - self.shortcuts_layout.setObjectName(u"shortcuts_layout") + self.shortcuts_layout.setObjectName("shortcuts_layout") self.desktop_link_btn = QPushButton(self.groupBox) - self.desktop_link_btn.setObjectName(u"desktop_link_btn") + self.desktop_link_btn.setObjectName("desktop_link_btn") self.shortcuts_layout.addWidget(self.desktop_link_btn) self.startmenu_link_btn = QPushButton(self.groupBox) - self.startmenu_link_btn.setObjectName(u"startmenu_link_btn") + self.startmenu_link_btn.setObjectName("startmenu_link_btn") self.shortcuts_layout.addWidget(self.startmenu_link_btn) @@ -216,27 +215,26 @@ def setupUi(self, RareSettings): # setupUi def retranslateUi(self, RareSettings): - self.interface_group.setTitle(QCoreApplication.translate("RareSettings", u"Interface", None)) - self.lang_label.setText(QCoreApplication.translate("RareSettings", u"Language", None)) - self.color_label.setText(QCoreApplication.translate("RareSettings", u"Color scheme", None)) - self.style_label.setText(QCoreApplication.translate("RareSettings", u"Style sheet", None)) - self.interface_info.setText(QCoreApplication.translate("RareSettings", u"Restart Rare to apply changes.", None)) - self.view_label.setText(QCoreApplication.translate("RareSettings", u"Library view", None)) - self.settings_group.setTitle(QCoreApplication.translate("RareSettings", u"Behavior", None)) - self.confirm_start.setText(QCoreApplication.translate("RareSettings", u"Confirm before launching games", None)) - self.sys_tray_close.setText(QCoreApplication.translate("RareSettings", u"Close to system tray", None)) - self.log_games.setText(QCoreApplication.translate("RareSettings", u"Show console window when launching games", None)) - self.auto_sync_cloud.setText(QCoreApplication.translate("RareSettings", u"Automatically upload/download cloud saves", None)) - self.save_size.setText(QCoreApplication.translate("RareSettings", u"Restore window size on application startup", None)) - self.auto_update.setText(QCoreApplication.translate("RareSettings", u"Queue game updates on application startup", None)) - self.notification.setText(QCoreApplication.translate("RareSettings", u"Show notifications when downloads complete", None)) - self.sys_tray_start.setText(QCoreApplication.translate("RareSettings", u"Start minimized to the system tray", None)) - self.log_dir_group.setTitle(QCoreApplication.translate("RareSettings", u"Logs", None)) - self.log_dir_open_button.setText(QCoreApplication.translate("RareSettings", u"Open log folder", None)) - self.log_dir_clean_button.setText(QCoreApplication.translate("RareSettings", u"Clean log folder", None)) - self.groupBox.setTitle(QCoreApplication.translate("RareSettings", u"Shortcuts", None)) - self.desktop_link_btn.setText(QCoreApplication.translate("RareSettings", u"Create on desktop", None)) - self.startmenu_link_btn.setText(QCoreApplication.translate("RareSettings", u"Create in menu", None)) - pass + self.interface_group.setTitle(QCoreApplication.translate("RareSettings", "Interface", None)) + self.lang_label.setText(QCoreApplication.translate("RareSettings", "Language", None)) + self.color_label.setText(QCoreApplication.translate("RareSettings", "Color scheme", None)) + self.style_label.setText(QCoreApplication.translate("RareSettings", "Style sheet", None)) + self.interface_info.setText(QCoreApplication.translate("RareSettings", "Restart Rare to apply changes.", None)) + self.view_label.setText(QCoreApplication.translate("RareSettings", "Library view", None)) + self.settings_group.setTitle(QCoreApplication.translate("RareSettings", "Behavior", None)) + self.confirm_start.setText(QCoreApplication.translate("RareSettings", "Confirm before launching games", None)) + self.sys_tray_close.setText(QCoreApplication.translate("RareSettings", "Close to system tray", None)) + self.log_games.setText(QCoreApplication.translate("RareSettings", "Show console window when launching games", None)) + self.auto_sync_cloud.setText(QCoreApplication.translate("RareSettings", "Automatically upload/download cloud saves", None)) + self.save_size.setText(QCoreApplication.translate("RareSettings", "Restore window size on application startup", None)) + self.auto_update.setText(QCoreApplication.translate("RareSettings", "Queue game updates on application startup", None)) + self.notification.setText(QCoreApplication.translate("RareSettings", "Show notifications when downloads complete", None)) + self.sys_tray_start.setText(QCoreApplication.translate("RareSettings", "Start minimized to the system tray", None)) + self.log_dir_group.setTitle(QCoreApplication.translate("RareSettings", "Logs", None)) + self.log_dir_open_button.setText(QCoreApplication.translate("RareSettings", "Open log folder", None)) + self.log_dir_clean_button.setText(QCoreApplication.translate("RareSettings", "Clean log folder", None)) + self.groupBox.setTitle(QCoreApplication.translate("RareSettings", "Shortcuts", None)) + self.desktop_link_btn.setText(QCoreApplication.translate("RareSettings", "Create on desktop", None)) + self.startmenu_link_btn.setText(QCoreApplication.translate("RareSettings", "Create in menu", None)) # retranslateUi diff --git a/rare/ui/components/tabs/settings/widgets/discord_rpc.py b/rare/ui/components/tabs/settings/widgets/discord_rpc.py index 1c113a91c..f881ba69d 100644 --- a/rare/ui/components/tabs/settings/widgets/discord_rpc.py +++ b/rare/ui/components/tabs/settings/widgets/discord_rpc.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'discord_rpc.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -12,21 +11,21 @@ from PySide6.QtWidgets import QCheckBox, QComboBox, QGridLayout, QLabel, QSizePolicy -class Ui_DiscordRPCSettings(object): +class Ui_DiscordRPCSettings: def setupUi(self, DiscordRPCSettings): if not DiscordRPCSettings.objectName(): - DiscordRPCSettings.setObjectName(u"DiscordRPCSettings") + DiscordRPCSettings.setObjectName("DiscordRPCSettings") DiscordRPCSettings.resize(370, 149) - DiscordRPCSettings.setWindowTitle(u"DiscordRPCSettings") + DiscordRPCSettings.setWindowTitle("DiscordRPCSettings") self.main_layout = QGridLayout(DiscordRPCSettings) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.mode_combo = QComboBox(DiscordRPCSettings) - self.mode_combo.setObjectName(u"mode_combo") + self.mode_combo.setObjectName("mode_combo") self.main_layout.addWidget(self.mode_combo, 0, 1, 1, 1) self.label = QLabel(DiscordRPCSettings) - self.label.setObjectName(u"label") + self.label.setObjectName("label") sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -36,17 +35,17 @@ def setupUi(self, DiscordRPCSettings): self.main_layout.addWidget(self.label, 0, 0, 1, 1) self.game_check = QCheckBox(DiscordRPCSettings) - self.game_check.setObjectName(u"game_check") + self.game_check.setObjectName("game_check") self.main_layout.addWidget(self.game_check, 1, 0, 1, 2) self.os_check = QCheckBox(DiscordRPCSettings) - self.os_check.setObjectName(u"os_check") + self.os_check.setObjectName("os_check") self.main_layout.addWidget(self.os_check, 2, 0, 1, 2) self.time_check = QCheckBox(DiscordRPCSettings) - self.time_check.setObjectName(u"time_check") + self.time_check.setObjectName("time_check") self.main_layout.addWidget(self.time_check, 3, 0, 1, 2) @@ -55,10 +54,10 @@ def setupUi(self, DiscordRPCSettings): # setupUi def retranslateUi(self, DiscordRPCSettings): - DiscordRPCSettings.setTitle(QCoreApplication.translate("DiscordRPCSettings", u"Discord RPC", None)) - self.label.setText(QCoreApplication.translate("DiscordRPCSettings", u"Show", None)) - self.game_check.setText(QCoreApplication.translate("DiscordRPCSettings", u"Show game", None)) - self.os_check.setText(QCoreApplication.translate("DiscordRPCSettings", u"Show OS", None)) - self.time_check.setText(QCoreApplication.translate("DiscordRPCSettings", u"Show play time", None)) + DiscordRPCSettings.setTitle(QCoreApplication.translate("DiscordRPCSettings", "Discord RPC", None)) + self.label.setText(QCoreApplication.translate("DiscordRPCSettings", "Show", None)) + self.game_check.setText(QCoreApplication.translate("DiscordRPCSettings", "Show game", None)) + self.os_check.setText(QCoreApplication.translate("DiscordRPCSettings", "Show OS", None)) + self.time_check.setText(QCoreApplication.translate("DiscordRPCSettings", "Show play time", None)) # retranslateUi diff --git a/rare/ui/components/tabs/settings/widgets/overlay.py b/rare/ui/components/tabs/settings/widgets/overlay.py index 7d1f9225b..4394d38cf 100644 --- a/rare/ui/components/tabs/settings/widgets/overlay.py +++ b/rare/ui/components/tabs/settings/widgets/overlay.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'overlay.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,29 +12,29 @@ from PySide6.QtWidgets import QComboBox, QFormLayout, QFrame, QGridLayout, QGroupBox, QLabel, QSizePolicy -class Ui_OverlaySettings(object): +class Ui_OverlaySettings: def setupUi(self, OverlaySettings): if not OverlaySettings.objectName(): - OverlaySettings.setObjectName(u"OverlaySettings") + OverlaySettings.setObjectName("OverlaySettings") OverlaySettings.resize(608, 256) - OverlaySettings.setWindowTitle(u"OverlaySettings") - OverlaySettings.setTitle(u"") + OverlaySettings.setWindowTitle("OverlaySettings") + OverlaySettings.setTitle("") self.main_layout = QFormLayout(OverlaySettings) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.main_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.overlay_state_label = QLabel(OverlaySettings) - self.overlay_state_label.setObjectName(u"overlay_state_label") + self.overlay_state_label.setObjectName("overlay_state_label") sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.overlay_state_label.sizePolicy().hasHeightForWidth()) self.overlay_state_label.setSizePolicy(sizePolicy) - self.overlay_state_label.setText(u"error") + self.overlay_state_label.setText("error") self.main_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.overlay_state_label) self.overlay_state_combo = QComboBox(OverlaySettings) - self.overlay_state_combo.setObjectName(u"overlay_state_combo") + self.overlay_state_combo.setObjectName("overlay_state_combo") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) @@ -45,19 +44,19 @@ def setupUi(self, OverlaySettings): self.main_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.overlay_state_combo) self.current_value_label = QLabel(OverlaySettings) - self.current_value_label.setObjectName(u"current_value_label") + self.current_value_label.setObjectName("current_value_label") self.main_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.current_value_label) self.current_value_info = QLabel(OverlaySettings) - self.current_value_info.setObjectName(u"current_value_info") + self.current_value_info.setObjectName("current_value_info") self.current_value_info.setMinimumSize(QSize(1, 0)) font = QFont() - font.setFamilies([u"Monospace"]) + font.setFamilies(["Monospace"]) self.current_value_info.setFont(font) self.current_value_info.setFrameShape(QFrame.Shape.StyledPanel) self.current_value_info.setFrameShadow(QFrame.Shadow.Sunken) - self.current_value_info.setText(u"") + self.current_value_info.setText("") self.current_value_info.setTextFormat(Qt.TextFormat.PlainText) self.current_value_info.setWordWrap(True) self.current_value_info.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByMouse) @@ -65,23 +64,23 @@ def setupUi(self, OverlaySettings): self.main_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.current_value_info) self.options_group = QGroupBox(OverlaySettings) - self.options_group.setObjectName(u"options_group") - self.options_group.setTitle(u"") + self.options_group.setObjectName("options_group") + self.options_group.setTitle("") self.options_layout = QGridLayout(self.options_group) - self.options_layout.setObjectName(u"options_layout") + self.options_layout.setObjectName("options_layout") self.left_options_form = QFormLayout() - self.left_options_form.setObjectName(u"left_options_form") + self.left_options_form.setObjectName("left_options_form") self.left_options_form.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.options_layout.addLayout(self.left_options_form, 1, 0, 1, 1) self.options_grid = QGridLayout() - self.options_grid.setObjectName(u"options_grid") + self.options_grid.setObjectName("options_grid") self.options_layout.addLayout(self.options_grid, 0, 0, 1, 2) self.right_options_form = QFormLayout() - self.right_options_form.setObjectName(u"right_options_form") + self.right_options_form.setObjectName("right_options_form") self.right_options_form.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.options_layout.addLayout(self.right_options_form, 1, 1, 1, 1) @@ -96,7 +95,6 @@ def setupUi(self, OverlaySettings): # setupUi def retranslateUi(self, OverlaySettings): - self.current_value_label.setText(QCoreApplication.translate("OverlaySettings", u"Current", None)) - pass + self.current_value_label.setText(QCoreApplication.translate("OverlaySettings", "Current", None)) # retranslateUi diff --git a/rare/ui/components/tabs/store/details.py b/rare/ui/components/tabs/store/details.py index 3503f4521..dd6b35cee 100644 --- a/rare/ui/components/tabs/store/details.py +++ b/rare/ui/components/tabs/store/details.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'details.ui' ## -## Created by: Qt User Interface Compiler version 6.10.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -25,24 +24,24 @@ ) -class Ui_StoreDetailsWidget(object): +class Ui_StoreDetailsWidget: def setupUi(self, StoreDetailsWidget): if not StoreDetailsWidget.objectName(): - StoreDetailsWidget.setObjectName(u"StoreDetailsWidget") + StoreDetailsWidget.setObjectName("StoreDetailsWidget") StoreDetailsWidget.resize(850, 492) - StoreDetailsWidget.setWindowTitle(u"StoreDetailsWidget") + StoreDetailsWidget.setWindowTitle("StoreDetailsWidget") self.main_layout = QHBoxLayout(StoreDetailsWidget) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.left_layout = QVBoxLayout() - self.left_layout.setObjectName(u"left_layout") + self.left_layout.setObjectName("left_layout") self.back_button = QPushButton(StoreDetailsWidget) - self.back_button.setObjectName(u"back_button") + self.back_button.setObjectName("back_button") sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.back_button.sizePolicy().hasHeightForWidth()) self.back_button.setSizePolicy(sizePolicy) - self.back_button.setText(u"") + self.back_button.setText("") self.back_button.setIconSize(QSize(32, 32)) self.back_button.setFlat(True) @@ -53,9 +52,9 @@ def setupUi(self, StoreDetailsWidget): self.right_layout = QGridLayout() self.right_layout.setSpacing(24) - self.right_layout.setObjectName(u"right_layout") + self.right_layout.setObjectName("right_layout") self.requirements_frame = QFrame(StoreDetailsWidget) - self.requirements_frame.setObjectName(u"requirements_frame") + self.requirements_frame.setObjectName("requirements_frame") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) @@ -64,32 +63,32 @@ def setupUi(self, StoreDetailsWidget): self.requirements_frame.setFrameShape(QFrame.Shape.StyledPanel) self.requirements_frame.setFrameShadow(QFrame.Shadow.Sunken) self.requirements_layout = QHBoxLayout(self.requirements_frame) - self.requirements_layout.setObjectName(u"requirements_layout") + self.requirements_layout.setObjectName("requirements_layout") self.requirements_layout.setContentsMargins(0, 0, 0, 0) self.right_layout.addWidget(self.requirements_frame, 2, 0, 1, 2, Qt.AlignmentFlag.AlignBottom) self.description_label = QTextBrowser(StoreDetailsWidget) - self.description_label.setObjectName(u"description_label") + self.description_label.setObjectName("description_label") self.description_label.setMinimumSize(QSize(450, 0)) self.description_label.setOpenExternalLinks(True) self.right_layout.addWidget(self.description_label, 1, 0, 1, 1) self.details_widget = QWidget(StoreDetailsWidget) - self.details_widget.setObjectName(u"details_widget") + self.details_widget.setObjectName("details_widget") sizePolicy1.setHeightForWidth(self.details_widget.sizePolicy().hasHeightForWidth()) self.details_widget.setSizePolicy(sizePolicy1) self.details_widget.setMinimumSize(QSize(450, 0)) self.details_layout = QFormLayout(self.details_widget) - self.details_layout.setObjectName(u"details_layout") + self.details_layout.setObjectName("details_layout") self.details_layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.AllNonFixedFieldsGrow) self.details_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setHorizontalSpacing(12) self.details_layout.setVerticalSpacing(12) self.details_layout.setContentsMargins(12, 0, 0, 0) self.title_label = QLabel(self.details_widget) - self.title_label.setObjectName(u"title_label") + self.title_label.setObjectName("title_label") font = QFont() font.setBold(True) self.title_label.setFont(font) @@ -98,108 +97,108 @@ def setupUi(self, StoreDetailsWidget): self.details_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.title_label) self.title = QLabel(self.details_widget) - self.title.setObjectName(u"title") - self.title.setText(u"title") + self.title.setObjectName("title") + self.title.setText("title") self.title.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByMouse) self.details_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.title) self.developer_label = QLabel(self.details_widget) - self.developer_label.setObjectName(u"developer_label") + self.developer_label.setObjectName("developer_label") self.developer_label.setFont(font) self.developer_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.developer_label) self.developer = QLabel(self.details_widget) - self.developer.setObjectName(u"developer") - self.developer.setText(u"developer") + self.developer.setObjectName("developer") + self.developer.setText("developer") self.developer.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByMouse) self.details_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.developer) self.publisher_label = QLabel(self.details_widget) - self.publisher_label.setObjectName(u"publisher_label") + self.publisher_label.setObjectName("publisher_label") self.publisher_label.setFont(font) self.publisher_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.publisher_label) self.publisher = QLabel(self.details_widget) - self.publisher.setObjectName(u"publisher") - self.publisher.setText(u"publisher") + self.publisher.setObjectName("publisher") + self.publisher.setText("publisher") self.publisher.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByMouse) self.details_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.publisher) self.status_label = QLabel(self.details_widget) - self.status_label.setObjectName(u"status_label") + self.status_label.setObjectName("status_label") self.status_label.setFont(font) self.status_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.status_label) self.status = QLabel(self.details_widget) - self.status.setObjectName(u"status") + self.status.setObjectName("status") self.details_layout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.status) self.price_label = QLabel(self.details_widget) - self.price_label.setObjectName(u"price_label") + self.price_label.setObjectName("price_label") self.price_label.setFont(font) self.price_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.price_label) self.tags_label = QLabel(self.details_widget) - self.tags_label.setObjectName(u"tags_label") + self.tags_label.setObjectName("tags_label") self.tags_label.setFont(font) self.tags_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.tags_label) self.tags = QLabel(self.details_widget) - self.tags.setObjectName(u"tags") - self.tags.setText(u"tags") + self.tags.setObjectName("tags") + self.tags.setText("tags") self.details_layout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.tags) self.social_links_label = QLabel(self.details_widget) - self.social_links_label.setObjectName(u"social_links_label") + self.social_links_label.setObjectName("social_links_label") self.social_links_label.setFont(font) self.social_links_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.social_links_label) self.actions_label = QLabel(self.details_widget) - self.actions_label.setObjectName(u"actions_label") + self.actions_label.setObjectName("actions_label") self.actions_label.setFont(font) self.actions_label.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.details_layout.setWidget(7, QFormLayout.ItemRole.LabelRole, self.actions_label) self.social_links = QWidget(self.details_widget) - self.social_links.setObjectName(u"social_links") + self.social_links.setObjectName("social_links") self.social_links_layout = QHBoxLayout(self.social_links) - self.social_links_layout.setObjectName(u"social_links_layout") + self.social_links_layout.setObjectName("social_links_layout") self.social_links_layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize) self.social_links_layout.setContentsMargins(0, 0, 0, 0) self.details_layout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.social_links) self.actions_widget = QWidget(self.details_widget) - self.actions_widget.setObjectName(u"actions_widget") + self.actions_widget.setObjectName("actions_widget") self.actions_widget.setMinimumSize(QSize(300, 0)) self.actions_layout = QVBoxLayout(self.actions_widget) - self.actions_layout.setObjectName(u"actions_layout") + self.actions_layout.setObjectName("actions_layout") self.actions_layout.setContentsMargins(0, 0, 0, 0) self.store_button = QPushButton(self.actions_widget) - self.store_button.setObjectName(u"store_button") + self.store_button.setObjectName("store_button") self.actions_layout.addWidget(self.store_button) self.wishlist_button = QPushButton(self.actions_widget) - self.wishlist_button.setObjectName(u"wishlist_button") + self.wishlist_button.setObjectName("wishlist_button") self.actions_layout.addWidget(self.wishlist_button) @@ -207,26 +206,26 @@ def setupUi(self, StoreDetailsWidget): self.details_layout.setWidget(7, QFormLayout.ItemRole.FieldRole, self.actions_widget) self.price = QWidget(self.details_widget) - self.price.setObjectName(u"price") + self.price.setObjectName("price") sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) sizePolicy2.setHeightForWidth(self.price.sizePolicy().hasHeightForWidth()) self.price.setSizePolicy(sizePolicy2) self.price_layout = QHBoxLayout(self.price) - self.price_layout.setObjectName(u"price_layout") + self.price_layout.setObjectName("price_layout") self.price_layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize) self.price_layout.setContentsMargins(0, 0, 0, 0) self.original_price = QLabel(self.price) - self.original_price.setObjectName(u"original_price") - self.original_price.setText(u"orignal") + self.original_price.setObjectName("original_price") + self.original_price.setText("orignal") self.original_price.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByMouse) self.price_layout.addWidget(self.original_price) self.discount_price = QLabel(self.price) - self.discount_price.setObjectName(u"discount_price") - self.discount_price.setText(u"discount") + self.discount_price.setObjectName("discount_price") + self.discount_price.setText("discount") self.price_layout.addWidget(self.discount_price) @@ -246,17 +245,16 @@ def setupUi(self, StoreDetailsWidget): # setupUi def retranslateUi(self, StoreDetailsWidget): - self.title_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Title", None)) - self.developer_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Developer", None)) - self.publisher_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Publisher", None)) - self.status_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Status", None)) - self.status.setText(QCoreApplication.translate("StoreDetailsWidget", u"You already own this game", None)) - self.price_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Price", None)) - self.tags_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Tags", None)) - self.social_links_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Links", None)) - self.actions_label.setText(QCoreApplication.translate("StoreDetailsWidget", u"Actions", None)) - self.store_button.setText(QCoreApplication.translate("StoreDetailsWidget", u"Buy in Epic Games Store", None)) - self.wishlist_button.setText(QCoreApplication.translate("StoreDetailsWidget", u"Add to wishlist", None)) - pass + self.title_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Title", None)) + self.developer_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Developer", None)) + self.publisher_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Publisher", None)) + self.status_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Status", None)) + self.status.setText(QCoreApplication.translate("StoreDetailsWidget", "You already own this game", None)) + self.price_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Price", None)) + self.tags_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Tags", None)) + self.social_links_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Links", None)) + self.actions_label.setText(QCoreApplication.translate("StoreDetailsWidget", "Actions", None)) + self.store_button.setText(QCoreApplication.translate("StoreDetailsWidget", "Buy in Epic Games Store", None)) + self.wishlist_button.setText(QCoreApplication.translate("StoreDetailsWidget", "Add to wishlist", None)) # retranslateUi diff --git a/rare/ui/components/tabs/store/landing.py b/rare/ui/components/tabs/store/landing.py index 4fba88e52..0d0642ad0 100644 --- a/rare/ui/components/tabs/store/landing.py +++ b/rare/ui/components/tabs/store/landing.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'landing.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -24,28 +23,28 @@ ) -class Ui_LandingWidget(object): +class Ui_LandingWidget: def setupUi(self, LandingWidget): if not LandingWidget.objectName(): - LandingWidget.setObjectName(u"LandingWidget") + LandingWidget.setObjectName("LandingWidget") LandingWidget.resize(788, 662) - LandingWidget.setWindowTitle(u"LandingWidget") + LandingWidget.setWindowTitle("LandingWidget") self.main_layout = QHBoxLayout(LandingWidget) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.left_layout = QVBoxLayout() - self.left_layout.setObjectName(u"left_layout") + self.left_layout.setObjectName("left_layout") self.main_layout.addLayout(self.left_layout) self.right_layout = QVBoxLayout() - self.right_layout.setObjectName(u"right_layout") + self.right_layout.setObjectName("right_layout") self.reset_button = QPushButton(LandingWidget) - self.reset_button.setObjectName(u"reset_button") + self.reset_button.setObjectName("reset_button") self.right_layout.addWidget(self.reset_button) self.filter_scrollarea = QScrollArea(LandingWidget) - self.filter_scrollarea.setObjectName(u"filter_scrollarea") + self.filter_scrollarea.setObjectName("filter_scrollarea") sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -57,7 +56,7 @@ def setupUi(self, LandingWidget): self.filter_scrollarea.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.filter_scrollarea.setWidgetResizable(True) self.filter_container = QWidget() - self.filter_container.setObjectName(u"filter_container") + self.filter_container.setObjectName("filter_container") self.filter_container.setGeometry(QRect(0, 0, 142, 390)) sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy1.setHorizontalStretch(0) @@ -65,45 +64,45 @@ def setupUi(self, LandingWidget): sizePolicy1.setHeightForWidth(self.filter_container.sizePolicy().hasHeightForWidth()) self.filter_container.setSizePolicy(sizePolicy1) self.filter_container_layout = QVBoxLayout(self.filter_container) - self.filter_container_layout.setObjectName(u"filter_container_layout") + self.filter_container_layout.setObjectName("filter_container_layout") self.filter_container_layout.setContentsMargins(0, 0, 3, 0) self.price_group = QGroupBox(self.filter_container) - self.price_group.setObjectName(u"price_group") + self.price_group.setObjectName("price_group") self.price_layout = QVBoxLayout(self.price_group) - self.price_layout.setObjectName(u"price_layout") + self.price_layout.setObjectName("price_layout") self.none_price = QRadioButton(self.price_group) - self.none_price.setObjectName(u"none_price") + self.none_price.setObjectName("none_price") self.none_price.setChecked(True) self.price_layout.addWidget(self.none_price) self.free_button = QRadioButton(self.price_group) - self.free_button.setObjectName(u"free_button") + self.free_button.setObjectName("free_button") self.price_layout.addWidget(self.free_button) self.under10 = QRadioButton(self.price_group) - self.under10.setObjectName(u"under10") + self.under10.setObjectName("under10") self.price_layout.addWidget(self.under10) self.under20 = QRadioButton(self.price_group) - self.under20.setObjectName(u"under20") + self.under20.setObjectName("under20") self.price_layout.addWidget(self.under20) self.under30 = QRadioButton(self.price_group) - self.under30.setObjectName(u"under30") + self.under30.setObjectName("under30") self.price_layout.addWidget(self.under30) self.above = QRadioButton(self.price_group) - self.above.setObjectName(u"above") + self.above.setObjectName("above") self.price_layout.addWidget(self.above) self.on_discount = QCheckBox(self.price_group) - self.on_discount.setObjectName(u"on_discount") + self.on_discount.setObjectName("on_discount") self.price_layout.addWidget(self.on_discount) @@ -111,30 +110,30 @@ def setupUi(self, LandingWidget): self.filter_container_layout.addWidget(self.price_group) self.platform_group = QGroupBox(self.filter_container) - self.platform_group.setObjectName(u"platform_group") + self.platform_group.setObjectName("platform_group") self.platfrom_layout = QVBoxLayout(self.platform_group) - self.platfrom_layout.setObjectName(u"platfrom_layout") + self.platfrom_layout.setObjectName("platfrom_layout") self.filter_container_layout.addWidget(self.platform_group) self.genre_group = QGroupBox(self.filter_container) - self.genre_group.setObjectName(u"genre_group") + self.genre_group.setObjectName("genre_group") self.genre_layout = QVBoxLayout(self.genre_group) - self.genre_layout.setObjectName(u"genre_layout") + self.genre_layout.setObjectName("genre_layout") self.filter_container_layout.addWidget(self.genre_group) self.type_group = QGroupBox(self.filter_container) - self.type_group.setObjectName(u"type_group") + self.type_group.setObjectName("type_group") self.type_layout = QVBoxLayout(self.type_group) - self.type_layout.setObjectName(u"type_layout") + self.type_layout.setObjectName("type_layout") self.filter_container_layout.addWidget(self.type_group) self.others_group = QGroupBox(self.filter_container) - self.others_group.setObjectName(u"others_group") + self.others_group.setObjectName("others_group") self.others_layout = QVBoxLayout(self.others_group) - self.others_layout.setObjectName(u"others_layout") + self.others_layout.setObjectName("others_layout") self.filter_container_layout.addWidget(self.others_group) @@ -151,19 +150,18 @@ def setupUi(self, LandingWidget): # setupUi def retranslateUi(self, LandingWidget): - self.reset_button.setText(QCoreApplication.translate("LandingWidget", u"Reset filters", None)) - self.price_group.setTitle(QCoreApplication.translate("LandingWidget", u"Price", None)) - self.none_price.setText(QCoreApplication.translate("LandingWidget", u"None", None)) - self.free_button.setText(QCoreApplication.translate("LandingWidget", u"Free", None)) - self.under10.setText(QCoreApplication.translate("LandingWidget", u"Under 10", None)) - self.under20.setText(QCoreApplication.translate("LandingWidget", u"Under 20", None)) - self.under30.setText(QCoreApplication.translate("LandingWidget", u"Under 30", None)) - self.above.setText(QCoreApplication.translate("LandingWidget", u"14.99 and above", None)) - self.on_discount.setText(QCoreApplication.translate("LandingWidget", u"Discount", None)) - self.platform_group.setTitle(QCoreApplication.translate("LandingWidget", u"Platform", None)) - self.genre_group.setTitle(QCoreApplication.translate("LandingWidget", u"Genre", None)) - self.type_group.setTitle(QCoreApplication.translate("LandingWidget", u"Type", None)) - self.others_group.setTitle(QCoreApplication.translate("LandingWidget", u"Other tags", None)) - pass + self.reset_button.setText(QCoreApplication.translate("LandingWidget", "Reset filters", None)) + self.price_group.setTitle(QCoreApplication.translate("LandingWidget", "Price", None)) + self.none_price.setText(QCoreApplication.translate("LandingWidget", "None", None)) + self.free_button.setText(QCoreApplication.translate("LandingWidget", "Free", None)) + self.under10.setText(QCoreApplication.translate("LandingWidget", "Under 10", None)) + self.under20.setText(QCoreApplication.translate("LandingWidget", "Under 20", None)) + self.under30.setText(QCoreApplication.translate("LandingWidget", "Under 30", None)) + self.above.setText(QCoreApplication.translate("LandingWidget", "14.99 and above", None)) + self.on_discount.setText(QCoreApplication.translate("LandingWidget", "Discount", None)) + self.platform_group.setTitle(QCoreApplication.translate("LandingWidget", "Platform", None)) + self.genre_group.setTitle(QCoreApplication.translate("LandingWidget", "Genre", None)) + self.type_group.setTitle(QCoreApplication.translate("LandingWidget", "Type", None)) + self.others_group.setTitle(QCoreApplication.translate("LandingWidget", "Other tags", None)) # retranslateUi diff --git a/rare/ui/components/tabs/store/search.py b/rare/ui/components/tabs/store/search.py index a34602f20..8efb1ca0a 100644 --- a/rare/ui/components/tabs/store/search.py +++ b/rare/ui/components/tabs/store/search.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'search.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -24,28 +23,28 @@ ) -class Ui_SearchWidget(object): +class Ui_SearchWidget: def setupUi(self, SearchWidget): if not SearchWidget.objectName(): - SearchWidget.setObjectName(u"SearchWidget") + SearchWidget.setObjectName("SearchWidget") SearchWidget.resize(491, 382) - SearchWidget.setWindowTitle(u"SearchWidget") + SearchWidget.setWindowTitle("SearchWidget") self.main_layout = QHBoxLayout(SearchWidget) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.left_layout = QVBoxLayout() - self.left_layout.setObjectName(u"left_layout") + self.left_layout.setObjectName("left_layout") self.main_layout.addLayout(self.left_layout) self.right_layout = QVBoxLayout() - self.right_layout.setObjectName(u"right_layout") + self.right_layout.setObjectName("right_layout") self.reset_button = QPushButton(SearchWidget) - self.reset_button.setObjectName(u"reset_button") + self.reset_button.setObjectName("reset_button") self.right_layout.addWidget(self.reset_button) self.filter_scrollarea = QScrollArea(SearchWidget) - self.filter_scrollarea.setObjectName(u"filter_scrollarea") + self.filter_scrollarea.setObjectName("filter_scrollarea") sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -57,7 +56,7 @@ def setupUi(self, SearchWidget): self.filter_scrollarea.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.filter_scrollarea.setWidgetResizable(True) self.filter_container = QWidget() - self.filter_container.setObjectName(u"filter_container") + self.filter_container.setObjectName("filter_container") self.filter_container.setGeometry(QRect(0, 0, 142, 390)) sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy1.setHorizontalStretch(0) @@ -65,45 +64,45 @@ def setupUi(self, SearchWidget): sizePolicy1.setHeightForWidth(self.filter_container.sizePolicy().hasHeightForWidth()) self.filter_container.setSizePolicy(sizePolicy1) self.filter_container_layout = QVBoxLayout(self.filter_container) - self.filter_container_layout.setObjectName(u"filter_container_layout") + self.filter_container_layout.setObjectName("filter_container_layout") self.filter_container_layout.setContentsMargins(0, 0, 3, 0) self.price_group = QGroupBox(self.filter_container) - self.price_group.setObjectName(u"price_group") + self.price_group.setObjectName("price_group") self.price_layout = QVBoxLayout(self.price_group) - self.price_layout.setObjectName(u"price_layout") + self.price_layout.setObjectName("price_layout") self.none_price = QRadioButton(self.price_group) - self.none_price.setObjectName(u"none_price") + self.none_price.setObjectName("none_price") self.none_price.setChecked(True) self.price_layout.addWidget(self.none_price) self.free_button = QRadioButton(self.price_group) - self.free_button.setObjectName(u"free_button") + self.free_button.setObjectName("free_button") self.price_layout.addWidget(self.free_button) self.under10 = QRadioButton(self.price_group) - self.under10.setObjectName(u"under10") + self.under10.setObjectName("under10") self.price_layout.addWidget(self.under10) self.under20 = QRadioButton(self.price_group) - self.under20.setObjectName(u"under20") + self.under20.setObjectName("under20") self.price_layout.addWidget(self.under20) self.under30 = QRadioButton(self.price_group) - self.under30.setObjectName(u"under30") + self.under30.setObjectName("under30") self.price_layout.addWidget(self.under30) self.above = QRadioButton(self.price_group) - self.above.setObjectName(u"above") + self.above.setObjectName("above") self.price_layout.addWidget(self.above) self.on_discount = QCheckBox(self.price_group) - self.on_discount.setObjectName(u"on_discount") + self.on_discount.setObjectName("on_discount") self.price_layout.addWidget(self.on_discount) @@ -111,30 +110,30 @@ def setupUi(self, SearchWidget): self.filter_container_layout.addWidget(self.price_group) self.platform_group = QGroupBox(self.filter_container) - self.platform_group.setObjectName(u"platform_group") + self.platform_group.setObjectName("platform_group") self.platfrom_layout = QVBoxLayout(self.platform_group) - self.platfrom_layout.setObjectName(u"platfrom_layout") + self.platfrom_layout.setObjectName("platfrom_layout") self.filter_container_layout.addWidget(self.platform_group) self.genre_group = QGroupBox(self.filter_container) - self.genre_group.setObjectName(u"genre_group") + self.genre_group.setObjectName("genre_group") self.genre_layout = QVBoxLayout(self.genre_group) - self.genre_layout.setObjectName(u"genre_layout") + self.genre_layout.setObjectName("genre_layout") self.filter_container_layout.addWidget(self.genre_group) self.type_group = QGroupBox(self.filter_container) - self.type_group.setObjectName(u"type_group") + self.type_group.setObjectName("type_group") self.type_layout = QVBoxLayout(self.type_group) - self.type_layout.setObjectName(u"type_layout") + self.type_layout.setObjectName("type_layout") self.filter_container_layout.addWidget(self.type_group) self.others_group = QGroupBox(self.filter_container) - self.others_group.setObjectName(u"others_group") + self.others_group.setObjectName("others_group") self.others_layout = QVBoxLayout(self.others_group) - self.others_layout.setObjectName(u"others_layout") + self.others_layout.setObjectName("others_layout") self.filter_container_layout.addWidget(self.others_group) @@ -151,19 +150,18 @@ def setupUi(self, SearchWidget): # setupUi def retranslateUi(self, SearchWidget): - self.reset_button.setText(QCoreApplication.translate("SearchWidget", u"Reset filters", None)) - self.price_group.setTitle(QCoreApplication.translate("SearchWidget", u"Price", None)) - self.none_price.setText(QCoreApplication.translate("SearchWidget", u"None", None)) - self.free_button.setText(QCoreApplication.translate("SearchWidget", u"Free", None)) - self.under10.setText(QCoreApplication.translate("SearchWidget", u"Under 10", None)) - self.under20.setText(QCoreApplication.translate("SearchWidget", u"Under 20", None)) - self.under30.setText(QCoreApplication.translate("SearchWidget", u"Under 30", None)) - self.above.setText(QCoreApplication.translate("SearchWidget", u"14.99 and above", None)) - self.on_discount.setText(QCoreApplication.translate("SearchWidget", u"Discount", None)) - self.platform_group.setTitle(QCoreApplication.translate("SearchWidget", u"Platform", None)) - self.genre_group.setTitle(QCoreApplication.translate("SearchWidget", u"Genre", None)) - self.type_group.setTitle(QCoreApplication.translate("SearchWidget", u"Type", None)) - self.others_group.setTitle(QCoreApplication.translate("SearchWidget", u"Other tags", None)) - pass + self.reset_button.setText(QCoreApplication.translate("SearchWidget", "Reset filters", None)) + self.price_group.setTitle(QCoreApplication.translate("SearchWidget", "Price", None)) + self.none_price.setText(QCoreApplication.translate("SearchWidget", "None", None)) + self.free_button.setText(QCoreApplication.translate("SearchWidget", "Free", None)) + self.under10.setText(QCoreApplication.translate("SearchWidget", "Under 10", None)) + self.under20.setText(QCoreApplication.translate("SearchWidget", "Under 20", None)) + self.under30.setText(QCoreApplication.translate("SearchWidget", "Under 30", None)) + self.above.setText(QCoreApplication.translate("SearchWidget", "14.99 and above", None)) + self.on_discount.setText(QCoreApplication.translate("SearchWidget", "Discount", None)) + self.platform_group.setTitle(QCoreApplication.translate("SearchWidget", "Platform", None)) + self.genre_group.setTitle(QCoreApplication.translate("SearchWidget", "Genre", None)) + self.type_group.setTitle(QCoreApplication.translate("SearchWidget", "Type", None)) + self.others_group.setTitle(QCoreApplication.translate("SearchWidget", "Other tags", None)) # retranslateUi diff --git a/rare/ui/components/tabs/store/widgets/wishlist_widget.py b/rare/ui/components/tabs/store/widgets/wishlist_widget.py index 4368d49da..c46bfe1c1 100644 --- a/rare/ui/components/tabs/store/widgets/wishlist_widget.py +++ b/rare/ui/components/tabs/store/widgets/wishlist_widget.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'wishlist_widget.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,64 +12,64 @@ from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QSizePolicy, QVBoxLayout, QWidget -class Ui_WishlistWidget(object): +class Ui_WishlistWidget: def setupUi(self, WishlistWidget): if not WishlistWidget.objectName(): - WishlistWidget.setObjectName(u"WishlistWidget") + WishlistWidget.setObjectName("WishlistWidget") WishlistWidget.resize(202, 94) sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(WishlistWidget.sizePolicy().hasHeightForWidth()) WishlistWidget.setSizePolicy(sizePolicy) - WishlistWidget.setWindowTitle(u"WishlistWIdget") + WishlistWidget.setWindowTitle("WishlistWIdget") self.main_layout = QHBoxLayout(WishlistWidget) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.main_layout.setContentsMargins(0, 0, 0, 0) self.info_widget = QWidget(WishlistWidget) - self.info_widget.setObjectName(u"info_widget") + self.info_widget.setObjectName("info_widget") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth(self.info_widget.sizePolicy().hasHeightForWidth()) self.info_widget.setSizePolicy(sizePolicy1) self.verticalLayout_2 = QVBoxLayout(self.info_widget) - self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.verticalLayout_2.setObjectName("verticalLayout_2") self.title_label = QLabel(self.info_widget) - self.title_label.setObjectName(u"title_label") + self.title_label.setObjectName("title_label") font = QFont() font.setPointSize(16) self.title_label.setFont(font) - self.title_label.setText(u"TextLabel") + self.title_label.setText("TextLabel") self.title_label.setWordWrap(True) self.verticalLayout_2.addWidget(self.title_label) self.developer = QLabel(self.info_widget) - self.developer.setObjectName(u"developer") + self.developer.setObjectName("developer") font1 = QFont() font1.setPointSize(12) self.developer.setFont(font1) - self.developer.setText(u"TextLabel") + self.developer.setText("TextLabel") self.verticalLayout_2.addWidget(self.developer) self.price_layout = QHBoxLayout() - self.price_layout.setObjectName(u"price_layout") + self.price_layout.setObjectName("price_layout") self.discount_price = QLabel(self.info_widget) - self.discount_price.setObjectName(u"discount_price") + self.discount_price.setObjectName("discount_price") sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) sizePolicy2.setHeightForWidth(self.discount_price.sizePolicy().hasHeightForWidth()) self.discount_price.setSizePolicy(sizePolicy2) - self.discount_price.setText(u"TextLabel") + self.discount_price.setText("TextLabel") self.price_layout.addWidget(self.discount_price) self.price = QLabel(self.info_widget) - self.price.setObjectName(u"price") - self.price.setText(u"TextLabel") + self.price.setObjectName("price") + self.price.setText("TextLabel") self.price_layout.addWidget(self.price) @@ -81,7 +80,7 @@ def setupUi(self, WishlistWidget): self.main_layout.addWidget(self.info_widget, 0, Qt.AlignTop) self.delete_button = QPushButton(WishlistWidget) - self.delete_button.setObjectName(u"delete_button") + self.delete_button.setObjectName("delete_button") sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Maximum) sizePolicy3.setHorizontalStretch(0) sizePolicy3.setVerticalStretch(0) @@ -96,6 +95,5 @@ def setupUi(self, WishlistWidget): def retranslateUi(self, WishlistWidget): self.delete_button.setText("") - pass # retranslateUi diff --git a/rare/ui/components/tabs/store/wishlist.py b/rare/ui/components/tabs/store/wishlist.py index 57ca315fe..9e32f84cc 100644 --- a/rare/ui/components/tabs/store/wishlist.py +++ b/rare/ui/components/tabs/store/wishlist.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'wishlist.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -24,28 +23,28 @@ ) -class Ui_Wishlist(object): +class Ui_Wishlist: def setupUi(self, Wishlist): if not Wishlist.objectName(): - Wishlist.setObjectName(u"Wishlist") + Wishlist.setObjectName("Wishlist") Wishlist.resize(489, 165) - Wishlist.setWindowTitle(u"Wishlist") + Wishlist.setWindowTitle("Wishlist") self.main_layout = QVBoxLayout(Wishlist) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.tool_layout = QHBoxLayout() - self.tool_layout.setObjectName(u"tool_layout") + self.tool_layout.setObjectName("tool_layout") self.filter_combo = QComboBox(Wishlist) - self.filter_combo.setObjectName(u"filter_combo") + self.filter_combo.setObjectName("filter_combo") self.tool_layout.addWidget(self.filter_combo) self.order_combo = QComboBox(Wishlist) - self.order_combo.setObjectName(u"order_combo") + self.order_combo.setObjectName("order_combo") self.tool_layout.addWidget(self.order_combo) self.reverse_check = QCheckBox(Wishlist) - self.reverse_check.setObjectName(u"reverse_check") + self.reverse_check.setObjectName("reverse_check") self.tool_layout.addWidget(self.reverse_check) @@ -54,7 +53,7 @@ def setupUi(self, Wishlist): self.tool_layout.addItem(self.hspacer_left) self.reload_button = QPushButton(Wishlist) - self.reload_button.setObjectName(u"reload_button") + self.reload_button.setObjectName("reload_button") sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -67,16 +66,16 @@ def setupUi(self, Wishlist): self.main_layout.addLayout(self.tool_layout) self.scrollarea = QScrollArea(Wishlist) - self.scrollarea.setObjectName(u"scrollarea") + self.scrollarea.setObjectName("scrollarea") self.scrollarea.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.scrollarea.setWidgetResizable(True) self.container = QWidget() - self.container.setObjectName(u"container") + self.container.setObjectName("container") self.container.setGeometry(QRect(0, 0, 473, 115)) self.container_layout = QVBoxLayout(self.container) - self.container_layout.setObjectName(u"container_layout") + self.container_layout.setObjectName("container_layout") self.no_games_label = QLabel(self.container) - self.no_games_label.setObjectName(u"no_games_label") + self.no_games_label.setObjectName("no_games_label") self.container_layout.addWidget(self.no_games_label, 0, Qt.AlignTop) @@ -89,9 +88,8 @@ def setupUi(self, Wishlist): # setupUi def retranslateUi(self, Wishlist): - self.reverse_check.setText(QCoreApplication.translate("Wishlist", u"Reverse", None)) + self.reverse_check.setText(QCoreApplication.translate("Wishlist", "Reverse", None)) self.reload_button.setText("") - self.no_games_label.setText(QCoreApplication.translate("Wishlist", u"No games matching your filter", None)) - pass + self.no_games_label.setText(QCoreApplication.translate("Wishlist", "No games matching your filter", None)) # retranslateUi From 84f02f60c0b7c2376715947698c75738119a0bfa Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:25:57 +0300 Subject: [PATCH 06/16] project: use ruff and ty instead of pylint, mypy, black --- packaging/requirements-dev.in | 4 +--- pyproject.toml | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packaging/requirements-dev.in b/packaging/requirements-dev.in index 671160f96..aa0872192 100644 --- a/packaging/requirements-dev.in +++ b/packaging/requirements-dev.in @@ -1,6 +1,4 @@ -pylint -mypy -black[d] PySide6-stubs qstylizer ruff +ty diff --git a/pyproject.toml b/pyproject.toml index 2ed414e71..ab0f6c854 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,17 +43,14 @@ discordrpc = [ "pypresence", ] dev = [ - "pylint", - "mypy", - "black[d]", "PySide6-stubs", "qstylizer", "ruff", + "ty", ] packaging = [ "cx-freeze", "nuitka", - "pyinstaller", ] [project.urls] @@ -133,6 +130,7 @@ force-exclude = ''' ''' [tool.ruff] +target-version = "py310" include = ["pyproject.toml", "rare/*.py"] exclude = [ "rare/ui", From 78d778960050bca9bf29c8dcd344a1646b108d10 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:26:26 +0300 Subject: [PATCH 07/16] chore: update the visual of some informative labels --- rare/components/tabs/settings/widgets/launch.py | 2 ++ rare/components/tabs/settings/widgets/runner.py | 1 + 2 files changed, 3 insertions(+) diff --git a/rare/components/tabs/settings/widgets/launch.py b/rare/components/tabs/settings/widgets/launch.py index 63454ed36..72f68a98b 100644 --- a/rare/components/tabs/settings/widgets/launch.py +++ b/rare/components/tabs/settings/widgets/launch.py @@ -50,6 +50,7 @@ def __init__(self, rcore: RareCore, wrapper_widget: type[WrapperSettings], paren font.setItalic(True) self.prelaunch_check = QCheckBox(self.tr('Wait for the pre-launch command to finish before launching the game')) + self.prelaunch_check.setObjectName('InfoLabel') self.prelaunch_check.setFont(font) self.prelaunch_check.checkStateChanged.connect(self._prelauch_check_changed) @@ -68,6 +69,7 @@ def __init__(self, rcore: RareCore, wrapper_widget: type[WrapperSettings], paren self.lgd_wrapper = QCheckBox( self.tr('Use "EpicGamesLauncher.exe" shim for compatibility with third-party launchers (Rockstar etc.)') ) + self.lgd_wrapper.setObjectName('InfoLabel') self.lgd_wrapper.setFont(font) self.lgd_wrapper.checkStateChanged.connect(self._lgd_wrapper_check_changed) diff --git a/rare/components/tabs/settings/widgets/runner.py b/rare/components/tabs/settings/widgets/runner.py index 571388fdb..005f19a3f 100644 --- a/rare/components/tabs/settings/widgets/runner.py +++ b/rare/components/tabs/settings/widgets/runner.py @@ -66,6 +66,7 @@ def __init__( font = self.font() font.setItalic(True) self.shader_cache_check = QCheckBox(self.tr('Use game-specific shader cache directory'), self) + self.shader_cache_check.setObjectName('InfoLabel') self.shader_cache_check.setFont(font) self.shader_cache_check.setChecked(self.settings.get_value(app_settings.local_shader_cache)) self.shader_cache_check.checkStateChanged.connect(self._shader_cache_check_changed) From 8a53253c2766c1df5cd42c14abf514f77f493e7d Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 11 Aug 2026 21:59:13 +0300 Subject: [PATCH 08/16] CloudSync: Implement the widgets fully instead of using designer files --- rare/commands/launcher/__init__.py | 53 +++--- .../{cloud_sync_dialog.py => cloud_dialog.py} | 40 ++--- .../tabs/library/details/__init__.py | 2 +- .../details/{cloud_saves.py => cloud.py} | 53 +++--- rare/resources/static_css/stylesheet.py | 2 +- rare/shared/workers/__init__.py | 2 +- .../workers/{cloud_sync.py => cloud.py} | 0 .../tabs/library/details/cloud_sync_widget.py | 113 ------------- .../tabs/library/details/cloud_sync_widget.ui | 155 ------------------ rare/widgets/cloudsync_widget.py | 59 +++++++ 10 files changed, 140 insertions(+), 339 deletions(-) rename rare/commands/launcher/{cloud_sync_dialog.py => cloud_dialog.py} (67%) rename rare/components/tabs/library/details/{cloud_saves.py => cloud.py} (86%) rename rare/shared/workers/{cloud_sync.py => cloud.py} (100%) delete mode 100644 rare/ui/components/tabs/library/details/cloud_sync_widget.py delete mode 100644 rare/ui/components/tabs/library/details/cloud_sync_widget.ui create mode 100644 rare/widgets/cloudsync_widget.py diff --git a/rare/commands/launcher/__init__.py b/rare/commands/launcher/__init__.py index c35e20927..a560957d3 100644 --- a/rare/commands/launcher/__init__.py +++ b/rare/commands/launcher/__init__.py @@ -31,11 +31,11 @@ from rare.lgndr.core import LegendaryCore from rare.models.game_slim import RareGameSlim from rare.models.launcher import Actions, BaseModel, ErrorModel, FinishedModel, StateChangedModel -from rare.shared.workers.cloud_sync import CloudSyncWorker +from rare.shared.workers.cloud import CloudSyncWorker from rare.utils.paths import get_rare_executable from rare.widgets.rare_app import RareApp, RareAppException -from .cloud_sync_dialog import CloudSyncDialog, CloudSyncDialogResult +from .cloud_dialog import CloudSyncDialog, CloudSyncDialogResult from .console_dialog import ConsoleDialog from .lgd_helper import InitParams, LaunchParams, dict_to_qprocenv, get_configured_qprocess, get_launch_params @@ -122,7 +122,7 @@ def __init__(self, core: LegendaryCore, rgame: RareGameSlim): def run(self) -> None: try: self.rgame.update_saves() - except Exception as e: + except Exception as e: # noqa: BLE001 self.signals.error_occurred.emit(str(e)) return self.signals.sync_state_ready.emit() @@ -203,16 +203,28 @@ def __init__(self, args: InitParams): @Slot(QProcess.ProcessState) def _on_game_process_changed(self, state: QProcess.ProcessState): + if not self.console: + return self.console.kill_button.setEnabled(state == QProcess.ProcessState.Running) self.console.terminate_button.setEnabled(state == QProcess.ProcessState.Running) @Slot() def _proc_log_stdout(self): - self.console.log_stdout(self.game_process.readAllStandardOutput().data().decode('utf-8', 'ignore')) + if not self.console: + return + data = self.game_process.readAllStandardOutput().data() + if isinstance(data, memoryview): + data = data.tobytes() + self.console.log_stdout(data.decode('utf-8', 'ignore')) @Slot() def _proc_log_stderr(self): - self.console.log_stderr(self.game_process.readAllStandardError().data().decode('utf-8', 'ignore')) + if not self.console: + return + data = self.game_process.readAllStandardError().data() + if isinstance(data, memoryview): + data = data.tobytes() + self.console.log_stderr(data.decode('utf-8', 'ignore')) @Slot() def _proc_term(self): @@ -233,20 +245,21 @@ def new_server_connection(self): with contextlib.suppress(RuntimeError): self.socket.disconnectFromServer() self.logger.info('New connection') - self.socket = self.server.nextPendingConnection() - self.socket.disconnected.connect(self.socket_disconnected) - self.socket.flush() + socket = self.server.nextPendingConnection() + socket.disconnected.connect(self.socket_disconnected) + socket.flush() + self.socket = socket def socket_disconnected(self): self.logger.info('Server disconnected') self.socket = None def send_message(self, message: BaseModel): - if self.socket: - self.socket.write(json.dumps(vars(message)).encode('utf-8')) - self.socket.flush() - else: + if not self.socket: self.logger.error("Can't send message") + return + self.socket.write(json.dumps(vars(message)).encode('utf-8')) + self.socket.flush() def check_saves(self, exit_code: int): # self.rgame.signals.widget.refresh.connect(lambda: self.on_exit(exit_code)) @@ -258,12 +271,13 @@ def check_saves(self, exit_code: int): action = CloudSyncDialogResult.UPLOAD self.check_saves_finished(exit_code, action) else: - self.sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote) + sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote) # self.sync_dialog.result_ready.connect( # lambda a: self.__check_saves_finished(exit_code, a) # ) - self.sync_dialog.result_ready.connect((lambda obj, a: obj.check_saves_finished(exit_code, a)).__get__(self)) - self.sync_dialog.open() + sync_dialog.result_ready.connect((lambda obj, a: obj.check_saves_finished(exit_code, a)).__get__(self)) + sync_dialog.open() + self.sync_dialog = sync_dialog @Slot(int, int) @Slot(int, CloudSyncDialogResult) @@ -427,9 +441,10 @@ def sync_ready(self): return _, (dt_local, dt_remote) = self.rgame.save_game_state - self.sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote) - self.sync_dialog.result_ready.connect(self.__sync_ready) - self.sync_dialog.open() + sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote) + sync_dialog.result_ready.connect(self.__sync_ready) + sync_dialog.open() + self.sync_dialog = sync_dialog @Slot(int) @Slot(CloudSyncDialogResult) @@ -534,7 +549,7 @@ def signal_handler(sig, frame): try: exit_code = app.exec() - except Exception as e: + except Exception as e: # noqa: BLE001 app.logger.error('Unhandled error %s', e) exit_code = 1 finally: diff --git a/rare/commands/launcher/cloud_sync_dialog.py b/rare/commands/launcher/cloud_dialog.py similarity index 67% rename from rare/commands/launcher/cloud_sync_dialog.py rename to rare/commands/launcher/cloud_dialog.py index 2a6d3510d..98854ff5e 100644 --- a/rare/commands/launcher/cloud_sync_dialog.py +++ b/rare/commands/launcher/cloud_dialog.py @@ -1,15 +1,15 @@ import sys -from datetime import datetime +from datetime import datetime, timezone from enum import IntEnum from logging import getLogger from legendary.models.game import InstalledGame from PySide6.QtCore import Signal, Slot -from PySide6.QtWidgets import QApplication, QDialog, QLabel, QVBoxLayout, QWidget +from PySide6.QtWidgets import QApplication, QDialog, QLabel, QVBoxLayout from rare.lgndr.core import LegendaryCore -from rare.ui.components.tabs.library.details.cloud_sync_widget import Ui_CloudSyncWidget from rare.utils.misc import qta_icon +from rare.widgets.cloudsync_widget import CloudSyncWidget from rare.widgets.dialogs import ButtonDialog, game_title logger = getLogger('CloudSyncDialog') @@ -25,16 +25,16 @@ class CloudSyncDialogResult(IntEnum): class CloudSyncDialog(ButtonDialog): result_ready: Signal = Signal(CloudSyncDialogResult) - def __init__(self, igame: InstalledGame, dt_local: datetime, dt_remote: datetime, parent=None): + def __init__(self, igame: InstalledGame, dt_local: datetime | None, dt_remote: datetime | None, parent=None): super(CloudSyncDialog, self).__init__(parent=parent) header = self.tr('Cloud saves for') self.setWindowTitle(game_title(header, igame.title)) title_label = QLabel(f'

{game_title(header, igame.title)}

', self) - sync_widget = QWidget(self) - self.sync_ui = Ui_CloudSyncWidget() - self.sync_ui.setupUi(sync_widget) + sync_widget = CloudSyncWidget(self) + sync_widget.uploadClicked.connect(self._on_upload) + sync_widget.downloadClicked.connect(self._on_download) layout = QVBoxLayout() layout.addWidget(title_label) @@ -49,8 +49,8 @@ def __init__(self, igame: InstalledGame, dt_local: datetime, dt_remote: datetime newer = self.tr('Newer') if dt_remote and dt_local: - self.sync_ui.age_label_local.setText(f'{newer}' if dt_remote < dt_local else ' ') - self.sync_ui.age_label_remote.setText(f'{newer}' if dt_remote > dt_local else ' ') + sync_widget.local.age_label.setText(f'{newer}' if dt_remote < dt_local else ' ') + sync_widget.remote.age_label.setText(f'{newer}' if dt_remote > dt_local else ' ') # Set status, if one of them is None elif dt_remote and not dt_local: self.status = CloudSyncDialogResult.DOWNLOAD @@ -60,23 +60,21 @@ def __init__(self, igame: InstalledGame, dt_local: datetime, dt_remote: datetime self.status = CloudSyncDialogResult.SKIP local_tz = datetime.now().astimezone().tzinfo - self.sync_ui.date_info_local.setText(dt_local.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_local else 'None') - self.sync_ui.date_info_remote.setText(dt_remote.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_remote else 'None') + sync_widget.local.date_label.setText(dt_local.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_local else 'None') + sync_widget.remote.date_label.setText(dt_remote.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_remote else 'None') - self.sync_ui.icon_local.setPixmap(qta_icon('mdi.harddisk', 'fa5s.desktop').pixmap(128, 128)) - self.sync_ui.icon_remote.setPixmap(qta_icon('mdi.cloud-outline', 'fa5s.cloud').pixmap(128, 128)) - - self.sync_ui.upload_button.clicked.connect(self.__on_upload) - self.sync_ui.download_button.clicked.connect(self.__on_download) + min_width = max(sync_widget.local.minimumSizeHint().width(), sync_widget.remote.minimumSizeHint().width()) + sync_widget.local.setMinimumWidth(min_width) + sync_widget.remote.setMinimumWidth(min_width) if self.status == CloudSyncDialogResult.SKIP: self.accept() - def __on_upload(self): + def _on_upload(self): self.status = CloudSyncDialogResult.UPLOAD self.done(QDialog.DialogCode.Accepted) - def __on_download(self): + def _on_download(self): self.status = CloudSyncDialogResult.DOWNLOAD self.done(QDialog.DialogCode.Accepted) @@ -98,7 +96,11 @@ def reject_handler(self): def __callback(status: int): print(repr(CloudSyncDialogResult(status))) - dlg = CloudSyncDialog(core.get_installed_list()[0], datetime.now(), datetime.strptime('2021,1', '%Y,%M')) + dlg = CloudSyncDialog( + core.get_installed_list()[0], + datetime.now(tz=timezone.utc), + datetime.strptime('2021,1', '%Y,%M').replace(tzinfo=timezone.utc) + ) dlg.result_ready.connect(__callback) dlg.open() app.exec() diff --git a/rare/components/tabs/library/details/__init__.py b/rare/components/tabs/library/details/__init__.py index dce33cfc7..1440cca92 100644 --- a/rare/components/tabs/library/details/__init__.py +++ b/rare/components/tabs/library/details/__init__.py @@ -11,7 +11,7 @@ from rare.utils.json_formatter import QJsonModel from rare.widgets.side_tab import SideTabContents, SideTabWidget -from .cloud_saves import CloudSaves +from .cloud import CloudSaves from .compat import LocalCompatSettings from .details import GameDetails from .dlcs import GameDlcs diff --git a/rare/components/tabs/library/details/cloud_saves.py b/rare/components/tabs/library/details/cloud.py similarity index 86% rename from rare/components/tabs/library/details/cloud_saves.py rename to rare/components/tabs/library/details/cloud.py index 32deac05a..ba6031a4d 100644 --- a/rare/components/tabs/library/details/cloud_saves.py +++ b/rare/components/tabs/library/details/cloud.py @@ -23,11 +23,11 @@ from rare.models.pathspec import PathSpec from rare.models.settings import RareAppSettings, app_settings from rare.shared import RareCore -from rare.shared.workers.cloud_sync import CloudSyncWorker +from rare.shared.workers.cloud import CloudSyncWorker from rare.shared.workers.wine_resolver import WineSavePathResolver -from rare.ui.components.tabs.library.details.cloud_sync_widget import Ui_CloudSyncWidget from rare.utils.metrics import timelogger from rare.utils.misc import qta_icon +from rare.widgets.cloudsync_widget import CloudSyncWidget from rare.widgets.indicator_edit import IndicatorReasonsCommon, PathEdit from rare.widgets.loading_widget import LoadingWidget from rare.widgets.side_tab import SideTabContents @@ -38,26 +38,13 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): super(CloudSaves, self).__init__(parent=parent) self.logger = getLogger(type(self).__name__) - self.sync_widget = QWidget(self) - self.sync_ui = Ui_CloudSyncWidget() - self.sync_ui.setupUi(self.sync_widget) - - self.settings = settings - self.rcore = rcore - self.core = rcore.core() - - self.sync_ui.icon_local.setPixmap(qta_icon('mdi.harddisk', 'fa5s.desktop').pixmap(128, 128)) - self.sync_ui.icon_remote.setPixmap(qta_icon('mdi.cloud-outline', 'fa5s.cloud').pixmap(128, 128)) - - self.sync_ui.upload_button.clicked.connect(self.upload) - self.sync_ui.download_button.clicked.connect(self.download) + self.sync_widget = CloudSyncWidget(self) + self.sync_widget.uploadClicked.connect(self._on_upload) + self.sync_widget.downloadClicked.connect(self._on_download) self.loading_widget = LoadingWidget(parent=self.sync_widget) self.loading_widget.setVisible(False) - self.rgame: RareGame = None - self.save_path_spec: str = None - self.settings_widget = QGroupBox(self) self.settings_widget.setTitle(self.tr('Settings')) @@ -95,6 +82,12 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): layout.addWidget(self.info_label) layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding)) + self.settings = settings + self.rcore = rcore + self.core = rcore.core() + self.rgame: RareGame = None + self.save_path_spec: str = None + def edit_save_path(self, text: str) -> tuple[bool, str, int]: # Validate against raw_save_path (usefull when the user types the path manually) # path = os.path.normpath(text.lower()).split("/") @@ -114,13 +107,13 @@ def save_save_path(self, text: str): if text != self.rgame.save_path: self.rgame.save_path = text - def upload(self): + def _on_upload(self): self.sync_widget.setEnabled(False) self.loading_widget.setVisible(True) worker = CloudSyncWorker(self.rgame, CloudSyncWorker.Mode.UPLOAD) self.rcore.enqueue_worker(self.rgame, worker) - def download(self): + def _on_download(self): self.sync_widget.setEnabled(False) self.loading_widget.setVisible(True) worker = CloudSyncWorker(self.rgame, CloudSyncWorker.Mode.DOWNLOAD) @@ -195,10 +188,10 @@ def _update_widget(self): self.info_label.setText(info_text) self.info_label.setVisible(bool(info_text)) if not saves_ready: - self.sync_ui.date_info_local.setText('None') - self.sync_ui.age_label_local.setText('None') - self.sync_ui.date_info_remote.setText('None') - self.sync_ui.age_label_remote.setText('None') + self.sync_widget.local.date_label.setText('None') + self.sync_widget.local.age_label.setText('None') + self.sync_widget.remote.date_label.setText('None') + self.sync_widget.remote.age_label.setText('None') self.cloud_sync_check.setChecked(False) self.cloud_save_path_edit.setText('') return @@ -206,12 +199,12 @@ def _update_widget(self): status, (dt_local, dt_remote) = self.rgame.save_game_state local_tz = datetime.now().astimezone().tzinfo - self.sync_ui.date_info_local.setText(dt_local.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_local else 'None') - self.sync_ui.date_info_remote.setText(dt_remote.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_remote else 'None') + self.sync_widget.local.date_label.setText(dt_local.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_local else 'None') + self.sync_widget.remote.date_label.setText(dt_remote.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_remote else 'None') newer = self.tr('Newer') - self.sync_ui.age_label_local.setText(f'{newer}' if status == SaveGameStatus.LOCAL_NEWER else ' ') - self.sync_ui.age_label_remote.setText(f'{newer}' if status == SaveGameStatus.REMOTE_NEWER else ' ') + self.sync_widget.local.age_label.setText(f'{newer}' if status == SaveGameStatus.LOCAL_NEWER else ' ') + self.sync_widget.remote.age_label.setText(f'{newer}' if status == SaveGameStatus.REMOTE_NEWER else ' ') button_disabled = self.rgame.state in [ RareGame.State.RUNNING, @@ -223,8 +216,8 @@ def _update_widget(self): else: self.loading_widget.stop() - self.sync_ui.upload_button.setDisabled(not dt_local) - self.sync_ui.download_button.setDisabled(not dt_remote) + self.sync_widget.local.button.setDisabled(not dt_local) + self.sync_widget.remote.button.setDisabled(not dt_remote) self.cloud_sync_check.blockSignals(True) self.cloud_sync_check.setChecked(self.rgame.auto_sync_saves) diff --git a/rare/resources/static_css/stylesheet.py b/rare/resources/static_css/stylesheet.py index d60ca6534..c618c54c8 100644 --- a/rare/resources/static_css/stylesheet.py +++ b/rare/resources/static_css/stylesheet.py @@ -115,7 +115,7 @@ def css_name(widget: wrappertype | QObject | type, subwidget: str = ''): backgroundColor=move_color.darker(400).name(), ) -from rare.shared.workers.cloud_sync import CloudSyncWorker # noqa: E402 +from rare.shared.workers.cloud import CloudSyncWorker # noqa: E402 style.QLabel['#QueueWorkerLabel'][f'[workertype="{widget_object_name(CloudSyncWorker, "")}"]'].setValues( borderColor=cloud_sync_color.darker(200).name(), diff --git a/rare/shared/workers/__init__.py b/rare/shared/workers/__init__.py index d77ae5764..8bfd5b728 100644 --- a/rare/shared/workers/__init__.py +++ b/rare/shared/workers/__init__.py @@ -1,4 +1,4 @@ -from .cloud_sync import CloudSyncWorker +from .cloud import CloudSyncWorker from .fetch import FetchWorker, GamesDlcsWorker from .install import InstallInfoWorker from .move import MoveInfoWorker, MoveWorker diff --git a/rare/shared/workers/cloud_sync.py b/rare/shared/workers/cloud.py similarity index 100% rename from rare/shared/workers/cloud_sync.py rename to rare/shared/workers/cloud.py diff --git a/rare/ui/components/tabs/library/details/cloud_sync_widget.py b/rare/ui/components/tabs/library/details/cloud_sync_widget.py deleted file mode 100644 index 1b8553306..000000000 --- a/rare/ui/components/tabs/library/details/cloud_sync_widget.py +++ /dev/null @@ -1,113 +0,0 @@ - -################################################################################ -## Form generated from reading UI file 'cloud_sync_widget.ui' -## -## Created by: Qt User Interface Compiler version 6.11.1 -## -## WARNING! All changes made in this file will be lost when recompiling UI file! -################################################################################ - -from PySide6.QtCore import QCoreApplication, QSize, Qt -from PySide6.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QVBoxLayout - - -class Ui_CloudSyncWidget: - def setupUi(self, CloudSyncWidget): - if not CloudSyncWidget.objectName(): - CloudSyncWidget.setObjectName("CloudSyncWidget") - CloudSyncWidget.resize(438, 137) - sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(CloudSyncWidget.sizePolicy().hasHeightForWidth()) - CloudSyncWidget.setSizePolicy(sizePolicy) - CloudSyncWidget.setWindowTitle("SyncWidget") - self.main_layout = QHBoxLayout(CloudSyncWidget) - self.main_layout.setObjectName("main_layout") - self.main_layout.setContentsMargins(0, 0, 0, 0) - self.local_group = QGroupBox(CloudSyncWidget) - self.local_group.setObjectName("local_group") - self.local_layout = QVBoxLayout(self.local_group) - self.local_layout.setObjectName("local_layout") - self.date_info_local = QLabel(self.local_group) - self.date_info_local.setObjectName("date_info_local") - self.date_info_local.setText("") - self.date_info_local.setAlignment(Qt.AlignCenter) - - self.local_layout.addWidget(self.date_info_local) - - self.icon_local = QLabel(self.local_group) - self.icon_local.setObjectName("icon_local") - sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) - sizePolicy1.setHeightForWidth(self.icon_local.sizePolicy().hasHeightForWidth()) - self.icon_local.setSizePolicy(sizePolicy1) - self.icon_local.setText("") - self.icon_local.setAlignment(Qt.AlignCenter) - - self.local_layout.addWidget(self.icon_local) - - self.age_label_local = QLabel(self.local_group) - self.age_label_local.setObjectName("age_label_local") - self.age_label_local.setAlignment(Qt.AlignCenter) - - self.local_layout.addWidget(self.age_label_local) - - self.upload_button = QPushButton(self.local_group) - self.upload_button.setObjectName("upload_button") - self.upload_button.setMinimumSize(QSize(192, 0)) - - self.local_layout.addWidget(self.upload_button) - - - self.main_layout.addWidget(self.local_group) - - self.cloud_group = QGroupBox(CloudSyncWidget) - self.cloud_group.setObjectName("cloud_group") - self.cloud_layout = QVBoxLayout(self.cloud_group) - self.cloud_layout.setObjectName("cloud_layout") - self.date_info_remote = QLabel(self.cloud_group) - self.date_info_remote.setObjectName("date_info_remote") - self.date_info_remote.setText("") - self.date_info_remote.setAlignment(Qt.AlignCenter) - - self.cloud_layout.addWidget(self.date_info_remote) - - self.icon_remote = QLabel(self.cloud_group) - self.icon_remote.setObjectName("icon_remote") - sizePolicy1.setHeightForWidth(self.icon_remote.sizePolicy().hasHeightForWidth()) - self.icon_remote.setSizePolicy(sizePolicy1) - self.icon_remote.setText("") - self.icon_remote.setAlignment(Qt.AlignCenter) - - self.cloud_layout.addWidget(self.icon_remote) - - self.age_label_remote = QLabel(self.cloud_group) - self.age_label_remote.setObjectName("age_label_remote") - self.age_label_remote.setText("") - self.age_label_remote.setAlignment(Qt.AlignCenter) - - self.cloud_layout.addWidget(self.age_label_remote) - - self.download_button = QPushButton(self.cloud_group) - self.download_button.setObjectName("download_button") - self.download_button.setMinimumSize(QSize(192, 0)) - - self.cloud_layout.addWidget(self.download_button) - - - self.main_layout.addWidget(self.cloud_group) - - - self.retranslateUi(CloudSyncWidget) - # setupUi - - def retranslateUi(self, CloudSyncWidget): - self.local_group.setTitle(QCoreApplication.translate("CloudSyncWidget", "Local", None)) - self.age_label_local.setText("") - self.upload_button.setText(QCoreApplication.translate("CloudSyncWidget", "Upload", None)) - self.cloud_group.setTitle(QCoreApplication.translate("CloudSyncWidget", "Cloud", None)) - self.download_button.setText(QCoreApplication.translate("CloudSyncWidget", "Download", None)) - # retranslateUi - diff --git a/rare/ui/components/tabs/library/details/cloud_sync_widget.ui b/rare/ui/components/tabs/library/details/cloud_sync_widget.ui deleted file mode 100644 index 72c1d9105..000000000 --- a/rare/ui/components/tabs/library/details/cloud_sync_widget.ui +++ /dev/null @@ -1,155 +0,0 @@ - - - CloudSyncWidget - - - - 0 - 0 - 438 - 137 - - - - - 0 - 0 - - - - SyncWidget - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Local - - - - - - - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - - 192 - 0 - - - - Upload - - - - - - - - - - Cloud - - - - - - - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - - 192 - 0 - - - - Download - - - - - - - - - - - diff --git a/rare/widgets/cloudsync_widget.py b/rare/widgets/cloudsync_widget.py new file mode 100644 index 000000000..9c7ea3405 --- /dev/null +++ b/rare/widgets/cloudsync_widget.py @@ -0,0 +1,59 @@ +# from logging import getLogger + +from PySide6.QtCore import Qt, Signal +from PySide6.QtGui import QPixmap, QResizeEvent +from PySide6.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget + +from rare.utils.misc import qta_icon + + +class CloudSyncItemWidget(QGroupBox): + buttonClicked = Signal() + + def __init__(self, title: str, icon: QPixmap, text: str, parent=None): + super(CloudSyncItemWidget, self).__init__(title, parent=parent) + # self.logger = getLogger(type(self).__name__) + + self.date_label = QLabel(self) + self.date_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.icon_label = QLabel(self) + self.icon_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.icon_label.setPixmap(icon) + self.age_label = QLabel(self) + self.age_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.button = QPushButton(text, self) + self.button.clicked.connect(self.buttonClicked) + + layout = QVBoxLayout(self) + layout.addWidget(self.date_label) + layout.addWidget(self.icon_label) + layout.addWidget(self.age_label) + layout.addWidget(self.button) + + +class CloudSyncWidget(QWidget): + uploadClicked = Signal() + downloadClicked = Signal() + + def __init__(self, parent=None): + super(CloudSyncWidget, self).__init__(parent=parent) + # self.logger = getLogger(type(self).__name__) + + self.local = CloudSyncItemWidget( + self.tr('Local'), + qta_icon('mdi.harddisk', 'fa5s.desktop').pixmap(128, 128), + self.tr('Upload'), + ) + self.local.buttonClicked.connect(self.uploadClicked) + + self.remote = CloudSyncItemWidget( + self.tr('Remote'), + qta_icon('mdi.cloud-outline', 'fa5s.cloud').pixmap(128, 128), + self.tr('Download'), + ) + self.remote.buttonClicked.connect(self.downloadClicked) + + layout = QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(self.local, stretch=2) + layout.addWidget(self.remote, stretch=2) From f5b1e423eb86b67e4d860ab951329c1adb6850aa Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Wed, 12 Aug 2026 01:44:45 +0300 Subject: [PATCH 09/16] CloudSyncWidget: handle updating the information on the widget internally --- rare/commands/launcher/__init__.py | 10 ++++----- rare/commands/launcher/cloud_dialog.py | 22 ++++++++----------- rare/components/tabs/library/details/cloud.py | 13 +---------- rare/widgets/cloudsync_widget.py | 20 ++++++++++++++++- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/rare/commands/launcher/__init__.py b/rare/commands/launcher/__init__.py index a560957d3..6e198d8c2 100644 --- a/rare/commands/launcher/__init__.py +++ b/rare/commands/launcher/__init__.py @@ -265,13 +265,13 @@ def check_saves(self, exit_code: int): # self.rgame.signals.widget.refresh.connect(lambda: self.on_exit(exit_code)) self.rgame.signals.widget.refresh.connect((lambda obj: obj.on_exit(exit_code)).__get__(self)) - state, (dt_local, dt_remote) = self.rgame.save_game_state + status, (dt_local, dt_remote) = self.rgame.save_game_state - if state == SaveGameStatus.LOCAL_NEWER and not self.no_sync_on_exit: + if status == SaveGameStatus.LOCAL_NEWER and not self.no_sync_on_exit: action = CloudSyncDialogResult.UPLOAD self.check_saves_finished(exit_code, action) else: - sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote) + sync_dialog = CloudSyncDialog(self.rgame.igame, status, dt_local, dt_remote) # self.sync_dialog.result_ready.connect( # lambda a: self.__check_saves_finished(exit_code, a) # ) @@ -440,8 +440,8 @@ def sync_ready(self): self.start_prepare() return - _, (dt_local, dt_remote) = self.rgame.save_game_state - sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote) + status, (dt_local, dt_remote) = self.rgame.save_game_state + sync_dialog = CloudSyncDialog(self.rgame.igame, status, dt_local, dt_remote) sync_dialog.result_ready.connect(self.__sync_ready) sync_dialog.open() self.sync_dialog = sync_dialog diff --git a/rare/commands/launcher/cloud_dialog.py b/rare/commands/launcher/cloud_dialog.py index 98854ff5e..0baabc821 100644 --- a/rare/commands/launcher/cloud_dialog.py +++ b/rare/commands/launcher/cloud_dialog.py @@ -3,7 +3,7 @@ from enum import IntEnum from logging import getLogger -from legendary.models.game import InstalledGame +from legendary.models.game import InstalledGame, SaveGameStatus from PySide6.QtCore import Signal, Slot from PySide6.QtWidgets import QApplication, QDialog, QLabel, QVBoxLayout @@ -25,7 +25,7 @@ class CloudSyncDialogResult(IntEnum): class CloudSyncDialog(ButtonDialog): result_ready: Signal = Signal(CloudSyncDialogResult) - def __init__(self, igame: InstalledGame, dt_local: datetime | None, dt_remote: datetime | None, parent=None): + def __init__(self, igame: InstalledGame, status: SaveGameStatus, dt_local: datetime | None, dt_remote: datetime | None, parent=None): super(CloudSyncDialog, self).__init__(parent=parent) header = self.tr('Cloud saves for') self.setWindowTitle(game_title(header, igame.title)) @@ -33,9 +33,14 @@ def __init__(self, igame: InstalledGame, dt_local: datetime | None, dt_remote: d title_label = QLabel(f'

{game_title(header, igame.title)}

', self) sync_widget = CloudSyncWidget(self) + sync_widget.update_widget(status, dt_local, dt_remote) sync_widget.uploadClicked.connect(self._on_upload) sync_widget.downloadClicked.connect(self._on_download) + min_width = max(sync_widget.local.minimumSizeHint().width(), sync_widget.remote.minimumSizeHint().width()) + sync_widget.local.setMinimumWidth(min_width) + sync_widget.remote.setMinimumWidth(min_width) + layout = QVBoxLayout() layout.addWidget(title_label) layout.addWidget(sync_widget) @@ -47,10 +52,8 @@ def __init__(self, igame: InstalledGame, dt_local: datetime | None, dt_remote: d self.status = CloudSyncDialogResult.CANCEL - newer = self.tr('Newer') if dt_remote and dt_local: - sync_widget.local.age_label.setText(f'{newer}' if dt_remote < dt_local else ' ') - sync_widget.remote.age_label.setText(f'{newer}' if dt_remote > dt_local else ' ') + pass # Set status, if one of them is None elif dt_remote and not dt_local: self.status = CloudSyncDialogResult.DOWNLOAD @@ -59,14 +62,6 @@ def __init__(self, igame: InstalledGame, dt_local: datetime | None, dt_remote: d else: self.status = CloudSyncDialogResult.SKIP - local_tz = datetime.now().astimezone().tzinfo - sync_widget.local.date_label.setText(dt_local.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_local else 'None') - sync_widget.remote.date_label.setText(dt_remote.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_remote else 'None') - - min_width = max(sync_widget.local.minimumSizeHint().width(), sync_widget.remote.minimumSizeHint().width()) - sync_widget.local.setMinimumWidth(min_width) - sync_widget.remote.setMinimumWidth(min_width) - if self.status == CloudSyncDialogResult.SKIP: self.accept() @@ -98,6 +93,7 @@ def __callback(status: int): dlg = CloudSyncDialog( core.get_installed_list()[0], + SaveGameStatus.LOCAL_NEWER, datetime.now(tz=timezone.utc), datetime.strptime('2021,1', '%Y,%M').replace(tzinfo=timezone.utc) ) diff --git a/rare/components/tabs/library/details/cloud.py b/rare/components/tabs/library/details/cloud.py index ba6031a4d..4adc77488 100644 --- a/rare/components/tabs/library/details/cloud.py +++ b/rare/components/tabs/library/details/cloud.py @@ -197,15 +197,7 @@ def _update_widget(self): return status, (dt_local, dt_remote) = self.rgame.save_game_state - - local_tz = datetime.now().astimezone().tzinfo - self.sync_widget.local.date_label.setText(dt_local.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_local else 'None') - self.sync_widget.remote.date_label.setText(dt_remote.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_remote else 'None') - - newer = self.tr('Newer') - self.sync_widget.local.age_label.setText(f'{newer}' if status == SaveGameStatus.LOCAL_NEWER else ' ') - self.sync_widget.remote.age_label.setText(f'{newer}' if status == SaveGameStatus.REMOTE_NEWER else ' ') - + self.sync_widget.update_widget(status, dt_local, dt_remote) button_disabled = self.rgame.state in [ RareGame.State.RUNNING, RareGame.State.SYNCING, @@ -216,9 +208,6 @@ def _update_widget(self): else: self.loading_widget.stop() - self.sync_widget.local.button.setDisabled(not dt_local) - self.sync_widget.remote.button.setDisabled(not dt_remote) - self.cloud_sync_check.blockSignals(True) self.cloud_sync_check.setChecked(self.rgame.auto_sync_saves) self.cloud_sync_check.blockSignals(False) diff --git a/rare/widgets/cloudsync_widget.py b/rare/widgets/cloudsync_widget.py index 9c7ea3405..a82610ba7 100644 --- a/rare/widgets/cloudsync_widget.py +++ b/rare/widgets/cloudsync_widget.py @@ -1,7 +1,9 @@ # from logging import getLogger +from datetime import datetime +from legendary.models.game import SaveGameStatus from PySide6.QtCore import Qt, Signal -from PySide6.QtGui import QPixmap, QResizeEvent +from PySide6.QtGui import QPixmap from PySide6.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget from rare.utils.misc import qta_icon @@ -57,3 +59,19 @@ def __init__(self, parent=None): layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.local, stretch=2) layout.addWidget(self.remote, stretch=2) + + def update_widget(self, status: SaveGameStatus, dt_local: datetime | None, dt_remote: datetime | None): + local_tz = datetime.now().astimezone().tzinfo + self.local.date_label.setText( + dt_local.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_local else 'None' + ) + self.remote.date_label.setText( + dt_remote.astimezone(local_tz).strftime('%A, %d %B %Y %X') if dt_remote else 'None' + ) + + newer = self.tr('Newer') + self.local.age_label.setText(f'{newer}' if status == SaveGameStatus.LOCAL_NEWER else ' ') + self.remote.age_label.setText(f'{newer}' if status == SaveGameStatus.REMOTE_NEWER else ' ') + + self.local.button.setDisabled(not dt_local) + self.remote.button.setDisabled(not dt_remote) From 244aa01f8f1bea9f887400da0f8ba6ff040a4c88 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Wed, 12 Aug 2026 04:57:08 +0300 Subject: [PATCH 10/16] LoadingWidget: control playback based on widget visibility --- rare/commands/launcher/cloud_dialog.py | 4 +-- .../tabs/integrations/ubisoft_group.py | 9 +++--- rare/components/tabs/library/details/cloud.py | 7 ++-- rare/components/tabs/store/widgets/groups.py | 7 ++-- rare/widgets/cloudsync_widget.py | 12 +++---- rare/widgets/dialogs.py | 32 +++++++++++-------- rare/widgets/image_widget.py | 7 ++-- rare/widgets/loading_widget.py | 30 +++++++++-------- 8 files changed, 53 insertions(+), 55 deletions(-) diff --git a/rare/commands/launcher/cloud_dialog.py b/rare/commands/launcher/cloud_dialog.py index 0baabc821..86f7ff667 100644 --- a/rare/commands/launcher/cloud_dialog.py +++ b/rare/commands/launcher/cloud_dialog.py @@ -34,8 +34,8 @@ def __init__(self, igame: InstalledGame, status: SaveGameStatus, dt_local: datet sync_widget = CloudSyncWidget(self) sync_widget.update_widget(status, dt_local, dt_remote) - sync_widget.uploadClicked.connect(self._on_upload) - sync_widget.downloadClicked.connect(self._on_download) + sync_widget.upload_clicked.connect(self._on_upload) + sync_widget.download_clicked.connect(self._on_download) min_width = max(sync_widget.local.minimumSizeHint().width(), sync_widget.remote.minimumSizeHint().width()) sync_widget.local.setMinimumWidth(min_width) diff --git a/rare/components/tabs/integrations/ubisoft_group.py b/rare/components/tabs/integrations/ubisoft_group.py index 9bcec2121..a64daee56 100644 --- a/rare/components/tabs/integrations/ubisoft_group.py +++ b/rare/components/tabs/integrations/ubisoft_group.py @@ -160,7 +160,7 @@ def __init__(self, rcore: RareCore, parent=None): self.setTitle(self.tr('Link Ubisoft Games')) self.thread_pool = QThreadPool.globalInstance() - self.worker: UbiGetInfoWorker = None + self.worker: UbiGetInfoWorker | None = None self.info_label = QLabel(parent=self) self.info_label.setText(self.tr('Getting information about your redeemable Ubisoft games.')) @@ -169,8 +169,7 @@ def __init__(self, rcore: RareCore, parent=None): self.link_button.clicked.connect(self._on_link_clicked) self.link_button.setEnabled(False) - self.loading_widget = LoadingWidget(self) - self.loading_widget.stop() + self.loading_widget = LoadingWidget(parent=self) header_layout = QHBoxLayout() header_layout.addWidget(self.info_label, stretch=1) @@ -194,7 +193,7 @@ def showEvent(self, a0: QShowEvent) -> None: for widget in self.findChildren(UbiLinkWidget, options=Qt.FindChildOption.FindDirectChildrenOnly): widget.disconnect(widget) widget.deleteLater() - self.loading_widget.start() + self.loading_widget.setVisible(True) self.worker = UbiGetInfoWorker(self.core) self.worker.signals.result.connect(self._on_result) @@ -204,7 +203,7 @@ def showEvent(self, a0: QShowEvent) -> None: @Slot(set, set, str) def _on_result(self, redeemed: set, entitlements: set, ubi_account_id: str): self.worker = None - self.loading_widget.stop() + self.loading_widget.setVisible(False) if not redeemed and ubi_account_id != 'error': self.logger.error('No linked ubisoft account found! Link your accounts via your browser and try again.') self.info_label.setText(self.tr('Your account is not linked with Ubisoft. Please link your account and try again.')) diff --git a/rare/components/tabs/library/details/cloud.py b/rare/components/tabs/library/details/cloud.py index 4adc77488..ec8c4234c 100644 --- a/rare/components/tabs/library/details/cloud.py +++ b/rare/components/tabs/library/details/cloud.py @@ -1,9 +1,7 @@ import os import platform -from datetime import datetime from logging import getLogger -from legendary.models.game import SaveGameStatus from PySide6.QtCore import Qt, QThreadPool, Slot from PySide6.QtWidgets import ( QCheckBox, @@ -39,11 +37,10 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): self.logger = getLogger(type(self).__name__) self.sync_widget = CloudSyncWidget(self) - self.sync_widget.uploadClicked.connect(self._on_upload) - self.sync_widget.downloadClicked.connect(self._on_download) + self.sync_widget.upload_clicked.connect(self._on_upload) + self.sync_widget.download_clicked.connect(self._on_download) self.loading_widget = LoadingWidget(parent=self.sync_widget) - self.loading_widget.setVisible(False) self.settings_widget = QGroupBox(self) self.settings_widget.setTitle(self.tr('Settings')) diff --git a/rare/components/tabs/store/widgets/groups.py b/rare/components/tabs/store/widgets/groups.py index ba4227b9e..ad6994c1e 100644 --- a/rare/components/tabs/store/widgets/groups.py +++ b/rare/components/tabs/store/widgets/groups.py @@ -8,10 +8,7 @@ def __init__(self, title: str, layout: type[QLayout], parent=None): super().__init__(parent=parent) self.setTitle(title) self.main_layout = layout(self) - self.loading_widget = LoadingWidget(autostart=True, parent=self) + self.loading_widget = LoadingWidget(True, parent=self) def loading(self, state: bool) -> None: - if state: - self.loading_widget.start() - else: - self.loading_widget.stop() + self.loading_widget.setVisible(state) diff --git a/rare/widgets/cloudsync_widget.py b/rare/widgets/cloudsync_widget.py index a82610ba7..b4774a043 100644 --- a/rare/widgets/cloudsync_widget.py +++ b/rare/widgets/cloudsync_widget.py @@ -10,7 +10,7 @@ class CloudSyncItemWidget(QGroupBox): - buttonClicked = Signal() + button_clicked = Signal() def __init__(self, title: str, icon: QPixmap, text: str, parent=None): super(CloudSyncItemWidget, self).__init__(title, parent=parent) @@ -24,7 +24,7 @@ def __init__(self, title: str, icon: QPixmap, text: str, parent=None): self.age_label = QLabel(self) self.age_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.button = QPushButton(text, self) - self.button.clicked.connect(self.buttonClicked) + self.button.clicked.connect(self.button_clicked) layout = QVBoxLayout(self) layout.addWidget(self.date_label) @@ -34,8 +34,8 @@ def __init__(self, title: str, icon: QPixmap, text: str, parent=None): class CloudSyncWidget(QWidget): - uploadClicked = Signal() - downloadClicked = Signal() + upload_clicked = Signal() + download_clicked = Signal() def __init__(self, parent=None): super(CloudSyncWidget, self).__init__(parent=parent) @@ -46,14 +46,14 @@ def __init__(self, parent=None): qta_icon('mdi.harddisk', 'fa5s.desktop').pixmap(128, 128), self.tr('Upload'), ) - self.local.buttonClicked.connect(self.uploadClicked) + self.local.button_clicked.connect(self.upload_clicked) self.remote = CloudSyncItemWidget( self.tr('Remote'), qta_icon('mdi.cloud-outline', 'fa5s.cloud').pixmap(128, 128), self.tr('Download'), ) - self.remote.buttonClicked.connect(self.downloadClicked) + self.remote.button_clicked.connect(self.download_clicked) layout = QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) diff --git a/rare/widgets/dialogs.py b/rare/widgets/dialogs.py index 4bca2b4df..804164257 100644 --- a/rare/widgets/dialogs.py +++ b/rare/widgets/dialogs.py @@ -19,6 +19,7 @@ ) from rare.utils.misc import qta_icon +from rare.widgets.loading_widget import LoadingWidget def game_title(text: str, app_title: str) -> str: @@ -38,7 +39,7 @@ def __init__(self, parent=None): self.logger = getLogger(type(self).__name__) - def setWindowTitle(self, a0): + def setWindowTitle(self, a0: str): super().setWindowTitle(dialog_title(a0)) def exec(self): @@ -111,8 +112,8 @@ def __init__(self, parent=None): self.main_layout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize) self.main_layout.setAlignment(Qt.AlignmentFlag.AlignVCenter) - self.__central_widget: QWidget = None - self.__central_layout: QLayout = None + self._central_widget: QWidget = None + self._central_layout: QLayout = None def close(self): raise RuntimeError(f"Don't use `close()` with {type(self).__name__}") @@ -125,19 +126,19 @@ def setCentralWidget(self, widget: QWidget): widget.layout().setContentsMargins(0, 0, 0, 0) self.main_layout.insertWidget(self.main_layout.indexOf(self.subtitle_label) + 1, widget) widget.layout().setAlignment(Qt.AlignmentFlag.AlignTop) - self.__central_widget = widget + self._central_widget = widget def centralWidget(self) -> QWidget: - return self.__central_widget + return self._central_widget def setCentralLayout(self, layout: QLayout): layout.setContentsMargins(0, 0, 0, 0) self.main_layout.insertLayout(self.main_layout.indexOf(self.subtitle_label) + 1, layout) layout.setAlignment(Qt.AlignmentFlag.AlignTop) - self.__central_layout = layout + self._central_layout = layout def centralLayout(self) -> QLayout: - return self.__central_layout + return self._central_layout @abstractmethod def accept_handler(self): @@ -165,7 +166,7 @@ def reject(self): super().reject() # lk: Override `done()` to to run our abstract handling method - def done(self, a0): + def done(self, a0: int): self.done_handler() super().done(a0) @@ -183,7 +184,9 @@ def closeEvent(self, a0: QCloseEvent) -> None: class ActionDialog(ButtonDialog): def __init__(self, parent=None): super(ActionDialog, self).__init__(parent=parent) - self.__reject_close = False + self._reject_close = False + + self.loading_widget = LoadingWidget(parent=self) self.action_button = QPushButton(self) self.action_button.setAutoDefault(True) @@ -192,7 +195,7 @@ def __init__(self, parent=None): self.button_layout.insertWidget(2, self.action_button) def active(self) -> bool: - return self.__reject_close + return self._reject_close def setActive(self, active: bool, disable: bool = True): if self.centralWidget(): @@ -200,7 +203,8 @@ def setActive(self, active: bool, disable: bool = True): self.reject_button.setDisabled(active) self.action_button.setDisabled(active) self.accept_button.setDisabled(active) - self.__reject_close = active + self.loading_widget.setVisible(active) + self._reject_close = active @abstractmethod def action_handler(self): @@ -213,14 +217,14 @@ def action(self): # lk: Ignore all key presses if there is an ongoing action def keyPressEvent(self, a0: QKeyEvent) -> None: - if self.__reject_close: + if self._reject_close: a0.ignore() return super(BaseDialog, self).keyPressEvent(a0) # lk: Ignore all closeEvents if there is an ongoing action def closeEvent(self, a0: QCloseEvent) -> None: - if self.__reject_close: + if self._reject_close: a0.ignore() return super(BaseDialog, self).closeEvent(a0) @@ -262,7 +266,7 @@ def closeEvent(self, a0: QCloseEvent) -> None: print('is spontaneous') a0.ignore() return - if self.reject_close: + if self._reject_close: a0.ignore() else: self._on_close() diff --git a/rare/widgets/image_widget.py b/rare/widgets/image_widget.py index 4e0dfb0e8..a7f2ca418 100644 --- a/rare/widgets/image_widget.py +++ b/rare/widgets/image_widget.py @@ -188,11 +188,10 @@ class LoadingSpinnerImageWidget(LoadingImageWidget): def __init__(self, manager: QRequests, parent=None): super(LoadingSpinnerImageWidget, self).__init__(manager, parent=parent) self.spinner = LoadingWidget(parent=self) - self.spinner.setVisible(False) - def fetchPixmap(self, url: str, params: dict = None): + def fetchPixmap(self, url: str, params: dict | None = None): self.spinner.setFixedSize(self._image_size.size) - self.spinner.start() + self.spinner.setVisible(True) params = ( params if params else {'resize': 1, 'w': self._image_size.base.size.width(), 'h': self._image_size.base.size.height()} ) @@ -201,7 +200,7 @@ def fetchPixmap(self, url: str, params: dict = None): def _on_image_ready(self, data): super()._on_image_ready(data) if shiboken6.isValid(self.spinner): - self.spinner.stop() + self.spinner.setVisible(False) __all__ = ['ImageSize', 'ImageWidget', 'LoadingImageWidget', 'LoadingSpinnerImageWidget'] diff --git a/rare/widgets/loading_widget.py b/rare/widgets/loading_widget.py index ab61707ae..ebc5f597a 100644 --- a/rare/widgets/loading_widget.py +++ b/rare/widgets/loading_widget.py @@ -1,22 +1,21 @@ from PySide6.QtCore import QEvent, QObject, Qt from PySide6.QtGui import QMovie, QShowEvent -from PySide6.QtWidgets import QLabel +from PySide6.QtWidgets import QLabel, QWidget class LoadingWidget(QLabel): - def __init__(self, autostart=False, parent=None): + def __init__(self, autostart: bool = False, *, parent: QWidget | None = None): super(LoadingWidget, self).__init__(parent=parent) self.setObjectName(type(self).__name__) self.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter) - self.movie = QMovie(':/images/loader.webp', parent=self) # The animation's exact size is 94x94 self.setFixedSize(96, 96) - self.setMovie(self.movie) + self.setMovie(QMovie(':/images/loader.webp', parent=self)) if self.parent() is not None: self.parent().installEventFilter(self) - self.autostart = autostart + self.setVisible(autostart) - def __center_on_parent(self): + def _center_on_parent(self): rect = self.rect() rect.moveCenter(self.parent().contentsRect().center()) self.setGeometry(rect) @@ -37,25 +36,28 @@ def showEvent(self, a0: QShowEvent) -> None: if a0.spontaneous(): super().showEvent(a0) return - if self.autostart: - self.movie.start() - self.autostart = False - self.__center_on_parent() + self._center_on_parent() super().showEvent(a0) def eventFilter(self, a0: QObject, a1: QEvent) -> bool: if not isinstance(a1, QEvent): return True if a0 is self.parent() and a1.type() == QEvent.Type.Resize: - self.__center_on_parent() + self._center_on_parent() return a0.event(a1) return False + def setVisible(self, visible: bool) -> None: + super().setVisible(visible) + if visible: + self.raise_() + self.movie().start() + else: + self.lower() + self.movie().stop() + def start(self): self.setVisible(True) - if not self.autostart: - self.movie.start() def stop(self): self.setVisible(False) - self.movie.stop() From 940e7c466ec5c7dde8045e340e110eda27db33d3 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 13 Aug 2026 23:11:01 +0300 Subject: [PATCH 11/16] InstallDialog: add EULA acceptance checkbox --- rare/components/dialogs/install/dialog.py | 146 ++++++++++-------- .../dialogs/install/file_filters.py | 35 ----- rare/components/dialogs/install/selective.py | 59 +++---- rare/components/dialogs/install/widgets.py | 67 ++++++++ rare/components/dialogs/move.py | 23 +-- rare/components/dialogs/selective.py | 7 +- rare/components/tabs/downloads/__init__.py | 7 +- rare/components/tabs/downloads/widgets.py | 4 +- rare/models/game.py | 95 ++++++------ rare/models/game_slim.py | 4 +- rare/models/install.py | 52 ++++--- rare/shared/workers/__init__.py | 5 +- rare/shared/workers/install.py | 47 +++++- rare/shared/workers/worker.py | 12 +- rare/ui/components/dialogs/install/dialog.py | 92 +++++------ rare/ui/components/dialogs/install/dialog.ui | 39 +++-- rare/widgets/dialogs.py | 9 +- 17 files changed, 406 insertions(+), 297 deletions(-) delete mode 100644 rare/components/dialogs/install/file_filters.py create mode 100644 rare/components/dialogs/install/widgets.py diff --git a/rare/components/dialogs/install/dialog.py b/rare/components/dialogs/install/dialog.py index 148455fa3..6821adddc 100644 --- a/rare/components/dialogs/install/dialog.py +++ b/rare/components/dialogs/install/dialog.py @@ -2,18 +2,19 @@ import platform as pf import shutil -from PySide6.QtCore import Qt, QThreadPool, Signal, Slot +from legendary.core import LegendaryCore +from PySide6.QtCore import Qt, Signal, Slot from PySide6.QtGui import QShowEvent from PySide6.QtWidgets import QFileDialog, QFormLayout, QLabel, QWidget -from rare.models.game import RareGame +from rare.models.game import RareEosOverlay, RareGame from rare.models.install import ( InstallDownloadModel, InstallOptionsModel, InstallQueueItemModel, ) from rare.models.settings import RareAppSettings, app_settings -from rare.shared.workers import InstallInfoWorker +from rare.shared.workers import InstallDataWorker, InstallPrepareWorker from rare.ui.components.dialogs.install.dialog import Ui_InstallDialog from rare.utils.misc import format_size, qta_icon from rare.widgets.dialogs import ActionDialog, game_title @@ -21,12 +22,20 @@ from .advanced import InstallDialogAdvanced from .selective import InstallDialogSelective +from .widgets import InstallDialogEulaWidget class InstallDialog(ActionDialog): result_ready = Signal(InstallQueueItemModel) - def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: InstallOptionsModel, parent=None): + def __init__( + self, + settings: RareAppSettings, + core: LegendaryCore, + rgame: 'RareGame|RareEosOverlay', + options: InstallOptionsModel, + parent=None + ): super(InstallDialog, self).__init__(parent=parent) self.settings = settings @@ -49,39 +58,8 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal self.ui = Ui_InstallDialog() self.ui.setupUi(install_widget) - self.core = rgame.core - self.rgame = rgame - self._options: InstallOptionsModel = options - self._download: InstallDownloadModel | None = None - self._queue_item: InstallQueueItemModel | None = None - - self.selectable = InstallDialogSelective(rgame, parent=self) - self.selectable.stateChanged.connect(self._on_option_changed) - self.ui.main_layout.insertRow( - self.ui.main_layout.getWidgetPosition(self.ui.shortcut_label)[0] + 1, - # self.tr("Optional"), - self.selectable, - ) - - self.advanced = InstallDialogAdvanced(parent=self) - self.ui.main_layout.insertRow( - self.ui.main_layout.getWidgetPosition(self.ui.shortcut_label)[0] + 2, - # self.tr("Advanced"), - self.advanced, - ) - - # self.file_filters = InstallDialogFileFilters(parent=self) - # self.ui.main_layout.insertRow( - # self.ui.main_layout.getWidgetPosition(self.ui.shortcut_label)[0] + 3, - # # self.tr("Filters"), - # self.file_filters, - # ) - self.options_changed = False - self.threadpool = QThreadPool(self) - self.threadpool.setMaxThreadCount(1) - self.install_dir_edit = PathEdit( path=options.base_path, file_mode=QFileDialog.FileMode.Directory, @@ -91,11 +69,8 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal ) self.install_dir_edit.setReadOnly(True) self.install_dir_edit.validationFinished.connect(self._on_install_dir_validation) - self.ui.main_layout.setWidget( - self.ui.main_layout.getWidgetPosition(self.ui.install_dir_label)[0], - QFormLayout.ItemRole.FieldRole, - self.install_dir_edit, - ) + install_dir_edit_index, _ = self.ui.main_layout.getWidgetPosition(self.ui.install_dir_label) + self.ui.main_layout.setWidget(install_dir_edit_index, QFormLayout.ItemRole.FieldRole, self.install_dir_edit) self.install_dir_edit.setDisabled(rgame.is_installed or rgame.is_dlc) self.ui.install_dir_label.setDisabled(rgame.is_installed or rgame.is_dlc) @@ -105,14 +80,32 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal self.ui.shortcut_check.setChecked(not rgame.is_installed and self.settings.get_value(app_settings.create_shortcut)) self.ui.shortcut_check.checkStateChanged.connect(self._on_option_changed_no_reload) + eula_index, _ = self.ui.main_layout.getWidgetPosition(self.ui.eula_label) + self.eula_widget = InstallDialogEulaWidget(parent=self) + self.eula_widget.check.checkStateChanged.connect(self._on_option_changed_no_reload) + self.ui.main_layout.setWidget(eula_index, QFormLayout.ItemRole.FieldRole, self.eula_widget) + + selectable_index = eula_index + 1 + self.selectable = InstallDialogSelective(rgame, parent=self) + self.selectable.stateChanged.connect(self._on_option_changed) + self.ui.main_layout.insertRow(selectable_index, self.selectable) + + advanced_index = selectable_index + 1 + self.advanced = InstallDialogAdvanced(parent=self) + self.ui.main_layout.insertRow(advanced_index, self.advanced) + + # file_filters_index = advanced_index + 1 + # self.file_filters = InstallDialogFileFilters(parent=self) + # self.ui.main_layout.insertRow(file_filters_index, self.file_filters) + self.set_error_labels() - self.ui.platform_combo.addItems(reversed(rgame.platforms)) + self.ui.platform_combo.addItems(tuple(reversed(rgame.platforms))) self.ui.platform_combo.setCurrentIndex(self.ui.platform_combo.findText(options.platform)) self.ui.platform_combo.currentIndexChanged.connect(self._on_option_changed) self.ui.platform_combo.currentIndexChanged.connect(self.check_incompatible_platform) self.ui.platform_combo.currentIndexChanged.connect(self.reset_install_dir) - self.ui.platform_combo.currentTextChanged.connect(self.selectable.update_list) + self.ui.platform_combo.currentTextChanged.connect(self.selectable.update_widget) self.ui.platform_label.setDisabled(rgame.is_installed or rgame.is_dlc) self.ui.platform_combo.setDisabled(rgame.is_installed or rgame.is_dlc) @@ -122,10 +115,10 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal if options.repair_mode and not options.repair_and_update: self.selectable.click() - self.advanced.ui.max_workers_spin.setValue(self.core.lgd.config.getint('Legendary', 'max_workers', fallback=0)) + self.advanced.ui.max_workers_spin.setValue(core.lgd.config.getint('Legendary', 'max_workers', fallback=0)) self.advanced.ui.max_workers_spin.valueChanged.connect(self._on_option_changed) - self.advanced.ui.max_memory_spin.setValue(self.core.lgd.config.getint('Legendary', 'max_memory', fallback=0)) + self.advanced.ui.max_memory_spin.setValue(core.lgd.config.getint('Legendary', 'max_memory', fallback=0)) self.advanced.ui.max_memory_spin.valueChanged.connect(self._on_option_changed) self.advanced.ui.read_files_check.setChecked(options.read_files) @@ -145,7 +138,7 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal self.accept_button.setEnabled(False) - if self._options.overlay: + if options.overlay: self.ui.platform_label.setEnabled(False) self.ui.platform_combo.setEnabled(False) self.advanced.ui.ignore_space_label.setEnabled(False) @@ -165,7 +158,7 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal self.advanced.ui.install_prereqs_label.setEnabled(False) self.advanced.ui.install_prereqs_check.setEnabled(False) self.advanced.ui.install_prereqs_check.checkStateChanged.connect(self._on_option_changed_no_reload) - self.advanced.ui.install_prereqs_check.setChecked(self._options.install_prereqs) + self.advanced.ui.install_prereqs_check.setChecked(options.install_prereqs) # lk: set object names for CSS properties self.accept_button.setText(header) @@ -177,6 +170,12 @@ def __init__(self, settings: RareAppSettings, rgame: 'RareGame', options: Instal self.setCentralWidget(install_widget) + self.core = core + self.rgame = rgame + self._options: InstallOptionsModel = options + self._download: InstallDownloadModel | None = None + self._queue_item: InstallQueueItemModel | None = None + def showEvent(self, a0: QShowEvent) -> None: if a0.spontaneous(): return super().showEvent(a0) @@ -186,10 +185,25 @@ def showEvent(self, a0: QShowEvent) -> None: def execute(self): self.reset_install_dir(self.ui.platform_combo.currentIndex()) self.check_incompatible_platform(self.ui.platform_combo.currentIndex()) - self.selectable.update_list(self.ui.platform_combo.currentText()) - if self._options.silent: - self.get_download_info() + if not self._options.silent: + self.open() + + data_worker = InstallDataWorker(self.rgame) + data_worker.signals.result.connect(self._on_data_worker_result) + data_worker.signals.failed.connect(self._on_worker_failed) + self.threadpool.start(data_worker) + self.setActive(True) + + @Slot(dict, list) + def _on_data_worker_result(self, sdl_data: dict, eulas: list): + self.eula_widget.setup_widget(eulas) + self.selectable.setup_widget(sdl_data) + self.selectable.update_widget(self.ui.platform_combo.currentText()) + self.setActive(False) + + if self._options.silent and not self.eula_widget.pending_eulas: + self.get_download() else: self.action_handler() self.open() @@ -232,12 +246,12 @@ def get_options(self): self._options.install_tag = self.selectable.enabled_tags() self._options.reset_sdl = True - def get_download_info(self): + def get_download(self): self._download = None - info_worker = InstallInfoWorker(self.core, self._options) - info_worker.signals.result.connect(self._on_worker_result) - info_worker.signals.failed.connect(self._on_worker_failed) - self.threadpool.start(info_worker) + prepare_worker = InstallPrepareWorker(self.core, self._options) + prepare_worker.signals.result.connect(self._on_prepare_worker_result) + prepare_worker.signals.failed.connect(self._on_worker_failed) + self.threadpool.start(prepare_worker) def action_handler(self): self.set_error_labels() @@ -246,7 +260,7 @@ def action_handler(self): self.setActive(True) self.options_changed = False self.get_options() - self.get_download_info() + self.get_download() @Slot() def _on_option_changed(self): @@ -263,6 +277,8 @@ def _on_option_changed_no_reload(self, state: Qt.CheckState): self._options.create_shortcut = state != Qt.CheckState.Unchecked elif self.sender() is self.advanced.ui.install_prereqs_check: self._options.install_prereqs = state != Qt.CheckState.Unchecked + elif self.sender() is self.eula_widget.check: + self.accept_button.setEnabled(not self.options_changed and state == Qt.CheckState.Checked) @staticmethod def _install_dir_edit_callback(path: str) -> tuple[bool, str, int]: @@ -304,7 +320,7 @@ def same_platform(download: InstallDownloadModel) -> bool: return False @Slot(InstallDownloadModel) - def _on_worker_result(self, download: InstallDownloadModel): + def _on_prepare_worker_result(self, download: InstallDownloadModel): self.setActive(False) self._download = download download_size = download.analysis.dl_size @@ -312,7 +328,9 @@ def _on_worker_result(self, download: InstallDownloadModel): # install_size = self.dl_item.download.analysis.disk_space_delta self.set_size_labels(download_size, install_size) if download_size or (not download_size and (download.game.is_dlc or download.repair)): - self.accept_button.setEnabled(not self.options_changed) + self.accept_button.setEnabled( + not self.options_changed and self.eula_widget.check.checkState() == Qt.CheckState.Checked + ) self.action_button.setEnabled(self.options_changed) has_prereqs = bool(download.igame.prereq_info) and not download.igame.prereq_info.get('installed', False) if has_prereqs: @@ -327,14 +345,6 @@ def _on_worker_result(self, download: InstallDownloadModel): self.advanced.ui.install_prereqs_check.setEnabled(has_prereqs) self.advanced.ui.install_prereqs_check.setChecked(has_prereqs and self.same_platform(download)) - # TODO: there is information about the files to be downloaded in analres, don't fetch the manifest again - # TODO: see if you can re-use the one from selective downloads - # new_manifest_data, _, _ = self.core.get_cdn_manifest(download.game, download.igame.platform, self._options.disable_https) - # new_manifest = self.core.load_manifest(new_manifest_data) - # self.file_filters.clear() - # for e in new_manifest.file_manifest_list.elements: - # self.file_filters.add_item(e.filename.lower()) - if self._options.silent: self.accept() @@ -350,7 +360,7 @@ def _on_worker_failed(self, message: str): self.open() @staticmethod - def _set_size_label(label: QLabel, value: int | float | str): + def _set_size_label(label: QLabel, value: float | str): is_numeric = isinstance(value, (int, float)) font = label.font() font.setBold(is_numeric) @@ -359,7 +369,7 @@ def _set_size_label(label: QLabel, value: int | float | str): text = format_size(value) if is_numeric else value label.setText(text) - def set_size_labels(self, download: int | float | str, install: int | float | str): + def set_size_labels(self, download: float | str, install: float | str): self._set_size_label(self.ui.download_size_text, download) self._set_size_label(self.ui.install_size_text, install) @@ -376,6 +386,8 @@ def done_handler(self): # lk: _download is already set at this point so just do nothing. def accept_handler(self): + if self.eula_widget.pending_eulas: + self.rgame.accept_eulas(self.eula_widget.pending_eulas) self._queue_item = InstallQueueItemModel(options=self._options, download=self._download) def reject_handler(self): diff --git a/rare/components/dialogs/install/file_filters.py b/rare/components/dialogs/install/file_filters.py deleted file mode 100644 index e3104783c..000000000 --- a/rare/components/dialogs/install/file_filters.py +++ /dev/null @@ -1,35 +0,0 @@ -from PySide6.QtCore import Qt -from PySide6.QtGui import QFont -from PySide6.QtWidgets import QListWidgetItem, QWidget - -from rare.ui.components.dialogs.install.file_filters import Ui_InstallDialogFileFilters -from rare.widgets.collapsible_widget import CollapsibleFrame - - -class InstallDialogFileFilters(CollapsibleFrame): - def __init__(self, parent=None): - super(InstallDialogFileFilters, self).__init__(parent=parent) - - title = self.tr('File filters') - self.setTitle(title) - - self.widget = QWidget(parent=self) - self.ui = Ui_InstallDialogFileFilters() - self.ui.setupUi(self.widget) - self.setWidget(self.widget) - - # self.ui.exclude_prefix_label.setVisible(False) - # self.ui.exclude_prefix_info.setVisible(False) - # self.ui.exclude_prefix_button.setVisible(False) - - def clear(self): - self.ui.exclude_list.clear() - - def add_item(self, data: str): - li = QListWidgetItem(data, self.ui.exclude_list) - li.setFont(QFont('monospace')) - li.setCheckState(Qt.CheckState.Unchecked) - self.ui.exclude_list.addItem(li) - - -__all__ = ['InstallDialogFileFilters'] diff --git a/rare/components/dialogs/install/selective.py b/rare/components/dialogs/install/selective.py index 51fe45c32..a4f4576b6 100644 --- a/rare/components/dialogs/install/selective.py +++ b/rare/components/dialogs/install/selective.py @@ -1,50 +1,41 @@ -from logging import getLogger +# from logging import getLogger from PySide6.QtCore import Qt, Signal from PySide6.QtGui import QFont from PySide6.QtWidgets import QCheckBox, QVBoxLayout, QWidget -from rare.models.game import RareGame +from rare.models.game import RareEosOverlay, RareGame from rare.widgets.collapsible_widget import CollapsibleFrame class InstallTagCheckBox(QCheckBox): - def __init__(self, text, desc, tags: list[str], parent=None): + def __init__(self, text, desc, tags: list[str], *, parent: QWidget | None = None): super(InstallTagCheckBox, self).__init__(parent) self.setFont(QFont('monospace')) self.setText(text) self.setToolTip(desc) self.tags = tags - def isChecked(self) -> bool | list[str]: - return self.tags if super(InstallTagCheckBox, self).isChecked() else False - class SelectiveWidget(QWidget): stateChanged: Signal = Signal() - def __init__(self, rgame: RareGame, platform: str, parent=None): + def __init__(self, sdl_data: dict, install_tags, disable_sdl, *, parent: QWidget | None = None): super().__init__(parent=parent) - self.logger = getLogger(type(self).__name__) + # self.logger = getLogger(type(self).__name__) self._has_tags = False main_layout = QVBoxLayout(self) main_layout.setSpacing(2) - core = rgame.core - - config_tags = core.lgd.config.get(rgame.app_name, 'install_tags', fallback=None) - config_disable_sdl = core.lgd.config.getboolean(rgame.app_name, 'disable_sdl', fallback=False) - - sdl_data = rgame.sdl_data(platform) - if not config_disable_sdl and sdl_data: + if not disable_sdl and sdl_data: for group, info in sdl_data.items(): - cb = InstallTagCheckBox(info['name'].strip(), info['description'].strip(), info['tags']) + cb = InstallTagCheckBox(info['name'].strip(), info['description'].strip(), info['tags'], parent=self) if group == '__required': cb.setChecked(True) cb.setDisabled(True) - if config_tags is not None: - if all(tag in config_tags for tag in info['tags']): + if install_tags is not None: + if all(tag in install_tags for tag in info['tags']): cb.setChecked(True) cb.stateChanged.connect(self.stateChanged) main_layout.addWidget(cb) @@ -55,9 +46,8 @@ def __init__(self, rgame: RareGame, platform: str, parent=None): def enabled_tags(self) -> list[str]: install_tags = set() for cb in self.findChildren(InstallTagCheckBox, options=Qt.FindChildOption.FindDirectChildrenOnly): - if data := cb.isChecked(): - # noinspection PyTypeChecker - install_tags.update(data) + if cb.isChecked(): + install_tags.update(cb.tags) install_tags = ['', *install_tags] return install_tags @@ -68,26 +58,37 @@ def supports_tags(self) -> bool: class InstallDialogSelective(CollapsibleFrame): stateChanged: Signal = Signal() - def __init__(self, rgame: RareGame, parent=None): + def __init__(self, rgame: RareGame | RareEosOverlay, *, parent: QWidget | None = None): super(InstallDialogSelective, self).__init__(parent=parent) + # self.logger = getLogger(type(self).__name__) title = self.tr('Optional downloads') self.setTitle(title) self.setEnabled(False) - self.widget: SelectiveWidget = None + self.widget: SelectiveWidget | None = None self.rgame = rgame + self.sdl_data: dict | None = None + + def setup_widget(self, sdl_data: dict): + self.sdl_data = sdl_data - def update_list(self, platform: str): + def update_widget(self, platform: str): + platform_sdl = {} + if self.sdl_data: + platform_sdl = self.sdl_data[platform] + install_tags = self.rgame.core.lgd.config.get(self.rgame.app_name, 'install_tags', fallback=None) + disable_sdl = self.rgame.core.lgd.config.getboolean(self.rgame.app_name, 'disable_sdl', fallback=False) if self.widget is not None: self.widget.disconnect(self.widget) self.widget.deleteLater() - self.widget = SelectiveWidget(self.rgame, platform, parent=self) - self.setEnabled(self.widget.supports_tags()) - self.widget.stateChanged.connect(self.stateChanged) - self.setWidget(self.widget) + widget = SelectiveWidget(platform_sdl, install_tags, disable_sdl, parent=self) + widget.stateChanged.connect(self.stateChanged) + self.setEnabled(widget.supports_tags()) + self.setWidget(widget) + self.widget = widget def enabled_tags(self) -> list[str]: - return self.widget.enabled_tags() + return self.widget.enabled_tags() if self.widget else [] __all__ = ['InstallDialogSelective', 'SelectiveWidget'] diff --git a/rare/components/dialogs/install/widgets.py b/rare/components/dialogs/install/widgets.py new file mode 100644 index 000000000..3bdd59494 --- /dev/null +++ b/rare/components/dialogs/install/widgets.py @@ -0,0 +1,67 @@ +from PySide6.QtGui import QFont, Qt +from PySide6.QtWidgets import QCheckBox, QHBoxLayout, QLabel, QListWidgetItem, QWidget + +from rare.ui.components.dialogs.install.file_filters import Ui_InstallDialogFileFilters +from rare.widgets.collapsible_widget import CollapsibleFrame + + +class InstallDialogEulaWidget(QWidget): + def __init__(self, *, parent: QWidget | None = None): + super(InstallDialogEulaWidget, self).__init__(parent=parent) + + font = self.font() + font.setItalic(True) + + self.check = QCheckBox(self.tr('EULAs:'), parent=self) + self.check.setObjectName('InfoLabel') + self.check.setFont(font) + self.label = QLabel(self.tr('All EULAs have been accepted')) + self.label.setObjectName('InfoLabel') + self.label.setFont(font) + + layout = QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(self.check, stretch=0) + layout.addWidget(self.label, stretch=1) + + self.pending_eulas: list = [] + + def setup_widget(self, pending_eulas: list): + self.check.setEnabled(bool(pending_eulas)) + self.check.setCheckState(Qt.CheckState.Unchecked if pending_eulas else Qt.CheckState.Checked) + self.label.setEnabled(bool(pending_eulas)) + label_text: list = [] + for eula in pending_eulas: + label_text.append(f'{eula.get("key")}') + if label_text: + self.label.setText(', '.join(label_text)) + self.pending_eulas = pending_eulas + + +class InstallDialogFileFilters(CollapsibleFrame): + def __init__(self, parent=None): + super(InstallDialogFileFilters, self).__init__(parent=parent) + + title = self.tr('File filters') + self.setTitle(title) + + self.widget = QWidget(parent=self) + self.ui = Ui_InstallDialogFileFilters() + self.ui.setupUi(self.widget) + self.setWidget(self.widget) + + # self.ui.exclude_prefix_label.setVisible(False) + # self.ui.exclude_prefix_info.setVisible(False) + # self.ui.exclude_prefix_button.setVisible(False) + + def clear(self): + self.ui.exclude_list.clear() + + def add_item(self, data: str): + li = QListWidgetItem(data, self.ui.exclude_list) + li.setFont(QFont('monospace')) + li.setCheckState(Qt.CheckState.Unchecked) + self.ui.exclude_list.addItem(li) + + +__all__ = ['InstallDialogEulaWidget', 'InstallDialogFileFilters'] diff --git a/rare/components/dialogs/move.py b/rare/components/dialogs/move.py index 32924fbee..0a608c5eb 100644 --- a/rare/components/dialogs/move.py +++ b/rare/components/dialogs/move.py @@ -24,9 +24,6 @@ def __init__(self, rcore: RareCore, rgame: RareGame, parent=None): self.setWindowTitle(game_title(header, rgame.app_title)) self.setSubtitle(game_title(header, rgame.app_title)) - self.threadpool = QThreadPool(self) - self.threadpool.setMaxThreadCount(1) - move_widget = QWidget(self) self.ui = Ui_MoveDialog() self.ui.setupUi(move_widget) @@ -52,19 +49,13 @@ def __init__(self, rcore: RareCore, rgame: RareGame, parent=None): MovePathEditReasons.MOVEDIALOG_NO_SPACE: self.tr('Not enough space available on drive.'), } self.target_path_edit.validationFinished.connect(self.__on_target_path_validation) - self.ui.main_layout.setWidget( - self.ui.main_layout.getWidgetPosition(self.ui.target_path_label)[0], - QFormLayout.ItemRole.FieldRole, - self.target_path_edit, - ) + target_path_edit_index, _ = self.ui.main_layout.getWidgetPosition(self.ui.target_path_label) + self.ui.main_layout.setWidget(target_path_edit_index, QFormLayout.ItemRole.FieldRole, self.target_path_edit) self.full_path_info = ElideLabel(parent=self) self.full_path_info.setFont(QFont('monospace')) - self.ui.main_layout.setWidget( - self.ui.main_layout.getWidgetPosition(self.ui.full_path_label)[0], - QFormLayout.ItemRole.FieldRole, - self.full_path_info, - ) + full_path_info_index, _ = self.ui.main_layout.getWidgetPosition(self.ui.full_path_label) + self.ui.main_layout.setWidget(full_path_info_index, QFormLayout.ItemRole.FieldRole, self.full_path_info) self.ui.rename_path_check.setChecked(self.options.rename_path) self.ui.rename_path_check.checkStateChanged.connect(self.__on_rename_path_changed) @@ -141,7 +132,7 @@ def __target_path_edit_callback(path: str) -> tuple[bool, str, int]: return True, path, IndicatorReasonsCommon.VALID @Slot(bool, object, object, MovePathEditReasons) - def __on_worker_result(self, is_valid: bool, src_size: int | float, dst_size: int | float, reason: MovePathEditReasons): + def __on_worker_result(self, is_valid: bool, src_size: float, dst_size: float, reason: MovePathEditReasons): self.setActive(False, disable=False) self.set_size_labels(src_size, dst_size) self.action_button.setEnabled(False) @@ -159,7 +150,7 @@ def __on_target_path_validation(self, is_valid: bool, reason: str): self.set_error_labels(error, reason) @staticmethod - def __set_size_label(label: QLabel, value: int | float | str): + def __set_size_label(label: QLabel, value: float | str): is_numeric = isinstance(value, (int, float)) font = label.font() font.setBold(is_numeric) @@ -168,7 +159,7 @@ def __set_size_label(label: QLabel, value: int | float | str): text = format_size(value) if is_numeric else value label.setText(text) - def set_size_labels(self, required: int | float | str, available: int | float | str): + def set_size_labels(self, required: float | str, available: float | str): self.__set_size_label(self.ui.required_space_text, required) self.__set_size_label(self.ui.available_space_text, available) diff --git a/rare/components/dialogs/selective.py b/rare/components/dialogs/selective.py index bf6a3d439..6f732d5dd 100644 --- a/rare/components/dialogs/selective.py +++ b/rare/components/dialogs/selective.py @@ -18,8 +18,10 @@ def __init__(self, rgame: RareGame, parent=None): self.setWindowTitle(game_title(header, rgame.app_title)) self.setSubtitle(game_title(header, rgame.app_title)) - self.rgame = rgame - self.selective_widget = SelectiveWidget(rgame, rgame.igame.platform, self) + sdl_data = rgame.sdl_data(rgame.igame.platform) + install_tags = rgame.core.lgd.config.get(rgame.app_name, 'install_tags', fallback=None) + disable_sdl = rgame.core.lgd.config.getboolean(rgame.app_name, 'disable_sdl', fallback=False) + self.selective_widget = SelectiveWidget(sdl_data, install_tags, disable_sdl, parent=self) container = QGroupBox(self.tr('Optional downloads'), self) container_layout = QVBoxLayout(container) @@ -35,6 +37,7 @@ def __init__(self, rgame: RareGame, parent=None): self.accept_button.setIcon(qta_icon('fa.check', 'fa5s.check')) self.options: SelectiveDownloadsModel = SelectiveDownloadsModel(rgame.app_name) + self.rgame = rgame def done_handler(self): self.result_ready.emit(self.rgame, self.options) diff --git a/rare/components/tabs/downloads/__init__.py b/rare/components/tabs/downloads/__init__.py index b445599ea..025751407 100644 --- a/rare/components/tabs/downloads/__init__.py +++ b/rare/components/tabs/downloads/__init__.py @@ -25,7 +25,7 @@ ) from rare.models.settings import RareAppSettings, app_settings from rare.shared import RareCore -from rare.shared.workers import InstallInfoWorker, UninstallWorker +from rare.shared.workers import InstallPrepareWorker, UninstallWorker from rare.utils.misc import format_size from rare.utils.paths import create_desktop_link, desktop_links_supported @@ -34,7 +34,7 @@ from .thread import DlResultCode, DlResultModel, DlThread -def get_time(seconds: int | float) -> str: +def get_time(seconds: float) -> str: return str(datetime.timedelta(seconds=seconds)) @@ -179,7 +179,7 @@ def stop_download(self, omit_queue=False): self.__thread.wait() def __refresh_download(self, item: InstallQueueItemModel): - worker = InstallInfoWorker(self.core, item.options) + worker = InstallPrepareWorker(self.core, item.options) worker.signals.result.connect( (lambda obj, d: obj.start_download(InstallQueueItemModel(options=item.options, download=d))).__get__(self) @@ -311,6 +311,7 @@ def __get_install_options(self, options: InstallOptionsModel): rgame.state = RareGame.State.DOWNLOADING install_dialog = InstallDialog( self.settings, + self.core, rgame, options=options, parent=self, diff --git a/rare/components/tabs/downloads/widgets.py b/rare/components/tabs/downloads/widgets.py index 2c042d9ee..857cf00a8 100644 --- a/rare/components/tabs/downloads/widgets.py +++ b/rare/components/tabs/downloads/widgets.py @@ -12,7 +12,7 @@ InstallQueueItemModel, ) from rare.shared.image_manager import ImageManager -from rare.shared.workers.install import InstallInfoWorker +from rare.shared.workers.install import InstallPrepareWorker from rare.ui.components.tabs.downloads.queue_base_widget import Ui_QueueBaseWidget from rare.ui.components.tabs.downloads.queue_info_widget import Ui_QueueInfoWidget from rare.utils.misc import elide_text, format_size, qta_icon, widget_object_name @@ -143,7 +143,7 @@ def __init__( if not item: self.ui.queue_buttons.setEnabled(False) - worker = InstallInfoWorker(core, item.options) + worker = InstallPrepareWorker(core, item.options) worker.signals.result.connect(self.__update_info) worker.signals.failed.connect( ( diff --git a/rare/models/game.py b/rare/models/game.py index 5e0e41c47..ccb185ee2 100644 --- a/rare/models/game.py +++ b/rare/models/game.py @@ -1,8 +1,9 @@ import json import os -import platform +import platform as pf import re from argparse import Namespace +from collections import OrderedDict from dataclasses import dataclass, field from datetime import datetime, timezone from functools import cached_property @@ -32,19 +33,19 @@ class RareGameMetadata: queued: bool = False queue_pos: int | None = None - last_played: datetime = datetime.min.replace(tzinfo=timezone.utc) - achievements_date: datetime = datetime.min.replace(tzinfo=timezone.utc) - grant_date: datetime = datetime.min.replace(tzinfo=timezone.utc) + last_played: datetime = field(default_factory=lambda: datetime.min.replace(tzinfo=timezone.utc)) + achievements_date: datetime = field(default_factory=lambda: datetime.min.replace(tzinfo=timezone.utc)) + grant_date: datetime = field(default_factory=lambda: datetime.min.replace(tzinfo=timezone.utc)) steam_appid: str | None = None steam_grade: str | None = None - steam_date: datetime = datetime.min.replace(tzinfo=timezone.utc) + steam_date: datetime = field(default_factory=lambda: datetime.min.replace(tzinfo=timezone.utc)) steam_shortcut: int | None = None tags: tuple[str, ...] = field(default_factory=tuple) # For compatibility with previously created game metadata @staticmethod def parse_date(strdate: str): - dt = datetime.fromisoformat(strdate) if strdate else datetime.min + dt = datetime.fromisoformat(strdate) if strdate else datetime.min # noqa: DTZ901 return dt.replace(tzinfo=timezone.utc) @classmethod @@ -64,20 +65,18 @@ def from_dict(cls, data: dict): @property def __dict__(self): - return dict( - queued=self.queued, - queue_pos=self.queue_pos, - last_played=self.last_played.isoformat() if self.last_played else datetime.min.replace(tzinfo=timezone.utc), - achievements_date=self.last_played.isoformat() - if self.achievements_date - else datetime.min.replace(tzinfo=timezone.utc), - grant_date=self.grant_date.isoformat() if self.grant_date else datetime.min.replace(tzinfo=timezone.utc), - steam_appid=str(self.steam_appid) if self.steam_appid else None, - steam_grade=self.steam_grade, - steam_date=self.steam_date.isoformat() if self.steam_date else datetime.min.replace(tzinfo=timezone.utc), - steam_shortcut=self.steam_shortcut, - tags=self.tags, - ) + return { + 'queued': self.queued, + 'queue_pos': self.queue_pos, + 'last_played': self.last_played.isoformat() if self.last_played else datetime.min.replace(tzinfo=timezone.utc), + 'achievements_date': self.last_played.isoformat() if self.achievements_date else datetime.min.replace(tzinfo=timezone.utc), + 'grant_date': self.grant_date.isoformat() if self.grant_date else datetime.min.replace(tzinfo=timezone.utc), + 'steam_appid': str(self.steam_appid) if self.steam_appid else None, + 'steam_grade': self.steam_grade, + 'steam_date': self.steam_date.isoformat() if self.steam_date else datetime.min.replace(tzinfo=timezone.utc), + 'steam_shortcut': self.steam_shortcut, + 'tags': self.tags, + } def __bool__(self): return self.queued or self.queue_pos is not None or self.last_played is not None @@ -114,8 +113,8 @@ def __init__( self.__worker: QRunnable | None = None self.progress: int = 0 - self.signals.progress.start.connect(self.__on_progress_update) - self.signals.progress.refresh.connect(self.__on_progress_update) + self.signals.progress.start.connect(self._on_progress_update) + self.signals.progress.refresh.connect(self._on_progress_update) self.__steam_grade_pending: bool = False self.game_process = GameProcess(self.game) @@ -146,7 +145,7 @@ def parent_rgame(self, rgame: 'RareGame') -> None: @Slot() @Slot(int) - def __on_progress_update(self, progress: int = 0): + def _on_progress_update(self, progress: int = 0): self.progress = progress def get_worker(self) -> QRunnable | None: @@ -187,9 +186,9 @@ def _game_finished(self, exit_code: int): __metadata_json: dict | None = None __metadata_lock: Lock = Lock() - def __load_metadata_json(self) -> dict | None: + def __load_metadata_json(self) -> dict: if RareGame.__metadata_json is None: - metadata = {} + metadata: dict = {} file = os.path.join(data_dir(), 'game_meta.json') try: with open(file, encoding='utf-8') as f: @@ -200,7 +199,9 @@ def __load_metadata_json(self) -> dict | None: self.logger.warning('%s is corrupt', file) finally: RareGame.__metadata_json = metadata - return RareGame.__metadata_json + return metadata + else: + return RareGame.__metadata_json def __load_metadata(self): with RareGame.__metadata_lock: @@ -514,7 +515,7 @@ def pending_eulas(self) -> list: # FIXME: Legendary 0.21.0 compatibility try: eula = self.core.egs.eula_get_status(key) - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.error(f'Failed to fetch EULA status for "{key}" {e!r}') continue if eula: @@ -529,20 +530,20 @@ def accept_eulas(self, eulas: list) -> bool: self.logger.debug(f'Accepting "{key}" version {version}') try: self.core.egs.eula_accept(key, version, locale) - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.error(f'Failed to accept EULA "{key}" {e!r}') return False return True - def sdl_data(self, platform: str) -> dict[str, dict] | None: - sdl_data = {} + def sdl_data(self, platform: str) -> dict[str, dict]: + sdl_data = OrderedDict() sdl_name = get_sdl_appname(self.app_name) if data := self.core.get_sdl_data(sdl_name, platform=platform): sdl_data.update(data) known_install_tags = set() if sdl_data: - known_install_tags = set(tag for _, info in sdl_data.items() for tag in info['tags']) + known_install_tags = {tag for _, info in sdl_data.items() for tag in info['tags']} if self.igame is not None and not self.has_update: manifest_data = self.core.lgd.load_manifest(self.app_name, self.igame.version, self.igame.platform) @@ -592,8 +593,8 @@ def steam_appid(self, appid: str) -> None: self.metadata.steam_appid = appid self.__save_metadata() - def get_steam_grade(self) -> str: - if platform.system() == 'Windows' or self.is_unreal: + def get_steam_grade(self) -> str | None: + if pf.system() == 'Windows' or self.is_unreal: return 'na' if self.__steam_grade_pending: return 'pending' @@ -630,11 +631,11 @@ def grant_date(self, force=False) -> datetime: @property def tags(self) -> tuple[str, ...]: - return tuple(tag for tag in map(lambda x: x.lower().strip(), self.metadata.tags) if bool(tag)) + return tuple(tag for tag in (x.lower().strip() for x in self.metadata.tags) if bool(tag)) @tags.setter def tags(self, tags: tuple[str, ...]) -> None: - self.metadata.tags = tuple(tag for tag in map(lambda x: x.lower().strip(), tags) if bool(tag)) + self.metadata.tags = tuple(tag for tag in (x.lower().strip() for x in tags) if bool(tag)) self.logger.debug(f'Saving tags for {self.game.app_title}: {self.metadata.tags}') self.__save_metadata() @@ -675,7 +676,7 @@ def refresh_pixmap(self): self.image_manager.download_image(self.game, self._update_pixmap, 0, True) @property - def __install_base_path(self) -> str: + def _install_base_path(self) -> str: if self.is_installed: return self.install_path if self.parent_rgame and self.parent_rgame.is_installed: @@ -683,7 +684,7 @@ def __install_base_path(self) -> str: return self.core.get_default_install_dir(self.default_platform) @property - def __install_platform(self) -> str: + def _install_platform(self) -> str: if self.is_installed: return self.igame.platform if self.parent_rgame and self.parent_rgame.is_installed: @@ -696,8 +697,8 @@ def install(self) -> bool: self.signals.game.install.emit( InstallOptionsModel( app_name=self.app_name, - base_path=self.__install_base_path, - platform=self.__install_platform, + base_path=self._install_base_path, + platform=self._install_platform, ) ) return True @@ -707,7 +708,7 @@ def modify(self) -> bool: return False self.signals.game.install.emit( InstallOptionsModel( - app_name=self.app_name, base_path=self.__install_base_path, platform=self.igame.platform, reset_sdl=True + app_name=self.app_name, base_path=self._install_base_path, platform=self.igame.platform, reset_sdl=True ) ) return True @@ -718,7 +719,7 @@ def repair(self, repair_and_update) -> bool: self.signals.game.install.emit( InstallOptionsModel( app_name=self.app_name, - base_path=self.__install_base_path, + base_path=self._install_base_path, platform=self.igame.platform, repair_mode=True, repair_and_update=repair_and_update, @@ -734,7 +735,7 @@ def uninstall(self) -> bool: UninstallOptionsModel( app_name=self.app_name, keep_folder=self.is_dlc, - keep_config=self.sdl_available or self.is_dlc or platform.system() not in {'Windows'}, + keep_config=self.sdl_available or self.is_dlc or pf.system() not in {'Windows'}, ) ) return True @@ -898,11 +899,11 @@ def disable(self, prefix: str | None = None) -> bool: def pending_eulas(self) -> list: return [] - def accept_euals(self, eulas: list): + def accept_eulas(self, eulas: list): return True - def sdl_data(self, platform: str) -> dict[str, dict] | None: - return None + def sdl_data(self, platform: str) -> dict[str, dict]: + return {} def install(self) -> bool: if not self.is_idle: @@ -924,10 +925,10 @@ def uninstall(self) -> bool: self.signals.game.uninstall.emit( UninstallOptionsModel( app_name=self.app_name, - keep_overlay_keys=platform.system() not in {'Windows'}, + keep_overlay_keys=pf.system() not in {'Windows'}, ) ) return True -__all__ = ['RareGame', 'RareEosOverlay'] +__all__ = ['RareEosOverlay', 'RareGame'] diff --git a/rare/models/game_slim.py b/rare/models/game_slim.py index 9c1c5d2d7..ab926358b 100644 --- a/rare/models/game_slim.py +++ b/rare/models/game_slim.py @@ -128,7 +128,7 @@ def set_installed(self, installed: bool) -> None: pass @property - def platforms(self) -> tuple: + def platforms(self) -> tuple[str, ...]: """! @brief Property that holds the platforms a game is available for @@ -224,7 +224,7 @@ def __init__(self, settings: RareAppSettings, legendary_core: LegendaryCore, gam super(RareGameSlim, self).__init__(legendary_core, game) self.settings = settings # None if origin or not installed - self.igame: InstalledGame = self.core.get_installed_game(game.app_name) + self.igame: InstalledGame | None = self.core.get_installed_game(game.app_name) self.saves: list[RareSaveGame] = [] @property diff --git a/rare/models/install.py b/rare/models/install.py index 321c6c866..1acb72a51 100644 --- a/rare/models/install.py +++ b/rare/models/install.py @@ -1,6 +1,6 @@ import os from dataclasses import dataclass -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from pathlib import Path from legendary.models.downloading import AnalysisResult, ConditionCheckResult @@ -40,7 +40,13 @@ def as_install_kwargs(self) -> dict: return { k: getattr(self, k) for k in vars(self) - if k not in ['update', 'silent', 'create_shortcut', 'overlay', 'install_prereqs'] + if k not in [ + 'update', + 'silent', + 'create_shortcut', + 'overlay', + 'install_prereqs', + ] } @@ -56,27 +62,29 @@ class InstallDownloadModel: class InstallQueueItemModel: - def __init__(self, options: InstallOptionsModel, download: InstallDownloadModel = None): + def __init__(self, options: InstallOptionsModel, download: InstallDownloadModel | None = None): self.options: InstallOptionsModel | None = options # lk: internal attribute holders - self.__download: InstallDownloadModel | None = None - self.__date: datetime | None = None + self._download: InstallDownloadModel | None = None + self._date: datetime | None = None self.download = download @property def download(self) -> InstallDownloadModel | None: - return self.__download + return self._download @download.setter def download(self, download: InstallDownloadModel | None): - self.__download = download + self._download = download if download is not None: - self.__date = datetime.now() + self._date = datetime.now(tz=timezone.utc) @property def expired(self) -> bool: - return datetime.now() > (self.__date + timedelta(minutes=5)) + if self._date is None: + return True + return datetime.now(tz=timezone.utc) > (self._date + timedelta(minutes=5)) def __bool__(self): return (self.download is not None) and (self.options is not None) and (not self.expired) @@ -85,14 +93,14 @@ def __bool__(self): @dataclass class UninstallOptionsModel: app_name: str - accepted: bool = None - keep_files: bool = None - keep_folder: bool = True - keep_config: bool = None - keep_overlay_keys: bool = None + accepted: bool | None = None + keep_files: bool | None = None + keep_folder: bool | None = True + keep_config: bool | None = None + keep_overlay_keys: bool | None = None @property - def __values(self) -> tuple[bool, bool, bool, bool, bool]: + def _values(self) -> tuple[bool | None, bool | None, bool | None, bool | None, bool | None]: return ( self.accepted, self.keep_files, @@ -101,8 +109,8 @@ def __values(self) -> tuple[bool, bool, bool, bool, bool]: self.keep_overlay_keys, ) - @__values.setter - def __values(self, values: tuple[bool, bool, bool, bool, bool]): + @_values.setter + def _values(self, values: tuple[bool | None, bool | None, bool | None, bool | None, bool | None]): ( self.accepted, self.keep_files, @@ -112,22 +120,22 @@ def __values(self, values: tuple[bool, bool, bool, bool, bool]): ) = values def __bool__(self): - return bool(self.app_name) and all(map(lambda x: x is not None, self.__values)) + return bool(self.app_name) and all(x is not None for x in self._values) def __iter__(self): - return iter(self.__values) + return iter(self._values) def set_accepted(self, keep_files, keep_folder, keep_config, keep_overlay_keys): - self.__values = True, keep_files, keep_folder, keep_config, keep_overlay_keys + self._values = True, keep_files, keep_folder, keep_config, keep_overlay_keys def set_rejected(self): - self.__values = False, None, None, None, None + self._values = False, None, None, None, None @dataclass class SelectiveDownloadsModel: app_name: str - accepted: bool = None + accepted: bool | None = None install_tag: list[str] | None = None def __bool__(self): diff --git a/rare/shared/workers/__init__.py b/rare/shared/workers/__init__.py index 8bfd5b728..30406cc0d 100644 --- a/rare/shared/workers/__init__.py +++ b/rare/shared/workers/__init__.py @@ -1,6 +1,6 @@ from .cloud import CloudSyncWorker from .fetch import FetchWorker, GamesDlcsWorker -from .install import InstallInfoWorker +from .install import InstallDataWorker, InstallPrepareWorker from .move import MoveInfoWorker, MoveWorker from .uninstall import UninstallWorker from .verify import VerifyWorker @@ -11,7 +11,8 @@ 'CloudSyncWorker', 'FetchWorker', 'GamesDlcsWorker', - 'InstallInfoWorker', + 'InstallDataWorker', + 'InstallPrepareWorker', 'MoveInfoWorker', 'MoveWorker', 'OriginWineWorker', diff --git a/rare/shared/workers/install.py b/rare/shared/workers/install.py index 6c7a9a0dd..ebf1662c7 100644 --- a/rare/shared/workers/install.py +++ b/rare/shared/workers/install.py @@ -7,21 +7,56 @@ from rare.lgndr.glue.arguments import LgndrInstallGameArgs from rare.lgndr.glue.exception import LgndrException from rare.lgndr.glue.monkeys import LgndrIndirectStatus +from rare.models.game import RareEosOverlay, RareGame from rare.models.install import InstallDownloadModel, InstallOptionsModel from .worker import Worker -class InstallInfoWorkerSignals(QObject): - result = Signal(InstallDownloadModel) +class InstallWorkerSignals(QObject): failed = Signal(str) finished = Signal() -class InstallInfoWorker(Worker): +class InstallDataWorkerSignals(InstallWorkerSignals): + result = Signal(dict, list) + + +class InstallPrepareWorkerSignals(InstallWorkerSignals): + result = Signal(InstallDownloadModel) + + +class InstallDataWorker(Worker): + def __init__(self, rgame: RareEosOverlay | RareGame): + super(InstallDataWorker, self).__init__() + self.signals = InstallDataWorkerSignals() + self.rgame = rgame + + def run_real(self): + try: + sdl_data = {} + for platform in self.rgame.platforms: + sdl_data[platform] = self.rgame.sdl_data(platform) + pending_eulas = self.rgame.pending_eulas() + + # TODO: there is information about the files to be downloaded in analres, don't fetch the manifest again + # TODO: see if you can re-use the one from selective downloads + # new_manifest_data, _, _ = self.core.get_cdn_manifest(download.game, download.igame.platform, self._options.disable_https) + # new_manifest = self.core.load_manifest(new_manifest_data) + # self.file_filters.clear() + # for e in new_manifest.file_manifest_list.elements: + # self.file_filters.add_item(e.filename.lower()) + + self.signals.result.emit(sdl_data, pending_eulas) + except Exception as e: # noqa: BLE001 + self.signals.failed.emit(str(e)) + self.signals.finished.emit() + + +class InstallPrepareWorker(Worker): def __init__(self, core: LegendaryCore, options: InstallOptionsModel): - super(InstallInfoWorker, self).__init__() - self.signals = InstallInfoWorkerSignals() + super(InstallPrepareWorker, self).__init__() + self.signals: InstallPrepareWorkerSignals = InstallPrepareWorkerSignals() self.core = core self.options = options @@ -55,6 +90,6 @@ def run_real(self): self.signals.failed.emit('\n'.join(map(str, download.res.failures))) except LgndrException as ret: self.signals.failed.emit(ret.message) - except Exception as e: + except Exception as e: # noqa: BLE001 self.signals.failed.emit(str(e)) self.signals.finished.emit() diff --git a/rare/shared/workers/worker.py b/rare/shared/workers/worker.py index 1d12651a3..498b1640f 100644 --- a/rare/shared/workers/worker.py +++ b/rare/shared/workers/worker.py @@ -19,25 +19,25 @@ class Worker(QRunnable): def __init__(self): super(Worker, self).__init__() self.setAutoDelete(True) - self.__logger = getLogger(type(self).__name__) - self.__signals: QObject = None + self._logger = getLogger(type(self).__name__) + self._signals: QObject | None = None def __str__(self): return type(self).__name__ @property def logger(self) -> Logger: - return self.__logger + return self._logger @property def signals(self) -> QObject: - if self.__signals is None: + if self._signals is None: raise RuntimeError(f"Subclasses must assign '{type(self).__name__}.signals' QObject attribute") - return self.__signals + return self._signals @signals.setter def signals(self, obj: QObject): - self.__signals = obj + self._signals = obj @abstractmethod def run_real(self): diff --git a/rare/ui/components/dialogs/install/dialog.py b/rare/ui/components/dialogs/install/dialog.py index 8190bc619..171584409 100644 --- a/rare/ui/components/dialogs/install/dialog.py +++ b/rare/ui/components/dialogs/install/dialog.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'dialog.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -13,27 +12,27 @@ from PySide6.QtWidgets import QCheckBox, QComboBox, QFormLayout, QFrame, QLabel, QSizePolicy -class Ui_InstallDialog(object): +class Ui_InstallDialog: def setupUi(self, InstallDialog): if not InstallDialog.objectName(): - InstallDialog.setObjectName(u"InstallDialog") - InstallDialog.resize(182, 153) - InstallDialog.setWindowTitle(u"InstallDialog") + InstallDialog.setObjectName("InstallDialog") + InstallDialog.resize(438, 204) + InstallDialog.setWindowTitle("InstallDialog") self.main_layout = QFormLayout(InstallDialog) - self.main_layout.setObjectName(u"main_layout") + self.main_layout.setObjectName("main_layout") self.main_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) self.install_dir_label = QLabel(InstallDialog) - self.install_dir_label.setObjectName(u"install_dir_label") + self.install_dir_label.setObjectName("install_dir_label") self.main_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.install_dir_label) self.platform_label = QLabel(InstallDialog) - self.platform_label.setObjectName(u"platform_label") + self.platform_label.setObjectName("platform_label") self.main_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.platform_label) self.platform_combo = QComboBox(InstallDialog) - self.platform_combo.setObjectName(u"platform_combo") + self.platform_combo.setObjectName("platform_combo") sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -42,87 +41,94 @@ def setupUi(self, InstallDialog): self.main_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.platform_combo) + self.eula_label = QLabel(InstallDialog) + self.eula_label.setObjectName("eula_label") + self.eula_label.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) + + self.main_layout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.eula_label) + self.shortcut_label = QLabel(InstallDialog) - self.shortcut_label.setObjectName(u"shortcut_label") + self.shortcut_label.setObjectName("shortcut_label") self.shortcut_label.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) self.main_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.shortcut_label) self.shortcut_check = QCheckBox(InstallDialog) - self.shortcut_check.setObjectName(u"shortcut_check") - self.shortcut_check.setText(u"") + self.shortcut_check.setObjectName("shortcut_check") + font = QFont() + font.setItalic(True) + self.shortcut_check.setFont(font) self.main_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.shortcut_check) self.download_size_label = QLabel(InstallDialog) - self.download_size_label.setObjectName(u"download_size_label") + self.download_size_label.setObjectName("download_size_label") - self.main_layout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.download_size_label) + self.main_layout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.download_size_label) self.download_size_text = QLabel(InstallDialog) - self.download_size_text.setObjectName(u"download_size_text") - font = QFont() - font.setItalic(True) + self.download_size_text.setObjectName("download_size_text") self.download_size_text.setFont(font) - self.main_layout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.download_size_text) + self.main_layout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.download_size_text) self.install_size_label = QLabel(InstallDialog) - self.install_size_label.setObjectName(u"install_size_label") + self.install_size_label.setObjectName("install_size_label") - self.main_layout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.install_size_label) + self.main_layout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.install_size_label) self.install_size_text = QLabel(InstallDialog) - self.install_size_text.setObjectName(u"install_size_text") + self.install_size_text.setObjectName("install_size_text") self.install_size_text.setFont(font) self.install_size_text.setWordWrap(True) - self.main_layout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.install_size_text) + self.main_layout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.install_size_text) self.available_space_label = QLabel(InstallDialog) - self.available_space_label.setObjectName(u"available_space_label") + self.available_space_label.setObjectName("available_space_label") - self.main_layout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.available_space_label) + self.main_layout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.available_space_label) self.available_space_text = QLabel(InstallDialog) - self.available_space_text.setObjectName(u"available_space_text") + self.available_space_text.setObjectName("available_space_text") font1 = QFont() font1.setBold(True) self.available_space_text.setFont(font1) - self.available_space_text.setText(u"") + self.available_space_text.setText("") - self.main_layout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.available_space_text) + self.main_layout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.available_space_text) self.warning_label = QLabel(InstallDialog) - self.warning_label.setObjectName(u"warning_label") + self.warning_label.setObjectName("warning_label") - self.main_layout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.warning_label) + self.main_layout.setWidget(7, QFormLayout.ItemRole.LabelRole, self.warning_label) self.warning_text = QLabel(InstallDialog) - self.warning_text.setObjectName(u"warning_text") + self.warning_text.setObjectName("warning_text") self.warning_text.setFont(font) self.warning_text.setFrameShape(QFrame.Shape.StyledPanel) self.warning_text.setFrameShadow(QFrame.Shadow.Sunken) - self.warning_text.setText(u"None") + self.warning_text.setText("None") self.warning_text.setWordWrap(True) self.warning_text.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByMouse) - self.main_layout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.warning_text) + self.main_layout.setWidget(7, QFormLayout.ItemRole.FieldRole, self.warning_text) self.retranslateUi(InstallDialog) # setupUi def retranslateUi(self, InstallDialog): - self.install_dir_label.setText(QCoreApplication.translate("InstallDialog", u"Install folder", None)) - self.platform_label.setText(QCoreApplication.translate("InstallDialog", u"Platform", None)) - self.shortcut_label.setText(QCoreApplication.translate("InstallDialog", u"Create shortcut", None)) - self.download_size_label.setText(QCoreApplication.translate("InstallDialog", u"Download size", None)) - self.download_size_text.setText(QCoreApplication.translate("InstallDialog", u"Click verify...", None)) - self.install_size_label.setText(QCoreApplication.translate("InstallDialog", u"Total install size", None)) - self.install_size_text.setText(QCoreApplication.translate("InstallDialog", u"Click verify...", None)) - self.available_space_label.setText(QCoreApplication.translate("InstallDialog", u"Available space", None)) - self.warning_label.setText(QCoreApplication.translate("InstallDialog", u"Warning", None)) - pass + self.install_dir_label.setText(QCoreApplication.translate("InstallDialog", "Install folder", None)) + self.platform_label.setText(QCoreApplication.translate("InstallDialog", "Platform", None)) + self.eula_label.setText(QCoreApplication.translate("InstallDialog", "Accept EULAs", None)) + self.shortcut_label.setText(QCoreApplication.translate("InstallDialog", "Shortcut", None)) + self.shortcut_check.setText(QCoreApplication.translate("InstallDialog", "Create desktop shortcut", None)) + self.download_size_label.setText(QCoreApplication.translate("InstallDialog", "Download size", None)) + self.download_size_text.setText(QCoreApplication.translate("InstallDialog", "Click verify...", None)) + self.install_size_label.setText(QCoreApplication.translate("InstallDialog", "Total install size", None)) + self.install_size_text.setText(QCoreApplication.translate("InstallDialog", "Click verify...", None)) + self.available_space_label.setText(QCoreApplication.translate("InstallDialog", "Available space", None)) + self.warning_label.setText(QCoreApplication.translate("InstallDialog", "Warning", None)) # retranslateUi diff --git a/rare/ui/components/dialogs/install/dialog.ui b/rare/ui/components/dialogs/install/dialog.ui index b16dfac37..8377dc5f4 100644 --- a/rare/ui/components/dialogs/install/dialog.ui +++ b/rare/ui/components/dialogs/install/dialog.ui @@ -6,8 +6,8 @@ 0 0 - 182 - 153 + 438 + 204 @@ -41,10 +41,20 @@ + + + + Accept EULAs + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + - Create shortcut + Shortcut Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -53,19 +63,24 @@ + + + true + + - + Create desktop shortcut - + Download size - + @@ -77,14 +92,14 @@ - + Total install size - + @@ -99,14 +114,14 @@ - + Available space - + @@ -118,14 +133,14 @@ - + Warning - + diff --git a/rare/widgets/dialogs.py b/rare/widgets/dialogs.py index 804164257..dc9819940 100644 --- a/rare/widgets/dialogs.py +++ b/rare/widgets/dialogs.py @@ -2,7 +2,7 @@ from abc import abstractmethod from logging import getLogger -from PySide6.QtCore import QCoreApplication, Qt, Slot +from PySide6.QtCore import QCoreApplication, Qt, QThreadPool, Slot from PySide6.QtGui import QCloseEvent, QKeyEvent, QKeySequence from PySide6.QtWidgets import ( QApplication, @@ -186,6 +186,9 @@ def __init__(self, parent=None): super(ActionDialog, self).__init__(parent=parent) self._reject_close = False + self.threadpool = QThreadPool(self) + self.threadpool.setMaxThreadCount(1) + self.loading_widget = LoadingWidget(parent=self) self.action_button = QPushButton(self) @@ -197,7 +200,7 @@ def __init__(self, parent=None): def active(self) -> bool: return self._reject_close - def setActive(self, active: bool, disable: bool = True): + def setActive(self, active: bool, *, disable: bool = True): if self.centralWidget(): self.centralWidget().setDisabled(active and disable) self.reject_button.setDisabled(active) @@ -230,7 +233,7 @@ def closeEvent(self, a0: QCloseEvent) -> None: super(BaseDialog, self).closeEvent(a0) -__all__ = ['dialog_title', 'game_title', 'BaseDialog', 'ButtonDialog', 'ActionDialog'] +__all__ = ['ActionDialog', 'BaseDialog', 'ButtonDialog', 'dialog_title', 'game_title'] class TestDialog(BaseDialog): From 59cb1c521511b539ac35bf9f6bce250e7e6e2442 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Fri, 14 Aug 2026 01:20:03 +0300 Subject: [PATCH 12/16] chore: fix issues reported by ruff --- rare/__init__.py | 2 +- rare/commands/launcher/__init__.py | 4 +- rare/commands/subreaper/subreaper_bsd.py | 4 +- rare/commands/subreaper/subreaper_linux.py | 2 +- rare/commands/subreaper/util.py | 4 +- rare/components/dialogs/login/__init__.py | 2 +- .../components/dialogs/login/browser_login.py | 4 +- rare/components/dialogs/login/import_login.py | 2 +- rare/components/dialogs/move.py | 2 +- rare/components/tabs/__init__.py | 2 +- rare/components/tabs/downloads/thread.py | 2 +- rare/components/tabs/integrations/__init__.py | 2 +- .../tabs/integrations/import_group.py | 4 +- .../tabs/integrations/ubisoft_group.py | 4 +- rare/components/tabs/library/__init__.py | 2 +- rare/components/tabs/library/details/cloud.py | 2 +- .../tabs/library/details/details.py | 15 ++++---- rare/components/tabs/library/details/game.py | 2 +- rare/components/tabs/library/head_bar.py | 2 +- .../tabs/library/widgets/__init__.py | 4 +- .../tabs/library/widgets/library_widget.py | 4 +- rare/components/tabs/settings/about.py | 2 +- rare/components/tabs/settings/compat.py | 2 +- rare/components/tabs/settings/legendary.py | 2 +- .../tabs/settings/widgets/envvars.py | 2 +- .../tabs/settings/widgets/launch.py | 2 +- .../tabs/settings/widgets/overlay.py | 38 +++++++++---------- .../tabs/settings/widgets/proton.py | 2 +- .../tabs/settings/widgets/runner.py | 2 +- .../components/tabs/store/api/models/query.py | 4 +- .../tabs/store/api/models/response.py | 4 +- rare/components/tabs/store/landing.py | 2 +- rare/components/tabs/store/search.py | 2 +- rare/components/tabs/store/store_api.py | 18 ++++----- rare/components/tabs/store/widgets/details.py | 14 +++---- rare/components/tabs/store/wishlist.py | 7 ++-- rare/components/tabs/tab_widgets.py | 4 +- rare/lgndr/glue/monkeys.py | 12 +++--- rare/main.py | 4 +- rare/models/game_slim.py | 4 +- rare/models/pathspec.py | 6 +-- rare/models/settings.py | 12 +++--- rare/models/steam.py | 26 ++++++------- rare/models/wrapper.py | 4 +- rare/resources/__init__.py | 5 +-- rare/resources/stylesheets/__init__.py | 2 +- rare/shared/image_manager.py | 7 +--- rare/shared/rare_core.py | 6 +-- rare/shared/workers/fetch.py | 9 ++--- rare/shared/workers/move.py | 2 +- rare/shared/workers/uninstall.py | 2 +- rare/shared/workers/wine_resolver.py | 2 - rare/shared/wrappers.py | 4 +- rare/utils/compat/miniproton.py | 4 +- rare/utils/compat/utils.py | 2 +- rare/utils/compat/wine.py | 8 ++-- rare/utils/config_helper.py | 14 ++++--- rare/utils/discord_rpc.py | 6 +-- rare/utils/json_formatter.py | 2 +- rare/utils/misc.py | 26 ++++++------- rare/utils/qrequests.py | 10 ++--- rare/utils/singleton.py | 4 +- rare/utils/steam_grades.py | 10 ++--- rare/utils/steam_shortcuts.py | 3 +- rare/utils/workarounds.py | 4 +- rare/utils/wrapper_exe.py | 9 +++-- rare/widgets/flow_layout.py | 4 +- rare/widgets/image_widget.py | 2 +- rare/widgets/indicator_edit.py | 27 ++++++------- 69 files changed, 206 insertions(+), 214 deletions(-) diff --git a/rare/__init__.py b/rare/__init__.py index b32aa56d9..4bd606014 100644 --- a/rare/__init__.py +++ b/rare/__init__.py @@ -10,4 +10,4 @@ sys.exit(main()) -__all__ = ['__version__', '__version_tuple__', '__codename__'] +__all__ = ['__codename__', '__version__', '__version_tuple__'] diff --git a/rare/commands/launcher/__init__.py b/rare/commands/launcher/__init__.py index 6e198d8c2..1779128a1 100644 --- a/rare/commands/launcher/__init__.py +++ b/rare/commands/launcher/__init__.py @@ -83,7 +83,7 @@ def run(self) -> None: def prepare_launch(self, args: InitParams) -> LaunchParams | None: try: launch = get_launch_params(self.rgame, args) - except Exception as e: + except Exception as e: # noqa: BLE001 self.signals.error_occurred.emit(str(e)) return None if not launch: @@ -379,7 +379,7 @@ def launch_game(self, params: LaunchParams): cmd_line = get_rare_executable() executable, arguments = cmd_line[0], cmd_line[1:] - if appid := os.environ.get('SteamGameId', False): # noqa: SIM112 + if appid := os.environ.get('SteamGameId', None): # noqa: SIM112 params.environment['SteamGameId'] = appid elif params.environment.get('SteamGameId', False): appid = params.environment['SteamGameId'] diff --git a/rare/commands/subreaper/subreaper_bsd.py b/rare/commands/subreaper/subreaper_bsd.py index bc78c81df..df508ee76 100755 --- a/rare/commands/subreaper/subreaper_bsd.py +++ b/rare/commands/subreaper/subreaper_bsd.py @@ -49,7 +49,7 @@ def get_pstree_from_pid(root_pid: int) -> set[int]: for line in lines: ppid, pid = map(int, line.split()) pid_to_ppid[pid] = ppid - except Exception: + except Exception: # noqa: BLE001 return descendants current_pid: list[int] = [root_pid] @@ -123,7 +123,7 @@ def signal_handler(sig, frame): if pid == 0: os.chdir(workdir) - os.execvp(command[0], command) # noqa: S606 + os.execvp(command[0], command) else: signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) diff --git a/rare/commands/subreaper/subreaper_linux.py b/rare/commands/subreaper/subreaper_linux.py index 809638959..11a563ef4 100755 --- a/rare/commands/subreaper/subreaper_linux.py +++ b/rare/commands/subreaper/subreaper_linux.py @@ -116,7 +116,7 @@ def signal_handler(sig, frame): sys.stdout.flush() sys.stderr.flush() os.chdir(workdir) - os.execvp(command[0], command) # noqa: S606 + os.execvp(command[0], command) else: signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) diff --git a/rare/commands/subreaper/util.py b/rare/commands/subreaper/util.py index 90b702af3..a454d24f8 100644 --- a/rare/commands/subreaper/util.py +++ b/rare/commands/subreaper/util.py @@ -27,7 +27,7 @@ def find_mangohud_shim() -> str: return '/'.join(ret) -def find_mangohud_bin() -> str: +def find_mangohud_bin() -> str| None: return shutil.which('mangohud') @@ -35,4 +35,4 @@ def find_mangohud_bin() -> str: print(find_mangohud_shim()) -__all__ = ['find_mangohud_shim', 'find_mangohud_bin'] +__all__ = ['find_mangohud_bin', 'find_mangohud_shim'] diff --git a/rare/components/dialogs/login/__init__.py b/rare/components/dialogs/login/__init__.py index 45600367a..e2cb5642a 100644 --- a/rare/components/dialogs/login/__init__.py +++ b/rare/components/dialogs/login/__init__.py @@ -163,7 +163,7 @@ def _on_login_successful(self): raise ValueError('Login failed.') self.logged_in = True self.accept() - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.error(str(e)) self.core.lgd.invalidate_userdata() self.ui.next_button.setEnabled(False) diff --git a/rare/components/dialogs/login/browser_login.py b/rare/components/dialogs/login/browser_login.py index bc64a9f5d..abb4f6017 100644 --- a/rare/components/dialogs/login/browser_login.py +++ b/rare/components/dialogs/login/browser_login.py @@ -69,7 +69,7 @@ def do_login(self) -> None: if self.core.auth_code(auth_code): self.logger.info('Successfully logged in as %s', self.core.lgd.userdata['displayName']) self.success.emit() - except Exception as e: + except Exception as e: # noqa: BLE001 msg = e.message if isinstance(e, LgndrException) else str(e) self.ui.status_field.setText(self.tr('Login failed: {}').format(msg)) self.logger.error('Failed to login through browser') @@ -96,7 +96,7 @@ def _on_open_browser(self): self.core.auth_ex_token(out) self.logger.info('Successfully logged in as %s', {self.core.lgd.userdata['displayName']}) self.success.emit() - except Exception as e: + except Exception as e: # noqa: BLE001 msg = e.message if isinstance(e, LgndrException) else str(e) self.ui.status_field.setText(self.tr('Login failed: {}').format(msg)) self.logger.error('Failed to login through browser') diff --git a/rare/components/dialogs/login/import_login.py b/rare/components/dialogs/login/import_login.py index dc13abb84..2959c4c02 100644 --- a/rare/components/dialogs/login/import_login.py +++ b/rare/components/dialogs/login/import_login.py @@ -99,7 +99,7 @@ def do_login(self) -> None: if self.core.auth_import(): self.logger.info('Logged in as %s', {self.core.lgd.userdata['displayName']}) self.success.emit() - except Exception as e: + except Exception as e: # noqa: BLE001 msg = e.message if isinstance(e, LgndrException) else str(e) self.ui.status_field.setText(self.tr('Login failed: {}').format(msg)) self.logger.warning('Failed to import existing session') diff --git a/rare/components/dialogs/move.py b/rare/components/dialogs/move.py index 0a608c5eb..8021e74b6 100644 --- a/rare/components/dialogs/move.py +++ b/rare/components/dialogs/move.py @@ -1,6 +1,6 @@ import os -from PySide6.QtCore import QSignalBlocker, QThreadPool, Signal, Slot +from PySide6.QtCore import QSignalBlocker, Signal, Slot from PySide6.QtGui import QFont, QShowEvent, Qt from PySide6.QtWidgets import QFileDialog, QFormLayout, QLabel, QWidget diff --git a/rare/components/tabs/__init__.py b/rare/components/tabs/__init__.py index 6c9354511..63854a8f5 100644 --- a/rare/components/tabs/__init__.py +++ b/rare/components/tabs/__init__.py @@ -130,7 +130,7 @@ def _on_update_available(self): @Slot() @Slot(str) - def show_import(self, app_name: str = None): + def show_import(self, app_name: str | None = None): self.setCurrentWidget(self.integrations_tab) self.integrations_tab.show_import(app_name) diff --git a/rare/components/tabs/downloads/thread.py b/rare/components/tabs/downloads/thread.py index 25a669f14..4d82d29cd 100644 --- a/rare/components/tabs/downloads/thread.py +++ b/rare/components/tabs/downloads/thread.py @@ -90,7 +90,7 @@ def run(self): self.item.download.dlm.signals_queue.put(self.dlm_signals, block=False, timeout=1.0) time.sleep(self.item.download.dlm.update_interval / 10) self.item.download.dlm.join() - except Exception as e: + except Exception as e: # noqa: BLE001 self.kill() self.item.download.dlm.join() end_t = time.time() diff --git a/rare/components/tabs/integrations/__init__.py b/rare/components/tabs/integrations/__init__.py index 45b7ad115..9254235b0 100644 --- a/rare/components/tabs/integrations/__init__.py +++ b/rare/components/tabs/integrations/__init__.py @@ -47,7 +47,7 @@ def __init__(self, rcore: RareCore, parent=None): self.setCurrentIndex(self.import_index) - def show_import(self, app_name: str = None): + def show_import(self, app_name: str | None = None): self.setCurrentIndex(self.import_index) self.import_group.set_game(app_name) diff --git a/rare/components/tabs/integrations/import_group.py b/rare/components/tabs/integrations/import_group.py index 2c80557de..498395d56 100644 --- a/rare/components/tabs/integrations/import_group.py +++ b/rare/components/tabs/integrations/import_group.py @@ -76,7 +76,7 @@ def __init__( self, core: LegendaryCore, path: str, - app_name: str = None, + app_name: str | None = None, platform: str | None = None, import_folder: bool = False, import_dlcs: bool = False, @@ -113,7 +113,7 @@ def run(self) -> None: self.signals.disconnect(self.signals) self.signals.deleteLater() - def _try_import(self, path: Path, app_name: str = None) -> ImportedGame: + def _try_import(self, path: Path, app_name: str | None = None) -> ImportedGame: result = ImportedGame(ImportResult.ERROR) result.path = str(path) if app_name or (app_name := find_app_name(self.core, str(path))): diff --git a/rare/components/tabs/integrations/ubisoft_group.py b/rare/components/tabs/integrations/ubisoft_group.py index a64daee56..f444e4f26 100644 --- a/rare/components/tabs/integrations/ubisoft_group.py +++ b/rare/components/tabs/integrations/ubisoft_group.py @@ -56,7 +56,7 @@ def run_real(self) -> None: entitlements = {i['entitlementName'] for i in entitlements} self.signals.result.emit(redeemed, entitlements, ubi_account_id) - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.error(e) self.signals.result.emit(set(), set(), 'error') @@ -81,7 +81,7 @@ def run_real(self) -> None: try: self.core.egs.store_claim_uplay_code(self.ubi_account_id, self.partner_link_id) self.core.egs.store_redeem_uplay_codes(self.ubi_account_id) - except Exception as e: + except Exception as e: # noqa: BLE001 self.signals.linked.emit(str(e)) return else: diff --git a/rare/components/tabs/library/__init__.py b/rare/components/tabs/library/__init__.py index 582e8f677..15bea71ac 100644 --- a/rare/components/tabs/library/__init__.py +++ b/rare/components/tabs/library/__init__.py @@ -114,7 +114,7 @@ def setup_game_list(self): def add_library_widget(self, rgame: RareGame): try: widget = self.library_controller.add_game(rgame) - except Exception as e: + except Exception as e: # noqa: BLE001 logger.error('Could not add widget for %s to library: %s', rgame.app_name, e) return None widget.show_info.connect(self.show_game_info) diff --git a/rare/components/tabs/library/details/cloud.py b/rare/components/tabs/library/details/cloud.py index ec8c4234c..9748fba8a 100644 --- a/rare/components/tabs/library/details/cloud.py +++ b/rare/components/tabs/library/details/cloud.py @@ -123,7 +123,7 @@ def _compute_save_path(self): new_path = self.core.get_save_path(self.rgame.app_name) if platform.system() != 'Windows' and not os.path.exists(new_path): raise ValueError(f'Path "{new_path}" does not exist.') - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.warning(str(e)) resolver = WineSavePathResolver(self.core, self.rgame) # if not resolver.environ.get("WINEPREFIX"): diff --git a/rare/components/tabs/library/details/details.py b/rare/components/tabs/library/details/details.py index db9e0446f..073d72ec7 100644 --- a/rare/components/tabs/library/details/details.py +++ b/rare/components/tabs/library/details/details.py @@ -2,6 +2,7 @@ import platform from hashlib import sha1 from logging import getLogger +from typing import ClassVar from PySide6.QtCore import ( QCoreApplication, @@ -531,7 +532,7 @@ def __init__(self, manager: QRequests, achievement: dict, parent=None): class GameTagCheckBox(QCheckBox): checkStateChangedData = Signal(Qt.CheckState, str) - tag_translations = { + tag_translations: ClassVar[dict] = { 'backlog': QCoreApplication.translate('GameTagCheckBox', 'Backlog', None), 'completed': QCoreApplication.translate('GameTagCheckBox', 'Completed', None), 'favorite': QCoreApplication.translate('GameTagCheckBox', 'Favorite', None), @@ -593,19 +594,19 @@ def __init__(self, rgame: RareGame, tags: tuple[str, ...], parent=None): self.accept_button.setIcon(qta_icon('fa.edit', 'fa5s.edit')) self.accept_button.setEnabled(False) - self.tags = tags - self.result: tuple = (False, '') + self._tags = tags + self._result: tuple[bool, str] = False, '' @Slot(str) def __on_text_changed(self, text: str): - enabled = all((bool(text), len(text) > 4, text not in self.tags)) + enabled = all((bool(text), len(text) > 4, text not in self._tags)) self.accept_button.setEnabled(enabled) def done_handler(self): - self.result_ready.emit(*self.result) + self.result_ready.emit(*self._result) def accept_handler(self): - self.result = (True, self.line_edit.text()) + self._result = True, self.line_edit.text() def reject_handler(self): - self.result = (False, self.line_edit.text()) + self._result = False, self.line_edit.text() diff --git a/rare/components/tabs/library/details/game.py b/rare/components/tabs/library/details/game.py index f2ce2f4d1..f8ac3acd0 100644 --- a/rare/components/tabs/library/details/game.py +++ b/rare/components/tabs/library/details/game.py @@ -112,7 +112,7 @@ def _override_exe_edit_callback(self, path: str) -> tuple[bool, str, int]: if not os.path.exists(path): return False, path, IndicatorReasonsCommon.WRONG_PATH - if not path.endswith(tuple(map(lambda s: s.replace('*', ''), self.override_exe_name_filters))): + if not path.endswith(tuple(s.replace('*', '') for s in self.override_exe_name_filters)): return False, path, IndicatorReasonsCommon.WRONG_PATH path = os.path.relpath(path, self.igame.install_path) return True, path, IndicatorReasonsCommon.VALID diff --git a/rare/components/tabs/library/head_bar.py b/rare/components/tabs/library/head_bar.py index 6482f47dd..60eff891c 100644 --- a/rare/components/tabs/library/head_bar.py +++ b/rare/components/tabs/library/head_bar.py @@ -141,7 +141,7 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): def __game_tags_updated(self): if self.search_bar.completer(): self.search_bar.completer().deleteLater() - wordlist = tuple(map(lambda x: '::' + x, self.rcore.game_tags)) + wordlist = tuple('::' + x for x in self.rcore.game_tags) completer = QCompleter(wordlist, self.search_bar) completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) self.search_bar.setCompleter(completer) diff --git a/rare/components/tabs/library/widgets/__init__.py b/rare/components/tabs/library/widgets/__init__.py index 0af343c95..f29608d53 100644 --- a/rare/components/tabs/library/widgets/__init__.py +++ b/rare/components/tabs/library/widgets/__init__.py @@ -1,5 +1,5 @@ from abc import abstractmethod -from typing import TypeVar +from typing import ClassVar, TypeVar from PySide6.QtCore import QObject, Qt, Slot from PySide6.QtWidgets import QScrollArea, QVBoxLayout, QWidget @@ -25,7 +25,7 @@ def _add_widget(self, widget_type: type[ViewWidget], rgame: RareGame) -> ViewWid self.layout().addWidget(widget) return widget - __is_visible = { + __is_visible: ClassVar[dict ]= { LibraryFilter.HIDDEN: lambda x: 'hidden' in x.metadata.tags, LibraryFilter.FAVORITES: lambda x: 'favorite' in x.metadata.tags, LibraryFilter.INSTALLED: lambda x: x.is_installed and not x.is_unreal and 'hidden' not in x.metadata.tags, diff --git a/rare/components/tabs/library/widgets/library_widget.py b/rare/components/tabs/library/widgets/library_widget.py index 815b97af6..7a0eef386 100644 --- a/rare/components/tabs/library/widgets/library_widget.py +++ b/rare/components/tabs/library/widgets/library_widget.py @@ -58,10 +58,10 @@ def calculateColors(image: QImage) -> tuple[QColor, QColor]: origin_h = (image.height() - min_d) // 2 for x, y in zip(range(origin_w, min_d), range(origin_h, min_d), strict=False): pixel = image.pixelColor(x, y).getRgb() - color = list(map(lambda t: sum(t) // 2, zip(pixel[:3], color, strict=False))) + color = [sum(t) // 2 for t in zip(pixel[:3], color, strict=False)] # take the V component of the HSV color fg_color = QColor(0, 0, 0) if QColor(*color).value() < 127 else QColor(255, 255, 255) - bg_color = QColor(*map(lambda c: 255 - c, color)) + bg_color = QColor(*(255 - c for c in color)) return bg_color, fg_color def setStyleSheetColors(self, bg: QColor, fg: QColor, brd: QColor): diff --git a/rare/components/tabs/settings/about.py b/rare/components/tabs/settings/about.py index 5c316ded3..a7bb085be 100644 --- a/rare/components/tabs/settings/about.py +++ b/rare/components/tabs/settings/about.py @@ -15,7 +15,7 @@ def versiontuple(v) -> tuple[int, ...]: try: return tuple(map(int, (v.split('.')))) - except Exception as e: + except Exception as e: # noqa: BLE001 logger.error('Error while parsing version %s', v) logger.error(e) return 99, 99, 99, 999 diff --git a/rare/components/tabs/settings/compat.py b/rare/components/tabs/settings/compat.py index f2e69a351..92ba258fa 100644 --- a/rare/components/tabs/settings/compat.py +++ b/rare/components/tabs/settings/compat.py @@ -32,7 +32,7 @@ def __init__( dxvk_config_widget: type[DxvkConfigSettings], dxvk_nvapi_drs_widget: type[DxvkNvapiDrsSettings], runner_widget: type['RunnerSettingsType'], - mangohud_widget: type['MangoHudSettings'] = None, + mangohud_widget: type['MangoHudSettings'] | None = None, parent=None, ): super(CompatSettingsBase, self).__init__(parent=parent) diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index 4c37bb096..44af603d9 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -157,7 +157,7 @@ def __locale_edit_callback(text: str) -> tuple[bool, str, int]: if text: if re.match('^[a-zA-Z]{2,3}[-_][a-zA-Z]{2,3}$', text): language, country = text.split('-' if '-' in text else '_') - text = '-'.join([language.lower(), country.upper()]) + text = f'{language.lower()}-{country.upper()}' if bool(re.match('^[a-z]{2,3}-[A-Z]{2,3}$', text)): return True, text, IndicatorReasonsCommon.VALID else: diff --git a/rare/components/tabs/settings/widgets/envvars.py b/rare/components/tabs/settings/widgets/envvars.py index 2f3a1f310..ac5689ca3 100644 --- a/rare/components/tabs/settings/widgets/envvars.py +++ b/rare/components/tabs/settings/widgets/envvars.py @@ -74,7 +74,7 @@ def __key(self, index: QModelIndex | int): index = index.row() try: return list(self.__data_map)[index] - except Exception: + except Exception: # noqa: BLE001 return '' def __is_local(self, index: QModelIndex | int): diff --git a/rare/components/tabs/settings/widgets/launch.py b/rare/components/tabs/settings/widgets/launch.py index 72f68a98b..148e2515a 100644 --- a/rare/components/tabs/settings/widgets/launch.py +++ b/rare/components/tabs/settings/widgets/launch.py @@ -127,7 +127,7 @@ def _prelaunch_changed(self): return command = shlex.quote(command) arguments = self.prelaunch_args.text().strip() - config.adjust_option(self.app_name, 'pre_launch_command', ' '.join([command, arguments])) + config.adjust_option(self.app_name, 'pre_launch_command', f'{command} {arguments}') @Slot(Qt.CheckState) def _lgd_wrapper_check_changed(self, state: Qt.CheckState): diff --git a/rare/components/tabs/settings/widgets/overlay.py b/rare/components/tabs/settings/widgets/overlay.py index 6b38c6f00..4bf3647b6 100644 --- a/rare/components/tabs/settings/widgets/overlay.py +++ b/rare/components/tabs/settings/widgets/overlay.py @@ -61,7 +61,7 @@ def __init__( title: str, desc: str = '', default_enabled: bool = False, - values: tuple = None, + values: tuple | None = None, parent=None, ): self.option = option @@ -101,7 +101,7 @@ def __init__(self, option: str, placeholder: str, parent=None): class OverlayNumberInput(OverlayLineEdit): - def __init__(self, option: str, placeholder: int | float, parent=None): + def __init__(self, option: str, placeholder: float, parent=None): super().__init__(option, str(placeholder), parent=parent) validator = QDoubleValidator(self) if isinstance(placeholder, float) else QIntValidator(self) self.setValidator(validator) @@ -177,28 +177,25 @@ def setupWidget( self.ui.overlay_state_label.setText(label) - for idx, widget in enumerate(grid_map): - widget.setParent(self.ui.options_group) - self.ui.options_grid.addWidget(widget, idx // self.grid_row_items, idx % self.grid_row_items) - # self.checkboxes[widget.option] = widget - self.option_widgets.append(widget) - widget.stateChanged.connect(self._update_settings) + for idx, w in enumerate(grid_map): + w.setParent(self.ui.options_group) + self.ui.options_grid.addWidget(w, idx // self.grid_row_items, idx % self.grid_row_items) + self.option_widgets.append(w) + w.stateChanged.connect(self._update_settings) self.ui.options_grid.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) - for widget, label in left_form_map: - widget.setParent(self.ui.options_group) - self.ui.left_options_form.addRow(label, widget) - # self.values[widget.option] = widget - self.option_widgets.append(widget) - widget.valueChanged.connect(self._update_settings) + for w, _label in left_form_map: + w.setParent(self.ui.options_group) + self.ui.left_options_form.addRow(_label, w) + self.option_widgets.append(w) + w.valueChanged.connect(self._update_settings) self.ui.left_options_form.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) - for widget, label in right_form_map: - widget.setParent(self.ui.options_group) - self.ui.right_options_form.addRow(label, widget) - # self.values[widget.option] = widget - self.option_widgets.append(widget) - widget.valueChanged.connect(self._update_settings) + for w, _label in right_form_map: + w.setParent(self.ui.options_group) + self.ui.right_options_form.addRow(_label, w) + self.option_widgets.append(w) + w.valueChanged.connect(self._update_settings) self.ui.right_options_form.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) self.ui.options_layout.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) @@ -521,7 +518,6 @@ def update_settings_override(self, state: ActivationStates): # pylint: disable= from PySide6.QtWidgets import QApplication, QDialog, QVBoxLayout - global config config = Namespace() def get_envvar(x, y, fallback): diff --git a/rare/components/tabs/settings/widgets/proton.py b/rare/components/tabs/settings/widgets/proton.py index 3230c55e9..2379710c9 100644 --- a/rare/components/tabs/settings/widgets/proton.py +++ b/rare/components/tabs/settings/widgets/proton.py @@ -152,7 +152,7 @@ def _on_tool_changed(self, index: int): if self.app_name != 'default' and (install_path := self.rcore.get_game(self.app_name).install_path): game_library = os.path.dirname(install_path) library_paths = ( - ':'.join([library_paths, game_library]) if library_paths else game_library + f'{library_paths}:{game_library}' if library_paths else game_library ) # https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/steam-compat-tool-interface.md#non-steam-games steam_environ['STEAM_COMPAT_INSTALL_PATH'] = install_path diff --git a/rare/components/tabs/settings/widgets/runner.py b/rare/components/tabs/settings/widgets/runner.py index 005f19a3f..e61bf1581 100644 --- a/rare/components/tabs/settings/widgets/runner.py +++ b/rare/components/tabs/settings/widgets/runner.py @@ -28,7 +28,7 @@ def __init__( settings: RareAppSettings, rcore: RareCore, wine_widget: type['WineSettings'], - proton_widget: type['ProtonSettings'] = None, + proton_widget: type['ProtonSettings'] | None = None, parent=None, ): super().__init__(parent=parent) diff --git a/rare/components/tabs/store/api/models/query.py b/rare/components/tabs/store/api/models/query.py index 90b5f6378..0e4392457 100644 --- a/rare/components/tabs/store/api/models/query.py +++ b/rare/components/tabs/store/api/models/query.py @@ -4,8 +4,8 @@ @dataclass class SearchDateRange: - start_date: datetime = datetime(year=1990, month=1, day=1, tzinfo=timezone.utc) - end_date: datetime = datetime.now(timezone.utc) + start_date: datetime = field(default_factory=lambda: datetime(year=1990, month=1, day=1, tzinfo=timezone.utc)) + end_date: datetime = field(default_factory=lambda: datetime.now(tz=timezone.utc)) def __str__(self): def fmt_date(date: datetime) -> str: diff --git a/rare/components/tabs/store/api/models/response.py b/rare/components/tabs/store/api/models/response.py index 2e4f16ed1..2a9a3569f 100644 --- a/rare/components/tabs/store/api/models/response.py +++ b/rare/components/tabs/store/api/models/response.py @@ -88,9 +88,9 @@ def for_dimensions(self, w: int, h: int) -> ImageUrlModel: else: model = self.available_tall()[0] _ = model.url - except Exception as e: + except Exception as e: # noqa: BLE001 logger.error(e) - logger.error(tuple(map(lambda x: x.as_dict(), self.key_images))) + logger.error(tuple(x.as_dict() for x in self.key_images)) else: return model diff --git a/rare/components/tabs/store/landing.py b/rare/components/tabs/store/landing.py index c1e72a26a..d40dc64dc 100644 --- a/rare/components/tabs/store/landing.py +++ b/rare/components/tabs/store/landing.py @@ -121,7 +121,7 @@ def _update_wishlist_discounts(self, wishlist: list[WishlistItemModel]): w = StoreItemWidget(self.api.cached_manager, item.offer) w.show_details.connect(self.show_details) self.discounts_group.layout().addWidget(w) - have_discounts = any(map(lambda x: bool(x.offer.price.totalPrice.discount), wishlist)) + have_discounts = any(bool(x.offer.price.totalPrice.discount) for x in wishlist) self.discounts_group.setVisible(have_discounts) self.discounts_group.loading(False) diff --git a/rare/components/tabs/store/search.py b/rare/components/tabs/store/search.py index 626c60135..e74adea05 100644 --- a/rare/components/tabs/store/search.py +++ b/rare/components/tabs/store/search.py @@ -169,7 +169,7 @@ def reset_filters(self): def prepare_request( self, - price: str = None, + price: str | None = None, added_tag: int = 0, removed_tag: int = 0, added_type: str = '', diff --git a/rare/components/tabs/store/store_api.py b/rare/components/tabs/store/store_api.py index f7f8cb02e..a14d18215 100644 --- a/rare/components/tabs/store/store_api.py +++ b/rare/components/tabs/store/store_api.py @@ -44,7 +44,7 @@ def __init__(self, token, language: str, country: str, installed): self.installed = installed self.browse_active = False - self.next_browse_request = tuple(()) + self.next_browse_request = () def get_free(self, callback: Callable): url = 'https://store-site-backend-static-ipv4.ak.epicgames.com/freeGamesPromotions' @@ -64,7 +64,7 @@ def __handle_free_games(self, data, callback: Callable): elements = response.data.catalog.searchStore.elements except (Exception, AttributeError, KeyError) as e: if DEBUG(): - raise e + raise elements = False self.logger.error('Free games request failed with: %s', e) callback(elements) @@ -92,7 +92,7 @@ def __handle_wishlist(self, data, callback: Callable[[tuple], None]): elements = response.data.wishlist.wishlistItems.elements except (Exception, AttributeError, KeyError) as e: if DEBUG(): - raise e + raise elements = False self.logger.error('Wishlist request failed with: %s', e) callback(elements) @@ -126,7 +126,7 @@ def __handle_search(self, data, callback: Callable[[tuple], None]): elements = response.data.catalog.searchStore.elements except (Exception, AttributeError, KeyError) as e: if DEBUG(): - raise e + raise elements = False self.logger.error('Search request failed with: %s', e) callback(elements) @@ -156,13 +156,13 @@ def __handle_browse_games(self, data, callback): elements = response.data.catalog.searchStore.elements except (Exception, AttributeError, KeyError) as e: if DEBUG(): - raise e + raise elements = False self.logger.error('Browse request failed with: %s', e) callback(elements) else: self.browse_games(*self.next_browse_request) # pylint: disable=E1120 - self.next_browse_request = tuple(()) + self.next_browse_request = () # def get_game_config_graphql(self, namespace: str, callback): # payload = { @@ -190,7 +190,7 @@ def __handle_get_game(self, data, callback): callback(product) except Exception as e: if DEBUG(): - raise e + raise self.logger.error(str(e)) # callback({}) @@ -220,7 +220,7 @@ def _handle_add_to_wishlist(self, data, callback): success = response.data.wishlist.addToWishlist.success except Exception as e: if DEBUG(): - raise e + raise self.logger.error('Add to wishlist request failed with: %s', e) success = False callback(success) @@ -250,7 +250,7 @@ def _handle_remove_from_wishlist(self, data, callback): success = response.data.wishlist.removeFromWishlist.success except Exception as e: if DEBUG(): - raise e + raise self.logger.error('Remove from wishlist request failed with: %s', e) success = False callback(success) diff --git a/rare/components/tabs/store/widgets/details.py b/rare/components/tabs/store/widgets/details.py index 36f4efe3b..0abd13753 100644 --- a/rare/components/tabs/store/widgets/details.py +++ b/rare/components/tabs/store/widgets/details.py @@ -141,14 +141,10 @@ def add_to_wishlist(self): ) def data_received(self, product: DieselProduct): - try: - if product.pages: - product_data: DieselProductDetail = product.pages[0].data - else: - product_data: DieselProductDetail = product.data - except Exception as e: - raise e - logger.error(str(e)) + if product.pages: + product_data: DieselProductDetail = product.pages[0].data + else: + product_data: DieselProductDetail = product.data self.ui.original_price.setFont(self.font()) price = self.catalog_offer.price.totalPrice.fmtPrice['originalPrice'] @@ -218,7 +214,7 @@ def data_received(self, product: DieselProduct): else: try: icn = qta_icon(f'mdi.{name}', f'fa5b.{name}', scale_factor=1.2) - except Exception as e: + except Exception as e: # noqa: BLE001 logger.error(str(e)) continue diff --git a/rare/components/tabs/store/wishlist.py b/rare/components/tabs/store/wishlist.py index 2f7632336..278ec3244 100644 --- a/rare/components/tabs/store/wishlist.py +++ b/rare/components/tabs/store/wishlist.py @@ -1,4 +1,5 @@ from enum import IntEnum +from typing import ClassVar from PySide6.QtCore import Qt, Signal, Slot from PySide6.QtGui import QShowEvent @@ -126,10 +127,10 @@ def filter_wishlist(self, index: int = int(WishlistFilter.NONE)): w.setVisible(bool(w.catalog_game.price.totalPrice.discount)) else: w.setVisible(True) - have_visible = any(map(lambda x: x.isVisible(), widgets)) + have_visible = any(x.isVisible() for x in widgets) self.ui.no_games_label.setVisible(not have_visible) - __ordering = { + __ordering: ClassVar[dict] = { WishlistOrder.NAME: lambda x: x.catalog_game.title, WishlistOrder.PRICE: lambda x: x.catalog_game.price.totalPrice.discountPrice, WishlistOrder.DEVELOPER: lambda x: x.catalog_game.seller['name'], @@ -154,7 +155,7 @@ def _on_reverse_changed(self, state: Qt.CheckState): self.order_wishlist(self.ui.order_combo.currentIndex()) @Slot(object) - def set_wishlist(self, wishlist: list[WishlistItemModel] = None): + def set_wishlist(self, wishlist: list[WishlistItemModel] | None = None): if wishlist and wishlist[0] == 'error': return diff --git a/rare/components/tabs/tab_widgets.py b/rare/components/tabs/tab_widgets.py index 4ac53973e..743455f8d 100644 --- a/rare/components/tabs/tab_widgets.py +++ b/rare/components/tabs/tab_widgets.py @@ -20,8 +20,8 @@ def tabSizeHint(self, index): size = super(MainTabBar, self).tabSizeHint(index) if index == self.expanded_idx: offset = self.width() - for index in range(self.count()): - offset -= super(MainTabBar, self).tabSizeHint(index).width() + for tab_index in range(self.count()): + offset -= super(MainTabBar, self).tabSizeHint(tab_index).width() size.setWidth(max(size.width(), size.width() + offset)) return size diff --git a/rare/lgndr/glue/monkeys.py b/rare/lgndr/glue/monkeys.py index 2ef81d9ba..b523f95b0 100644 --- a/rare/lgndr/glue/monkeys.py +++ b/rare/lgndr/glue/monkeys.py @@ -4,8 +4,6 @@ from rare.lgndr.models.downloading import UIUpdate -logger = logging.getLogger("LgndrMonkeys") - class GetBooleanChoiceProtocol(Protocol): def __call__(self, prompt: str, default: bool = ...) -> bool: @@ -13,6 +11,7 @@ def __call__(self, prompt: str, default: bool = ...) -> bool: def get_boolean_choice_factory(value: bool = True) -> GetBooleanChoiceProtocol: + logger = logging.getLogger("LgndrMonkeys") def get_boolean_choice(prompt: str, default: bool = value) -> bool: logger.debug("get_boolean_choice: %s, default: %s, choice: %s", prompt, default, value) return value @@ -25,6 +24,7 @@ def __call__(self, sdl_data: Dict, title: str) -> List[str]: def sdl_prompt_factory(install_tag: Optional[List[str]] = None) -> SdlPromptProtocol: + logger = logging.getLogger("LgndrMonkeys") def sdl_prompt(sdl_data: Dict, title: str) -> List[str]: logger.debug("sdl_prompt: %s", title) for key in sdl_data.keys(): @@ -40,7 +40,8 @@ def __call__(self, a0: int, a1: int, a2: float, a3: float) -> None: ... -def verify_stdout_factory(callback: VerifyStdoutProtocol = None) -> VerifyStdoutProtocol: +def verify_stdout_factory(callback: VerifyStdoutProtocol | None = None) -> VerifyStdoutProtocol: + logger = logging.getLogger("LgndrMonkeys") def verify_stdout(a0: int, a1: int, a2: float, a3: float) -> None: if callback is not None and callable(callback): callback(a0, a1, a2, a3) @@ -54,7 +55,8 @@ def __call__(self, status: UIUpdate) -> None: ... -def ui_update_factory(callback: UiUpdateProtocol = None) -> UiUpdateProtocol: +def ui_update_factory(callback: UiUpdateProtocol | None = None) -> UiUpdateProtocol: + logger = logging.getLogger("LgndrMonkeys") def ui_update(status: UIUpdate) -> None: if callback is not None and callable(callback): callback(status) @@ -112,7 +114,7 @@ def __str__(self): class LgndrIndirectLogger: def __init__( - self, status: LgndrIndirectStatus, logger: logging.Logger = None, level: int = logging.ERROR + self, status: LgndrIndirectStatus, logger: logging.Logger | None = None, level: int = logging.ERROR ): self.logger = logger self.level = level diff --git a/rare/main.py b/rare/main.py index b713d2f7b..6c094f02c 100755 --- a/rare/main.py +++ b/rare/main.py @@ -1,3 +1,5 @@ +#!/usr/bin/python3 + import multiprocessing import os import pathlib @@ -23,7 +25,7 @@ def main() -> int: # execute the incoming command instead of Rare itself. if 'MULTIPROCESSING_LAUNCH_TOKEN' in os.environ: if len(sys.argv) == 5 and sys.argv[1:4] == ['-S', '-s', '-c']: - exec(sys.argv[4]) + exec(sys.argv[4]) # noqa: S102 return 0 os.environ['MULTIPROCESSING_LAUNCH_TOKEN'] = '1' diff --git a/rare/models/game_slim.py b/rare/models/game_slim.py index ab926358b..a6c640b0e 100644 --- a/rare/models/game_slim.py +++ b/rare/models/game_slim.py @@ -282,7 +282,7 @@ def upload_saves(self): return self.state = RareGameSlim.State.SYNCING - status, (dt_local, dt_remote) = self.save_game_state + status, (dt_local, _dt_remote) = self.save_game_state if status == SaveGameStatus.NO_SAVE or not dt_local: self.logger.warning("Can't upload missing save") self.state = RareGameSlim.State.IDLE @@ -306,7 +306,7 @@ def download_saves(self): return self.state = RareGameSlim.State.SYNCING - status, (dt_local, dt_remote) = self.save_game_state + status, (_dt_local, dt_remote) = self.save_game_state if status == SaveGameStatus.NO_SAVE or not dt_remote: self.logger.error("Can't download missing save") self.state = RareGameSlim.State.IDLE diff --git a/rare/models/pathspec.py b/rare/models/pathspec.py index af90ee52e..257200c32 100644 --- a/rare/models/pathspec.py +++ b/rare/models/pathspec.py @@ -42,7 +42,7 @@ def wine_egl_prefixes(results: int = 0) -> list[str] | str: else: return prefixes[:results] - def __init__(self, core: LegendaryCore = None, igame: InstalledGame = None): + def __init__(self, core: LegendaryCore | None = None, igame: InstalledGame | None = None): self.__egl_path_vars = { '{appdata}': os.path.expandvars('%LOCALAPPDATA%'), '{userdir}': os.path.expandvars('%USERPROFILE%/Documents'), @@ -56,6 +56,6 @@ def __init__(self, core: LegendaryCore = None, igame: InstalledGame = None): if igame is not None: self.__egl_path_vars['{installdir}'] = igame.install_path - def resolve_egl_path_vars(self, path: str) -> str | bytes: - cooked_path = (self.__egl_path_vars.get(p.lower(), p) for p in path.split('/')) + def resolve_egl_path_vars(self, path: str) -> str: + cooked_path = [self.__egl_path_vars.get(p.lower(), p) for p in path.split('/')] return os.path.join(*cooked_path) diff --git a/rare/models/settings.py b/rare/models/settings.py index 831d2aaba..27dd795f0 100644 --- a/rare/models/settings.py +++ b/rare/models/settings.py @@ -82,19 +82,19 @@ def instance() -> 'RareAppSettings': raise RuntimeError('Uninitialized use of RareSettings') return RareAppSettings.__instance - def get_value(self, option: Setting, prefix: str = None) -> Any: + def get_value(self, option: Setting, prefix: str | None = None) -> Any: if prefix: return self.value(f'{prefix}/{option.key}', defaultValue=option.default, type=option.dtype) else: return self.value(option.key, defaultValue=option.default, type=option.dtype) - def set_value(self, option: Setting, value: Any, prefix: str = None) -> None: + def set_value(self, option: Setting, value: Any, prefix: str | None = None) -> None: if prefix: self.setValue(f'{prefix}/{option.key}', option.dtype(value)) else: self.setValue(option.key, option.dtype(value)) - def rem_value(self, option: Setting, prefix: str = None) -> None: + def rem_value(self, option: Setting, prefix: str | None = None) -> None: if prefix: self.remove(f'{prefix}/{option.key}') else: @@ -117,10 +117,10 @@ def deleteLater(self): __all__ = [ - 'app_settings', - 'RareAppSettings', + 'DiscordRPCMode', 'LibraryFilter', 'LibraryOrder', 'LibraryView', - 'DiscordRPCMode', + 'RareAppSettings', + 'app_settings', ] diff --git a/rare/models/steam.py b/rare/models/steam.py index 3f6867df2..b614198bf 100644 --- a/rare/models/steam.py +++ b/rare/models/steam.py @@ -38,14 +38,14 @@ def last_login(self) -> datetime: @property def __dict__(self): - return dict( - long_id=self.long_id, - short_id=self.short_id, - account_name=self.account_name, - persona_name=self.persona_name, - most_recent=self.most_recent, - last_login=self.last_login, - ) + return { + 'long_id': self.long_id, + 'short_id': self.short_id, + 'account_name': self.account_name, + 'persona_name': self.persona_name, + 'most_recent': self.most_recent, + 'last_login': self.last_login, + } def __repr__(self): return repr(vars(self)) @@ -148,9 +148,9 @@ def last_played(self): @property def __dict__(self): - ret = dict( - shortcut_appid=self.shortcut_appid(), - grid_appid=self.coverart_appid(), - last_played=self.last_played, - ) + ret = { + 'shortcut_appid': self.shortcut_appid(), + 'grid_appid': self.coverart_appid(), + 'last_played': self.last_played, + } return ret diff --git a/rare/models/wrapper.py b/rare/models/wrapper.py index 7a1ba45f7..a89b05a24 100644 --- a/rare/models/wrapper.py +++ b/rare/models/wrapper.py @@ -15,7 +15,7 @@ class Wrapper: def __init__( self, command: str | list[str], - name: str = None, + name: str | None = None, wtype: WrapperType = None, enabled: bool = True, ): @@ -84,4 +84,4 @@ def from_dict(cls, data: dict): @property def __dict__(self): - return dict(command=self.__command, name=self.__name, wtype=int(self.__wtype)) + return {'command': self.__command, 'name': self.__name, 'wtype': int(self.__wtype)} diff --git a/rare/resources/__init__.py b/rare/resources/__init__.py index 7b08215d2..3977556f1 100644 --- a/rare/resources/__init__.py +++ b/rare/resources/__init__.py @@ -1,7 +1,4 @@ -import rare.resources.resources as resources - # Static QSS independent of application style/colorsheme -import rare.resources.static_css as static_css -import rare.resources.stylesheets as stylesheets +from rare.resources import resources, static_css, stylesheets __all__ = ['resources', 'static_css', 'stylesheets'] diff --git a/rare/resources/stylesheets/__init__.py b/rare/resources/stylesheets/__init__.py index 83846f620..5286d1047 100644 --- a/rare/resources/stylesheets/__init__.py +++ b/rare/resources/stylesheets/__init__.py @@ -1,4 +1,4 @@ -import rare.resources.stylesheets.RareStyle as RareStyle +from rare.resources.stylesheets import RareStyle # Incomplete # import rare.resources.stylesheets.ChildOfMetropolis as ChildOfMetropolis diff --git a/rare/shared/image_manager.py b/rare/shared/image_manager.py index b2a0a9e87..d7afb14ad 100644 --- a/rare/shared/image_manager.py +++ b/rare/shared/image_manager.py @@ -7,7 +7,7 @@ from logging import getLogger from multiprocessing import cpu_count from pathlib import Path -from typing import TYPE_CHECKING, Any +from typing import Any import requests from legendary.lfs.eos import EOSOverlayApp @@ -47,9 +47,6 @@ resources_path, ) -if TYPE_CHECKING: - pass - class ImageWorkerSignals(QObject): # object: Game @@ -247,7 +244,7 @@ def _download(self, updates: list, json_data: dict, game: Game) -> bool: } try: cache_data[image['type']] = requests.get(image['url'], params=payload, timeout=10).content - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.error(e) return False diff --git a/rare/shared/rare_core.py b/rare/shared/rare_core.py index 2acfd2259..b762731ce 100644 --- a/rare/shared/rare_core.py +++ b/rare/shared/rare_core.py @@ -100,7 +100,7 @@ def enqueue_worker(self, rgame: RareGame, worker: QueueWorker): self.workers_disk.append(worker) self.threadpool_disk.start(worker, priority=0) else: - raise RuntimeError(f'Cannot enqueue unkown worker type {type(worker).__name__}') + raise TypeError(f'Cannot enqueue unkown worker type {type(worker).__name__}') self.__signals.application.update_statusbar.emit() def _on_worker_finished(self, worker: QueueWorker): @@ -144,7 +144,7 @@ def signals(self, init: bool = False) -> GlobalSignals: self.__signals = GlobalSignals() return self.__signals - def args(self, args: Namespace = None) -> Namespace | None: + def args(self, args: Namespace | None = None) -> Namespace | None: if self.__args is None and args is None: raise RuntimeError('Uninitialized use of ArgumentsSingleton') if self.__args is not None and args is not None: @@ -182,7 +182,7 @@ def core(self, init: bool = False) -> LegendaryCore: self.__core.lgd.config.add_section(section) # Set some platform defaults if unset - def check_config(option: str, accepted: set = None) -> bool: + def check_config(option: str, accepted: set | None = None) -> bool: _exists = self.__core.lgd.config.has_option('Legendary', option) _value = self.__core.lgd.config.get('Legendary', option, fallback='') _accepted = _value in accepted if accepted is not None else True diff --git a/rare/shared/workers/fetch.py b/rare/shared/workers/fetch.py index f54a41bc9..830708247 100644 --- a/rare/shared/workers/fetch.py +++ b/rare/shared/workers/fetch.py @@ -44,24 +44,23 @@ def run_real(self): with timelogger(self.logger, 'Request Steam AppIds'): try: steam_grades.load_steam_appids() - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.warning(e) if not self.args.offline: self.signals.progress.emit(increment, self.signals.tr('Updating workarounds')) with timelogger(self.logger, 'Request workarounds'): try: workarounds.load_workarounds() - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.warning(e) if not self.args.offline: self.signals.progress.emit(increment, self.signals.tr('Updating workarounds')) with timelogger(self.logger, 'Request wrapper exe'): try: download_lgd_wrapper() - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.warning(e) self.signals.result.emit((), FetchWorker.Result.RUNTIMEASSETS) - return class GamesDlcsWorker(FetchWorker): @@ -132,7 +131,7 @@ def run_real(self): na_games, na_dlc_dict = ([], {}) # NOTE: This is here because of broken appIds from Epic # https://discord.com/channels/826881530310819914/884510635642216499/1111321692703305729 - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.error('General exception while updating non-asset games from EGS.') self.logger.error(e) na_games, na_dlc_dict = ([], {}) diff --git a/rare/shared/workers/move.py b/rare/shared/workers/move.py index a1a517f51..5bb3b06ca 100644 --- a/rare/shared/workers/move.py +++ b/rare/shared/workers/move.py @@ -177,7 +177,7 @@ def copy_with_progress(src, dst): key=lambda a: a.filename.lower(), ) if config_tags := self.core.lgd.config.get(self.rgame.app_name, 'install_tags', fallback=None): - install_tags = set(i.strip() for i in config_tags.split(',')) + install_tags = {i.strip() for i in config_tags.split(',')} file_list = [ (f.filename, f.sha_hash.hex()) for f in files diff --git a/rare/shared/workers/uninstall.py b/rare/shared/workers/uninstall.py index 146f4da91..399636d9a 100644 --- a/rare/shared/workers/uninstall.py +++ b/rare/shared/workers/uninstall.py @@ -48,7 +48,7 @@ def uninstall_game( for prefix, _ in prefixes: try: remove_registry_entries(prefix) - except Exception as e: + except Exception as e: # noqa: BLE001 logger.error('%s %s', e, prefix) logger.debug('Removed registry entries for prefix %s', prefix) else: diff --git a/rare/shared/workers/wine_resolver.py b/rare/shared/workers/wine_resolver.py index 81dc63279..45becfd5f 100644 --- a/rare/shared/workers/wine_resolver.py +++ b/rare/shared/workers/wine_resolver.py @@ -93,7 +93,6 @@ def run_real(self): path = self._resolve_unix_path(command, environ, self.path) self.signals.result_ready.emit(path, self.app_name) - return class WineSavePathResolver(WinePathResolver): @@ -115,7 +114,6 @@ def run_real(self): if os.path.exists(path): self.rgame.save_path = path self.signals.result_ready.emit(path, self.rgame.app_name) - return class OriginWineWorker(WinePathResolver): diff --git a/rare/shared/wrappers.py b/rare/shared/wrappers.py index 67ae27968..ba49bbea8 100644 --- a/rare/shared/wrappers.py +++ b/rare/shared/wrappers.py @@ -32,7 +32,7 @@ def from_dict(cls, data: dict): @property def __dict__(self): - return dict(checksum=self.__checksum, enabled=self.__enabled) + return {'checksum': self.__checksum, 'enabled': self.__enabled} # def __eq__(self, other) -> bool: # return self.checksum == other.checksum @@ -167,9 +167,7 @@ def __save_wrappers(self): from rare.utils.compat import steam - global config_dir config_dir = os.getcwd - global config config = Namespace() config.set_option = lambda x, y, z: print('set_option:', x, y, z) config.remove_option = lambda x, y: print('remove_option:', x, y) diff --git a/rare/utils/compat/miniproton.py b/rare/utils/compat/miniproton.py index aeaf69839..3015d5d28 100644 --- a/rare/utils/compat/miniproton.py +++ b/rare/utils/compat/miniproton.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 - +# noqa: EXE001 import os import subprocess import sys @@ -42,7 +42,7 @@ def run_proc(args: list, env: dict): 'd3d12': 'n,b;', 'd3d12core': 'n,b', } - dlloverrides = ';'.join(('='.join((k, v)) for k, v in dlls.items())) + dlloverrides = ';'.join((f'{k}={v}' for k, v in dlls.items())) dlloverrides = ';'.join((os.environ.get('WINEDLLOVERRIDES', ''), dlloverrides)) env = { diff --git a/rare/utils/compat/utils.py b/rare/utils/compat/utils.py index 8aae8e403..249de9a6c 100644 --- a/rare/utils/compat/utils.py +++ b/rare/utils/compat/utils.py @@ -107,7 +107,7 @@ def execute_qprocess(command: list[str], arguments: list[str], environment: Mapp def execute(command: list[str], arguments: list[str], environment: Mapping) -> tuple[str, str]: try: out, err = execute_qprocess(command, arguments, environment) - except Exception as e: + except Exception as e: # noqa: BLE001 out, err = '', str(e) return out, err diff --git a/rare/utils/compat/wine.py b/rare/utils/compat/wine.py index 2dd441ea6..7c9d37f56 100644 --- a/rare/utils/compat/wine.py +++ b/rare/utils/compat/wine.py @@ -36,7 +36,7 @@ class WineRunner: runtime: WineRuntime | None = None -def find_lutris_wines(runtime_path: str = None, wine_path: str = None) -> list[WineRunner]: +def find_lutris_wines(runtime_path: str | None = None, wine_path: str | None = None) -> list[WineRunner]: runners = [] if not runtime_path and not wine_path: return runners @@ -49,15 +49,15 @@ def __get_lib_path(executable: str, basename: str = '') -> str: lib64 = os.path.realpath(os.path.join(path, 'lib64', basename)) lib = os.path.realpath(os.path.join(path, 'lib', basename)) if lib32 == lib or not os.path.exists(lib32): - ldpath = ':'.join([lib64, lib]) + ldpath = f'{lib64}:{lib}' elif lib64 == lib or not os.path.exists(lib64): - ldpath = ':'.join([lib, lib32]) + ldpath = f'{lib}:{lib32}' else: ldpath = lib if os.path.exists(lib) else lib64 return ldpath -def get_wine_environment(executable: str = None, prefix: str = None) -> dict: +def get_wine_environment(executable: str | None = None, prefix: str | None = None) -> dict: # If the tool is unset, return all affected env variable names # IMPORTANT: keep this in sync with the code below environ = {'WINEPREFIX': prefix if prefix is not None else ''} diff --git a/rare/utils/config_helper.py b/rare/utils/config_helper.py index 962d46fe4..140bed5b3 100644 --- a/rare/utils/config_helper.py +++ b/rare/utils/config_helper.py @@ -131,13 +131,13 @@ def adjust_compat_data_path(app_name: str, value: str) -> None: adjust_envvar(app_name, 'STEAM_COMPAT_DATA_PATH', value) -def get_compat_data_path(app_name: str | None = None, fallback: Any = None) -> str: +def get_compat_data_path(app_name: str, fallback: Any = None) -> str: _compat = get_envvar(app_name, 'STEAM_COMPAT_DATA_PATH', fallback=fallback) # return os.path.join(_compat, "pfx") if _compat else fallback return _compat -def get_compat_data_path_with_global(app_name: str | None = None, fallback: Any = None) -> str: +def get_compat_data_path_with_global(app_name: str, fallback: Any = None) -> str: _compat = get_envvar_with_global(app_name, 'STEAM_COMPAT_DATA_PATH', fallback=fallback) # return os.path.join(_compat, "pfx") if _compat else fallback return _compat @@ -152,17 +152,21 @@ def _get_prefixes(lookup_fn: Callable[[SectionProxy], str]) -> set[tuple[str, st for name, section in _config.items(): pfx = lookup_fn(section) if pfx: - _prefixes.update([(pfx, name[: -len('.env')] if name.endswith('.env') else name)]) + _prefixes.update([(pfx, name.removesuffix('.env'))]) _prefixes = {(os.path.expanduser(p), n) for p, n in _prefixes} return {(p, n) for p, n in _prefixes if prefix_exists(p)} def get_wine_prefixes() -> set[tuple[str, str]]: - return _get_prefixes(lambda s: s.get('WINEPREFIX') or s.get('wine_prefix')) + def _condition(s: SectionProxy) -> str: + return s.get('WINEPREFIX') or s.get('wine_prefix', '') + return _get_prefixes(_condition) def get_proton_prefixes() -> set[tuple[str, str]]: - return _get_prefixes(lambda s: os.path.join(compat_path, 'pfx') if (compat_path := s.get('STEAM_COMPAT_DATA_PATH')) else '') + def _condition(s: SectionProxy) -> str: + return os.path.join(compat_path, 'pfx') if (compat_path := s.get('STEAM_COMPAT_DATA_PATH')) else '' + return _get_prefixes(_condition) def get_prefixes() -> set[tuple[str, str]]: diff --git a/rare/utils/discord_rpc.py b/rare/utils/discord_rpc.py index de9457738..8313f6d47 100644 --- a/rare/utils/discord_rpc.py +++ b/rare/utils/discord_rpc.py @@ -39,7 +39,7 @@ def remove_presence(self, app_name: str): @Slot() @Slot(list) - def update_settings(self, game_running: list = None): + def update_settings(self, game_running: list | None = None): rpc_mode = DiscordRPCMode(self.settings.get_value(app_settings.discord_rpc_mode)) if rpc_mode == DiscordRPCMode.NEVER: self.remove_rpc() @@ -58,7 +58,7 @@ def remove_rpc(self): return try: self.rpc.close() - except Exception: + except Exception: # noqa: BLE001 logger.warning('Already closed') del self.rpc self.rpc = None @@ -83,7 +83,7 @@ def set_discord_rpc(self, app_name=None): logger.error(f'Is Discord running? \n{e}') self.rpc = None return - except Exception as e: + except Exception as e: # noqa: BLE001 logger.error(str(e)) self.rpc = None return diff --git a/rare/utils/json_formatter.py b/rare/utils/json_formatter.py index dc8e1a084..832cd3ee7 100644 --- a/rare/utils/json_formatter.py +++ b/rare/utils/json_formatter.py @@ -49,7 +49,7 @@ def __init__(self, parent=None): self._key = '' self._value = '' self._type = None - self._children = list() + self._children = [] def appendChild(self, item): self._children.append(item) diff --git a/rare/utils/misc.py b/rare/utils/misc.py index 7d06dcecd..907c328ae 100644 --- a/rare/utils/misc.py +++ b/rare/utils/misc.py @@ -60,24 +60,24 @@ class ExitCodes(IntEnum): } -def load_color_scheme(path: str) -> QPalette: +def load_color_scheme(path: str) -> QPalette | None: palette = QPalette() scheme = QSettings(path, QSettings.Format.IniFormat) try: scheme.beginGroup('ColorScheme') - for g in color_group_map: - scheme.beginGroup(color_group_map[g]) - group = QPalette.ColorGroup(g) - for r in color_role_map: - role = QPalette.ColorRole(r) - color = scheme.value(color_role_map[r], None) + for group, group_name in color_group_map.items(): + scheme.beginGroup(group_name) + group = QPalette.ColorGroup(group) + for role, role_name in color_role_map.items(): + role = QPalette.ColorRole(role) + color = scheme.value(role_name, None) if color is not None: palette.setColor(group, role, QColor(color)) else: palette.setColor(group, role, palette.color(QPalette.ColorGroup.Active, role)) scheme.endGroup() scheme.endGroup() - except Exception: + except Exception: # noqa: BLE001 palette = None return palette @@ -168,7 +168,7 @@ def path_size(path: str | os.PathLike) -> int: ) -def format_size(b: int | float) -> str: +def format_size(b: float) -> str: for s in ('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei'): if b < 1024: return f'{b:.2f} {s}B' @@ -199,16 +199,16 @@ def relative_date(date): return f'{s // 3600} hours ago' -def qta_icon(icn_str: str, fallback: str = None, **kwargs): +def qta_icon(icn_str: str, fallback: str | None = None, **kwargs): try: return qtawesome.icon(icn_str, **kwargs) - except Exception as e: + except Exception as e: # noqa: BLE001 if not fallback: logger.warning(f'{e} {icn_str}') if fallback: try: return qtawesome.icon(fallback, **kwargs) - except Exception as e: + except Exception as e: # noqa: BLE001 logger.error(f'{e} {icn_str}') if kwargs.get('color'): kwargs['color'] = 'red' @@ -233,7 +233,7 @@ def widget_object_name(widget: QObject | ShibokenObject | type, suffix: str) -> elif isinstance(widget, (ShibokenObject, type)): return f'{widget.__name__}{suffix}' else: - raise RuntimeError(f'Argument {widget} not a QObject or type of QObject') + raise TypeError(f'Argument {widget} not a QObject or type of QObject') def elide_text(label: QLabel, text: str) -> str: diff --git a/rare/utils/qrequests.py b/rare/utils/qrequests.py index 279b0f568..1fd03b19d 100644 --- a/rare/utils/qrequests.py +++ b/rare/utils/qrequests.py @@ -33,7 +33,7 @@ def __eq__(self, other): class QRequests(QObject): data_ready = Signal(object) - def __init__(self, cache: str = None, token: str = None, parent=None): + def __init__(self, cache: str | None = None, token: str | None = None, parent=None): super(QRequests, self).__init__(parent=parent) self.logger = getLogger(f'{type(self).__name__}_{type(parent).__name__}') self._manager = QNetworkAccessManager(self) @@ -100,8 +100,8 @@ def get( self, url: str, handler: RequestHandler, - payload: dict = None, - params: dict = None, + payload: dict | None = None, + params: dict | None = None, ): url = self.__prepare_query(url, params) if params is not None else QUrl(url) item = RequestQueueItem(method='get', url=url, payload=payload, handlers=[handler]) @@ -125,8 +125,8 @@ def __on_finished(self, reply: QNetworkReply): elif reply.error() != QNetworkReply.NetworkError.NoError: self.logger.error(reply.errorString()) else: - mimetype, charset = self.__parse_content_type(reply.header(QNetworkRequest.KnownHeaders.ContentTypeHeader)) - maintype, subtype = mimetype.split('/') + mimetype, _charset = self.__parse_content_type(reply.header(QNetworkRequest.KnownHeaders.ContentTypeHeader)) + maintype, _subtype = mimetype.split('/') bin_data = reply.readAll().data() if mimetype == 'application/json': data = orjson.loads(bin_data) diff --git a/rare/utils/singleton.py b/rare/utils/singleton.py index f1f09392c..0e68fbc56 100644 --- a/rare/utils/singleton.py +++ b/rare/utils/singleton.py @@ -53,7 +53,7 @@ def __init__(self, flavor_id='', lockfile=''): os.unlink(self.lockfile) self.fd = os.open(self.lockfile, os.O_CREAT | os.O_EXCL | os.O_RDWR) except OSError as exc: - type, e, tb = sys.exc_info() + _type, e, _tb = sys.exc_info() if e.errno == 13: logger.error('Another instance is already running, quitting.') raise SingleInstanceException() from exc @@ -82,7 +82,7 @@ def __del__(self): # os.close(self.fp) if os.path.isfile(self.lockfile): os.unlink(self.lockfile) - except Exception as e: + except Exception as e: # noqa: BLE001 if logger: logger.warning(e) else: diff --git a/rare/utils/steam_grades.py b/rare/utils/steam_grades.py index 01449913a..26dae7358 100644 --- a/rare/utils/steam_grades.py +++ b/rare/utils/steam_grades.py @@ -1,6 +1,6 @@ import difflib import lzma -from datetime import datetime +from datetime import datetime, timezone from enum import Enum from logging import getLogger @@ -64,8 +64,8 @@ def load_steam_appids(self) -> dict: elapsed_days = 0 if file.is_file(): - mod_time = datetime.fromtimestamp(file.stat().st_mtime) - elapsed_days = abs(datetime.now() - mod_time).days + mod_time = datetime.fromtimestamp(file.stat().st_mtime, tz=timezone.utc) + elapsed_days = abs(datetime.now(tz=timezone.utc) - mod_time).days with file.open('r') as fd: json = orjson.loads(fd.read()) version = json.get('version', 0) @@ -123,7 +123,7 @@ def _get_grade(self, steam_appid: str): return app.get('tier', 'fail') - def get_rating(self, core: LegendaryCore, app_name: str, steam_appid: str = None) -> tuple[str, str]: + def get_rating(self, core: LegendaryCore, app_name: str, steam_appid: str | None = None) -> tuple[str, str]: game = core.get_game(app_name) try: if steam_appid is None: @@ -131,7 +131,7 @@ def get_rating(self, core: LegendaryCore, app_name: str, steam_appid: str = None if not steam_appid: raise RuntimeError grade = self._get_grade(steam_appid) - except Exception as e: + except Exception as e: # noqa: BLE001 self.logger.error(repr(e)) self.logger.error('Failed to get ProtonDB rating for %s', game.app_title) return '0', 'fail' diff --git a/rare/utils/steam_shortcuts.py b/rare/utils/steam_shortcuts.py index 0555f7abb..80223389f 100644 --- a/rare/utils/steam_shortcuts.py +++ b/rare/utils/steam_shortcuts.py @@ -103,7 +103,7 @@ def load_steam_shortcuts(): else: steam_user = next( filter(lambda x: x.most_recent, steam_users), - sorted(steam_users, key=lambda x: x.last_login, reverse=True)[0], + max(steam_users, key=lambda x: x.last_login), ) logger.info( 'Found most recently logged-in user %s(%s) (%s)', @@ -147,7 +147,6 @@ def remove_steam_shortcut(app_name: str) -> SteamShortcut | None: def add_steam_shortcut(app_name: str, app_title: str) -> SteamShortcut: - global __steam_shortcuts if steam_shortcut_exists(app_name): logger.info('Removing old Steam shortcut for %s', app_name) diff --git a/rare/utils/workarounds.py b/rare/utils/workarounds.py index 119758fda..ca0c6c2b9 100644 --- a/rare/utils/workarounds.py +++ b/rare/utils/workarounds.py @@ -93,14 +93,14 @@ def apply_workarounds(app_name: str): for opt in (options := wa.get('options', {})): if config.get_option(app_name, opt, None) is not None: continue - if platform.system() not in options[opt].get('os', tuple()): + if platform.system() not in options[opt].get('os', ()): continue config.set_option(app_name, opt, Workarounds.subst(options[opt]['value'])) # apply environment for var in (environ := wa.get('environ', {})): if config.get_envvar(app_name, var, None) is not None: continue - if platform.system() not in environ[var].get('os', tuple()): + if platform.system() not in environ[var].get('os', ()): continue config.set_envvar(app_name, var, Workarounds.subst(environ[var]['value'])) diff --git a/rare/utils/wrapper_exe.py b/rare/utils/wrapper_exe.py index 00263335e..635de556d 100644 --- a/rare/utils/wrapper_exe.py +++ b/rare/utils/wrapper_exe.py @@ -1,9 +1,9 @@ -from datetime import datetime +from datetime import datetime, timezone from logging import getLogger from pathlib import Path +import orjson import requests -from orjson import orjson from rare.utils.paths import data_dir, runtime_assets_path @@ -25,7 +25,7 @@ def download_lgd_wrapper() -> bool: runtime_assets = { wrapper_path().name: { 'version': 'v0.0', - 'date': datetime.isoformat(datetime.min), + 'date': datetime.isoformat(datetime.min.replace(tzinfo=timezone.utc)), } } version = runtime_assets[wrapper_path().name]['version'] @@ -38,7 +38,8 @@ def download_lgd_wrapper() -> bool: resp = requests.get(_github_api_url, timeout=5) data = resp.content.decode('utf-8') latest_release = orjson.loads(data) - except requests.exceptions.Timeout: + except requests.exceptions.Timeout as e: + logger.error('Error while downloading release: %s', e) return wrapper_path().exists() remote_assets = latest_release['assets'] diff --git a/rare/widgets/flow_layout.py b/rare/widgets/flow_layout.py index d9db45270..8d180d9c4 100644 --- a/rare/widgets/flow_layout.py +++ b/rare/widgets/flow_layout.py @@ -19,13 +19,13 @@ def __del__(self): def indexOf(self, a0: QWidget) -> int: try: return next(idx for idx, item in enumerate(self._items) if item.widget() is a0) - except Exception: + except Exception: # noqa: BLE001 return -1 def indexOf(self, a0: QLayoutItem) -> int: try: return self._items.index(a0) - except Exception: + except Exception: # noqa: BLE001 return -1 def addItem(self, a0: QLayoutItem) -> None: diff --git a/rare/widgets/image_widget.py b/rare/widgets/image_widget.py index a7f2ca418..f337c4c73 100644 --- a/rare/widgets/image_widget.py +++ b/rare/widgets/image_widget.py @@ -167,7 +167,7 @@ def __init__(self, manager: QRequests, parent=None): super(LoadingImageWidget, self).__init__(parent=parent) self.manager = manager - def fetchPixmap(self, url: str, params: dict = None): + def fetchPixmap(self, url: str, params: dict | None = None): self.setPixmap(QPixmap()) self.manager.get(url, self._on_image_ready, params=params) diff --git a/rare/widgets/indicator_edit.py b/rare/widgets/indicator_edit.py index feec79732..118d87d07 100644 --- a/rare/widgets/indicator_edit.py +++ b/rare/widgets/indicator_edit.py @@ -2,6 +2,7 @@ from collections.abc import Callable from enum import Enum, IntEnum from logging import getLogger +from typing import ClassVar from PySide6.QtCore import ( QDir, @@ -133,9 +134,9 @@ def __init__( self, text: str = '', placeholder: str = '', - completer: QCompleter = None, - edit_func: Callable[[str], tuple[bool, str, int]] = None, - save_func: Callable[[str], None] = None, + completer: QCompleter | None = None, + edit_func: Callable[[str], tuple[bool, str, int]] | None = None, + save_func: Callable[[str], None] | None = None, horiz_policy: QSizePolicy.Policy = QSizePolicy.Policy.Expanding, parent=None, ): @@ -261,9 +262,10 @@ def __edit(self, text): if self.edit_func is not None: if self.__thread is not None: self.__thread.signals.result.disconnect(self.__edit_handler) - self.__thread = EditFuncRunnable(self.edit_func, text) - self.__thread.signals.result.connect(self.__edit_handler) - self.__threadpool.start(self.__thread) + thread = EditFuncRunnable(self.edit_func, text) + thread.signals.result.connect(self.__edit_handler) + self.__threadpool.start(thread) + self.__thread = thread def __save(self, text): if self.save_func is not None: @@ -275,7 +277,7 @@ class CustomIconType(Enum): Unknown = -1 Executable = -2 - icons = { + icons: ClassVar[dict] = { CustomIconType.Unknown: ('mdi.file-cancel', 'fa5.file-excel'), # Unknown QAbstractFileIconProvider.IconType.Computer: ( 'mdi.desktop-classic', @@ -331,11 +333,11 @@ def __init__( self, path: str = '', file_mode: QFileDialog.FileMode = QFileDialog.FileMode.AnyFile, - file_filter: QDir.Filter = 0, - name_filters: tuple[str, ...] = None, + file_filter: QDir.Filter = QDir.Filter.NoFilter, + name_filters: tuple[str, ...] | None = None, placeholder: str = '', - edit_func: Callable[[str], tuple[bool, str, int]] = None, - save_func: Callable[[str], None] = None, + edit_func: Callable[[str], tuple[bool, str, int]] | None = None, + save_func: Callable[[str], None] | None = None, horiz_policy: QSizePolicy.Policy = QSizePolicy.Policy.Expanding, parent=None, ): @@ -352,8 +354,7 @@ def __init__( logger.warning(e) self.__completer_model.setIconProvider(PathEditIconProvider()) self.__completer_model.setRootPath(path) - if file_filter: - self.__completer_model.setFilter(file_filter) + self.__completer_model.setFilter(file_filter) if name_filters: self.__completer_model.setNameFilters(name_filters) self.__completer.setModel(self.__completer_model) From 07ac280a6352fd0dcff6f2b14bd34cbd34643c18 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Fri, 14 Aug 2026 21:39:13 +0300 Subject: [PATCH 13/16] chore: update pyproject.toml --- pyproject.toml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ab0f6c854..69c691b15 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ dependencies = [ "pywin32 ; platform_system == 'Windows'", ] -[project.optional-dependencies] +[dependency-groups] webview = [ "pywebview[gtk]; platform_system == 'Linux'", "pywebview[gtk]; platform_system == 'FreeBSD'", @@ -42,15 +42,18 @@ webview = [ discordrpc = [ "pypresence", ] +packaging = [ + "cx-freeze", + "nuitka", +] dev = [ "PySide6-stubs", "qstylizer", "ruff", "ty", -] -packaging = [ - "cx-freeze", - "nuitka", + {include-group = "webview"}, + {include-group = "discordrpc"}, + {include-group = "packaging"}, ] [project.urls] From 9af5d21bc4a015077725fbe9f86bcbd3a1452e0a Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Fri, 14 Aug 2026 21:39:53 +0300 Subject: [PATCH 14/16] chore: typing fixes --- rare/commands/subreaper/subreaper_bsd.py | 6 +-- rare/commands/subreaper/subreaper_linux.py | 6 +-- rare/utils/qrequests.py | 60 +++++++++++----------- rare/utils/steam_shortcuts.py | 17 +++--- 4 files changed, 46 insertions(+), 43 deletions(-) diff --git a/rare/commands/subreaper/subreaper_bsd.py b/rare/commands/subreaper/subreaper_bsd.py index df508ee76..f5b6fa673 100755 --- a/rare/commands/subreaper/subreaper_bsd.py +++ b/rare/commands/subreaper/subreaper_bsd.py @@ -56,10 +56,10 @@ def get_pstree_from_pid(root_pid: int) -> set[int]: while current_pid: current = current_pid.pop() # Ignore. mypy flags [arg-type] due to the reuse of pid variable - for pid, ppid in pid_to_ppid.items(): # type: ignore + for pid, ppid in pid_to_ppid.items(): if ppid == current and pid not in descendants: - descendants.add(pid) # type: ignore - current_pid.append(pid) # type: ignore + descendants.add(pid) + current_pid.append(pid) return descendants diff --git a/rare/commands/subreaper/subreaper_linux.py b/rare/commands/subreaper/subreaper_linux.py index 11a563ef4..3d61a6727 100755 --- a/rare/commands/subreaper/subreaper_linux.py +++ b/rare/commands/subreaper/subreaper_linux.py @@ -48,10 +48,10 @@ def get_pstree_from_pid(root_pid: int) -> set[int]: while current_pid: current = current_pid.pop() # Ignore. mypy flags [arg-type] due to the reuse of pid variable - for pid, ppid in pid_to_ppid.items(): # type: ignore + for pid, ppid in pid_to_ppid.items(): if ppid == current and pid not in descendants: - descendants.add(pid) # type: ignore - current_pid.append(pid) # type: ignore + descendants.add(pid) + current_pid.append(pid) return descendants diff --git a/rare/utils/qrequests.py b/rare/utils/qrequests.py index 1fd03b19d..4028093b6 100644 --- a/rare/utils/qrequests.py +++ b/rare/utils/qrequests.py @@ -2,7 +2,7 @@ from dataclasses import dataclass, field from email.message import Message from logging import getLogger -from typing import TypeVar +from typing import Generic, TypeVar import orjson from PySide6.QtCore import QObject, QUrl, QUrlQuery, Signal, Slot @@ -19,9 +19,9 @@ @dataclass -class RequestQueueItem: - method: str = None - url: QUrl = None +class RequestQueueItem(Generic[RequestHandler]): + method: str + url: QUrl payload: dict = field(default_factory=dict) params: dict = field(default_factory=dict) handlers: list[RequestHandler] = field(default_factory=list) @@ -37,7 +37,7 @@ def __init__(self, cache: str | None = None, token: str | None = None, parent=No super(QRequests, self).__init__(parent=parent) self.logger = getLogger(f'{type(self).__name__}_{type(parent).__name__}') self._manager = QNetworkAccessManager(self) - self._manager.finished.connect(self.__on_finished) + self._manager.finished.connect(self._on_finished) self._cache = None if cache is not None: self.logger.debug('Using cache dir %s', cache) @@ -48,18 +48,18 @@ def __init__(self, cache: str | None = None, token: str | None = None, parent=No self.logger.debug('Manager is authorized') self._token = token - self.__active_requests: dict[QNetworkReply, RequestQueueItem] = {} + self._active_requests: dict[QNetworkReply, RequestQueueItem] = {} @staticmethod - def __prepare_query(url, params) -> QUrl: - url = QUrl(url) - query = QUrlQuery(url) + def _prepare_query(url: str, params: dict) -> QUrl: + qurl = QUrl(url) + query = QUrlQuery(qurl) for k, v in params.items(): query.addQueryItem(str(k), str(v)) - url.setQuery(query) - return url + qurl.setQuery(query) + return qurl - def __prepare_request(self, item: RequestQueueItem) -> QNetworkRequest: + def _prepare_request(self, item: RequestQueueItem) -> QNetworkRequest: request = QNetworkRequest(item.url) request.setHeader( QNetworkRequest.KnownHeaders.ContentTypeHeader, @@ -79,22 +79,22 @@ def __prepare_request(self, item: RequestQueueItem) -> QNetworkRequest: request.setRawHeader(b'Authorization', self._token.encode()) return request - def __post(self, item: RequestQueueItem): - request = self.__prepare_request(item) + def _post(self, item: RequestQueueItem): + request = self._prepare_request(item) payload = orjson.dumps(item.payload) reply = self._manager.post(request, payload) - reply.errorOccurred.connect(self.__on_error) - self.__active_requests[reply] = item + reply.errorOccurred.connect(self._on_error) + self._active_requests[reply] = item def post(self, url: str, handler: RequestHandler, payload: dict): item = RequestQueueItem(method='post', url=QUrl(url), payload=payload, handlers=[handler]) - self.__post(item) + self._post(item) - def __get(self, item: RequestQueueItem): - request = self.__prepare_request(item) + def _get(self, item: RequestQueueItem): + request = self._prepare_request(item) reply = self._manager.get(request) - reply.errorOccurred.connect(self.__on_error) - self.__active_requests[reply] = item + reply.errorOccurred.connect(self._on_error) + self._active_requests[reply] = item def get( self, @@ -103,29 +103,31 @@ def get( payload: dict | None = None, params: dict | None = None, ): - url = self.__prepare_query(url, params) if params is not None else QUrl(url) - item = RequestQueueItem(method='get', url=url, payload=payload, handlers=[handler]) - self.__get(item) + if payload is None: + payload = {} + qurl = self._prepare_query(url, params) if params is not None else QUrl(url) + item = RequestQueueItem(method='get', url=qurl, payload=payload, handlers=[handler]) + self._get(item) - def __on_error(self, error: QNetworkReply.NetworkError) -> None: + def _on_error(self, error: QNetworkReply.NetworkError) -> None: self.logger.error(error) @staticmethod - def __parse_content_type(header) -> tuple[str, str]: + def _parse_content_type(header) -> tuple[str, str | None]: # lk: this looks weird but `cgi` is deprecated, PEP 594 suggests this way of parsing MIME m = Message() m['content-type'] = header return m.get_content_type(), m.get_content_charset() @Slot(QNetworkReply) - def __on_finished(self, reply: QNetworkReply): - item = self.__active_requests.pop(reply, None) + def _on_finished(self, reply: QNetworkReply): + item = self._active_requests.pop(reply, None) if item is None: self.logger.error('QNetworkReply: %s without associated item', reply.url().toString()) elif reply.error() != QNetworkReply.NetworkError.NoError: self.logger.error(reply.errorString()) else: - mimetype, _charset = self.__parse_content_type(reply.header(QNetworkRequest.KnownHeaders.ContentTypeHeader)) + mimetype, _charset = self._parse_content_type(reply.header(QNetworkRequest.KnownHeaders.ContentTypeHeader)) maintype, _subtype = mimetype.split('/') bin_data = reply.readAll().data() if mimetype == 'application/json': diff --git a/rare/utils/steam_shortcuts.py b/rare/utils/steam_shortcuts.py index 80223389f..262bbef93 100644 --- a/rare/utils/steam_shortcuts.py +++ b/rare/utils/steam_shortcuts.py @@ -29,13 +29,13 @@ def find_steam() -> str | None: if platform.system() == 'Windows': # Find the Steam install directory or raise an error try: # 32-bit - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Valve\\Steams') + key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Valve\\Steams') # ty: ignore[unresolved-attribute] except FileNotFoundError: try: # 64-bit - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Wow6432Node\\Valve\\Steam') + key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Wow6432Node\\Valve\\Steam') # ty: ignore[unresolved-attribute] except FileNotFoundError: return None - return winreg.QueryValueEx(key, 'InstallPath')[0] + return winreg.QueryValueEx(key, 'InstallPath')[0] # ty: ignore[unresolved-attribute] # return the first valid path elif platform.system() in {'Linux', 'FreeBSD'}: for path in steam_client_install_paths: @@ -75,9 +75,9 @@ def _save_shortcuts(steam_path: str, user: SteamUser, shortcuts: dict[str, Steam vdf.binary_dump({'shortcuts': _shortcuts}, f) -__steam_dir: str | None = None +__steam_dir: str = '' __steam_user: SteamUser | None = None -__steam_shortcuts: dict | None = None +__steam_shortcuts: dict[str, SteamShortcut] = {} def steam_shortcuts_supported() -> bool: @@ -87,7 +87,7 @@ def steam_shortcuts_supported() -> bool: def load_steam_shortcuts(): global __steam_shortcuts, __steam_dir, __steam_user - if __steam_shortcuts is not None: + if __steam_shortcuts: return steam_dir = find_steam() @@ -125,6 +125,7 @@ def save_steam_shortcuts(): __steam_user.account_name, __steam_user.persona_name, ) + _save_shortcuts(__steam_dir, __steam_user, __steam_shortcuts) @@ -171,7 +172,7 @@ def add_steam_shortcut(app_name: str, app_title: str) -> SteamShortcut: def add_steam_coverart(app_name: str, shortcut: SteamShortcut): - if not __steam_dir: + if not (__steam_dir and __steam_user): return steam_grid_dir = os.path.join(__steam_dir, 'userdata', str(__steam_user.short_id), 'config', 'grid') if not os.path.exists(steam_grid_dir): @@ -183,7 +184,7 @@ def add_steam_coverart(app_name: str, shortcut: SteamShortcut): def remove_steam_coverart(shortcut: SteamShortcut): - if not __steam_dir: + if not (__steam_dir and __steam_user): return steam_grid_dir = os.path.join(__steam_dir, 'userdata', str(__steam_user.short_id), 'config', 'grid') if not os.path.exists(steam_grid_dir): From c913ed5869d3fe28ec9270f22b5358da05a40265 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Fri, 14 Aug 2026 21:40:03 +0300 Subject: [PATCH 15/16] tools: update ts2qm --- tools/ts2qm.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/ts2qm.py b/tools/ts2qm.py index ff2587c89..918023971 100755 --- a/tools/ts2qm.py +++ b/tools/ts2qm.py @@ -1,13 +1,14 @@ #!/usr/bin/env python3 import os import shlex +import subprocess from pathlib import Path basedir = Path(__file__).parent.parent.joinpath("rare/resources/languages/") for f in basedir.iterdir(): if f.suffix == ".ts" and f.name != "source.ts": - os.system( + subprocess.run( shlex.join( ( "pyside6-lrelease", @@ -15,5 +16,6 @@ "-removeidentical", f.as_posix(), ) - ) + ), + check=False ) From 4180de2fe145764cf6ed477bfefcc37d5c2d2da8 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Sat, 15 Aug 2026 00:18:35 +0300 Subject: [PATCH 16/16] workflows: work around gh silliness --- .github/actions/setup-python/action.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-python/action.yml b/.github/actions/setup-python/action.yml index c6fd4a14e..2d09dc163 100644 --- a/.github/actions/setup-python/action.yml +++ b/.github/actions/setup-python/action.yml @@ -10,9 +10,14 @@ inputs: runs: using: 'composite' steps: + - name: GH Actions silliness (please add lower) + id: silly + shell: bash + run: | + echo "pyarch=$(echo ${{ inputs.architecture }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT - uses: actions/setup-python@v7 with: cache: pip python-version: ${{ inputs.version }} check-latest: true - architecture: ${{ inputs.architecture }} + architecture: ${{ steps.silly.outputs.pyarch }}