diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bf60789527..bbecaa1b50 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -8,41 +8,47 @@ assignees: '' --- **Describe the bug** - + -**To Reproduce** - +**Steps to Reproduce** + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** - + **Screenshots** - + **System information** - + - Operating system: [e.g. Manjaro/Windows 10] - Version: [e.g. 1.6.2] - Installation method: [e.g. pip/msi/AppImage] - Python version: (if installed through `pip` or your package manager) **Additional context** - + **Error message** - + | OS | Path | |---------|----------------------------------------------------------| | Windows | `C:\Users\\AppData\Local\Rare\Rare\cache\logs` | diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index fec3c8c7a6..829134c561 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -8,17 +8,21 @@ assignees: '' --- **Is your feature request related to a problem? Please describe.** - + **Describe the solution you'd like** - + **Describe alternatives you've considered** - + **Additional context** - + diff --git a/rare/commands/launcher/console_dialog.py b/rare/commands/launcher/console_dialog.py index 4e2e098c37..5d1e338522 100644 --- a/rare/commands/launcher/console_dialog.py +++ b/rare/commands/launcher/console_dialog.py @@ -165,7 +165,7 @@ class ConsoleEdit(QPlainTextEdit): def __init__(self, parent=None): super(ConsoleEdit, self).__init__(parent=parent) self.setReadOnly(True) - font = QFont("Monospace") + font = self.font() font.setStyleHint(QFont.StyleHint.Monospace) self.setFont(font) diff --git a/rare/components/dialogs/login/__init__.py b/rare/components/dialogs/login/__init__.py index 80baf902c9..c5db7c3ef5 100644 --- a/rare/components/dialogs/login/__init__.py +++ b/rare/components/dialogs/login/__init__.py @@ -45,40 +45,44 @@ def __init__(self, args: Namespace, core: LegendaryCore, parent=None): self.core = core self.login_stack = SlidingStackedWidget(parent=self) - self.login_stack.setMinimumWidth(480) - self.ui.login_stack_layout.addWidget(self.login_stack) + self.ui.main_layout.insertWidget(3, self.login_stack, stretch=1) self.landing_page = LandingPage(self.login_stack) - self.login_stack.insertWidget(0, self.landing_page) + self.landing_index = self.login_stack.insertWidget(0, self.landing_page) self.browser_page = BrowserLogin(self.core, self.login_stack) - self.login_stack.insertWidget(1, self.browser_page) + self.browser_index = self.login_stack.insertWidget(1, self.browser_page) self.browser_page.success.connect(self.login_successful) self.browser_page.isValid.connect(lambda x: self.ui.next_button.setEnabled(x)) self.import_page = ImportLogin(self.core, self.login_stack) - self.login_stack.insertWidget(2, self.import_page) + self.import_index = self.login_stack.insertWidget(2, self.import_page) self.import_page.success.connect(self.login_successful) self.import_page.isValid.connect(lambda x: self.ui.next_button.setEnabled(x)) - # # NOTE: The real problem is that the BrowserLogin page has a huge QLabel with word-wrapping enabled. - # # That forces the whole form to vertically expand instead of horizontally. Since the form is not shown - # # on the first page, the internal Qt calculation for the size of that form calculates it by expanding it - # # vertically. Once the form becomes visible, the correct calculation takes place and that is why the - # # dialog reduces in height. To avoid that, calculate the bounding size of all forms and set it as the - # # minumum size - # self.login_stack.setMinimumSize( - # self.landing_page.sizeHint().expandedTo( - # self.browser_page.sizeHint().expandedTo(self.import_page.sizeHint()) - # ) - # ) - - self.login_stack.setFixedHeight( - max( - self.landing_page.heightForWidth(self.login_stack.minimumWidth()), - self.browser_page.heightForWidth(self.login_stack.minimumWidth()), - self.import_page.heightForWidth(self.login_stack.minimumWidth()), - ) - ) + self.info_message = { + 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 " + "in any web browser. After logging in using the browser, copy " + "the text in the quotes after authorizationCode " + "in the same line into the empty input above." + "

