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