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:
parent
7fbd941c98
commit
599db2629f
4 changed files with 37 additions and 22 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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("")
|
||||||
|
|
|
@ -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]:
|
||||||
|
|
Loading…
Reference in a new issue