From c8bf4659459e4870fa45dd0e0da1737e15963a0d Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 5 Mar 2026 21:54:51 +0200 Subject: [PATCH 1/2] OverlaySettings: add a second form layout on the right to split options into two columns --- .../tabs/settings/widgets/overlay.py | 102 +++++++++--------- .../tabs/settings/widgets/overlay.py | 24 +++-- .../tabs/settings/widgets/overlay.ui | 26 ++--- 3 files changed, 75 insertions(+), 77 deletions(-) diff --git a/rare/components/tabs/settings/widgets/overlay.py b/rare/components/tabs/settings/widgets/overlay.py index dc68dd49f7..0295aa8512 100644 --- a/rare/components/tabs/settings/widgets/overlay.py +++ b/rare/components/tabs/settings/widgets/overlay.py @@ -144,6 +144,7 @@ def __init__(self, parent=None): self.force_disabled: Union[str, None] = None self.force_defaults: Union[str, None] = None self.separator: Union[str, None] = None + self.grid_row_items: Union[int, None] = None self.app_name: str = "default" self.option_widgets: List[Union[OverlayCheckBox, OverlayLineEdit, OverlayComboBox]] = [] @@ -158,35 +159,50 @@ def __init__(self, parent=None): def setupWidget( self, grid_map: List[OverlayCheckBox], - form_map: List[Tuple[Union[OverlayLineEdit, OverlayComboBox], str]], + left_form_map: List[Tuple[Union[OverlayLineEdit, OverlayComboBox], str]], + right_form_map: List[Tuple[Union[OverlayLineEdit, OverlayComboBox], str]], label: str, control_key: str, config_key: str, force_disabled: str, force_defaults: str, separator: str, + grid_row_items: int, ): self.control_key = control_key self.config_key = config_key self.force_disabled = force_disabled self.force_defaults = force_defaults self.separator = separator + self.grid_row_items = grid_row_items 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 // 4, idx % 4) + 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) + self.ui.options_grid.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) - for widget, label in form_map: + for widget, label in left_form_map: widget.setParent(self.ui.options_group) - self.ui.options_form.addRow(label, widget) + self.ui.left_options_form.addRow(label, widget) # self.values[widget.option] = widget self.option_widgets.append(widget) widget.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) + self.ui.right_options_form.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) + + self.ui.options_layout.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) @abstractmethod def update_settings_override(self, state: ActivationStates): @@ -282,19 +298,22 @@ def __init__(self, parent=None): OverlayCheckBox("devinfo", self.tr("GPU driver and version")), OverlayCheckBox("drawcalls", self.tr("Draw calls per frame")), ] - form = [ + left_form = [ (OverlayNumberInput("scale", 1.0), self.tr("Scale")), (OverlayNumberInput("opacity", 1.0), self.tr("Opacity")), ] + right_form = [] self.setupWidget( grid, - form, + left_form, + right_form, label=self.tr("Show HUD"), control_key="DXVK_HUD", config_key="DXVK_HUD", force_disabled="0", force_defaults="1", separator=",", + grid_row_items=4, ) def update_settings_override(self, state: ActivationStates): @@ -306,54 +325,31 @@ def __init__(self, parent=None): super(DxvkConfigSettings, self).__init__(parent=parent) self.setTitle(self.tr("DXVK Config")) dxvk_config_trinary = (("Auto", "Auto"), ("True", "True"), ("False", "False")) + # fmt: off grid = [] - form = [ - ( - OverlayLineEdit( - "dxvk.deviceFilter", - "", - ), - "dxvk.deviceFilter", - ), - ( - OverlayNumberInput( - "dxgi.syncInterval", - -1, - ), - "dxgi.syncInterval", - ), - ( - OverlayNumberInput( - "d3d9.presentInterval", - -1, - ), - "d3d9.presentInterval", - ), - ( - OverlayNumberInput( - "dxgi.maxFrameRate", - 0, - ), - "dxgi.maxFrameRate", - ), - ( - OverlayNumberInput( - "d3d9.maxFrameRate", - 0, - ), - "d3d9.maxFrameRate", - ), + left_form = [ + (OverlayLineEdit("dxvk.deviceFilter", ""), "dxvk.deviceFilter"), + (OverlayNumberInput("dxvk.numCompilerThreads", 0), "dxvk.numCompilerThreads"), (OverlaySelectInput("dxvk.tearFree", dxvk_config_trinary), "dxvk.tearFree"), ] + right_form = [ + (OverlayNumberInput("dxgi.syncInterval", -1), "dxgi.syncInterval"), + (OverlayNumberInput("dxgi.maxFrameRate", 0), "dxgi.maxFrameRate"), + (OverlayNumberInput("d3d9.presentInterval", -1), "d3d9.presentInterval"), + (OverlayNumberInput("d3d9.maxFrameRate", 0), "d3d9.maxFrameRate"), + ] + # fmt: on self.setupWidget( grid, - form, + left_form, + right_form, label=self.tr("Mode"), control_key="DXVK_CONFIG", config_key="DXVK_CONFIG", force_disabled="0", force_defaults="", separator=";", + grid_row_items=4, ) def update_settings_override(self, state: ActivationStates): @@ -397,7 +393,7 @@ def preset_range(start: str, end: str) -> Tuple[Tuple, ...]: values=("off", "on"), ), ] - form = [ + left_form = [ ( OverlaySelectInput("ngx_dlss_sr_override_render_preset_selection", ngx_sr_presets), "Super Resolution preset", @@ -407,15 +403,18 @@ def preset_range(start: str, end: str) -> Tuple[Tuple, ...]: "Ray Reconstruction preset", ), ] + right_form = [] self.setupWidget( grid, - form, + left_form, + right_form, label=self.tr("Mode"), control_key="DXVK_NVAPI_DRS_SETTINGS", config_key="DXVK_NVAPI_DRS_SETTINGS", force_disabled="0", force_defaults="", separator=",", + grid_row_items=4, ) def update_settings_override(self, state: ActivationStates): @@ -471,25 +470,26 @@ def __init__(self, parent=None): OverlayCheckBox("cpu_power", self.tr("CPU power consumption")), OverlayCheckBox("gpu_power", self.tr("GPU power consumption")), ] - form = [ + left_form = [ (OverlayNumberInput("fps_limit", 0), self.tr("FPS limit")), (OverlaySelectInput("vsync", mangohud_vsync), self.tr("Vulkan vsync")), - ( - OverlaySelectInput("gl_vsync", mangohud_gl_vsync), - self.tr("OpenGL vsync"), - ), + (OverlaySelectInput("gl_vsync", mangohud_gl_vsync), self.tr("OpenGL vsync")), + ] + right_form = [ (OverlayNumberInput("font_size", 24), self.tr("Font size")), (OverlaySelectInput("position", mangohud_position), self.tr("Position")), ] self.setupWidget( grid, - form, + left_form, + right_form, label=self.tr("Show HUD"), control_key="MANGOHUD", config_key="MANGOHUD_CONFIG", force_disabled="no_display", force_defaults="read_cfg", separator=",", + grid_row_items=4, ) def showEvent(self, a0: QShowEvent): diff --git a/rare/ui/components/tabs/settings/widgets/overlay.py b/rare/ui/components/tabs/settings/widgets/overlay.py index 256a7bf74e..7d1f9225bf 100644 --- a/rare/ui/components/tabs/settings/widgets/overlay.py +++ b/rare/ui/components/tabs/settings/widgets/overlay.py @@ -3,21 +3,21 @@ ################################################################################ ## Form generated from reading UI file 'overlay.ui' ## -## Created by: Qt User Interface Compiler version 6.9.1 +## Created by: Qt User Interface Compiler version 6.10.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ from PySide6.QtCore import QCoreApplication, QSize, Qt from PySide6.QtGui import QFont -from PySide6.QtWidgets import QComboBox, QFormLayout, QFrame, QGridLayout, QGroupBox, QLabel, QSizePolicy, QSpacerItem +from PySide6.QtWidgets import QComboBox, QFormLayout, QFrame, QGridLayout, QGroupBox, QLabel, QSizePolicy class Ui_OverlaySettings(object): def setupUi(self, OverlaySettings): if not OverlaySettings.objectName(): OverlaySettings.setObjectName(u"OverlaySettings") - OverlaySettings.resize(343, 119) + OverlaySettings.resize(608, 256) OverlaySettings.setWindowTitle(u"OverlaySettings") OverlaySettings.setTitle(u"") self.main_layout = QFormLayout(OverlaySettings) @@ -69,21 +69,25 @@ def setupUi(self, OverlaySettings): self.options_group.setTitle(u"") self.options_layout = QGridLayout(self.options_group) self.options_layout.setObjectName(u"options_layout") - self.options_form = QFormLayout() - self.options_form.setObjectName(u"options_form") - self.options_form.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + self.left_options_form = QFormLayout() + self.left_options_form.setObjectName(u"left_options_form") + self.left_options_form.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.options_layout.addLayout(self.options_form, 1, 0, 1, 1) + 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_layout.addLayout(self.options_grid, 0, 0, 1, 1) + self.options_layout.addLayout(self.options_grid, 0, 0, 1, 2) - self.hspacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.right_options_form = QFormLayout() + self.right_options_form.setObjectName(u"right_options_form") + self.right_options_form.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.options_layout.addItem(self.hspacer, 0, 1, 2, 1) + self.options_layout.addLayout(self.right_options_form, 1, 1, 1, 1) + self.options_layout.setColumnStretch(0, 1) + self.options_layout.setColumnStretch(1, 1) self.main_layout.setWidget(1, QFormLayout.ItemRole.SpanningRole, self.options_group) diff --git a/rare/ui/components/tabs/settings/widgets/overlay.ui b/rare/ui/components/tabs/settings/widgets/overlay.ui index cc967bf952..7fc62b91d9 100644 --- a/rare/ui/components/tabs/settings/widgets/overlay.ui +++ b/rare/ui/components/tabs/settings/widgets/overlay.ui @@ -6,8 +6,8 @@ 0 0 - 343 - 119 + 608 + 256 @@ -88,29 +88,23 @@ - + - + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - + - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - + + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - + From eec3ff001f13a9a3554ed30947cc5b9e12b15847 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 5 Mar 2026 21:57:44 +0200 Subject: [PATCH 2/2] chore: ruff format --- rare/commands/launcher/__init__.py | 13 ++----- rare/components/dialogs/login/__init__.py | 4 +- .../components/dialogs/login/browser_login.py | 5 +-- rare/components/dialogs/login/import_login.py | 1 - rare/components/dialogs/login/login_frame.py | 1 - rare/components/dialogs/move.py | 8 ++-- rare/components/tabs/__init__.py | 2 +- rare/components/tabs/downloads/__init__.py | 11 +++--- rare/components/tabs/downloads/thread.py | 3 +- rare/components/tabs/downloads/widgets.py | 24 ++++++------ .../components/tabs/integrations/eos_group.py | 1 - .../tabs/integrations/import_group.py | 5 ++- .../tabs/library/details/details.py | 39 +++++++++++-------- rare/components/tabs/settings/__init__.py | 2 +- rare/components/tabs/settings/legendary.py | 1 - .../tabs/settings/widgets/proton.py | 7 ++-- .../tabs/settings/widgets/runner.py | 12 ++---- rare/components/tabs/settings/widgets/wine.py | 5 +-- rare/components/tabs/store/search.py | 12 ++---- rare/components/tabs/store/wishlist.py | 3 +- rare/models/game.py | 36 ++++++++--------- rare/models/game_slim.py | 1 - rare/models/install.py | 1 - rare/models/signals.py | 1 - rare/resources/resources.py | 3 ++ rare/resources/static_css/__init__.py | 3 ++ rare/resources/static_css/stylesheet.py | 12 ++---- .../stylesheets/RareStyle/__init__.py | 3 ++ rare/shared/workers/install.py | 1 - rare/shared/workers/move.py | 2 - rare/shared/workers/uninstall.py | 1 - rare/shared/workers/verify.py | 1 - rare/shared/workers/wine_resolver.py | 1 - rare/utils/compat/miniproton.py | 14 +++---- rare/utils/compat/steam.py | 3 +- rare/utils/misc.py | 19 ++++----- rare/utils/paths.py | 4 +- rare/utils/steam_grades.py | 2 +- rare/widgets/image_widget.py | 14 ++++--- 39 files changed, 126 insertions(+), 155 deletions(-) diff --git a/rare/commands/launcher/__init__.py b/rare/commands/launcher/__init__.py index 636312efbc..3c09eea1a5 100644 --- a/rare/commands/launcher/__init__.py +++ b/rare/commands/launcher/__init__.py @@ -58,7 +58,6 @@ class PreLaunchSignals(QObject): class PreLaunch(QRunnable): - def __init__(self, args: InitParams, rgame: RareGameSlim, sync_action=None): super(PreLaunch, self).__init__() self.signals = PreLaunchSignals() @@ -94,8 +93,7 @@ def prepare_launch(self, args: InitParams) -> Optional[LaunchParams]: proc = get_configured_qprocess(shlex.split(launch.pre_launch_command), launch.environment) proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels) proc.readyReadStandardOutput.connect( - (lambda obj: obj.logger.debug( - str(proc.readAllStandardOutput().data(), "utf-8", "ignore"))).__get__(self) + (lambda obj: obj.logger.debug(str(proc.readAllStandardOutput().data(), "utf-8", "ignore"))).__get__(self) ) self.signals.pre_launch_command_started.emit() self.logger.info("Running pre-launch command %s, %s", proc.program(), proc.arguments()) @@ -115,7 +113,6 @@ class SyncCheckWorkerSignals(QObject): class SyncCheckWorker(QRunnable): - def __init__(self, core: LegendaryCore, rgame: RareGameSlim): super().__init__() self.signals = SyncCheckWorkerSignals() @@ -257,9 +254,7 @@ def send_message(self, message: BaseModel): 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) - ) + 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 @@ -271,9 +266,7 @@ def check_saves(self, exit_code: int): # 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.result_ready.connect((lambda obj, a: obj.check_saves_finished(exit_code, a)).__get__(self)) self.sync_dialog.open() @Slot(int, int) diff --git a/rare/components/dialogs/login/__init__.py b/rare/components/dialogs/login/__init__.py index cd52bd6edf..111efc5e3e 100644 --- a/rare/components/dialogs/login/__init__.py +++ b/rare/components/dialogs/login/__init__.py @@ -60,9 +60,7 @@ def __init__(self, args: Namespace, core: LegendaryCore, parent=None): self.import_page.validated.connect(self._on_page_validated) self.info_message = { - self.landing_index: self.tr( - "Select log-in method." - ), + self.landing_index: self.tr("Select log-in method."), self.browser_index: self.tr( "Click the Open Browser button to open the " "login page in your web browser or copy the link and paste it " diff --git a/rare/components/dialogs/login/browser_login.py b/rare/components/dialogs/login/browser_login.py index b2bdc0cff0..45861a370f 100644 --- a/rare/components/dialogs/login/browser_login.py +++ b/rare/components/dialogs/login/browser_login.py @@ -17,7 +17,6 @@ class BrowserLogin(LoginFrame): - def __init__(self, core: LegendaryCore, parent=None): super(BrowserLogin, self).__init__(core, parent=parent) @@ -34,9 +33,7 @@ def __init__(self, core: LegendaryCore, parent=None): self.ui.copy_button.setIcon(qta_icon("mdi.content-copy", "fa5.copy")) self.ui.copy_button.clicked.connect(self._on_copy_link) self.ui.form_layout.setWidget( - self.ui.form_layout.getWidgetPosition(self.ui.sid_label)[0], - QFormLayout.ItemRole.FieldRole, - self.auth_edit + self.ui.form_layout.getWidgetPosition(self.ui.sid_label)[0], QFormLayout.ItemRole.FieldRole, self.auth_edit ) self.ui.open_button.clicked.connect(self._on_open_browser) diff --git a/rare/components/dialogs/login/import_login.py b/rare/components/dialogs/login/import_login.py index eee72eba7e..249932da8d 100644 --- a/rare/components/dialogs/login/import_login.py +++ b/rare/components/dialogs/login/import_login.py @@ -14,7 +14,6 @@ class ImportLogin(LoginFrame): - # FIXME: Use pathspec instead of duplicated code if platform.system() == "Windows": localappdata = os.path.expandvars("%LOCALAPPDATA%") diff --git a/rare/components/dialogs/login/login_frame.py b/rare/components/dialogs/login/login_frame.py index 2325efaf6b..899d970160 100644 --- a/rare/components/dialogs/login/login_frame.py +++ b/rare/components/dialogs/login/login_frame.py @@ -30,4 +30,3 @@ def _on_input_changed(self): @abstractmethod def do_login(self) -> None: pass - diff --git a/rare/components/dialogs/move.py b/rare/components/dialogs/move.py index 2682ce1ba7..e1b216678f 100644 --- a/rare/components/dialogs/move.py +++ b/rare/components/dialogs/move.py @@ -35,9 +35,7 @@ def __init__(self, rcore: RareCore, rgame: RareGame, parent=None): self.rcore = rcore self.core = rcore.core() self.rgame: Optional[RareGame] = rgame - self.options: MoveGameModel = MoveGameModel( - rgame.app_name, rgame.install_path, rgame.folder_name - ) + self.options: MoveGameModel = MoveGameModel(rgame.app_name, rgame.install_path, rgame.folder_name) self.target_path_edit = PathEdit( path=self.options.target_path, @@ -115,7 +113,7 @@ def reject_handler(self): @Slot(Qt.CheckState) def __on_rename_path_changed(self, state: Qt.CheckState): - self.options.rename_path = (state == Qt.CheckState.Checked) + self.options.rename_path = state == Qt.CheckState.Checked self.full_path_info.setText(self.options.full_path) _ = QSignalBlocker(self.ui.reset_name_check) self.ui.reset_name_check.setChecked(self.options.reset_name) @@ -123,7 +121,7 @@ def __on_rename_path_changed(self, state: Qt.CheckState): @Slot(Qt.CheckState) def __on_reset_name_changed(self, state: Qt.CheckState): - self.options.reset_name = (state == Qt.CheckState.Checked) + self.options.reset_name = state == Qt.CheckState.Checked self.full_path_info.setText(self.options.full_path) _ = QSignalBlocker(self.ui.rename_path_check) self.ui.rename_path_check.setChecked(self.options.rename_path) diff --git a/rare/components/tabs/__init__.py b/rare/components/tabs/__init__.py index a8b97dcb97..73403e2fee 100644 --- a/rare/components/tabs/__init__.py +++ b/rare/components/tabs/__init__.py @@ -98,7 +98,7 @@ def eventFilter(self, w: QObject, e: QEvent) -> bool: if e.button() == Qt.MouseButton.LeftButton: origin = QPoint( self.main_bar.tabRect(tab_idx).bottomRight().x() - self.account_menu.sizeHint().width(), - self.main_bar.tabRect(tab_idx).bottomRight().y() + self.main_bar.tabRect(tab_idx).bottomRight().y(), ) self.account_menu.exec(self.mapToGlobal(origin)) return True diff --git a/rare/components/tabs/downloads/__init__.py b/rare/components/tabs/downloads/__init__.py index f8a4fc2c54..42fb2ee7fc 100644 --- a/rare/components/tabs/downloads/__init__.py +++ b/rare/components/tabs/downloads/__init__.py @@ -183,16 +183,15 @@ def __refresh_download(self, item: InstallQueueItemModel): worker = InstallInfoWorker(self.core, item.options) worker.signals.result.connect( - (lambda obj, d: obj.start_download( - InstallQueueItemModel(options=item.options, download=d))).__get__(self) + (lambda obj, d: obj.start_download(InstallQueueItemModel(options=item.options, download=d))).__get__(self) ) worker.signals.failed.connect( - (lambda obj, m: obj.logger.error( - f"Failed to refresh download for {item.options.app_name} with error: {m}")).__get__(self) + (lambda obj, m: obj.logger.error(f"Failed to refresh download for {item.options.app_name} with error: {m}")).__get__( + self + ) ) worker.signals.finished.connect( - (lambda obj: obj.logger.info( - f"Download refresh worker finished for {item.options.app_name}")).__get__(self) + (lambda obj: obj.logger.info(f"Download refresh worker finished for {item.options.app_name}")).__get__(self) ) QThreadPool.globalInstance().start(worker) diff --git a/rare/components/tabs/downloads/thread.py b/rare/components/tabs/downloads/thread.py index acaaae4c88..c2d928ed88 100644 --- a/rare/components/tabs/downloads/thread.py +++ b/rare/components/tabs/downloads/thread.py @@ -211,8 +211,7 @@ def _handle_postinstall(self, postinstall, igame): proc = QProcess(self) proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels) proc.readyReadStandardOutput.connect( - (lambda obj: obj.logger.debug( - str(proc.readAllStandardOutput().data(), "utf-8", "ignore"))).__get__(self) + (lambda obj: obj.logger.debug(str(proc.readAllStandardOutput().data(), "utf-8", "ignore"))).__get__(self) ) proc.setProgram(fullpath) proc.setArguments(postinstall.get("args", "").split(" ")) diff --git a/rare/components/tabs/downloads/widgets.py b/rare/components/tabs/downloads/widgets.py index 93f32f4f80..afc7322394 100644 --- a/rare/components/tabs/downloads/widgets.py +++ b/rare/components/tabs/downloads/widgets.py @@ -104,13 +104,15 @@ def _on_settings_clicked(self): def _update_game(self, auto: bool): self.ui.update_button.setDisabled(True) self.ui.settings_button.setDisabled(True) - self.enqueue.emit(InstallOptionsModel( - app_name=self.game.app_name, - base_path=self.igame.install_path, - platform=self.igame.platform, - update=True, - silent=auto, # True if settings - )) + self.enqueue.emit( + InstallOptionsModel( + app_name=self.game.app_name, + base_path=self.igame.install_path, + platform=self.igame.platform, + update=True, + silent=auto, # True if settings + ) + ) def set_enabled(self, enabled: bool): self.ui.update_button.setEnabled(enabled) @@ -145,13 +147,13 @@ def __init__( worker = InstallInfoWorker(core, item.options) worker.signals.result.connect(self.__update_info) worker.signals.failed.connect( - (lambda obj, m: obj.logger.error( - f"Failed to requeue download for {item.options.app_name} with error: {m}")).__get__(self) + ( + lambda obj, m: obj.logger.error(f"Failed to requeue download for {item.options.app_name} with error: {m}") + ).__get__(self) ) worker.signals.failed.connect((lambda obj, m: obj.remove.emit(item.options.app_name)).__get__(self)) worker.signals.finished.connect( - (lambda obj: obj.logger.error( - f"Download requeue worker finished for {item.options.app_name}")).__get__(self) + (lambda obj: obj.logger.error(f"Download requeue worker finished for {item.options.app_name}")).__get__(self) ) QThreadPool.globalInstance().start(worker) self.info_widget = QueueInfoWidget(imgmgr, None, None, None, old_igame, parent=self) diff --git a/rare/components/tabs/integrations/eos_group.py b/rare/components/tabs/integrations/eos_group.py index 8c7940c7b9..e8c3b2993c 100644 --- a/rare/components/tabs/integrations/eos_group.py +++ b/rare/components/tabs/integrations/eos_group.py @@ -42,7 +42,6 @@ class CheckForUpdateWorkerSignals(QObject): class CheckForUpdateWorker(QRunnable): - def __init__(self, core: LegendaryCore): super(CheckForUpdateWorker, self).__init__() self.signals = CheckForUpdateWorkerSignals() diff --git a/rare/components/tabs/integrations/import_group.py b/rare/components/tabs/integrations/import_group.py index fc91671ec5..e8cb9689e8 100644 --- a/rare/components/tabs/integrations/import_group.py +++ b/rare/components/tabs/integrations/import_group.py @@ -73,7 +73,6 @@ class ImportWorkerSignals(QObject): class ImportWorker(QRunnable): - def __init__( self, core: LegendaryCore, @@ -278,7 +277,9 @@ def _app_name_changed(self, app_name: str): self.ui.import_dlcs_check.setCheckState(Qt.CheckState.Unchecked) self.ui.import_force_check.setCheckState(Qt.CheckState.Unchecked) self.ui.import_dlcs_check.setEnabled(self.app_name_edit.is_valid and bool(self.core.get_dlc_for_game(app_name))) - self.ui.import_button.setEnabled(not bool(self.worker) and (self.app_name_edit.is_valid and self.import_path_edit.is_valid)) + self.ui.import_button.setEnabled( + not bool(self.worker) and (self.app_name_edit.is_valid and self.import_path_edit.is_valid) + ) @Slot(Qt.CheckState) def _on_import_folder_changed(self, state: Qt.CheckState): diff --git a/rare/components/tabs/library/details/details.py b/rare/components/tabs/library/details/details.py index 7d28108ec6..a15b7bd8a1 100644 --- a/rare/components/tabs/library/details/details.py +++ b/rare/components/tabs/library/details/details.py @@ -166,7 +166,7 @@ def repair_game(self, rgame: RareGame): "There is an update for {} from {} to {}. Do you want to update the game while repairing it?" ).format(rgame.app_title, rgame.version, rgame.remote_version), ) - ans = (mbox == QMessageBox.StandardButton.Yes) + ans = mbox == QMessageBox.StandardButton.Yes rgame.repair(repair_and_update=ans) @Slot(RareGame, str) @@ -252,9 +252,7 @@ def move_game(self, rgame: RareGame, options: MoveGameModel): ans = QMessageBox.question( self, self.tr("Move game? - {}").format(self.rgame.app_title), - self.tr("Destination {} already exists. Are you sure you want to overwrite it?").format( - new_install_path - ), + self.tr("Destination {} already exists. Are you sure you want to overwrite it?").format(new_install_path), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.Yes, ) @@ -439,10 +437,13 @@ def update_game(self, rgame: RareGame): else: self.ui.install_button.setText(self.tr("Install")) - self.ui.description_field.setText(rgame.game.metadata['description']) + self.ui.description_field.setText(rgame.game.metadata["description"]) for page in ( - self.ui.ach_progress_page, self.ui.ach_completed_page, self.ui.ach_uninitiated_page, self.ui.ach_hidden_page, + self.ui.ach_progress_page, + self.ui.ach_completed_page, + self.ui.ach_uninitiated_page, + self.ui.ach_hidden_page, ): for w in page.findChildren(AchievementWidget, options=Qt.FindChildOption.FindDirectChildrenOnly): page.layout().removeWidget(w) @@ -455,12 +456,17 @@ def update_game(self, rgame: RareGame): for group, page in zip( ( - sorted(ach.hidden, key=lambda a: a['xp'], reverse=False), - sorted(ach.uninitiated, key=lambda a: a['xp'], reverse=False), - sorted(ach.completed, key=lambda a: a['unlock_date'], reverse=True), - sorted(ach.in_progress, key=lambda a: a['progress'], reverse=True), + sorted(ach.hidden, key=lambda a: a["xp"], reverse=False), + sorted(ach.uninitiated, key=lambda a: a["xp"], reverse=False), + sorted(ach.completed, key=lambda a: a["unlock_date"], reverse=True), + sorted(ach.in_progress, key=lambda a: a["progress"], reverse=True), + ), + ( + self.ui.ach_hidden_page, + self.ui.ach_uninitiated_page, + self.ui.ach_completed_page, + self.ui.ach_progress_page, ), - (self.ui.ach_hidden_page, self.ui.ach_uninitiated_page, self.ui.ach_completed_page, self.ui.ach_progress_page, ) ): self.ui.achievements_toolbox.setItemEnabled(self.ui.achievements_toolbox.indexOf(page), bool(group)) if bool(group): @@ -483,17 +489,16 @@ def __init__(self, manager: QtRequests, achievement: Dict, parent=None): image = LoadingImageWidget(manager, parent=self) image.setFixedSize(ImageSize.LibraryIcon) - image.fetchPixmap(achievement['icon_link']) + image.fetchPixmap(achievement["icon_link"]) title = QLabel( - f"{achievement['display_name']}" - f" ({achievement['xp']} XP)", - parent=self + f"{achievement['display_name']} ({achievement['xp']} XP)", + parent=self, ) title.setWordWrap(True) - description = QLabel(achievement['description'], parent=self) + description = QLabel(achievement["description"], parent=self) description.setWordWrap(True) - unlock_date = achievement['unlock_date'].astimezone() if achievement['unlock_date'] else None + unlock_date = achievement["unlock_date"].astimezone() if achievement["unlock_date"] else None unlock_date_str = f" ( On: {relative_date(unlock_date)} )" if unlock_date else "" progress = QLabel(f"Progress: {achievement['progress'] * 100:,.2f}% {unlock_date_str}", parent=self) if unlock_date: diff --git a/rare/components/tabs/settings/__init__.py b/rare/components/tabs/settings/__init__.py index 28463c705b..3bb248221f 100644 --- a/rare/components/tabs/settings/__init__.py +++ b/rare/components/tabs/settings/__init__.py @@ -47,4 +47,4 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): @Slot() def _on_update_available(self): - self.tabBar().setTabText(self.about_index, "About (!)") \ No newline at end of file + self.tabBar().setTabText(self.about_index, "About (!)") diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index ca5d51bfd3..c7a5e274ac 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -28,7 +28,6 @@ class RefreshGameMetaWorkerSignals(QObject): class RefreshGameMetaWorker(Worker): - def __init__(self, core: LegendaryCore, platforms: Set[str], include_unreal: bool): super(RefreshGameMetaWorker, self).__init__() self.core = core diff --git a/rare/components/tabs/settings/widgets/proton.py b/rare/components/tabs/settings/widgets/proton.py index 1e86dd9d9c..8b70304611 100644 --- a/rare/components/tabs/settings/widgets/proton.py +++ b/rare/components/tabs/settings/widgets/proton.py @@ -146,7 +146,9 @@ def showEvent(self, a0: QShowEvent) -> None: @Slot(int) def _on_tool_changed(self, index: int): - steam_tool: Union[steam.ProtonTool, steam.CompatibilityTool, None] = self.tool_combo.itemData(index, Qt.ItemDataRole.UserRole) + steam_tool: Union[steam.ProtonTool, steam.CompatibilityTool, None] = self.tool_combo.itemData( + index, Qt.ItemDataRole.UserRole + ) steam_environ = steam.get_steam_environment(steam_tool, self.compat_edit.text()) library_paths = steam_environ["STEAM_COMPAT_LIBRARY_PATHS"] if "STEAM_COMPAT_LIBRARY_PATHS" in steam_environ else "" @@ -211,8 +213,7 @@ def _proton_prefix_edit(text: str) -> Tuple[bool, str, int]: if not dir_list: return True, text, IndicatorReasonsCommon.VALID if any( - (x in dir_list) for x in - ("pfx", "shadercache", "dosdevices", "drive_c", "system.reg", "user.reg", "userdef.reg") + (x in dir_list) for x in ("pfx", "shadercache", "dosdevices", "drive_c", "system.reg", "user.reg", "userdef.reg") ): return True, text, IndicatorReasonsCommon.VALID return False, text, IndicatorReasonsCommon.DIR_NOT_EMPTY diff --git a/rare/components/tabs/settings/widgets/runner.py b/rare/components/tabs/settings/widgets/runner.py index 3f2c50b575..f9a3ef9c55 100644 --- a/rare/components/tabs/settings/widgets/runner.py +++ b/rare/components/tabs/settings/widgets/runner.py @@ -84,19 +84,13 @@ def _shader_cache_check_changed(self, state: Qt.CheckState): @Slot() def _open_pfx_folder(self): - QDesktopServices.openUrl( - QUrl.fromLocalFile(lgd_config.get_wine_prefix_with_global(self.app_name)) - ) + QDesktopServices.openUrl(QUrl.fromLocalFile(lgd_config.get_wine_prefix_with_global(self.app_name))) @Slot() def _open_usr_folder(self): - path = os.path.join( - lgd_config.get_wine_prefix_with_global(self.app_name), "drive_c", "users", getuser() - ) + path = os.path.join(lgd_config.get_wine_prefix_with_global(self.app_name), "drive_c", "users", getuser()) if not os.path.exists(path): - path = os.path.join( - lgd_config.get_wine_prefix_with_global(self.app_name), "drive_c", "users", "steamuser" - ) + path = os.path.join(lgd_config.get_wine_prefix_with_global(self.app_name), "drive_c", "users", "steamuser") QDesktopServices.openUrl(path) @Slot() diff --git a/rare/components/tabs/settings/widgets/wine.py b/rare/components/tabs/settings/widgets/wine.py index 1d598f096e..13592c1306 100644 --- a/rare/components/tabs/settings/widgets/wine.py +++ b/rare/components/tabs/settings/widgets/wine.py @@ -110,10 +110,7 @@ def _wine_prefix_edit(text: str) -> Tuple[bool, str, int]: dir_list = os.listdir(text) if not dir_list: return True, text, IndicatorReasonsCommon.VALID - if any( - (x in dir_list) for x in - ("dosdevices", "drive_c", "system.reg", "user.reg", "userdef.reg") - ): + if any((x in dir_list) for x in ("dosdevices", "drive_c", "system.reg", "user.reg", "userdef.reg")): return True, text, IndicatorReasonsCommon.VALID return False, text, IndicatorReasonsCommon.DIR_NOT_EMPTY else: diff --git a/rare/components/tabs/store/search.py b/rare/components/tabs/store/search.py index 4284b02fd0..aa8e9aedfc 100644 --- a/rare/components/tabs/store/search.py +++ b/rare/components/tabs/store/search.py @@ -129,9 +129,7 @@ def init_filter(self): # lambda: self.prepare_request("sale") if self.on_discount.isChecked() else None # ) # self.ui.on_discount.toggled.connect(lambda: self.prepare_request()) - self.ui.on_discount.toggled.connect( - (lambda obj: obj.prepare_request()).__get__(self) - ) + self.ui.on_discount.toggled.connect((lambda obj: obj.prepare_request()).__get__(self)) constants = Constants() self.checkboxes = [] @@ -145,13 +143,9 @@ def init_filter(self): for text, tag in variables: checkbox = CheckBox(text, tag) # checkbox.activated.connect(lambda x: self.prepare_request(added_tag=x)) - checkbox.activated.connect( - (lambda obj, x: obj.prepare_request(added_tag=x)).__get__(self) - ) + checkbox.activated.connect((lambda obj, x: obj.prepare_request(added_tag=x)).__get__(self)) # checkbox.deactivated.connect(lambda x: self.prepare_request(removed_tag=x)) - checkbox.deactivated.connect( - (lambda obj, x: obj.prepare_request(removed_tag=x)).__get__(self) - ) + checkbox.deactivated.connect((lambda obj, x: obj.prepare_request(removed_tag=x)).__get__(self)) groupbox.layout().addWidget(checkbox) self.checkboxes.append(checkbox) self.ui.reset_button.clicked.connect(self.reset_filters) diff --git a/rare/components/tabs/store/wishlist.py b/rare/components/tabs/store/wishlist.py index 43d3a64205..8bf2af4274 100644 --- a/rare/components/tabs/store/wishlist.py +++ b/rare/components/tabs/store/wishlist.py @@ -134,7 +134,8 @@ def filter_wishlist(self, index: int = int(WishlistFilter.NONE)): 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"], - WishlistOrder.DISCOUNT: lambda x: 1 - (x.catalog_game.price.totalPrice.discountPrice / x.catalog_game.price.totalPrice.originalPrice) + WishlistOrder.DISCOUNT: lambda x: 1 + - (x.catalog_game.price.totalPrice.discountPrice / x.catalog_game.price.totalPrice.originalPrice), } @Slot(int) diff --git a/rare/models/game.py b/rare/models/game.py index 7f5cb2855f..10d1d15b8e 100644 --- a/rare/models/game.py +++ b/rare/models/game.py @@ -67,8 +67,9 @@ def __dict__(self): 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), + 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, @@ -82,7 +83,6 @@ def __bool__(self): class RareGame(RareGameSlim): - def __init__( self, settings: RareAppSettings, @@ -507,9 +507,9 @@ def achievements(self) -> Optional[Namespace]: @property def eulas(self) -> List: - eulas = self.game.metadata.get('eulaIds') or ['$'] + eulas = self.game.metadata.get("eulaIds") or ["$"] - pattern = r'\w+' + pattern = r"\w+" keys = [] for eula in eulas: keys += re.findall(pattern, eula) @@ -699,10 +699,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 @@ -730,7 +727,8 @@ def uninstall(self) -> bool: 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"}, - )) + ) + ) return True def launch( @@ -789,14 +787,13 @@ def launch( class RareEosOverlay(RareGameBase): - def __init__( - self, - settings: RareAppSettings, - legendary_core: LegendaryCore, - image_manager: ImageManager, - game: Game, - ): + self, + settings: RareAppSettings, + legendary_core: LegendaryCore, + image_manager: ImageManager, + game: Game, + ): super(RareEosOverlay, self).__init__(legendary_core, game) self.settings = settings self.image_manager = image_manager @@ -911,8 +908,9 @@ def uninstall(self) -> bool: UninstallOptionsModel( app_name=self.app_name, keep_overlay_keys=platform.system() not in {"Windows"}, - )) + ) + ) return True -__all__ = ["RareGame", "RareEosOverlay"] \ No newline at end of file +__all__ = ["RareGame", "RareEosOverlay"] diff --git a/rare/models/game_slim.py b/rare/models/game_slim.py index 84e6f26e38..edf7b05ef3 100644 --- a/rare/models/game_slim.py +++ b/rare/models/game_slim.py @@ -49,7 +49,6 @@ class RareGameSignalsGame(QObject): class RareGameSignals(QObject): - def __init__(self, /): super(RareGameSignals, self).__init__() self.progress = RareGameSignalsProgress() diff --git a/rare/models/install.py b/rare/models/install.py index 276af1e6c3..777a53aee9 100644 --- a/rare/models/install.py +++ b/rare/models/install.py @@ -137,7 +137,6 @@ def __bool__(self): class MoveGameModel: - def __init__(self, app_name, install_path: str, default_name: str): self.app_name: str = app_name self.default_name: str = default_name diff --git a/rare/models/signals.py b/rare/models/signals.py index bed9c8ae6e..1f0386cb44 100644 --- a/rare/models/signals.py +++ b/rare/models/signals.py @@ -46,7 +46,6 @@ class GlobalSignalsDiscordRPCSignals(QObject): class GlobalSignals(QObject): - def __init__(self): super(GlobalSignals, self).__init__() self.application = GlobalSignalsApplicationSignals() diff --git a/rare/resources/resources.py b/rare/resources/resources.py index 6f3ce6c637..cb40fb7605 100644 --- a/rare/resources/resources.py +++ b/rare/resources/resources.py @@ -35698,10 +35698,13 @@ \x00\x00\x01\x905 \x19\x03\ " + def qInitResources(): QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + def qCleanupResources(): QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + qInitResources() diff --git a/rare/resources/static_css/__init__.py b/rare/resources/static_css/__init__.py index 5b6d4b6d35..5dc5c7590c 100644 --- a/rare/resources/static_css/__init__.py +++ b/rare/resources/static_css/__init__.py @@ -87,10 +87,13 @@ \x00\x00\x01\x9c]]\x00Y\ " + def qInitResources(): QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + def qCleanupResources(): QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + qInitResources() diff --git a/rare/resources/static_css/stylesheet.py b/rare/resources/static_css/stylesheet.py index 82f56713ff..b9b4cb635c 100644 --- a/rare/resources/static_css/stylesheet.py +++ b/rare/resources/static_css/stylesheet.py @@ -55,18 +55,12 @@ def css_name(widget: Union[wrappertype, QObject, Type], subwidget: str = ""): # [Un]InstallButton -style.QPushButton["#InstallButton"].setValues( - borderColor=QColor(0, 180, 0).name(), backgroundColor=QColor(0, 100, 0).name() -) -style.QPushButton["#InstallButton"].hover.setValues( - borderColor=QColor(0, 135, 0).name(), backgroundColor=QColor(0, 70, 0).name() -) +style.QPushButton["#InstallButton"].setValues(borderColor=QColor(0, 180, 0).name(), backgroundColor=QColor(0, 100, 0).name()) +style.QPushButton["#InstallButton"].hover.setValues(borderColor=QColor(0, 135, 0).name(), backgroundColor=QColor(0, 70, 0).name()) style.QPushButton["#InstallButton"].disabled.setValues( borderColor=QColor(0, 60, 0).name(), backgroundColor=QColor(0, 40, 0).name() ) -style.QPushButton["#UninstallButton"].setValues( - borderColor=QColor(180, 0, 0).name(), backgroundColor=QColor(100, 0, 0).name() -) +style.QPushButton["#UninstallButton"].setValues(borderColor=QColor(180, 0, 0).name(), backgroundColor=QColor(100, 0, 0).name()) style.QPushButton["#UninstallButton"].hover.setValues( borderColor=QColor(135, 0, 0).name(), backgroundColor=QColor(70, 0, 0).name() ) diff --git a/rare/resources/stylesheets/RareStyle/__init__.py b/rare/resources/stylesheets/RareStyle/__init__.py index e0b9441a1f..0f0a57f6a4 100644 --- a/rare/resources/stylesheets/RareStyle/__init__.py +++ b/rare/resources/stylesheets/RareStyle/__init__.py @@ -363,10 +363,13 @@ \x00\x00\x01\x8f\xdd\xb9\xe7\xe2\ " + def qInitResources(): QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + def qCleanupResources(): QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + qInitResources() diff --git a/rare/shared/workers/install.py b/rare/shared/workers/install.py index 35b715f9ce..f83bfb6ce8 100644 --- a/rare/shared/workers/install.py +++ b/rare/shared/workers/install.py @@ -19,7 +19,6 @@ class InstallInfoWorkerSignals(QObject): class InstallInfoWorker(Worker): - def __init__(self, core: LegendaryCore, options: InstallOptionsModel): super(InstallInfoWorker, self).__init__() self.signals = InstallInfoWorkerSignals() diff --git a/rare/shared/workers/move.py b/rare/shared/workers/move.py index 33ccd0be2d..ed95f6c499 100644 --- a/rare/shared/workers/move.py +++ b/rare/shared/workers/move.py @@ -30,7 +30,6 @@ class MoveInfoWorkerSignals(QObject): class MoveInfoWorker(Worker): - def __init__(self, rgame: RareGame, igames: Iterator[RareGame], options: MoveGameModel): super(MoveInfoWorker, self).__init__() self.signals = MoveInfoWorkerSignals() @@ -109,7 +108,6 @@ class MoveWorkerSignals(QObject): class MoveWorker(QueueWorker): - def __init__(self, core: LegendaryCore, rgame: RareGame, options: MoveGameModel): super(MoveWorker, self).__init__() self.signals = MoveWorkerSignals() diff --git a/rare/shared/workers/uninstall.py b/rare/shared/workers/uninstall.py index 61ea760958..0dea7b2c10 100644 --- a/rare/shared/workers/uninstall.py +++ b/rare/shared/workers/uninstall.py @@ -100,7 +100,6 @@ class UninstallWorkerSignals(QObject): class UninstallWorker(Worker): - def __init__(self, core: LegendaryCore, rgame: RareGame, options: UninstallOptionsModel): super(UninstallWorker, self).__init__() self.signals = UninstallWorkerSignals() diff --git a/rare/shared/workers/verify.py b/rare/shared/workers/verify.py index b82305c9fa..a34ab5d643 100644 --- a/rare/shared/workers/verify.py +++ b/rare/shared/workers/verify.py @@ -19,7 +19,6 @@ class VerifyWorkerSignals(QObject): class VerifyWorker(QueueWorker): - def __init__(self, core: LegendaryCore, args: Namespace, rgame: RareGame): super(VerifyWorker, self).__init__() self.signals = VerifyWorkerSignals() diff --git a/rare/shared/workers/wine_resolver.py b/rare/shared/workers/wine_resolver.py index c6bc627231..13b4667785 100644 --- a/rare/shared/workers/wine_resolver.py +++ b/rare/shared/workers/wine_resolver.py @@ -30,7 +30,6 @@ class WinePathResolverSignals(QObject): class WinePathResolver(Worker): - def __init__(self, core: LegendaryCore, app_name: str, path: str): super(WinePathResolver, self).__init__() self.signals = WinePathResolverSignals() diff --git a/rare/utils/compat/miniproton.py b/rare/utils/compat/miniproton.py index 32045a29a2..d69ae55fab 100644 --- a/rare/utils/compat/miniproton.py +++ b/rare/utils/compat/miniproton.py @@ -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(("=".join((k, v)) for k, v in dlls.items())) dlloverrides = ";".join((os.environ.get("WINEDLLOVERRIDES", ""), dlloverrides)) env = { @@ -55,26 +55,26 @@ def run_proc(args: List, env: Dict): local_env = os.environ.copy() local_env.update(env) - #determine mode + # determine mode rc = 0 if sys.argv[1] == "run": - #start target app + # start target app rc = run_proc([wine_bin] + sys.argv[2:], local_env) elif sys.argv[1] == "waitforexitandrun": - #wait for wineserver to shut down + # wait for wineserver to shut down run_proc([wineserver_bin, "-w"], local_env) - #then run + # then run rc = run_proc([wine_bin] + sys.argv[2:], local_env) elif sys.argv[1] == "runinprefix": rc = run_proc([wine_bin] + sys.argv[2:], local_env) elif sys.argv[1] == "getcompatpath": - #linux -> windows path + # linux -> windows path path = subprocess.check_output([wine_bin, "winepath", "-w", sys.argv[2]], env=local_env, stderr=sys.stderr) sys.stdout.buffer.write(path) sys.stdout.buffer.flush() sys.stderr.buffer.flush() elif sys.argv[1] == "getnativepath": - #windows -> linux path + # windows -> linux path path = subprocess.check_output([wine_bin, "winepath", sys.argv[2]], env=local_env, stderr=sys.stderr) sys.stdout.buffer.write(path) sys.stdout.buffer.flush() diff --git a/rare/utils/compat/steam.py b/rare/utils/compat/steam.py index 64bc922442..580592cb84 100644 --- a/rare/utils/compat/steam.py +++ b/rare/utils/compat/steam.py @@ -361,8 +361,7 @@ def find_compatibility_tools(steam_path: str) -> List[CompatibilityTool]: def get_runtime( - tool: Union[ProtonTool, CompatibilityTool], - runtimes: Dict[str, Union[SteamRuntime, UmuRuntime]] + tool: Union[ProtonTool, CompatibilityTool], runtimes: Dict[str, Union[SteamRuntime, UmuRuntime]] ) -> Union[SteamRuntime, UmuRuntime, None]: required_tool = tool.required_tool if required_tool is None: diff --git a/rare/utils/misc.py b/rare/utils/misc.py index 97cd661216..065385f16d 100644 --- a/rare/utils/misc.py +++ b/rare/utils/misc.py @@ -180,23 +180,23 @@ def relative_date(date): diff = datetime.now(UTC) - date s = diff.seconds if diff.days > 7 or diff.days < 0: - return date.strftime('%d %b %y') + return date.strftime("%d %b %y") elif diff.days == 1: - return '1 day ago' + return "1 day ago" elif diff.days > 1: - return '{} days ago'.format(diff.days) + return "{} days ago".format(diff.days) elif s <= 1: - return 'just now' + return "just now" elif s < 60: - return '{} seconds ago'.format(s) + return "{} seconds ago".format(s) elif s < 120: - return '1 minute ago' + return "1 minute ago" elif s < 3600: - return '{} minutes ago'.format(s//60) + return "{} minutes ago".format(s // 60) elif s < 7200: - return '1 hour ago' + return "1 hour ago" else: - return '{} hours ago'.format(s//3600) + return "{} hours ago".format(s // 3600) def qta_icon(icn_str: str, fallback: str = None, **kwargs): @@ -219,6 +219,7 @@ def qta_icon(icn_str: str, fallback: str = None, **kwargs): # Posted by benrg # Retrieved 2025-12-25, License - CC BY-SA 4.0 + def partial_bound_method(bound_method, *args, **kwargs): f = functools.partialmethod(bound_method.__func__, *args, **kwargs) # NB: the seemingly redundant lambda is needed to ensure the correct result type diff --git a/rare/utils/paths.py b/rare/utils/paths.py index 973c812755..9f50db1aab 100644 --- a/rare/utils/paths.py +++ b/rare/utils/paths.py @@ -149,7 +149,7 @@ def setup_compat_shaders_dir(path: str) -> Dict: "__GL_SHADER_DISK_CACHE_PATH": os.path.join(path, "nvidiav1"), "__GL_SHADER_DISK_CACHE_READ_ONLY_APP_NAME": "steam_shader_cache;steamapp_merged_shader_cache", "__GL_SHADER_DISK_CACHE_SIZE": "10737418240", # 10GiB - #"__GL_SHADER_DISK_CACHE_SKIP_CLEANUP": "1", + # "__GL_SHADER_DISK_CACHE_SKIP_CLEANUP": "1", # Mesa "MESA_DISK_CACHE_READ_ONLY_FOZ_DBS": "steam_cache,steam_precompiled", "MESA_DISK_CACHE_SINGLE_FILE": "1", @@ -257,7 +257,7 @@ def get_rare_executable(*, external: bool = False) -> List[str]: if os.environ.get("SNAP") and external: return ["snap", "run", "rare"] if os.environ.get("container") == "flatpak" and external: - return ["flatpak", "run", "io.github.dummerle.rare"] + return ["flatpak", "run", "io.github.dummerle.rare"] # lk: detect if nuitka if "__compiled__" in globals(): diff --git a/rare/utils/steam_grades.py b/rare/utils/steam_grades.py index 7a0dd18a76..46605f3115 100644 --- a/rare/utils/steam_grades.py +++ b/rare/utils/steam_grades.py @@ -14,6 +14,7 @@ logger = getLogger("SteamGrades") + class ProtondbRatings(int, Enum): # internal PENDING = ("pending", -2) @@ -59,7 +60,6 @@ def _download_steam_appids(self) -> bytes: return resp.content def load_steam_appids(self) -> Dict: - if SteamGrades.__steam_appids: return SteamGrades.__steam_appids diff --git a/rare/widgets/image_widget.py b/rare/widgets/image_widget.py index 8315dc2038..74d14b52c4 100644 --- a/rare/widgets/image_widget.py +++ b/rare/widgets/image_widget.py @@ -190,11 +190,15 @@ def __init__(self, manager: QtRequests, parent=None): def fetchPixmap(self, url: str, params: Dict = None): self.spinner.setFixedSize(self._image_size.size) self.spinner.start() - params = { - "resize": 1, - "w": self._image_size.base.size.width(), - "h": self._image_size.base.size.height(), - } if not params else params + params = ( + { + "resize": 1, + "w": self._image_size.base.size.width(), + "h": self._image_size.base.size.height(), + } + if not params + else params + ) super().fetchPixmap(url, params=params) def _on_image_ready(self, data):