1
0
Fork 0
mirror of synced 2024-06-22 04:20:25 +12:00
Rare/rare/components/tabs/__init__.py
loathingKernel 99eaf86507
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-10 14:21:39 +02:00

121 lines
5 KiB
Python

from PyQt5.QtCore import QSize, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QMenu, QTabWidget, QWidget, QWidgetAction, QShortcut, QMessageBox
from rare.shared import RareCore, LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
from rare.utils.misc import icon
from .account import AccountWidget
from .downloads import DownloadsTab
from .games import GamesTab
from .settings import SettingsTab
from .settings.debug import DebugSettings
from .shop import Shop
from .tab_widgets import MainTabBar, TabButtonWidget
class MainTabWidget(QTabWidget):
# int: exit code
exit_app: pyqtSignal = pyqtSignal(int)
def __init__(self, parent):
super(MainTabWidget, self).__init__(parent=parent)
self.rcore = RareCore.instance()
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
self.args = ArgumentsSingleton()
self.tab_bar = MainTabBar(parent=self)
self.setTabBar(self.tab_bar)
# Generate Tabs
self.games_tab = GamesTab(self)
self.games_index = self.addTab(self.games_tab, self.tr("Games"))
# Downloads Tab after Games Tab to use populated RareCore games list
if not self.args.offline:
self.downloads_tab = DownloadsTab(self)
self.downloads_index = self.addTab(self.downloads_tab, "")
self.downloads_tab.update_title.connect(self.__on_downloads_update_title)
self.downloads_tab.update_queues_count()
self.setTabEnabled(self.downloads_index, not self.args.offline)
self.store_tab = Shop(self.core)
self.store_index = self.addTab(self.store_tab, self.tr("Store (Beta)"))
self.setTabEnabled(self.store_index, not self.args.offline)
# Space Tab
space_index = self.addTab(QWidget(self), "")
self.setTabEnabled(space_index, False)
self.tab_bar.expanded = space_index
# Button
button_index = self.addTab(QWidget(self), "")
self.setTabEnabled(button_index, False)
self.account_widget = AccountWidget(self)
self.account_widget.exit_app.connect(self.__on_exit_app)
account_action = QWidgetAction(self)
account_action.setDefaultWidget(self.account_widget)
account_button = TabButtonWidget("mdi.account-circle", "Account", fallback_icon="fa.user")
account_button.setMenu(QMenu())
account_button.menu().addAction(account_action)
self.tab_bar.setTabButton(
button_index, MainTabBar.RightSide, account_button
)
self.settings_tab = SettingsTab(self)
self.settings_index = self.addTab(self.settings_tab, icon("fa.gear"), "")
self.settings_tab.about.update_available_ready.connect(
lambda: self.tab_bar.setTabText(self.settings_index, "(!)")
)
# Open game list on click on Games tab button
self.tabBarClicked.connect(self.mouse_clicked)
self.setIconSize(QSize(24, 24))
# shortcuts
QShortcut("Alt+1", self).activated.connect(lambda: self.setCurrentIndex(self.games_index))
if not self.args.offline:
QShortcut("Alt+2", self).activated.connect(lambda: self.setCurrentIndex(self.downloads_index))
QShortcut("Alt+3", self).activated.connect(lambda: self.setCurrentIndex(self.store_index))
QShortcut("Alt+4", self).activated.connect(lambda: self.setCurrentIndex(self.settings_index))
@pyqtSlot(int)
def __on_downloads_update_title(self, num_downloads: int):
self.setTabText(self.indexOf(self.downloads_tab), self.tr("Downloads ({})").format(num_downloads))
def mouse_clicked(self, index):
if index == self.games_index:
self.games_tab.setCurrentWidget(self.games_tab.games_page)
if not self.args.offline and index == self.store_index:
self.store_tab.load()
def resizeEvent(self, event):
self.tab_bar.setMinimumWidth(self.width())
super(MainTabWidget, self).resizeEvent(event)
@pyqtSlot(int)
def __on_exit_app(self, exit_code: int):
# FIXME: Don't allow logging out if there are active downloads
if self.downloads_tab.is_download_active:
QMessageBox.warning(
self,
self.tr("Quit") if exit_code == self.account_widget.ExitCodes.EXIT else self.tr("Logout"),
self.tr("There are active downloads. Stop them before trying to quit."),
)
return
# FIXME: End of FIXME
if exit_code == self.account_widget.ExitCodes.LOGOUT:
reply = QMessageBox.question(
self,
self.tr("Logout"),
self.tr("Do you really want to logout <b>{}</b>?").format(self.core.lgd.userdata.get("display_name")),
buttons=(QMessageBox.Yes | QMessageBox.No),
defaultButton=QMessageBox.No,
)
if reply == QMessageBox.Yes:
self.core.lgd.invalidate_userdata()
else:
return
self.exit_app.emit(exit_code) # restart exit code