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