diff --git a/rare/components/tray_icon.py b/rare/components/tray_icon.py index 8226a336..6b6aa57b 100644 --- a/rare/components/tray_icon.py +++ b/rare/components/tray_icon.py @@ -1,9 +1,9 @@ from logging import getLogger from typing import List -from PyQt5.QtCore import pyqtSignal +from PyQt5.QtCore import pyqtSignal, pyqtSlot from PyQt5.QtGui import QIcon -from PyQt5.QtWidgets import QSystemTrayIcon, QMenu, QAction +from PyQt5.QtWidgets import QSystemTrayIcon, QMenu, QAction, QApplication from rare.shared import RareCore, LegendaryCoreSingleton, GlobalSignalsSingleton @@ -18,16 +18,17 @@ class TrayIcon(QSystemTrayIcon): def __init__(self, parent=None): super(TrayIcon, self).__init__(parent=parent) + self.__parent = parent self.rcore = RareCore.instance() self.core = LegendaryCoreSingleton() self.setIcon(QIcon(":/images/Rare.png")) self.setVisible(True) - self.setToolTip("Rare") + self.setToolTip(QApplication.applicationName()) self.menu = QMenu() - self.show_action = QAction("Rare") + self.show_action = QAction(QApplication.applicationName()) self.show_action.triggered.connect(self.show_app) self.menu.addAction(self.show_action) @@ -36,32 +37,42 @@ class TrayIcon(QSystemTrayIcon): self.text_action.setEnabled(False) self.menu.addAction(self.text_action) - last_played = [game for game in self.rcore.games if (game.metadata and game.is_installed)] - last_played.sort(key=lambda g: g.metadata.last_played, reverse=True) - last_played = last_played[0:5] - - self.game_actions: List[QAction] = [] - - for game in last_played: - a = QAction(game.game.app_title) - a.setProperty("app_name", game.app_name) - self.game_actions.append(a) - a.triggered.connect( - lambda: parent.tab_widget.games_tab.game_utils.prepare_launch( - self.sender().property("app_name")) - ) - - self.menu.addActions(self.game_actions) - self.menu.addSeparator() - + # We need to reference this separator to add game actions before it + self.separator = self.menu.addSeparator() self.exit_action = QAction(self.tr("Quit")) self.exit_action.triggered.connect(lambda: self.exit_app.emit(0)) self.menu.addAction(self.exit_action) + + self.game_actions: List[QAction] = [] + self.update_actions() + self.setContextMenu(self.menu) self.signals = GlobalSignalsSingleton() self.signals.game.uninstalled.connect(self.remove_button) + self.signals.application.update_tray.connect(self.update_actions) + def last_played(self) -> List: + last_played = [game for game in self.rcore.games if (game.metadata and game.is_installed)] + last_played.sort(key=lambda g: g.metadata.last_played, reverse=True) + return last_played[0:5] + + @pyqtSlot() + def update_actions(self): + for action in self.game_actions: + action.deleteLater() + self.game_actions.clear() + for rgame in self.last_played(): + a = QAction(rgame.app_title) + a.setProperty("app_name", rgame.app_name) + a.triggered.connect( + lambda: self.__parent.tab_widget.games_tab.game_utils.prepare_launch( + self.sender().property("app_name")) + ) + self.menu.insertAction(self.separator, a) + self.game_actions.append(a) + + @pyqtSlot(str) def remove_button(self, app_name: str): if action := next((i for i in self.game_actions if i.property("app_name") == app_name), None): self.game_actions.remove(action) diff --git a/rare/models/signals.py b/rare/models/signals.py index 33f0cea4..c9b6115f 100644 --- a/rare/models/signals.py +++ b/rare/models/signals.py @@ -17,6 +17,8 @@ class GlobalSignals: prefix_updated = pyqtSignal() # none overlay_installed = pyqtSignal() + # none + update_tray = pyqtSignal() class ProgressSignals(QObject): # str: app_name diff --git a/rare/shared/game_utils.py b/rare/shared/game_utils.py index a6d6226e..8892cb21 100644 --- a/rare/shared/game_utils.py +++ b/rare/shared/game_utils.py @@ -182,6 +182,7 @@ class GameUtils(QObject): return self.finished.emit(rgame.app_name, "") + rgame.signals.game.finished.emit() logger.info(f"Game exited with exit code: {exit_code}") self.signals.discord_rpc.set_title.emit("") diff --git a/rare/shared/rare_core.py b/rare/shared/rare_core.py index eed993c3..74e3a2e6 100644 --- a/rare/shared/rare_core.py +++ b/rare/shared/rare_core.py @@ -141,6 +141,7 @@ class RareCore(QObject): def add_game(self, rgame: RareGame) -> None: rgame.signals.game.install.connect(self._signals.game.install) + rgame.signals.game.finished.connect(self._signals.application.update_tray) self.__games[rgame.app_name] = rgame def __filter_games(self, condition: Callable[[RareGame], bool]) -> Iterator[RareGame]: