1
0
Fork 0
mirror of synced 2024-07-18 04:46:14 +12:00
Rare/rare/components/dialogs/launch_dialog.py
loathingKernel c3c9b0f059
AccountWidget: Add a Quit button in the widget in case the system tray
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.
2023-12-03 17:11:45 +02:00

98 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