99eaf86507
is unavailable (for example running in a gamescope session) * Do not show the launch window while instantiating the application. This probably was causing numerous issues because it was running outside of the applications event loop. This also fixes the exit button on the login dialog requiring `sys.exit()` to quit Rare. Now it goes through the proper cleanup procedures. * Make slot and signal names more uniform * Fix a problem with RareCore connecting RareGames to the same signals multiple times when the library was refreshed.
97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
import platform
|
|
from logging import getLogger
|
|
|
|
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
|
|
from PyQt5.QtWidgets import QDialog, QApplication
|
|
from requests.exceptions import ConnectionError, HTTPError
|
|
|
|
from rare.components.dialogs.login import LoginDialog
|
|
from rare.shared import RareCore
|
|
from rare.ui.components.dialogs.launch_dialog import Ui_LaunchDialog
|
|
from rare.widgets.elide_label import ElideLabel
|
|
|
|
logger = getLogger("LaunchDialog")
|
|
|
|
|
|
class LaunchDialog(QDialog):
|
|
exit_app = pyqtSignal(int)
|
|
start_app = pyqtSignal()
|
|
|
|
def __init__(self, parent=None):
|
|
super(LaunchDialog, self).__init__(parent=parent)
|
|
self.setAttribute(Qt.WA_DeleteOnClose, True)
|
|
self.setWindowFlags(
|
|
Qt.Window
|
|
| Qt.Dialog
|
|
| Qt.CustomizeWindowHint
|
|
| Qt.WindowSystemMenuHint
|
|
| Qt.WindowTitleHint
|
|
| Qt.WindowMinimizeButtonHint
|
|
| Qt.MSWindowsFixedSizeDialogHint
|
|
)
|
|
self.setWindowModality(Qt.WindowModal)
|
|
self.ui = Ui_LaunchDialog()
|
|
self.ui.setupUi(self)
|
|
|
|
self.accept_close = False
|
|
|
|
self.progress_info = ElideLabel(parent=self)
|
|
self.progress_info.setFixedHeight(False)
|
|
self.ui.launch_layout.addWidget(self.progress_info)
|
|
|
|
self.rcore = RareCore.instance()
|
|
self.rcore.progress.connect(self.__on_progress)
|
|
self.rcore.completed.connect(self.__on_completed)
|
|
self.core = self.rcore.core()
|
|
self.args = self.rcore.args()
|
|
|
|
self.login_dialog = LoginDialog(core=self.core, parent=parent)
|
|
|
|
def login(self):
|
|
do_launch = True
|
|
try:
|
|
if self.args.offline:
|
|
pass
|
|
else:
|
|
# Force an update check and notice in case there are API changes
|
|
self.core.check_for_updates(force=True)
|
|
self.core.force_show_update = True
|
|
if self.core.login():
|
|
logger.info("You are logged in")
|
|
else:
|
|
raise ValueError("You are not logged in. Open Login Window")
|
|
except ValueError as e:
|
|
logger.info(str(e))
|
|
# Do not set parent, because it won't show a task bar icon
|
|
# Update: Inherit the same parent as LaunchDialog
|
|
do_launch = self.login_dialog.login()
|
|
except (HTTPError, ConnectionError) as e:
|
|
logger.warning(e)
|
|
self.args.offline = True
|
|
finally:
|
|
if do_launch:
|
|
if not self.args.silent:
|
|
self.show()
|
|
self.launch()
|
|
else:
|
|
self.exit_app.emit(0)
|
|
|
|
def launch(self):
|
|
self.progress_info.setText(self.tr("Preparing Rare"))
|
|
self.rcore.fetch()
|
|
|
|
@pyqtSlot(int, str)
|
|
def __on_progress(self, i: int, m: str):
|
|
self.ui.progress_bar.setValue(i)
|
|
self.progress_info.setText(m)
|
|
|
|
def __on_completed(self):
|
|
logger.info("App starting")
|
|
self.accept_close = True
|
|
self.start_app.emit()
|
|
|
|
def reject(self) -> None:
|
|
if self.accept_close:
|
|
super(LaunchDialog, self).reject()
|
|
else:
|
|
pass
|