DO NOT SHARE THE INFORMATION IN THE BROWSER PAGE WITH " + "ANYONE IN ANY FORM (TEXT OR SCREENSHOT)!
" + ), + self.import_index: self.tr( + "Select the Wine prefix where Epic Games Launcher is installed. " + "You will get logged out from EGL in the process." + ), + } + self.ui.info_label.setText(self.info_message[self.landing_index]) + + self.login_stack.setMinimumWidth(640) + self.login_stack.setMinimumHeight(180) + self.ui.info_label.setMinimumWidth(640) + self.ui.info_label.setMinimumHeight(40) self.ui.next_button.setEnabled(False) self.ui.back_button.setEnabled(False) @@ -108,12 +112,14 @@ def __init__(self, args: Namespace, core: LegendaryCore, parent=None): @Slot() def browser_radio_clicked(self): self.login_stack.slideInWidget(self.browser_page) + self.ui.info_label.setText(self.info_message[self.browser_index]) self.ui.back_button.setEnabled(True) self.ui.next_button.setEnabled(False) @Slot() def import_radio_clicked(self): self.login_stack.slideInWidget(self.import_page) + self.ui.info_label.setText(self.info_message[self.import_index]) self.ui.back_button.setEnabled(True) self.ui.next_button.setEnabled(self.import_page.is_valid()) @@ -121,6 +127,7 @@ def import_radio_clicked(self): def back_clicked(self): self.ui.back_button.setEnabled(False) self.ui.next_button.setEnabled(True) + self.ui.info_label.setText(self.info_message[self.landing_index]) self.login_stack.slideInWidget(self.landing_page) @Slot() diff --git a/rare/components/dialogs/login/browser_login.py b/rare/components/dialogs/login/browser_login.py index 7541667554..568d3f658c 100644 --- a/rare/components/dialogs/login/browser_login.py +++ b/rare/components/dialogs/login/browser_login.py @@ -8,6 +8,7 @@ from PySide6.QtWidgets import QApplication, QFormLayout, QFrame, QLineEdit from rare.lgndr.core import LegendaryCore +from rare.lgndr.glue.exception import LgndrException from rare.ui.components.dialogs.login.browser_login import Ui_BrowserLogin from rare.utils.misc import qta_icon from rare.utils.paths import get_rare_executable @@ -29,28 +30,30 @@ def __init__(self, core: LegendaryCore, parent=None): self.core = core self.login_url = self.core.egs.get_auth_url() - self.sid_edit = IndicatorLineEdit( + self.auth_edit = IndicatorLineEdit( placeholder=self.tr("Insert authorizationCode here"), edit_func=self.sid_edit_callback, parent=self ) - self.sid_edit.line_edit.setEchoMode(QLineEdit.EchoMode.Password) + self.auth_edit.line_edit.setEchoMode(QLineEdit.EchoMode.Password) self.ui.link_text.setText(self.login_url) self.ui.copy_button.setIcon(qta_icon("mdi.content-copy", "fa5.copy")) self.ui.copy_button.clicked.connect(self.copy_link) self.ui.form_layout.setWidget( - self.ui.form_layout.getWidgetPosition(self.ui.sid_label)[0], QFormLayout.ItemRole.FieldRole, self.sid_edit + self.ui.form_layout.getWidgetPosition(self.ui.sid_label)[0], + QFormLayout.ItemRole.FieldRole, + self.auth_edit ) self.ui.open_button.clicked.connect(self.open_browser) - self.sid_edit.textChanged.connect(lambda _: self.isValid.emit(self.is_valid())) + self.auth_edit.textChanged.connect(lambda _: self.isValid.emit(self.is_valid())) @Slot() def copy_link(self): clipboard = QApplication.instance().clipboard() clipboard.setText(self.login_url) - self.ui.status_label.setText(self.tr("Copied to clipboard")) + self.ui.status_field.setText(self.tr("Copied to clipboard")) def is_valid(self): - return self.sid_edit.is_valid + return self.auth_edit.is_valid @staticmethod def sid_edit_callback(text) -> Tuple[bool, str, int]: @@ -68,17 +71,17 @@ def sid_edit_callback(text) -> Tuple[bool, str, int]: return False, text, IndicatorReasonsCommon.VALID def do_login(self): - self.ui.status_label.setText(self.tr("Logging in...")) - auth_code = self.sid_edit.text() + self.ui.status_field.setText(self.tr("Logging in...")) + auth_code = self.auth_edit.text() try: if self.core.auth_code(auth_code): self.logger.info("Successfully logged in as %s", self.core.lgd.userdata["displayName"]) self.success.emit() - else: - self.ui.status_label.setText(self.tr("Login failed.")) - self.logger.warning("Failed to login through browser") except Exception as e: - self.logger.warning(e) + 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") + self.logger.error(e) @Slot() def open_browser(self): @@ -97,8 +100,14 @@ def open_browser(self): proc.deleteLater() if out: - self.core.auth_ex_token(out) - self.logger.info("Successfully logged in as %s", {self.core.lgd.userdata["displayName"]}) - self.success.emit() + try: + 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: + 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") + self.logger.error(e) else: - self.logger.warning("Failed to login through browser.") + 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 3a76977de8..00294841ba 100644 --- a/rare/components/dialogs/login/import_login.py +++ b/rare/components/dialogs/login/import_login.py @@ -8,6 +8,7 @@ from PySide6.QtWidgets import QFileDialog, QFrame from rare.lgndr.core import LegendaryCore +from rare.lgndr.glue.exception import LgndrException from rare.ui.components.dialogs.login.import_login import Ui_ImportLogin @@ -40,9 +41,9 @@ def __init__(self, core: LegendaryCore, parent=None): if not self.core.egl.appdata_path and os.path.exists(self.egl_appdata): self.core.egl.appdata_path = self.egl_appdata if not self.core.egl.appdata_path: - self.ui.status_label.setText(self.text_egl_notfound) + self.ui.status_field.setText(self.text_egl_notfound) else: - self.ui.status_label.setText(self.text_egl_found) + self.ui.status_field.setText(self.text_egl_found) self.found = True self.ui.prefix_combo.setCurrentText(self.egl_appdata) else: @@ -52,9 +53,9 @@ def __init__(self, core: LegendaryCore, parent=None): prefixes = self.get_wine_prefixes() if len(prefixes): self.ui.prefix_combo.addItems(prefixes) - self.ui.status_label.setText(self.tr("Select the Wine prefix you want to import.")) + self.ui.status_field.setText(self.tr("Select the Wine prefix you want to import.")) else: - self.ui.status_label.setText(self.text_egl_notfound) + self.ui.status_field.setText(self.text_egl_notfound) self.ui.prefix_button.clicked.connect(self.prefix_path) self.ui.prefix_combo.editTextChanged.connect(lambda _: self.isValid.emit(self.is_valid())) @@ -90,13 +91,13 @@ def is_valid(self) -> bool: os.path.join(wine_folders["Local AppData"], "EpicGamesLauncher", "Saved", "Config", "Windows") ) if path_exists := os.path.exists(self.egl_appdata): - self.ui.status_label.setText(self.text_egl_found) + self.ui.status_field.setText(self.text_egl_found) return path_exists except KeyError: return False def do_login(self): - self.ui.status_label.setText(self.tr("Loading...")) + self.ui.status_field.setText(self.tr("Loading...")) if os.name != "nt": self.logger.info("Using EGL appdata path at %s", {self.egl_appdata}) self.core.egl.appdata_path = self.egl_appdata @@ -104,9 +105,8 @@ def do_login(self): if self.core.auth_import(): self.logger.info("Logged in as %s", {self.core.lgd.userdata["displayName"]}) self.success.emit() - else: - self.ui.status_label.setText(self.tr("Login failed.")) - self.logger.warning("Failed to import existing session.") except Exception as e: - self.ui.status_label.setText(self.tr("Login failed. {}").format(str(e))) - self.logger.warning("Failed to import existing session: %s", e) + 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") + self.logger.error(e) diff --git a/rare/components/dialogs/move.py b/rare/components/dialogs/move.py index f8ad7f52a9..c4797abd76 100644 --- a/rare/components/dialogs/move.py +++ b/rare/components/dialogs/move.py @@ -2,7 +2,7 @@ from typing import Optional, Tuple, Union from PySide6.QtCore import QSignalBlocker, QThreadPool, Signal, Slot -from PySide6.QtGui import QShowEvent, Qt +from PySide6.QtGui import QFont, QShowEvent, Qt from PySide6.QtWidgets import QFileDialog, QFormLayout, QLabel, QWidget from rare.models.game import RareGame @@ -62,7 +62,7 @@ def __init__(self, rcore: RareCore, rgame: RareGame, parent=None): self.full_path_info = ElideLabel(parent=self) font = self.font() - font.setItalic(True) + font.setStyleHint(QFont.StyleHint.Monospace) self.full_path_info.setFont(font) self.ui.main_layout.setWidget( self.ui.main_layout.getWidgetPosition(self.ui.full_path_label)[0], diff --git a/rare/lgndr/core.py b/rare/lgndr/core.py index f17b8f2ec4..efa61b3cba 100644 --- a/rare/lgndr/core.py +++ b/rare/lgndr/core.py @@ -58,6 +58,39 @@ def default_platform(self) -> str: usr_platform = self.lgd.config.get("Legendary", "default_platform", fallback=os_default) return usr_platform if usr_platform in ("Windows", "Win32", "Mac") else os_default + def auth_code(self, code) -> bool: + handler = LgndrLogHandler(logging.ERROR) + self.log.addHandler(handler) + try: + ret = super().auth_code(code) + except LgndrException as ret: + raise ret + finally: + self.log.removeHandler(handler) + return ret + + def auth_ex_token(self, code) -> bool: + handler = LgndrLogHandler(logging.ERROR) + self.log.addHandler(handler) + try: + ret = super().auth_ex_token(code) + except LgndrException as ret: + raise ret + finally: + self.log.removeHandler(handler) + return ret + + def auth_import(self) -> bool: + handler = LgndrLogHandler(logging.ERROR) + self.log.addHandler(handler) + try: + ret = super().auth_import() + except LgndrException as ret: + raise ret + finally: + self.log.removeHandler(handler) + return ret + def update_check_enabled(self): return True diff --git a/rare/models/game.py b/rare/models/game.py index 2ebe86d646..549d78476f 100644 --- a/rare/models/game.py +++ b/rare/models/game.py @@ -583,7 +583,11 @@ def repair(self, repair_and_update) -> bool: def uninstall(self) -> bool: if not self.is_idle: return False - self.signals.game.uninstall.emit(UninstallOptionsModel(app_name=self.app_name, keep_config=self.sdl_name is not None)) + self.signals.game.uninstall.emit( + UninstallOptionsModel( + app_name=self.app_name, + keep_config=self.sdl_name is not None or platform.system() not in {"Windows"}, + )) return True def launch( @@ -760,5 +764,9 @@ def install(self) -> bool: def uninstall(self) -> bool: if not self.is_idle or not self.is_installed: return False - self.signals.game.uninstall.emit(UninstallOptionsModel(app_name=self.app_name)) + self.signals.game.uninstall.emit( + UninstallOptionsModel( + app_name=self.app_name, + keep_overlay_keys=platform.system() not in {"Windows"}, + )) return True diff --git a/rare/ui/components/dialogs/login/browser_login.py b/rare/ui/components/dialogs/login/browser_login.py index 0d4b9e2557..c0ca479429 100644 --- a/rare/ui/components/dialogs/login/browser_login.py +++ b/rare/ui/components/dialogs/login/browser_login.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'browser_login.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! ################################################################################ @@ -12,14 +12,15 @@ from PySide6.QtGui import QFont from PySide6.QtWidgets import ( QFormLayout, + QFrame, QHBoxLayout, QLabel, QLayout, QLineEdit, QPushButton, QSizePolicy, - QSpacerItem, QVBoxLayout, + QWidget, ) @@ -27,7 +28,7 @@ class Ui_BrowserLogin(object): def setupUi(self, BrowserLogin): if not BrowserLogin.objectName(): BrowserLogin.setObjectName(u"BrowserLogin") - BrowserLogin.resize(320, 243) + BrowserLogin.resize(310, 237) BrowserLogin.setWindowTitle(u"BrowserLogin") self.main_layout = QVBoxLayout(BrowserLogin) self.main_layout.setObjectName(u"main_layout") @@ -42,22 +43,23 @@ def setupUi(self, BrowserLogin): font.setBold(True) self.title_label.setFont(font) - self.main_layout.addWidget(self.title_label) + self.main_layout.addWidget(self.title_label, 0, Qt.AlignmentFlag.AlignTop) - self.form_layout = QFormLayout() + self.form_widget = QWidget(BrowserLogin) + self.form_widget.setObjectName(u"form_widget") + self.form_layout = QFormLayout(self.form_widget) self.form_layout.setObjectName(u"form_layout") - self.form_layout.setSizeConstraint(QLayout.SetFixedSize) - self.form_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) - self.form_layout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - self.form_layout.setFormAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) - self.open_button = QPushButton(BrowserLogin) + 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.form_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.open_button) self.link_layout = QHBoxLayout() self.link_layout.setObjectName(u"link_layout") - self.link_text = QLineEdit(BrowserLogin) + 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.setReadOnly(True) @@ -65,7 +67,7 @@ def setupUi(self, BrowserLogin): self.link_layout.addWidget(self.link_text) - self.copy_button = QPushButton(BrowserLogin) + self.copy_button = QPushButton(self.form_widget) self.copy_button.setObjectName(u"copy_button") self.copy_button.setText(u"") @@ -75,40 +77,31 @@ def setupUi(self, BrowserLogin): self.form_layout.setLayout(0, QFormLayout.ItemRole.FieldRole, self.link_layout) - self.sid_label = QLabel(BrowserLogin) + self.sid_label = QLabel(self.form_widget) self.sid_label.setObjectName(u"sid_label") self.sid_label.setText(u"authorizationCode") - self.sid_label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) + 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_label = QLabel(BrowserLogin) - self.status_label.setObjectName(u"status_label") - font1 = QFont() - font1.setItalic(True) - self.status_label.setFont(font1) - self.status_label.setText(u"") - - self.form_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.status_label) + self.status_field = QLabel(self.form_widget) + self.status_field.setObjectName(u"status_field") + self.status_field.setFrameShape(QFrame.Shape.StyledPanel) + self.status_field.setFrameShadow(QFrame.Shadow.Sunken) + self.status_field.setText(u"") + self.status_field.setWordWrap(True) + self.form_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.status_field) - self.main_layout.addLayout(self.form_layout) - - self.vscaper = QSpacerItem(20, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + self.status_label = QLabel(self.form_widget) + self.status_label.setObjectName(u"status_label") - self.main_layout.addItem(self.vscaper) + self.form_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.status_label) - self.info_label = QLabel(BrowserLogin) - self.info_label.setObjectName(u"info_label") - sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) - sizePolicy1.setHeightForWidth(self.info_label.sizePolicy().hasHeightForWidth()) - self.info_label.setSizePolicy(sizePolicy1) - self.info_label.setWordWrap(True) - self.main_layout.addWidget(self.info_label) + self.main_layout.addWidget(self.form_widget, 0, Qt.AlignmentFlag.AlignTop) + self.main_layout.setStretch(1, 1) self.retranslateUi(BrowserLogin) # setupUi @@ -116,7 +109,7 @@ def setupUi(self, BrowserLogin): 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.info_label.setText(QCoreApplication.translate("BrowserLogin", u"Click the Open Browser button to open the login page in your web browser or copy the link and paste it in any web browser. After logging in using the browser, copy the text in the quotes after authorizationCode in the same line into the empty input above.

DO NOT SHARE THE INFORMATION IN THE BROWSER PAGE WITH ANYONE IN ANY FORM (TEXT OR SCREENSHOT)!
", None)) + self.status_label.setText(QCoreApplication.translate("BrowserLogin", u"Status", None)) pass # retranslateUi diff --git a/rare/ui/components/dialogs/login/browser_login.ui b/rare/ui/components/dialogs/login/browser_login.ui index 8331b84cbb..a5f9efcceb 100644 --- a/rare/ui/components/dialogs/login/browser_login.ui +++ b/rare/ui/components/dialogs/login/browser_login.ui @@ -6,15 +6,15 @@ 0 0 - 320 - 243 + 310 + 237 BrowserLogin - - + + @@ -24,7 +24,6 @@ - 75 true @@ -33,102 +32,92 @@ - - - - QLayout::SetFixedSize - - - QFormLayout::AllNonFixedFieldsGrow - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - Open Browser - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - authorizationCode - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - true - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 10 - - - - - - - - - 0 - 0 - - - - <i>Click the <strong>Open Browser</strong> button to open the login page in your web browser or copy the link and paste it in any web browser. After logging in using the browser, copy the text in the quotes after </i><code><b>authorizationCode</b></code><i> in the same line into the empty input above.<br><br><strong>DO NOT SHARE THE INFORMATION IN THE BROWSER PAGE WITH ANYONE IN ANY FORM (TEXT OR SCREENSHOT)!</strong></i> - - - true - + + + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Open Browser + + + + + + + QLayout::SizeConstraint::SetFixedSize + + + + + + + + true + + + + + + + + + + + + + + + + + + + authorizationCode + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Sunken + + + + + + true + + + + + + + Status + + + + diff --git a/rare/ui/components/dialogs/login/import_login.py b/rare/ui/components/dialogs/login/import_login.py index aad9838ed1..ae1e74706b 100644 --- a/rare/ui/components/dialogs/login/import_login.py +++ b/rare/ui/components/dialogs/login/import_login.py @@ -3,41 +3,29 @@ ################################################################################ ## Form generated from reading UI file 'import_login.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, Qt from PySide6.QtGui import QFont -from PySide6.QtWidgets import ( - QComboBox, - QFormLayout, - QHBoxLayout, - QLabel, - QLayout, - QPushButton, - QSizePolicy, - QSpacerItem, - QVBoxLayout, -) +from PySide6.QtWidgets import QComboBox, QFormLayout, QFrame, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QVBoxLayout, QWidget class Ui_ImportLogin(object): def setupUi(self, ImportLogin): if not ImportLogin.objectName(): ImportLogin.setObjectName(u"ImportLogin") - ImportLogin.resize(256, 143) - sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(ImportLogin.sizePolicy().hasHeightForWidth()) - ImportLogin.setSizePolicy(sizePolicy) + ImportLogin.resize(256, 128) ImportLogin.setWindowTitle(u"ImportLogin") self.main_layout = QVBoxLayout(ImportLogin) self.main_layout.setObjectName(u"main_layout") self.title_label = QLabel(ImportLogin) self.title_label.setObjectName(u"title_label") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.title_label.sizePolicy().hasHeightForWidth()) self.title_label.setSizePolicy(sizePolicy) font = QFont() @@ -46,26 +34,28 @@ def setupUi(self, ImportLogin): self.main_layout.addWidget(self.title_label) - self.form_layout = QFormLayout() + self.form_widget = QWidget(ImportLogin) + self.form_widget.setObjectName(u"form_widget") + self.form_layout = QFormLayout(self.form_widget) self.form_layout.setObjectName(u"form_layout") - self.form_layout.setSizeConstraint(QLayout.SetFixedSize) - self.form_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) - self.form_layout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - self.form_layout.setFormAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) + 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.form_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.prefix_label) + self.prefix_layout = QHBoxLayout() self.prefix_layout.setObjectName(u"prefix_layout") - self.prefix_combo = QComboBox(ImportLogin) + self.prefix_combo = QComboBox(self.form_widget) self.prefix_combo.setObjectName(u"prefix_combo") - sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) - sizePolicy1.setHeightForWidth(self.prefix_combo.sizePolicy().hasHeightForWidth()) - self.prefix_combo.setSizePolicy(sizePolicy1) self.prefix_combo.setEditable(True) + self.prefix_combo.setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon) + self.prefix_combo.setFrame(True) self.prefix_layout.addWidget(self.prefix_combo) - self.prefix_button = QPushButton(ImportLogin) + self.prefix_button = QPushButton(self.form_widget) self.prefix_button.setObjectName(u"prefix_button") self.prefix_layout.addWidget(self.prefix_button) @@ -74,47 +64,33 @@ def setupUi(self, ImportLogin): self.form_layout.setLayout(0, QFormLayout.ItemRole.FieldRole, self.prefix_layout) - self.prefix_label = QLabel(ImportLogin) - self.prefix_label.setObjectName(u"prefix_label") + self.status_field = QLabel(self.form_widget) + self.status_field.setObjectName(u"status_field") + self.status_field.setFrameShape(QFrame.Shape.StyledPanel) + self.status_field.setFrameShadow(QFrame.Shadow.Sunken) + self.status_field.setText(u"") + self.status_field.setWordWrap(True) - self.form_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.prefix_label) + self.form_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.status_field) - self.status_label = QLabel(ImportLogin) + self.status_label = QLabel(self.form_widget) self.status_label.setObjectName(u"status_label") - font1 = QFont() - font1.setItalic(True) - self.status_label.setFont(font1) - self.status_label.setText(u"") - - self.form_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.status_label) - - self.main_layout.addLayout(self.form_layout) + self.form_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.status_label) - self.vspacer = QSpacerItem(20, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) - self.main_layout.addItem(self.vspacer) - - self.info_label = QLabel(ImportLogin) - self.info_label.setObjectName(u"info_label") - sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(0) - sizePolicy2.setHeightForWidth(self.info_label.sizePolicy().hasHeightForWidth()) - self.info_label.setSizePolicy(sizePolicy2) - self.info_label.setWordWrap(True) - - self.main_layout.addWidget(self.info_label) + self.main_layout.addWidget(self.form_widget, 0, Qt.AlignmentFlag.AlignTop) + self.main_layout.setStretch(1, 1) self.retranslateUi(ImportLogin) # setupUi def retranslateUi(self, ImportLogin): self.title_label.setText(QCoreApplication.translate("ImportLogin", u"Import existing session from EGL", None)) - self.prefix_button.setText(QCoreApplication.translate("ImportLogin", u"Browse...", None)) self.prefix_label.setText(QCoreApplication.translate("ImportLogin", u"Select prefix", None)) - self.info_label.setText(QCoreApplication.translate("ImportLogin", u"Please select the Wine prefix where Epic Games Launcher is installed. You will get logged out from EGL in the process.", None)) + self.prefix_button.setText(QCoreApplication.translate("ImportLogin", u"Browse...", None)) + self.status_label.setText(QCoreApplication.translate("ImportLogin", u"Status", None)) pass # retranslateUi diff --git a/rare/ui/components/dialogs/login/import_login.ui b/rare/ui/components/dialogs/login/import_login.ui index f6a6f3c323..147e4464fe 100644 --- a/rare/ui/components/dialogs/login/import_login.ui +++ b/rare/ui/components/dialogs/login/import_login.ui @@ -7,19 +7,13 @@ 0 0 256 - 143 + 128 - - - 0 - 0 - - ImportLogin - + @@ -30,7 +24,6 @@ - 75 true @@ -39,92 +32,79 @@ - - - - QLayout::SetFixedSize - - - QFormLayout::AllNonFixedFieldsGrow - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - true - - - - - - - Browse... - - - - - - - - - Select prefix - - - - - - - - true - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 10 - - - - - - - - - 0 - 0 - - - - <i>Please select the Wine prefix where Epic Games Launcher is installed. You will get logged out from EGL in the process.</i> - - - true - + + + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Select prefix + + + + + + + + + true + + + QComboBox::SizeAdjustPolicy::AdjustToMinimumContentsLengthWithIcon + + + true + + + + + + + Browse... + + + + + + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Sunken + + + + + + true + + + + + + + Status + + + + diff --git a/rare/ui/components/dialogs/login/landing_page.py b/rare/ui/components/dialogs/login/landing_page.py index 2158d00862..9099a2a6e1 100644 --- a/rare/ui/components/dialogs/login/landing_page.py +++ b/rare/ui/components/dialogs/login/landing_page.py @@ -3,43 +3,46 @@ ################################################################################ ## Form generated from reading UI file 'landing_page.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, Qt +from PySide6.QtCore import QCoreApplication, QSize from PySide6.QtGui import QFont -from PySide6.QtWidgets import QFormLayout, QLabel, QRadioButton, QSizePolicy +from PySide6.QtWidgets import QFormLayout, QLabel, QRadioButton, QSizePolicy, QVBoxLayout, QWidget class Ui_LandingPage(object): def setupUi(self, LandingPage): if not LandingPage.objectName(): LandingPage.setObjectName(u"LandingPage") - LandingPage.resize(293, 78) - sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(LandingPage.sizePolicy().hasHeightForWidth()) - LandingPage.setSizePolicy(sizePolicy) + LandingPage.resize(300, 95) LandingPage.setWindowTitle(u"LandingPage") - self.main_layout = QFormLayout(LandingPage) + self.main_layout = QVBoxLayout(LandingPage) self.main_layout.setObjectName(u"main_layout") - self.main_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) - self.main_layout.setLabelAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) - self.main_layout.setFormAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) self.login_label = QLabel(LandingPage) self.login_label.setObjectName(u"login_label") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.login_label.sizePolicy().hasHeightForWidth()) self.login_label.setSizePolicy(sizePolicy) font = QFont() font.setBold(True) self.login_label.setFont(font) - self.main_layout.setWidget(0, QFormLayout.ItemRole.SpanningRole, self.login_label) - - self.login_browser_radio = QRadioButton(LandingPage) + self.main_layout.addWidget(self.login_label) + + self.form_widget = QWidget(LandingPage) + self.form_widget.setObjectName(u"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.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") sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy1.setHorizontalStretch(0) @@ -47,28 +50,31 @@ def setupUi(self, LandingPage): sizePolicy1.setHeightForWidth(self.login_browser_radio.sizePolicy().hasHeightForWidth()) self.login_browser_radio.setSizePolicy(sizePolicy1) - self.main_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.login_browser_radio) + self.form_layout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.login_browser_radio) - self.login_browser_label = QLabel(LandingPage) + self.login_browser_label = QLabel(self.form_widget) self.login_browser_label.setObjectName(u"login_browser_label") font1 = QFont() font1.setItalic(True) self.login_browser_label.setFont(font1) - self.main_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.login_browser_label) + self.form_layout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.login_browser_label) - self.login_import_radio = QRadioButton(LandingPage) + self.login_import_radio = QRadioButton(self.form_widget) self.login_import_radio.setObjectName(u"login_import_radio") sizePolicy1.setHeightForWidth(self.login_import_radio.sizePolicy().hasHeightForWidth()) self.login_import_radio.setSizePolicy(sizePolicy1) - self.main_layout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.login_import_radio) + self.form_layout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.login_import_radio) - self.login_import_label = QLabel(LandingPage) + self.login_import_label = QLabel(self.form_widget) self.login_import_label.setObjectName(u"login_import_label") self.login_import_label.setFont(font1) - self.main_layout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.login_import_label) + self.form_layout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.login_import_label) + + + self.main_layout.addWidget(self.form_widget) self.retranslateUi(LandingPage) diff --git a/rare/ui/components/dialogs/login/landing_page.ui b/rare/ui/components/dialogs/login/landing_page.ui index 43e4dc018c..0483061285 100644 --- a/rare/ui/components/dialogs/login/landing_page.ui +++ b/rare/ui/components/dialogs/login/landing_page.ui @@ -6,30 +6,15 @@ 0 0 - 293 - 78 + 300 + 95 - - - 0 - 0 - - LandingPage - - - QFormLayout::AllNonFixedFieldsGrow - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - + + @@ -39,7 +24,6 @@ - 75 true @@ -48,54 +32,84 @@ - - - - - 0 - 0 - - - - Browser - - - - - - - - true - - - - Login using a browser. - - - - - - - - 0 - 0 - - - - Import - - - - - - - - true - - - - Import from Epic Games Launcher + + + + + 0 + 20 + + + + 15 + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Browser + + + + + + + + true + + + + Login using a browser. + + + + + + + + 0 + 0 + + + + Import + + + + + + + + true + + + + Import from Epic Games Launcher + + + + diff --git a/rare/ui/components/dialogs/login/login_dialog.py b/rare/ui/components/dialogs/login/login_dialog.py index 2377905486..f808dcd33b 100644 --- a/rare/ui/components/dialogs/login/login_dialog.py +++ b/rare/ui/components/dialogs/login/login_dialog.py @@ -3,13 +3,14 @@ ################################################################################ ## Form generated from reading UI file 'login_dialog.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 +from PySide6.QtCore import QCoreApplication, Qt from PySide6.QtWidgets import ( + QFrame, QHBoxLayout, QLabel, QPushButton, @@ -23,10 +24,10 @@ class Ui_LoginDialog(object): def setupUi(self, LoginDialog): if not LoginDialog.objectName(): LoginDialog.setObjectName(u"LoginDialog") - LoginDialog.resize(241, 128) + LoginDialog.resize(242, 146) self.main_layout = QVBoxLayout(LoginDialog) self.main_layout.setObjectName(u"main_layout") - self.login_vspacer_top = QSpacerItem(0, 17, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + self.login_vspacer_top = QSpacerItem(17, 17, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) self.main_layout.addItem(self.login_vspacer_top) @@ -35,14 +36,18 @@ def setupUi(self, LoginDialog): self.main_layout.addWidget(self.welcome_label) - self.login_vspacer_bottom = QSpacerItem(0, 17, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + self.login_vspacer_bottom = QSpacerItem(17, 17, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) self.main_layout.addItem(self.login_vspacer_bottom) - self.login_stack_layout = QVBoxLayout() - self.login_stack_layout.setObjectName(u"login_stack_layout") + self.info_label = QLabel(LoginDialog) + self.info_label.setObjectName(u"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) + self.info_label.setWordWrap(True) - self.main_layout.addLayout(self.login_stack_layout) + self.main_layout.addWidget(self.info_label) self.button_layout = QHBoxLayout() self.button_layout.setObjectName(u"button_layout") @@ -75,6 +80,7 @@ def setupUi(self, LoginDialog): def retranslateUi(self, LoginDialog): LoginDialog.setWindowTitle(QCoreApplication.translate("LoginDialog", u"Login", None)) self.welcome_label.setText(QCoreApplication.translate("LoginDialog", u"

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)) diff --git a/rare/ui/components/dialogs/login/login_dialog.ui b/rare/ui/components/dialogs/login/login_dialog.ui index 6ca9271018..a07483efb1 100644 --- a/rare/ui/components/dialogs/login/login_dialog.ui +++ b/rare/ui/components/dialogs/login/login_dialog.ui @@ -6,8 +6,8 @@ 0 0 - 241 - 128 + 242 + 146 @@ -17,14 +17,14 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed - 0 + 17 17 @@ -40,21 +40,37 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed - 0 + 17 17 - + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Sunken + + + + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop + + + true + + @@ -68,7 +84,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal diff --git a/rare/widgets/indicator_edit.py b/rare/widgets/indicator_edit.py index d7b14897a4..e5eb998fae 100644 --- a/rare/widgets/indicator_edit.py +++ b/rare/widgets/indicator_edit.py @@ -143,6 +143,9 @@ def __init__( layout = QHBoxLayout(self) layout.setObjectName(f"{self.objectName()}Layout") layout.setContentsMargins(0, 0, 0, 0) + layout.setSizeConstraints( + QHBoxLayout.SizeConstraint.SetDefaultConstraint, QHBoxLayout.SizeConstraint.SetFixedSize + ) # Add line_edit self.line_edit = QLineEdit(self) self.line_edit.setObjectName(f"{type(self).__name__}Edit")