1
0
Fork 0
mirror of synced 2024-06-29 11:40:37 +12:00

RareGame: Add enqueue and dequeue signals

They are used to insert and remove updates from downloads when
the installation of a game changes through `RareGame.set_installed`.
They piggy-back the signals with the same names in `GlobalSignals`

When importing a game from EGL, also check
This commit is contained in:
loathingKernel 2023-01-27 04:11:10 +02:00
parent 523391d166
commit 90021e34f2
7 changed files with 36 additions and 23 deletions

View file

@ -274,8 +274,9 @@ class DownloadsTab(QWidget):
@pyqtSlot(UninstallOptionsModel) @pyqtSlot(UninstallOptionsModel)
def __on_uninstall_dialog_closed(self, options: UninstallOptionsModel): def __on_uninstall_dialog_closed(self, options: UninstallOptionsModel):
if options and options.uninstall: if options and options.uninstall:
self.__remove_update(options.app_name) rgame = self.rcore.get_game(options.app_name)
worker = UninstallWorker(self.core, self.rcore.get_game(options.app_name), options) rgame.set_installed(False)
worker = UninstallWorker(self.core, rgame, options)
worker.signals.result.connect(self.__on_uninstall_worker_result) worker.signals.result.connect(self.__on_uninstall_worker_result)
self.threadpool.start(worker) self.threadpool.start(worker)
@ -283,4 +284,3 @@ class DownloadsTab(QWidget):
def __on_uninstall_worker_result(self, rgame: RareGame, success: bool, message: str): def __on_uninstall_worker_result(self, rgame: RareGame, success: bool, message: str):
if not success: if not success:
QMessageBox.warning(None, self.tr("Uninstall - {}").format(rgame.title), message, QMessageBox.Close) QMessageBox.warning(None, self.tr("Uninstall - {}").format(rgame.title), message, QMessageBox.Close)
rgame.set_installed(False)

View file

@ -15,7 +15,6 @@ from rare.shared import (
ImageManagerSingleton, ImageManagerSingleton,
) )
from rare.shared import RareCore from rare.shared import RareCore
from rare.shared.game_utils import GameUtils
from rare.widgets.library_layout import LibraryLayout from rare.widgets.library_layout import LibraryLayout
from rare.widgets.sliding_stack import SlidingStackedWidget from rare.widgets.sliding_stack import SlidingStackedWidget
from .game_info import GameInfoTabs from .game_info import GameInfoTabs
@ -45,8 +44,6 @@ class GamesTab(QStackedWidget):
self.dlcs: Dict[str, List[Game]] = self.api_results.dlcs self.dlcs: Dict[str, List[Game]] = self.api_results.dlcs
self.no_assets: List[Game] = self.api_results.no_asset_games self.no_assets: List[Game] = self.api_results.no_asset_games
self.game_utils = GameUtils(parent=self)
self.games = QWidget(parent=self) self.games = QWidget(parent=self)
self.games.setLayout(QVBoxLayout()) self.games.setLayout(QVBoxLayout())
self.addWidget(self.games) self.addWidget(self.games)

View file

@ -11,7 +11,7 @@ from legendary.models.game import InstalledGame
from rare.lgndr.glue.exception import LgndrException from rare.lgndr.glue.exception import LgndrException
from rare.models.pathspec import PathSpec from rare.models.pathspec import PathSpec
from rare.shared import RareCore, LegendaryCoreSingleton, GlobalSignalsSingleton from rare.shared import RareCore
from rare.shared.workers.wine_resolver import WineResolver from rare.shared.workers.wine_resolver import WineResolver
from rare.ui.components.tabs.games.integrations.egl_sync_group import Ui_EGLSyncGroup from rare.ui.components.tabs.games.integrations.egl_sync_group import Ui_EGLSyncGroup
from rare.ui.components.tabs.games.integrations.egl_sync_list_group import Ui_EGLSyncListGroup from rare.ui.components.tabs.games.integrations.egl_sync_list_group import Ui_EGLSyncListGroup
@ -25,7 +25,7 @@ class EGLSyncGroup(QGroupBox):
super(EGLSyncGroup, self).__init__(parent=parent) super(EGLSyncGroup, self).__init__(parent=parent)
self.ui = Ui_EGLSyncGroup() self.ui = Ui_EGLSyncGroup()
self.ui.setupUi(self) self.ui.setupUi(self)
self.core = LegendaryCoreSingleton() self.core = RareCore.instance().core()
self.ui.egl_path_info.setProperty("infoLabel", 1) self.ui.egl_path_info.setProperty("infoLabel", 1)
self.thread_pool = QThreadPool.globalInstance() self.thread_pool = QThreadPool.globalInstance()
@ -175,7 +175,7 @@ class EGLSyncListItem(QListWidgetItem):
super(EGLSyncListItem, self).__init__(parent=parent) super(EGLSyncListItem, self).__init__(parent=parent)
self.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable) self.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
self.setCheckState(Qt.Unchecked) self.setCheckState(Qt.Unchecked)
self.core = LegendaryCoreSingleton() self.core = RareCore.instance().core()
self.game = game self.game = game
self.setText(self.app_title) self.setText(self.app_title)
@ -239,7 +239,7 @@ class EGLSyncListGroup(QGroupBox):
self.ui.setupUi(self) self.ui.setupUi(self)
self.ui.list.setFrameShape(QFrame.NoFrame) self.ui.list.setFrameShape(QFrame.NoFrame)
self.rcore = RareCore.instance() self.rcore = RareCore.instance()
self.core = LegendaryCoreSingleton() self.core = RareCore.instance().core()
self.ui.list.itemDoubleClicked.connect( self.ui.list.itemDoubleClicked.connect(
lambda item: item.setCheckState(Qt.Unchecked) lambda item: item.setCheckState(Qt.Unchecked)

View file

@ -15,7 +15,7 @@ from rare.lgndr.cli import LegendaryCLI
from rare.lgndr.core import LegendaryCore from rare.lgndr.core import LegendaryCore
from rare.lgndr.glue.arguments import LgndrImportGameArgs from rare.lgndr.glue.arguments import LgndrImportGameArgs
from rare.lgndr.glue.monkeys import LgndrIndirectStatus from rare.lgndr.glue.monkeys import LgndrIndirectStatus
from rare.shared import RareCore, LegendaryCoreSingleton, GlobalSignalsSingleton, ApiResultsSingleton from rare.shared import RareCore
from rare.ui.components.tabs.games.integrations.import_group import Ui_ImportGroup from rare.ui.components.tabs.games.integrations.import_group import Ui_ImportGroup
from rare.utils.extra_widgets import IndicatorLineEdit, PathEdit from rare.utils.extra_widgets import IndicatorLineEdit, PathEdit
from rare.widgets.elide_label import ElideLabel from rare.widgets.elide_label import ElideLabel
@ -62,8 +62,8 @@ class ImportWorker(QRunnable):
def __init__(self, core: LegendaryCore, path: str, app_name: str = None, import_folder: bool = False, import_dlcs: bool = False): def __init__(self, core: LegendaryCore, path: str, app_name: str = None, import_folder: bool = False, import_dlcs: bool = False):
super(ImportWorker, self).__init__() super(ImportWorker, self).__init__()
self.signals = ImportWorker.Signals()
self.core = core self.core = core
self.signals = self.Signals()
self.path = Path(path) self.path = Path(path)
self.app_name = app_name self.app_name = app_name
@ -161,11 +161,12 @@ class ImportGroup(QGroupBox):
self.ui = Ui_ImportGroup() self.ui = Ui_ImportGroup()
self.ui.setupUi(self) self.ui.setupUi(self)
self.rcore = RareCore.instance() self.rcore = RareCore.instance()
self.core = LegendaryCoreSingleton() self.core = RareCore.instance().core()
self.signals = GlobalSignalsSingleton() self.api_results = RareCore.instance().api_results()
self.api_results = ApiResultsSingleton()
#self.app_name_list = [rgame.app_name for rgame in self.rcore.games]
self.app_name_list = [game.app_name for game in self.api_results.game_list] self.app_name_list = [game.app_name for game in self.api_results.game_list]
#self.install_dir_list = [rgame.folder_name for rgame in self.rcore.games if not rgame.is_dlc]
self.install_dir_list = [ self.install_dir_list = [
game.metadata.get("customAttributes", {}) game.metadata.get("customAttributes", {})
.get("FolderName", {}) .get("FolderName", {})
@ -186,6 +187,7 @@ class ImportGroup(QGroupBox):
self.app_name_edit = IndicatorLineEdit( self.app_name_edit = IndicatorLineEdit(
placeholder=self.tr("Use in case the app name was not found automatically"), placeholder=self.tr("Use in case the app name was not found automatically"),
completer=AppNameCompleter( completer=AppNameCompleter(
# app_names=[(rgame.app_name, rgame.app_title) for rgame in self.rcore.games]
app_names=[(i.app_name, i.app_title) for i in self.api_results.game_list] app_names=[(i.app_name, i.app_title) for i in self.api_results.game_list]
), ),
edit_func=self.app_name_edit_callback, edit_func=self.app_name_edit_callback,
@ -289,10 +291,7 @@ class ImportGroup(QGroupBox):
def __on_import_progress(self, imported: ImportedGame, progress: int): def __on_import_progress(self, imported: ImportedGame, progress: int):
self.info_progress.setValue(progress) self.info_progress.setValue(progress)
if imported.result == ImportResult.SUCCESS or imported.result == ImportResult.FAILED: if imported.result == ImportResult.SUCCESS or imported.result == ImportResult.FAILED:
rgame = self.rcore.get_game(imported.app_name) self.rcore.get_game(imported.app_name).set_installed(True)
rgame.set_installed(True)
if rgame.has_update:
self.signals.download.enqueue.emit(rgame.app_name)
status = "error" if not imported.result else ( status = "error" if not imported.result else (
"failed" if imported.result == ImportResult.FAILED else "successful" "failed" if imported.result == ImportResult.FAILED else "successful"
) )

View file

@ -72,6 +72,10 @@ class RareGame(QObject):
class Widget(QObject): class Widget(QObject):
update = pyqtSignal() update = pyqtSignal()
class Download(QObject):
enqueue = pyqtSignal(str)
dequeue = pyqtSignal(str)
class Game(QObject): class Game(QObject):
install = pyqtSignal(InstallOptionsModel) install = pyqtSignal(InstallOptionsModel)
installed = pyqtSignal(str) installed = pyqtSignal(str)
@ -84,6 +88,7 @@ class RareGame(QObject):
super(RareGame.Signals, self).__init__() super(RareGame.Signals, self).__init__()
self.progress = RareGame.Signals.Progress() self.progress = RareGame.Signals.Progress()
self.widget = RareGame.Signals.Widget() self.widget = RareGame.Signals.Widget()
self.download = RareGame.Signals.Download()
self.game = RareGame.Signals.Game() self.game = RareGame.Signals.Game()
def __init__(self, legendary_core: LegendaryCore, image_manager: ImageManager, game: Game): def __init__(self, legendary_core: LegendaryCore, image_manager: ImageManager, game: Game):
@ -157,12 +162,12 @@ class RareGame(QObject):
return RareGame.__metadata_json return RareGame.__metadata_json
def __load_metadata(self): def __load_metadata(self):
metadata = self.__load_metadata_json() metadata: Dict = self.__load_metadata_json()
if self.app_name in metadata: if self.app_name in metadata:
self.metadata = RareGame.Metadata.from_dict(metadata[self.app_name]) self.metadata = RareGame.Metadata.from_dict(metadata[self.app_name])
def __save_metadata(self): def __save_metadata(self):
metadata = self.__load_metadata_json() metadata: Dict = self.__load_metadata_json()
metadata[self.app_name] = self.metadata.as_dict() metadata[self.app_name] = self.metadata.as_dict()
with open(os.path.join(data_dir(), "game_meta.json"), "w") as metadata_json: with open(os.path.join(data_dir(), "game_meta.json"), "w") as metadata_json:
json.dump(metadata, metadata_json, indent=2) json.dump(metadata, metadata_json, indent=2)
@ -281,7 +286,11 @@ class RareGame(QObject):
if installed: if installed:
self.update_igame() self.update_igame()
self.signals.game.installed.emit(self.app_name) self.signals.game.installed.emit(self.app_name)
if self.has_update:
self.signals.download.enqueue.emit(self.app_name)
else: else:
if self.has_update:
self.signals.download.dequeue.emit(self.app_name)
self.igame = None self.igame = None
self.signals.game.uninstalled.emit(self.app_name) self.signals.game.uninstalled.emit(self.app_name)
self.set_pixmap() self.set_pixmap()
@ -418,6 +427,10 @@ class RareGame(QObject):
== "Origin" == "Origin"
) )
@property
def folder_name(self) -> str:
return self.game.metadata.get("customAttributes", {}).get("FolderName", {}).get("value")
def grant_date(self, force=False) -> datetime: def grant_date(self, force=False) -> datetime:
if self.metadata.grant_date is None or force: if self.metadata.grant_date is None or force:
entitlements = self.core.lgd.entitlements entitlements = self.core.lgd.entitlements

View file

@ -21,10 +21,12 @@ class GlobalSignals:
update_tray = pyqtSignal() update_tray = pyqtSignal()
class GameSignals(QObject): class GameSignals(QObject):
# model
install = pyqtSignal(InstallOptionsModel) install = pyqtSignal(InstallOptionsModel)
uninstall = pyqtSignal(UninstallOptionsModel)
# str: app_name # str: app_name
installed = pyqtSignal(str) installed = pyqtSignal(str)
# model
uninstall = pyqtSignal(UninstallOptionsModel)
# str: app_name # str: app_name
uninstalled = pyqtSignal(str) uninstalled = pyqtSignal(str)

View file

@ -145,9 +145,11 @@ class RareCore(QObject):
return self.__games[app_name] return self.__games[app_name]
def add_game(self, rgame: RareGame) -> None: def add_game(self, rgame: RareGame) -> None:
rgame.signals.download.enqueue.connect(self.__signals.download.enqueue)
rgame.signals.download.dequeue.connect(self.__signals.download.dequeue)
rgame.signals.game.install.connect(self.__signals.game.install) rgame.signals.game.install.connect(self.__signals.game.install)
rgame.signals.game.uninstall.connect(self.__signals.game.uninstall)
rgame.signals.game.installed.connect(self.__signals.game.installed) rgame.signals.game.installed.connect(self.__signals.game.installed)
rgame.signals.game.uninstall.connect(self.__signals.game.uninstall)
rgame.signals.game.uninstalled.connect(self.__signals.game.uninstalled) rgame.signals.game.uninstalled.connect(self.__signals.game.uninstalled)
rgame.signals.game.finished.connect(self.__signals.application.update_tray) rgame.signals.game.finished.connect(self.__signals.application.update_tray)
rgame.signals.game.finished.connect(lambda: self.__signals.discord_rpc.set_title.emit("")) rgame.signals.game.finished.connect(lambda: self.__signals.discord_rpc.set_title.emit(""))