1
0
Fork 0
mirror of synced 2024-06-20 03:20:23 +12:00

TrayIcon: Update the list of recent games after a game has exited

Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
This commit is contained in:
loathingKernel 2023-01-10 22:31:10 +02:00
parent 7fbd941c98
commit 599db2629f
4 changed files with 37 additions and 22 deletions

View file

@ -1,9 +1,9 @@
from logging import getLogger from logging import getLogger
from typing import List from typing import List
from PyQt5.QtCore import pyqtSignal from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtGui import QIcon 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 from rare.shared import RareCore, LegendaryCoreSingleton, GlobalSignalsSingleton
@ -18,16 +18,17 @@ class TrayIcon(QSystemTrayIcon):
def __init__(self, parent=None): def __init__(self, parent=None):
super(TrayIcon, self).__init__(parent=parent) super(TrayIcon, self).__init__(parent=parent)
self.__parent = parent
self.rcore = RareCore.instance() self.rcore = RareCore.instance()
self.core = LegendaryCoreSingleton() self.core = LegendaryCoreSingleton()
self.setIcon(QIcon(":/images/Rare.png")) self.setIcon(QIcon(":/images/Rare.png"))
self.setVisible(True) self.setVisible(True)
self.setToolTip("Rare") self.setToolTip(QApplication.applicationName())
self.menu = QMenu() self.menu = QMenu()
self.show_action = QAction("Rare") self.show_action = QAction(QApplication.applicationName())
self.show_action.triggered.connect(self.show_app) self.show_action.triggered.connect(self.show_app)
self.menu.addAction(self.show_action) self.menu.addAction(self.show_action)
@ -36,32 +37,42 @@ class TrayIcon(QSystemTrayIcon):
self.text_action.setEnabled(False) self.text_action.setEnabled(False)
self.menu.addAction(self.text_action) self.menu.addAction(self.text_action)
last_played = [game for game in self.rcore.games if (game.metadata and game.is_installed)] # We need to reference this separator to add game actions before it
last_played.sort(key=lambda g: g.metadata.last_played, reverse=True) self.separator = self.menu.addSeparator()
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()
self.exit_action = QAction(self.tr("Quit")) self.exit_action = QAction(self.tr("Quit"))
self.exit_action.triggered.connect(lambda: self.exit_app.emit(0)) self.exit_action.triggered.connect(lambda: self.exit_app.emit(0))
self.menu.addAction(self.exit_action) self.menu.addAction(self.exit_action)
self.game_actions: List[QAction] = []
self.update_actions()
self.setContextMenu(self.menu) self.setContextMenu(self.menu)
self.signals = GlobalSignalsSingleton() self.signals = GlobalSignalsSingleton()
self.signals.game.uninstalled.connect(self.remove_button) 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): 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): if action := next((i for i in self.game_actions if i.property("app_name") == app_name), None):
self.game_actions.remove(action) self.game_actions.remove(action)

View file

@ -17,6 +17,8 @@ class GlobalSignals:
prefix_updated = pyqtSignal() prefix_updated = pyqtSignal()
# none # none
overlay_installed = pyqtSignal() overlay_installed = pyqtSignal()
# none
update_tray = pyqtSignal()
class ProgressSignals(QObject): class ProgressSignals(QObject):
# str: app_name # str: app_name

View file

@ -182,6 +182,7 @@ class GameUtils(QObject):
return return
self.finished.emit(rgame.app_name, "") self.finished.emit(rgame.app_name, "")
rgame.signals.game.finished.emit()
logger.info(f"Game exited with exit code: {exit_code}") logger.info(f"Game exited with exit code: {exit_code}")
self.signals.discord_rpc.set_title.emit("") self.signals.discord_rpc.set_title.emit("")

View file

@ -141,6 +141,7 @@ class RareCore(QObject):
def add_game(self, rgame: RareGame) -> None: def add_game(self, rgame: RareGame) -> None:
rgame.signals.game.install.connect(self._signals.game.install) 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 self.__games[rgame.app_name] = rgame
def __filter_games(self, condition: Callable[[RareGame], bool]) -> Iterator[RareGame]: def __filter_games(self, condition: Callable[[RareGame], bool]) -> Iterator[RareGame]: