From 90ac9a1574852228017978787c198b079d360071 Mon Sep 17 00:00:00 2001 From: Stelios Tsampas Date: Fri, 28 May 2021 21:34:34 +0300 Subject: [PATCH] Re-implement LoginDialog. --- rare/components/dialogs/login/__init__.py | 146 ++++++------ .../components/dialogs/login/browser_login.py | 66 +++--- rare/components/dialogs/login/import_login.py | 83 +++++++ .../components/dialogs/login/import_widget.py | 103 -------- rare/ui/components/dialogs/login/__init__.py | 0 .../components/dialogs/login/browser_login.py | 69 ++++++ .../components/dialogs/login/browser_login.ui | 76 ++++++ .../components/dialogs/login/import_login.py | 81 +++++++ .../components/dialogs/login/import_login.ui | 94 ++++++++ .../components/dialogs/login/login_dialog.py | 131 +++++++++++ .../components/dialogs/login/login_dialog.ui | 220 ++++++++++++++++++ 11 files changed, 856 insertions(+), 213 deletions(-) create mode 100644 rare/components/dialogs/login/import_login.py delete mode 100644 rare/components/dialogs/login/import_widget.py create mode 100644 rare/ui/components/dialogs/login/__init__.py create mode 100644 rare/ui/components/dialogs/login/browser_login.py create mode 100644 rare/ui/components/dialogs/login/browser_login.ui create mode 100644 rare/ui/components/dialogs/login/import_login.py create mode 100644 rare/ui/components/dialogs/login/import_login.ui create mode 100644 rare/ui/components/dialogs/login/login_dialog.py create mode 100644 rare/ui/components/dialogs/login/login_dialog.ui diff --git a/rare/components/dialogs/login/__init__.py b/rare/components/dialogs/login/__init__.py index 2e6b7822..0b0a4b55 100644 --- a/rare/components/dialogs/login/__init__.py +++ b/rare/components/dialogs/login/__init__.py @@ -1,96 +1,96 @@ -from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QStackedLayout, QWidget, QPushButton +from dataclasses import dataclass +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QWidget, QPushButton from custom_legendary.core import LegendaryCore -# Login Opportunities: Browser, Import + from rare.components.dialogs.login.browser_login import BrowserLogin -from rare.components.dialogs.login.import_widget import ImportWidget +from rare.components.dialogs.login.import_login import ImportLogin +# Login Opportunities: Browser, Import +from rare.ui.components.dialogs.login.login_dialog import Ui_LoginDialog -class LoginDialog(QDialog): +@dataclass +class LoginPages: + login: int + browser: int + import_egl: int + success: int + + +class LoginDialog(QDialog, Ui_LoginDialog): logged_in: bool = False + pages = LoginPages(0, 1, 2, 3) - def __init__(self, core: LegendaryCore): - super(LoginDialog, self).__init__() + def __init__(self, core: LegendaryCore, parent=None): + super(LoginDialog, self).__init__(parent=parent) + self.setupUi(self) + self.setAttribute(Qt.WA_DeleteOnClose, True) + self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint | Qt.WindowTitleHint) self.core = core - self.setWindowTitle("Rare - Login") - self.setFixedWidth(350) - self.setFixedHeight(450) - self.init_ui() + self.browser_page = BrowserLogin(self.core, self.login_stack) + self.login_stack.insertWidget(self.pages.browser, self.browser_page) + self.browser_page.success.connect(self.login_successful) + self.browser_page.changed.connect( + lambda: self.next_button.setEnabled(self.browser_page.is_valid()) + ) + self.import_page = ImportLogin(self.core, self.login_stack) + self.login_stack.insertWidget(self.pages.import_egl, self.import_page) + self.import_page.success.connect(self.login_successful) + self.import_page.changed.connect( + lambda: self.next_button.setEnabled(self.import_page.is_valid()) + ) - def init_ui(self): - self.layout = QStackedLayout() + self.next_button.setEnabled(False) + self.back_button.setEnabled(False) - self.landing_widget = QWidget() - self.landing_layout = QVBoxLayout() + self.login_browser_radio.clicked.connect(lambda: self.next_button.setEnabled(True)) + self.login_import_radio.clicked.connect(lambda: self.next_button.setEnabled(True)) + self.exit_button.clicked.connect(self.close) + self.back_button.clicked.connect(self.back_clicked) + self.next_button.clicked.connect(self.next_clicked) - self.title = QLabel(f"

{self.tr('Welcome to Rare')}

") - self.landing_layout.addWidget(self.title) - self.info_text = QLabel(self.tr("Select one option to Login")) - self.landing_layout.addWidget(self.info_text) + self.login_stack.setCurrentIndex(self.pages.login) - self.browser_login = OptionWidget(self.tr("Use Browser"), - self.tr("This opens your default browser. Login and copy the text")) + self.resize(self.minimumSizeHint()) + self.setFixedSize(self.size()) - self.landing_layout.addWidget(self.browser_login) - self.browser_login.button.clicked.connect(lambda: self.layout.setCurrentIndex(1)) + def back_clicked(self): + self.back_button.setEnabled(False) + self.next_button.setEnabled(True) + self.login_stack.setCurrentIndex(self.pages.login) - self.import_login = OptionWidget("Import from existing installation", - "Import an existing login session from an Epic Games Launcher installation. You will get logged out there") - self.import_login.button.clicked.connect(lambda: self.layout.setCurrentIndex(2)) - self.landing_layout.addWidget(self.import_login) - - self.close_button = QPushButton("Exit App") - self.close_button.clicked.connect(self.close) - self.landing_layout.addWidget(self.close_button) - - self.landing_widget.setLayout(self.landing_layout) - self.layout.addWidget(self.landing_widget) - - self.browser_widget = BrowserLogin(self.core) - self.browser_widget.success.connect(self.success) - self.browser_widget.back.clicked.connect(lambda: self.layout.setCurrentIndex(0)) - self.layout.addWidget(self.browser_widget) - - self.import_widget = ImportWidget(self.core) - self.import_widget.back.clicked.connect(lambda: self.layout.setCurrentIndex(0)) - self.import_widget.success.connect(self.success) - self.layout.addWidget(self.import_widget) - - self.layout.addWidget(LoginSuccessfulWidget()) - - self.setLayout(self.layout) + def next_clicked(self): + if self.login_stack.currentIndex() == self.pages.login: + if self.login_browser_radio.isChecked(): + self.login_stack.setCurrentIndex(self.pages.browser) + self.next_button.setEnabled(False) + if self.login_import_radio.isChecked(): + self.login_stack.setCurrentIndex(self.pages.import_egl) + self.next_button.setEnabled(self.import_page.is_valid()) + self.back_button.setEnabled(True) + elif self.login_stack.currentIndex() == self.pages.browser: + self.browser_page.do_login() + elif self.login_stack.currentIndex() == self.pages.import_egl: + self.import_page.do_login() + else: + self.close() def login(self): self.exec_() return self.logged_in - def success(self): + def login_successful(self): if self.core.login(): self.logged_in = True - self.layout.setCurrentIndex(3) - # time.sleep(1) - self.close() - - -class OptionWidget(QWidget): - def __init__(self, btn_text: str, info_text: str): - super(OptionWidget, self).__init__() - self.layout = QVBoxLayout() - self.text = QLabel(info_text) - self.text.setWordWrap(True) - self.button = QPushButton(btn_text) - - self.layout.addWidget(self.button) - self.layout.addWidget(self.text) - - self.setLayout(self.layout) - - -class LoginSuccessfulWidget(QWidget): - def __init__(self): - super(LoginSuccessfulWidget, self).__init__() - self.layout = QVBoxLayout() - self.layout.addWidget(QLabel("Login Successful")) - self.setLayout(self.layout) + self.welcome_label.setText( + self.welcome_label.text().replace("", f", {self.core.lgd.userdata['displayName']}") + ) + self.exit_button.setVisible(False) + self.back_button.setVisible(False) + self.login_stack.setCurrentIndex(self.pages.success) + else: + self.next_button.setEnabled(False) + self.logged_in = False diff --git a/rare/components/dialogs/login/browser_login.py b/rare/components/dialogs/login/browser_login.py index 03468043..c4d53705 100644 --- a/rare/components/dialogs/login/browser_login.py +++ b/rare/components/dialogs/login/browser_login.py @@ -1,54 +1,46 @@ import json from logging import getLogger -from PyQt5.QtCore import pyqtSignal -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QLineEdit - +from PyQt5.QtCore import pyqtSignal, QUrl +from PyQt5.QtGui import QDesktopServices +from PyQt5.QtWidgets import QWidget from custom_legendary.core import LegendaryCore +from rare.ui.components.dialogs.login.browser_login import Ui_BrowserLogin + logger = getLogger("BrowserLogin") -class BrowserLogin(QWidget): +class BrowserLogin(QWidget, Ui_BrowserLogin): success = pyqtSignal() - url: str = "https://www.epicgames.com/id/login?redirectUrl=https%3A%2F%2Fwww.epicgames.com%2Fid%2Fapi%2Fredirect" + changed = pyqtSignal() + login_url = "https://www.epicgames.com/id/login?redirectUrl=https%3A%2F%2Fwww.epicgames.com%2Fid%2Fapi%2Fredirect" + + def __init__(self, core: LegendaryCore, parent=None): + super(BrowserLogin, self).__init__(parent=parent) + self.setupUi(self) - def __init__(self, core: LegendaryCore): - super(BrowserLogin, self).__init__() - self.layout = QVBoxLayout() self.core = core - self.back = QPushButton("Back") # TODO Icon - self.layout.addWidget(self.back) + self.open_button.clicked.connect(lambda: QDesktopServices.openUrl(QUrl(self.login_url))) + self.sid_edit.textChanged.connect(self.changed.emit) - self.info_text = QLabel(self.tr( - "Opens a browser. You login and copy the json code in the field below. Click here to open Browser").format( - self.url)) - self.info_text.setWordWrap(True) - self.info_text.setOpenExternalLinks(True) - self.layout.addWidget(self.info_text) + def is_valid(self): + return len(self.sid_edit.text()) == 32 - self.input_field = QLineEdit() - self.input_field.setPlaceholderText(self.tr("Insert SID here")) - self.layout.addWidget(self.input_field) - - self.mini_info = QLabel("") - - self.login_btn = QPushButton(self.tr("Login")) - self.login_btn.clicked.connect(self.login) - self.layout.addWidget(self.login_btn) - - self.setLayout(self.layout) - - def login(self): - self.mini_info.setText(self.tr("Loading...")) - sid = self.input_field.text() + def do_login(self): + self.status_label.setText(self.tr("Logging in...")) + sid = self.sid_edit.text() # when the text copied if sid.startswith("{") and sid.endswith("}"): sid = json.loads(sid)["sid"] - token = self.core.auth_sid(sid) - if self.core.auth_code(token): - logger.info(f"Successfully logged in as {self.core.lgd.userdata['displayName']}") - self.success.emit() - else: - self.mini_info.setText("Login failed") + try: + token = self.core.auth_sid(sid) + if self.core.auth_code(token): + logger.info(f"Successfully logged in as {self.core.lgd.userdata['displayName']}") + self.success.emit() + else: + self.status_label.setText(self.tr("Login failed.")) + logger.warning("Failed to login through browser") + except Exception as e: + logger.warning(e) diff --git a/rare/components/dialogs/login/import_login.py b/rare/components/dialogs/login/import_login.py new file mode 100644 index 00000000..207548b0 --- /dev/null +++ b/rare/components/dialogs/login/import_login.py @@ -0,0 +1,83 @@ +import os +from getpass import getuser +from logging import getLogger + +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtWidgets import QWidget +from custom_legendary.core import LegendaryCore + +from rare.ui.components.dialogs.login.import_login import Ui_ImportLogin + +logger = getLogger("ImportLogin") + + +class ImportLogin(QWidget, Ui_ImportLogin): + success = pyqtSignal() + changed = pyqtSignal() + if os.name == "nt": + localappdata = os.path.expandvars("%LOCALAPPDATA%") + else: + localappdata = os.path.join("drive_c/users", getuser(), "Local Settings/Application Data") + appdata_path = os.path.join(localappdata, "EpicGamesLauncher/Saved/Config/Windows") + found = False + + def __init__(self, core: LegendaryCore, parent=None): + super(ImportLogin, self).__init__(parent=parent) + self.setupUi(self) + + self.core = core + + if os.name == "nt": + if not self.core.egl.appdata_path and os.path.exists(self.egl_data_path): + self.core.egl.appdata_path = self.appdata_path + if not self.core.egl.appdata_path: + self.status_label.setText(self.tr("Could not find EGL Program Data.")) + else: + self.status_label.setText(self.tr("Found EGL Program Data. Click 'Next' to import them.")) + self.found = True + else: + self.info_label.setText( + self.tr( + "Please select the Wine prefix where Epic Games Launcher is installed. ") + self.info_label.text() + ) + prefixes = self.get_wine_prefixes() + if len(prefixes): + self.prefix_combo.addItems(prefixes) + self.status_label.setText(self.tr("Select the Wine prefix you want to import.")) + else: + self.status_label.setText(self.tr("Could not any EGL Program Data.")) + self.prefix_combo.editTextChanged.connect(self.changed.emit) + + def get_wine_prefixes(self): + possible_prefixes = [ + os.path.expanduser("~/.wine"), + os.path.expanduser("~/Games/epic-games-store"), + os.path.expanduser("~/Wine/Stores") + ] + prefixes = [] + for prefix in possible_prefixes: + if os.path.exists(os.path.join(prefix, self.appdata_path)): + prefixes.append(prefix) + return prefixes + + def is_valid(self): + if os.name == "nt": + return self.found + else: + return os.path.exists(os.path.join(self.prefix_combo.currentText(), self.appdata_path)) + + def do_login(self): + self.status_label.setText(self.tr("Loading...")) + if os.name == "nt": + pass + else: + self.core.egl.appdata_path = os.path.join(self.prefix_combo.currentText(), self.appdata_path) + try: + if self.core.auth_import(): + logger.info(f"Logged in as {self.core.lgd.userdata['displayName']}") + self.success.emit() + else: + self.status_label.setText(self.tr("Login failed.")) + logger.warning("Failed to import existing session") + except Exception as e: + logger.warning(e) diff --git a/rare/components/dialogs/login/import_widget.py b/rare/components/dialogs/login/import_widget.py deleted file mode 100644 index a54c3a46..00000000 --- a/rare/components/dialogs/login/import_widget.py +++ /dev/null @@ -1,103 +0,0 @@ -import os -from getpass import getuser -from logging import getLogger - -from PyQt5.QtCore import pyqtSignal -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QButtonGroup, QRadioButton - -from custom_legendary.core import LegendaryCore - -logger = getLogger("Import") - - -class ImportWidget(QWidget): - success = pyqtSignal() - - def __init__(self, core: LegendaryCore): - super(ImportWidget, self).__init__() - self.layout = QVBoxLayout() - self.core = core - - self.back = QPushButton("Back") - self.layout.addWidget(self.back) - self.title = QLabel("

Import existing Login session

") - self.title.setWordWrap(True) - self.layout.addWidget(self.title) - self.infoText = QLabel( - "Found Installations here. \nPlease select prefix, where Epic Games Launcher is installed\nNote: You will get logged out there") - self.infoText.setWordWrap(True) - self.layout.addWidget(self.infoText) - self.import_button = QPushButton(self.tr("Import")) - self.data_path = "" - if os.name == "nt": - - if not self.core.egl.appdata_path and os.path.exists( - os.path.expandvars("%LOCALAPPDATA%/EpicGamesLauncher/Saved/Config/Windows")): - self.core.egl.appdata_path = os.path.expandvars("%LOCALAPPDATA%/EpicGamesLauncher/Saved/Config/Windows") - - if not self.core.egl.appdata_path: - self.text = QLabel(self.tr("Could not find EGL program data")) - - else: - self.text = QLabel(self.tr("Found EGL program Data. Do you want to import them?")) - - self.layout.addWidget(self.text) - - # Linux - else: - self.radio_buttons = [] - prefixes = self.get_wine_prefixes() - if len(prefixes) == 0: - self.infoText.setText(self.tr("Could not find any Epic Games login data")) - self.import_button.setDisabled(True) - else: - self.btn_group = QButtonGroup() - for i in prefixes: - radio_button = QRadioButton(i) - self.radio_buttons.append(radio_button) - self.btn_group.addButton(radio_button) - self.layout.addWidget(radio_button) - radio_button.toggled.connect(self.toggle_radiobutton) - - self.login_text = QLabel("") - self.layout.addWidget(self.login_text) - self.layout.addWidget(self.import_button) - self.import_button.clicked.connect(self.import_login_data) - - self.setLayout(self.layout) - - def toggle_radiobutton(self): - if self.sender().isChecked(): - self.data_path = self.sender().text() - - def get_wine_prefixes(self): - possible_prefixes = [ - os.path.expanduser("~/.wine"), - os.path.expanduser("~/Games/epic-games-store") - ] - prefixes = [] - for i in possible_prefixes: - if os.path.exists(os.path.join(i, "drive_c/users", getuser(), - "Local Settings/Application Data/EpicGamesLauncher/Saved/Config/Windows")): - prefixes.append(i) - return prefixes - - def import_login_data(self): - self.import_button.setText(self.tr("Loading...")) - self.import_button.setDisabled(True) - if os.name != "nt": - self.core.egl.appdata_path = os.path.join(self.data_path, - f"drive_c/users/{getuser()}/Local Settings/Application Data/EpicGamesLauncher/Saved/Config/Windows") - try: - if self.core.auth_import(): - logger.info(f"Logged in as {self.core.lgd.userdata['displayName']}") - self.success.emit() - else: - logger.warning("Failed to import existing session") - except Exception as e: - logger.warning(e) - - logger.warning("Error: No valid session found") - self.login_text.setText(self.tr("Error: No valid session found")) - self.import_button.setText(self.tr("Import")) - self.import_button.setDisabled(False) diff --git a/rare/ui/components/dialogs/login/__init__.py b/rare/ui/components/dialogs/login/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/rare/ui/components/dialogs/login/browser_login.py b/rare/ui/components/dialogs/login/browser_login.py new file mode 100644 index 00000000..20405fe0 --- /dev/null +++ b/rare/ui/components/dialogs/login/browser_login.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'browser_login.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_BrowserLogin(object): + def setupUi(self, BrowserLogin): + BrowserLogin.setObjectName("BrowserLogin") + BrowserLogin.resize(246, 130) + BrowserLogin.setWindowTitle("BrowserLogin") + self.browser_layout = QtWidgets.QGridLayout(BrowserLogin) + self.browser_layout.setObjectName("browser_layout") + self.open_button = QtWidgets.QPushButton(BrowserLogin) + self.open_button.setObjectName("open_button") + self.browser_layout.addWidget(self.open_button, 1, 0, 1, 1) + self.title_label = QtWidgets.QLabel(BrowserLogin) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.title_label.setFont(font) + self.title_label.setObjectName("title_label") + self.browser_layout.addWidget(self.title_label, 0, 0, 1, 2, QtCore.Qt.AlignTop) + self.sid_edit = QtWidgets.QLineEdit(BrowserLogin) + self.sid_edit.setObjectName("sid_edit") + self.browser_layout.addWidget(self.sid_edit, 1, 1, 1, 1) + self.info_label = QtWidgets.QLabel(BrowserLogin) + font = QtGui.QFont() + font.setItalic(True) + self.info_label.setFont(font) + self.info_label.setWordWrap(True) + self.info_label.setObjectName("info_label") + self.browser_layout.addWidget(self.info_label, 3, 0, 1, 2, QtCore.Qt.AlignBottom) + self.status_label = QtWidgets.QLabel(BrowserLogin) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.status_label.sizePolicy().hasHeightForWidth()) + self.status_label.setSizePolicy(sizePolicy) + self.status_label.setText("") + self.status_label.setObjectName("status_label") + self.browser_layout.addWidget(self.status_label, 2, 1, 1, 1) + + self.retranslateUi(BrowserLogin) + QtCore.QMetaObject.connectSlotsByName(BrowserLogin) + + def retranslateUi(self, BrowserLogin): + _translate = QtCore.QCoreApplication.translate + self.open_button.setText(_translate("BrowserLogin", "Open Browser")) + self.title_label.setText(_translate("BrowserLogin", "Login through browser")) + self.sid_edit.setPlaceholderText(_translate("BrowserLogin", "Insert SID here")) + self.info_label.setText(_translate("BrowserLogin", "Click the button to open the login page in a browser. After logging in, copy the SID code in the input above.")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + BrowserLogin = QtWidgets.QWidget() + ui = Ui_BrowserLogin() + ui.setupUi(BrowserLogin) + BrowserLogin.show() + sys.exit(app.exec_()) diff --git a/rare/ui/components/dialogs/login/browser_login.ui b/rare/ui/components/dialogs/login/browser_login.ui new file mode 100644 index 00000000..a950617b --- /dev/null +++ b/rare/ui/components/dialogs/login/browser_login.ui @@ -0,0 +1,76 @@ + + + BrowserLogin + + + + 0 + 0 + 246 + 130 + + + + BrowserLogin + + + + + + Open Browser + + + + + + + + 75 + true + + + + Login through browser + + + + + + + Insert SID here + + + + + + + + true + + + + Click the button to open the login page in a browser. After logging in, copy the SID code in the input above. + + + true + + + + + + + + 0 + 0 + + + + + + + + + + + + diff --git a/rare/ui/components/dialogs/login/import_login.py b/rare/ui/components/dialogs/login/import_login.py new file mode 100644 index 00000000..ad14f9d6 --- /dev/null +++ b/rare/ui/components/dialogs/login/import_login.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'import_login.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_ImportLogin(object): + def setupUi(self, ImportLogin): + ImportLogin.setObjectName("ImportLogin") + ImportLogin.resize(246, 117) + ImportLogin.setWindowTitle("ImportLogin") + self.import_layout = QtWidgets.QGridLayout(ImportLogin) + self.import_layout.setObjectName("import_layout") + self.info_label = QtWidgets.QLabel(ImportLogin) + font = QtGui.QFont() + font.setItalic(True) + self.info_label.setFont(font) + self.info_label.setWordWrap(True) + self.info_label.setObjectName("info_label") + self.import_layout.addWidget(self.info_label, 3, 0, 1, 3, QtCore.Qt.AlignBottom) + self.title_label = QtWidgets.QLabel(ImportLogin) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.title_label.setFont(font) + self.title_label.setObjectName("title_label") + self.import_layout.addWidget(self.title_label, 0, 0, 1, 3, QtCore.Qt.AlignTop) + self.prefix_combo = QtWidgets.QComboBox(ImportLogin) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.prefix_combo.sizePolicy().hasHeightForWidth()) + self.prefix_combo.setSizePolicy(sizePolicy) + self.prefix_combo.setEditable(True) + self.prefix_combo.setObjectName("prefix_combo") + self.import_layout.addWidget(self.prefix_combo, 1, 1, 1, 1) + self.prefix_label = QtWidgets.QLabel(ImportLogin) + self.prefix_label.setObjectName("prefix_label") + self.import_layout.addWidget(self.prefix_label, 1, 0, 1, 1) + self.prefix_tool = QtWidgets.QToolButton(ImportLogin) + self.prefix_tool.setObjectName("prefix_tool") + self.import_layout.addWidget(self.prefix_tool, 1, 2, 1, 1) + self.status_label = QtWidgets.QLabel(ImportLogin) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.status_label.sizePolicy().hasHeightForWidth()) + self.status_label.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setItalic(True) + self.status_label.setFont(font) + self.status_label.setText("") + self.status_label.setObjectName("status_label") + self.import_layout.addWidget(self.status_label, 2, 1, 1, 2) + + self.retranslateUi(ImportLogin) + QtCore.QMetaObject.connectSlotsByName(ImportLogin) + + def retranslateUi(self, ImportLogin): + _translate = QtCore.QCoreApplication.translate + self.info_label.setText(_translate("ImportLogin", "You will get logged out from EGL in the process.")) + self.title_label.setText(_translate("ImportLogin", "Import existing session from EGL")) + self.prefix_label.setText(_translate("ImportLogin", "Select prefix")) + self.prefix_tool.setText(_translate("ImportLogin", "Browse")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + ImportLogin = QtWidgets.QWidget() + ui = Ui_ImportLogin() + ui.setupUi(ImportLogin) + ImportLogin.show() + sys.exit(app.exec_()) diff --git a/rare/ui/components/dialogs/login/import_login.ui b/rare/ui/components/dialogs/login/import_login.ui new file mode 100644 index 00000000..2bc3f0d1 --- /dev/null +++ b/rare/ui/components/dialogs/login/import_login.ui @@ -0,0 +1,94 @@ + + + ImportLogin + + + + 0 + 0 + 246 + 117 + + + + ImportLogin + + + + + + + true + + + + You will get logged out from EGL in the process. + + + true + + + + + + + + 75 + true + + + + Import existing session from EGL + + + + + + + + 0 + 0 + + + + true + + + + + + + Select prefix + + + + + + + Browse + + + + + + + + 0 + 0 + + + + + true + + + + + + + + + + + + diff --git a/rare/ui/components/dialogs/login/login_dialog.py b/rare/ui/components/dialogs/login/login_dialog.py new file mode 100644 index 00000000..8b1afbc4 --- /dev/null +++ b/rare/ui/components/dialogs/login/login_dialog.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'login_dialog.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_LoginDialog(object): + def setupUi(self, LoginDialog): + LoginDialog.setObjectName("LoginDialog") + LoginDialog.resize(492, 311) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(LoginDialog.sizePolicy().hasHeightForWidth()) + LoginDialog.setSizePolicy(sizePolicy) + self.dialog_layout = QtWidgets.QVBoxLayout(LoginDialog) + self.dialog_layout.setObjectName("dialog_layout") + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + self.dialog_layout.addItem(spacerItem) + self.welcome_label = QtWidgets.QLabel(LoginDialog) + self.welcome_label.setObjectName("welcome_label") + self.dialog_layout.addWidget(self.welcome_label) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + self.dialog_layout.addItem(spacerItem1) + self.login_stack = QtWidgets.QStackedWidget(LoginDialog) + self.login_stack.setEnabled(True) + self.login_stack.setMinimumSize(QtCore.QSize(480, 135)) + self.login_stack.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.login_stack.setFrameShadow(QtWidgets.QFrame.Raised) + self.login_stack.setObjectName("login_stack") + self.login_page = QtWidgets.QWidget() + self.login_page.setEnabled(True) + self.login_page.setObjectName("login_page") + self.login_page_layout = QtWidgets.QGridLayout(self.login_page) + self.login_page_layout.setObjectName("login_page_layout") + self.login_browser_label = QtWidgets.QLabel(self.login_page) + font = QtGui.QFont() + font.setItalic(True) + self.login_browser_label.setFont(font) + self.login_browser_label.setObjectName("login_browser_label") + self.login_page_layout.addWidget(self.login_browser_label, 1, 1, 1, 1) + self.login_label = QtWidgets.QLabel(self.login_page) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.login_label.setFont(font) + self.login_label.setObjectName("login_label") + self.login_page_layout.addWidget(self.login_label, 0, 0, 1, 3, QtCore.Qt.AlignTop) + self.login_import_label = QtWidgets.QLabel(self.login_page) + font = QtGui.QFont() + font.setItalic(True) + self.login_import_label.setFont(font) + self.login_import_label.setObjectName("login_import_label") + self.login_page_layout.addWidget(self.login_import_label, 2, 1, 1, 1) + self.login_import_radio = QtWidgets.QRadioButton(self.login_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.login_import_radio.sizePolicy().hasHeightForWidth()) + self.login_import_radio.setSizePolicy(sizePolicy) + self.login_import_radio.setObjectName("login_import_radio") + self.login_page_layout.addWidget(self.login_import_radio, 2, 0, 1, 1) + self.login_browser_radio = QtWidgets.QRadioButton(self.login_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.login_browser_radio.sizePolicy().hasHeightForWidth()) + self.login_browser_radio.setSizePolicy(sizePolicy) + self.login_browser_radio.setObjectName("login_browser_radio") + self.login_page_layout.addWidget(self.login_browser_radio, 1, 0, 1, 1) + spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.login_page_layout.addItem(spacerItem2, 1, 2, 2, 1) + self.login_stack.addWidget(self.login_page) + self.success_page = QtWidgets.QWidget() + self.success_page.setObjectName("success_page") + self.success_page_layout = QtWidgets.QHBoxLayout(self.success_page) + self.success_page_layout.setObjectName("success_page_layout") + self.success_label = QtWidgets.QLabel(self.success_page) + self.success_label.setObjectName("success_label") + self.success_page_layout.addWidget(self.success_label) + self.login_stack.addWidget(self.success_page) + self.dialog_layout.addWidget(self.login_stack) + self.button_layout = QtWidgets.QHBoxLayout() + self.button_layout.setObjectName("button_layout") + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.button_layout.addItem(spacerItem3) + self.exit_button = QtWidgets.QPushButton(LoginDialog) + self.exit_button.setObjectName("exit_button") + self.button_layout.addWidget(self.exit_button) + self.back_button = QtWidgets.QPushButton(LoginDialog) + self.back_button.setObjectName("back_button") + self.button_layout.addWidget(self.back_button) + self.next_button = QtWidgets.QPushButton(LoginDialog) + self.next_button.setObjectName("next_button") + self.button_layout.addWidget(self.next_button) + self.dialog_layout.addLayout(self.button_layout) + + self.retranslateUi(LoginDialog) + self.login_stack.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(LoginDialog) + + def retranslateUi(self, LoginDialog): + _translate = QtCore.QCoreApplication.translate + LoginDialog.setWindowTitle(_translate("LoginDialog", "Welcome to Rare")) + self.welcome_label.setText(_translate("LoginDialog", "

Welcome to Rare

")) + self.login_browser_label.setText(_translate("LoginDialog", "Login using a browser.")) + self.login_label.setText(_translate("LoginDialog", "Select login method")) + self.login_import_label.setText(_translate("LoginDialog", "Import from Epic Games Launcher")) + self.login_import_radio.setText(_translate("LoginDialog", "Import")) + self.login_browser_radio.setText(_translate("LoginDialog", "Browser")) + self.success_label.setText(_translate("LoginDialog", "

Login Succeful!

")) + self.exit_button.setText(_translate("LoginDialog", "Exit")) + self.back_button.setText(_translate("LoginDialog", "Back")) + self.next_button.setText(_translate("LoginDialog", "Next")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + LoginDialog = QtWidgets.QDialog() + ui = Ui_LoginDialog() + ui.setupUi(LoginDialog) + LoginDialog.show() + sys.exit(app.exec_()) diff --git a/rare/ui/components/dialogs/login/login_dialog.ui b/rare/ui/components/dialogs/login/login_dialog.ui new file mode 100644 index 00000000..70bf38c1 --- /dev/null +++ b/rare/ui/components/dialogs/login/login_dialog.ui @@ -0,0 +1,220 @@ + + + LoginDialog + + + + 0 + 0 + 492 + 311 + + + + + 0 + 0 + + + + Welcome to Rare + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + <h1>Welcome to Rare</h1> + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + true + + + + 480 + 135 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + 0 + + + + true + + + + + + + true + + + + Login using a browser. + + + + + + + + 75 + true + + + + Select login method + + + + + + + + true + + + + Import from Epic Games Launcher + + + + + + + + 0 + 0 + + + + Import + + + + + + + + 0 + 0 + + + + Browser + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + <h2>Login Succeful!</h2> + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Exit + + + + + + + Back + + + + + + + Next + + + + + + + + + +