1
0
Fork 0
mirror of synced 2024-06-30 20:20:53 +12:00
Rare/rare/components/tray_icon.py
loathingKernel 4640f8af6f RareGame: Add metadata loading into RareGame itself and adapt tray icon to use the same file structure
Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
2023-02-04 17:38:06 +02:00

86 lines
2.9 KiB
Python

from logging import getLogger
from typing import List, Dict
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QSystemTrayIcon, QMenu, QAction
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
from rare.models.game import RareGame
logger = getLogger("TrayIcon")
# FIXME: Remove when RareCore gets merged and replace it below
class RareGameMeta:
def __init__(self):
self.core = LegendaryCoreSingleton()
metadata = RareGame.load_metadata_json()
self.metadata: Dict[str, RareGame.Metadata] = {}
for app_name, data in metadata.items():
self.metadata[app_name] = RareGame.Metadata.from_dict(data)
def get_list(self) -> List[str]:
last_played = [
item for item in self.metadata.items() if (bool(item[1]) and self.core.is_installed(item[0]))
]
last_played.sort(key=lambda item: item[1].last_played, reverse=True)
last_played = last_played[0:5]
last_played = [item[0] for item in last_played]
return last_played
class TrayIcon(QSystemTrayIcon):
# none:
show_app: pyqtSignal = pyqtSignal()
# int: exit code
exit_app: pyqtSignal = pyqtSignal(int)
def __init__(self, parent=None):
super(TrayIcon, self).__init__(parent=parent)
self.core = LegendaryCoreSingleton()
self.setIcon(QIcon(":/images/Rare.png"))
self.setVisible(True)
self.setToolTip("Rare")
self.menu = QMenu()
self.show_action = QAction("Rare")
self.show_action.triggered.connect(self.show_app)
self.menu.addAction(self.show_action)
self.menu.addSeparator()
self.text_action = QAction("Quick launch")
self.text_action.setEnabled(False)
self.menu.addAction(self.text_action)
metadata = RareGameMeta()
last_played = metadata.get_list()
self.game_actions: List[QAction] = []
for app_name in last_played:
a = QAction(self.core.get_game(app_name).app_title)
a.setProperty("app_name", 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.triggered.connect(lambda: self.exit_app.emit(0))
self.menu.addAction(self.exit_action)
self.setContextMenu(self.menu)
self.signals = GlobalSignalsSingleton()
self.signals.game.uninstalled.connect(self.remove_button)
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)
action.deleteLater()