From e3348c3881d37206dd980cfef918858f48132c4e Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 11 Jan 2025 20:26:54 +0200 Subject: [PATCH 1/3] app: add wine related cmd arguments only on relevant platforms --- rare/commands/launcher/lgd_helper.py | 4 ++-- rare/main.py | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/rare/commands/launcher/lgd_helper.py b/rare/commands/launcher/lgd_helper.py index 6b415d9dc..80f4ce06e 100644 --- a/rare/commands/launcher/lgd_helper.py +++ b/rare/commands/launcher/lgd_helper.py @@ -34,8 +34,8 @@ def from_argparse(cls, args): debug=args.debug, offline=args.offline, skip_update_check=args.skip_update_check, - wine_bin=args.wine_bin, - wine_prefix=args.wine_pfx, + wine_bin=args.wine_bin if hasattr(args, "wine_bin") else "", + wine_prefix=args.wine_pfx if hasattr(args, "wine_prefix") else "", dry_run=args.dry_run ) diff --git a/rare/main.py b/rare/main.py index ab1c26acd..583c764da 100755 --- a/rare/main.py +++ b/rare/main.py @@ -1,6 +1,7 @@ import multiprocessing import os import pathlib +import platform import sys from argparse import ArgumentParser @@ -65,16 +66,17 @@ def main() -> int: launch_parser.add_argument("--dry-run", help="Print arguments and exit", action="store_true") launch_parser.add_argument("--offline", help="Launch game offline", action="store_true") - launch_parser.add_argument('--wine-bin', dest='wine_bin', action='store', metavar='', - default=os.environ.get('LGDRY_WINE_BINARY', None), - help='Set WINE binary to use to launch the app') - launch_parser.add_argument('--wine-prefix', dest='wine_pfx', action='store', metavar='', - default=os.environ.get('LGDRY_WINE_PREFIX', None), - help='Set WINE prefix to use') launch_parser.add_argument("--ask-sync-saves", help="Ask to sync cloud saves", action="store_true") launch_parser.add_argument("--skip-update-check", help="Do not check for updates", action="store_true") + if platform.system() != "Windows": + launch_parser.add_argument('--wine-bin', dest='wine_bin', action='store', metavar='', + default=os.environ.get('LGDRY_WINE_BINARY', None), + help='Set WINE binary to use to launch the app') + launch_parser.add_argument('--wine-prefix', dest='wine_pfx', action='store', metavar='', + default=os.environ.get('LGDRY_WINE_PREFIX', None), + help='Set WINE prefix to use') login_parser = subparsers.add_parser("login", aliases=["auth"]) login_parser.add_argument("egl_version", help="Epic Games Launcher User Agent version", From 5bd4ad2e4226df333dbffcff004f519f8a5096d0 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 11 Jan 2025 20:30:19 +0200 Subject: [PATCH 2/3] RareGame: update login when adding launch arguments. fixes Rare adding the `--offline` and `--skip-update-check` arguments if their respective options where set to `Off` Fixes #512 --- rare/models/game.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rare/models/game.py b/rare/models/game.py index 756bbb238..7e61829b8 100644 --- a/rare/models/game.py +++ b/rare/models/game.py @@ -20,7 +20,7 @@ from rare.shared.image_manager import ImageManager from rare.utils.paths import data_dir, get_rare_executable from rare.utils.steam_grades import get_rating -from rare.utils.config_helper import set_envvar, get_option +from rare.utils.config_helper import set_envvar, get_boolean logger = getLogger("RareGame") @@ -566,10 +566,10 @@ def launch( cmd_line = get_rare_executable() executable, args = cmd_line[0], cmd_line[1:] - args.extend(["launch", self.app_name]) - if offline or get_option(self.app_name, "offline", fallback=None): + args.extend(("launch", self.app_name)) + if offline or get_boolean(self.app_name, "offline", fallback=False): args.append("--offline") - if skip_update_check or get_option(self.app_name, "skip_update_check", fallback=None): + if skip_update_check or get_boolean(self.app_name, "skip_update_check", fallback=False): args.append("--skip-update-check") if wine_bin: args.extend(["--wine-bin", wine_bin]) From e3a6bdd828772ef9724e66996913610ead1028fb Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Sat, 11 Jan 2025 18:38:07 +0200 Subject: [PATCH 3/3] Rare: add option to close to tray on startup Implements #478 --- rare/components/__init__.py | 8 +-- rare/components/main_window.py | 14 ++--- rare/components/tabs/settings/rare.py | 19 +++++-- rare/models/options.py | 5 +- rare/ui/components/tabs/settings/rare.py | 68 +++++++++++++----------- rare/ui/components/tabs/settings/rare.ui | 63 ++++++++++++---------- 6 files changed, 103 insertions(+), 74 deletions(-) diff --git a/rare/components/__init__.py b/rare/components/__init__.py index 6f05878e2..116f771f2 100644 --- a/rare/components/__init__.py +++ b/rare/components/__init__.py @@ -11,7 +11,7 @@ from rare.models.options import options from rare.components.dialogs.launch_dialog import LaunchDialog -from rare.components.main_window import MainWindow +from rare.components.main_window import RareWindow from rare.shared import RareCore from rare.utils import paths from rare.utils.misc import ExitCodes @@ -50,7 +50,7 @@ def __init__(self, args: Namespace): self.load_translator(language) # set Application name for settings - self.main_window: Optional[MainWindow] = None + self.main_window: Optional[RareWindow] = None self.launch_dialog: Optional[LaunchDialog] = None self.relogin_timer: Optional[QTimer] = None @@ -91,10 +91,10 @@ def __on_start_app(self): self.relogin_timer.timeout.connect(self.relogin) self.poke_timer() - self.main_window = MainWindow() + self.main_window = RareWindow() self.main_window.exit_app.connect(self.__on_exit_app) - if not self.args.silent: + if (not self.args.silent) and (not self.settings.value(*options.sys_tray_start)): self.main_window.show() if self.args.test_start: diff --git a/rare/components/main_window.py b/rare/components/main_window.py index 46af6c6c9..161a5a9f6 100644 --- a/rare/components/main_window.py +++ b/rare/components/main_window.py @@ -28,7 +28,7 @@ logger = getLogger("MainWindow") -class MainWindow(QMainWindow): +class RareWindow(QMainWindow): # int: exit code exit_app: Signal = Signal(int) @@ -36,7 +36,7 @@ def __init__(self, parent=None): self.__exit_code = 0 self.__accept_close = False self._window_launched = False - super(MainWindow, self).__init__(parent=parent) + super(RareWindow, self).__init__(parent=parent) self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True) self.rcore = RareCore.instance() self.core = RareCore.instance().core() @@ -149,7 +149,7 @@ def center_window(self): @Slot() def show(self) -> None: - super(MainWindow, self).show() + super(RareWindow, self).show() if not self._window_launched: self.center_window() self._window_launched = True @@ -158,7 +158,7 @@ def hide(self) -> None: if self.settings.value(*options.restore_window): self.settings.setValue(options.window_width.key, self.size().width()) self.settings.setValue(options.window_height.key, self.size().height()) - super(MainWindow, self).hide() + super(RareWindow, self).hide() def toggle(self): if self.isHidden(): @@ -212,13 +212,13 @@ def __on_exit_app(self, exit_code=0) -> None: def close(self) -> bool: self.__accept_close = True - return super(MainWindow, self).close() + return super(RareWindow, self).close() def closeEvent(self, e: QCloseEvent) -> None: # lk: `accept_close` is set to `True` by the `close()` method, overrides exiting to tray in `closeEvent()` # lk: ensures exiting instead of hiding when `close()` is called programmatically if not self.__accept_close: - if self.settings.value(*options.sys_tray): + if self.settings.value(*options.sys_tray_close): self.hide() e.ignore() return @@ -265,5 +265,5 @@ def closeEvent(self, e: QCloseEvent) -> None: self.tray_icon.deleteLater() self.hide() self.exit_app.emit(self.__exit_code) - super(MainWindow, self).closeEvent(e) + super(RareWindow, self).closeEvent(e) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index fc81f28dd..f74e6e565 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -78,9 +78,22 @@ def __init__(self, parent=None): self.discord_rpc_settings = DiscordRPCSettings(self) self.ui.right_layout.insertWidget(1, self.discord_rpc_settings, alignment=Qt.AlignmentFlag.AlignTop) - self.ui.sys_tray.setChecked(self.settings.value(*options.sys_tray)) - self.ui.sys_tray.stateChanged.connect( - lambda: self.settings.setValue(options.sys_tray.key, self.ui.sys_tray.isChecked()) + self.ui.sys_tray_close.setChecked(self.settings.value(*options.sys_tray_close)) + self.ui.sys_tray_close.stateChanged.connect( + lambda: self.settings.setValue(options.sys_tray_close.key, self.ui.sys_tray_close.isChecked()) + ) + + self.ui.sys_tray_start.setChecked(self.settings.value(*options.sys_tray_start)) + self.ui.sys_tray_start.stateChanged.connect( + lambda: self.settings.setValue(options.sys_tray_start.key, self.ui.sys_tray_start.isChecked()) + ) + + # Disable starting in system tray if closing to system tray is disabled. + self.ui.sys_tray_close.checkStateChanged.connect( + lambda: self.ui.sys_tray_start.setChecked(False) + ) + self.ui.sys_tray_close.checkStateChanged.connect( + lambda: self.ui.sys_tray_start.setEnabled(self.ui.sys_tray_close.isChecked()) ) self.ui.auto_update.setChecked(self.settings.value(*options.auto_update)) diff --git a/rare/models/options.py b/rare/models/options.py index 990c3ea93..0bf821cc8 100644 --- a/rare/models/options.py +++ b/rare/models/options.py @@ -26,7 +26,10 @@ class Defaults(Namespace): exclude_entitlements = Value(key="exclude_entitlements", default=False, dtype=bool) language = Value(key="language", default=locale.getlocale()[0], dtype=str) - sys_tray = Value(key="sys_tray", default=True, dtype=bool) + + sys_tray_close = Value(key="sys_tray", default=True, dtype=bool) + sys_tray_start = Value(key="sys_tray_start", default=False, dtype=bool) + auto_update = Value(key="auto_update", default=False, dtype=bool) auto_sync_cloud = Value(key="auto_sync_cloud", default=False, dtype=bool) confirm_start = Value(key="confirm_start", default=False, dtype=bool) diff --git a/rare/ui/components/tabs/settings/rare.py b/rare/ui/components/tabs/settings/rare.py index b7a048495..c1706925c 100644 --- a/rare/ui/components/tabs/settings/rare.py +++ b/rare/ui/components/tabs/settings/rare.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'rare.ui' ## -## Created by: Qt User Interface Compiler version 6.7.2 +## Created by: Qt User Interface Compiler version 6.8.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -39,8 +39,8 @@ def setupUi(self, RareSettings): self.interface_group.setSizePolicy(sizePolicy) self.interface_layout = QFormLayout(self.interface_group) self.interface_layout.setObjectName(u"interface_layout") - self.interface_layout.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint) - self.interface_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) + 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") @@ -49,7 +49,7 @@ def setupUi(self, RareSettings): self.lang_select = QComboBox(self.interface_group) self.lang_select.setObjectName(u"lang_select") - self.interface_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.lang_select) + self.interface_layout.setWidget(0, QFormLayout.FieldRole, self.lang_select) self.color_label = QLabel(self.interface_group) self.color_label.setObjectName(u"color_label") @@ -59,7 +59,7 @@ def setupUi(self, RareSettings): self.color_select = QComboBox(self.interface_group) self.color_select.setObjectName(u"color_select") - self.interface_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.color_select) + self.interface_layout.setWidget(1, QFormLayout.FieldRole, self.color_select) self.style_label = QLabel(self.interface_group) self.style_label.setObjectName(u"style_label") @@ -69,7 +69,7 @@ def setupUi(self, RareSettings): self.style_select = QComboBox(self.interface_group) self.style_select.setObjectName(u"style_select") - self.interface_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.style_select) + self.interface_layout.setWidget(2, QFormLayout.FieldRole, self.style_select) self.interface_info = QLabel(self.interface_group) self.interface_info.setObjectName(u"interface_info") @@ -88,7 +88,7 @@ def setupUi(self, RareSettings): self.view_combo = QComboBox(self.interface_group) self.view_combo.setObjectName(u"view_combo") - self.interface_layout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.view_combo) + self.interface_layout.setWidget(3, QFormLayout.FieldRole, self.view_combo) self.left_layout.addWidget(self.interface_group) @@ -97,44 +97,49 @@ def setupUi(self, RareSettings): self.settings_group.setObjectName(u"settings_group") self.behavior_layout = QGridLayout(self.settings_group) self.behavior_layout.setObjectName(u"behavior_layout") - self.save_size = QCheckBox(self.settings_group) - self.save_size.setObjectName(u"save_size") + self.confirm_start = QCheckBox(self.settings_group) + self.confirm_start.setObjectName(u"confirm_start") - self.behavior_layout.addWidget(self.save_size, 5, 0, 1, 1) + self.behavior_layout.addWidget(self.confirm_start, 3, 0, 1, 1) - self.notification = QCheckBox(self.settings_group) - self.notification.setObjectName(u"notification") + self.sys_tray_close = QCheckBox(self.settings_group) + self.sys_tray_close.setObjectName(u"sys_tray_close") - self.behavior_layout.addWidget(self.notification, 4, 0, 1, 1) + 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.behavior_layout.addWidget(self.log_games, 6, 0, 1, 1) + 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.sys_tray = QCheckBox(self.settings_group) - self.sys_tray.setObjectName(u"sys_tray") + self.behavior_layout.addWidget(self.auto_sync_cloud, 4, 0, 1, 1) - self.behavior_layout.addWidget(self.sys_tray, 0, 0, 1, 1) + self.save_size = QCheckBox(self.settings_group) + self.save_size.setObjectName(u"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.behavior_layout.addWidget(self.auto_update, 1, 0, 1, 1) + self.behavior_layout.addWidget(self.auto_update, 2, 0, 1, 1) - self.confirm_start = QCheckBox(self.settings_group) - self.confirm_start.setObjectName(u"confirm_start") + self.settings_hspacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.behavior_layout.addWidget(self.confirm_start, 2, 0, 1, 1) + self.behavior_layout.addItem(self.settings_hspacer, 3, 1, 2, 1) - self.auto_sync_cloud = QCheckBox(self.settings_group) - self.auto_sync_cloud.setObjectName(u"auto_sync_cloud") + self.notification = QCheckBox(self.settings_group) + self.notification.setObjectName(u"notification") - self.behavior_layout.addWidget(self.auto_sync_cloud, 3, 0, 1, 1) + self.behavior_layout.addWidget(self.notification, 5, 0, 1, 1) - self.settings_hspacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.sys_tray_start = QCheckBox(self.settings_group) + self.sys_tray_start.setObjectName(u"sys_tray_start") - self.behavior_layout.addItem(self.settings_hspacer, 2, 1, 2, 1) + self.behavior_layout.addWidget(self.sys_tray_start, 1, 0, 1, 1) self.left_layout.addWidget(self.settings_group) @@ -213,13 +218,14 @@ def retranslateUi(self, RareSettings): 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.save_size.setText(QCoreApplication.translate("RareSettings", u"Restore window size on application startup", None)) - self.notification.setText(QCoreApplication.translate("RareSettings", u"Show notifications when downloads complete", None)) - self.log_games.setText(QCoreApplication.translate("RareSettings", u"Show console window when launching games", None)) - self.sys_tray.setText(QCoreApplication.translate("RareSettings", u"Close to system tray", None)) - self.auto_update.setText(QCoreApplication.translate("RareSettings", u"Queue game updates on application startup", 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)) diff --git a/rare/ui/components/tabs/settings/rare.ui b/rare/ui/components/tabs/settings/rare.ui index 09b08a2db..43134dd68 100644 --- a/rare/ui/components/tabs/settings/rare.ui +++ b/rare/ui/components/tabs/settings/rare.ui @@ -29,10 +29,10 @@ - QFormLayout::FieldsStayAtSizeHint + QFormLayout::FieldGrowthPolicy::FieldsStayAtSizeHint - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -98,59 +98,52 @@ Behavior - - + + - Restore window size on application startup + Confirm before launching games - - + + - Show notifications when downloads complete + Close to system tray - + Show console window when launching games - - + + - Close to system tray + Automatically upload/download cloud saves - - + + - Queue game updates on application startup + Restore window size on application startup - - - Confirm before launching games - - - - - + - Automatically upload/download cloud saves + Queue game updates on application startup - + - Qt::Horizontal + Qt::Orientation::Horizontal @@ -160,13 +153,27 @@ + + + + Show notifications when downloads complete + + + + + + + Start minimized to the system tray + + + - Qt::Vertical + Qt::Orientation::Vertical @@ -245,7 +252,7 @@ - Qt::Vertical + Qt::Orientation::Vertical