From 3f7d8b10e211cab687a1be20e12f3e8065514846 Mon Sep 17 00:00:00 2001 From: Dummerle Date: Sun, 10 Oct 2021 21:52:11 +0200 Subject: [PATCH] Add support for uninstalling dlcs --- rare/components/tabs/games/__init__.py | 14 ++--- .../tabs/games/game_info/__init__.py | 24 ++++----- .../tabs/games/game_info/game_dlc.py | 53 ++++++++++++------- 3 files changed, 53 insertions(+), 38 deletions(-) diff --git a/rare/components/tabs/games/__init__.py b/rare/components/tabs/games/__init__.py index 4c8a603a..cb1a90fe 100644 --- a/rare/components/tabs/games/__init__.py +++ b/rare/components/tabs/games/__init__.py @@ -39,10 +39,16 @@ class GamesTab(QStackedWidget, Ui_GamesTab): self.signals.games_tab.connect(lambda x: self.signal_received(*x)) self.settings = QSettings() + self.game_list = shared.api_results.game_list + self.dlcs = shared.api_results.dlcs + self.bit32 = shared.api_results.bit32_games + self.mac_games = shared.api_results.mac_games + self.no_assets = shared.api_results.no_asset_games + self.head_bar = GameListHeadBar() self.games.layout().insertWidget(0, self.head_bar) - self.game_info = InfoTabs(self.core, self.signals, self) + self.game_info = InfoTabs(self.dlcs, self) self.addWidget(self.game_info) self.import_widget = ImportWidget() @@ -56,11 +62,6 @@ class GamesTab(QStackedWidget, Ui_GamesTab): self.import_widget.back_button.clicked.connect(lambda: self.setCurrentIndex(0)) self.uninstalled_info_widget.tabBarClicked.connect(lambda x: self.setCurrentIndex(0) if x == 0 else None) - self.game_list = shared.api_results.game_list - self.dlcs = shared.api_results.dlcs - self.bit32 = shared.api_results.bit32_games - self.mac_games = shared.api_results.mac_games - self.no_assets = shared.api_results.no_asset_games self.no_asset_names = [] if not shared.args.offline: for game in self.no_assets: @@ -262,7 +263,6 @@ class GamesTab(QStackedWidget, Ui_GamesTab): w.setVisible(True) def update_list(self, app_name=None): - print(app_name) if app_name: if widgets := self.widgets.get(app_name): diff --git a/rare/components/tabs/games/game_info/__init__.py b/rare/components/tabs/games/game_info/__init__.py index ab59db92..e1e2bd8f 100644 --- a/rare/components/tabs/games/game_info/__init__.py +++ b/rare/components/tabs/games/game_info/__init__.py @@ -4,19 +4,19 @@ from PyQt5.QtWidgets import QWidget, QTabWidget from qtawesome import icon from legendary.models.game import Game +from rare import shared from rare.components.tabs.games.game_info.game_dlc import GameDlc from rare.components.tabs.games.game_info.game_info import GameInfo from rare.components.tabs.games.game_info.game_settings import GameSettings from rare.utils.extra_widgets import SideTabBar -from rare.utils.models import Signals class InfoTabs(QTabWidget): - def __init__(self, core, signals: Signals, parent): + def __init__(self, dlcs: list, parent): super(InfoTabs, self).__init__(parent=parent) self.app_name = "" - self.core = core - self.signals = signals + self.core = shared.legendary_core + self.signals = shared.signals self.setTabBar(SideTabBar()) self.setTabPosition(QTabWidget.West) @@ -26,11 +26,12 @@ class InfoTabs(QTabWidget): self.info = GameInfo(self.core, self.signals, self) self.addTab(self.info, self.tr("Information")) - self.settings = GameSettings(core, self) + self.settings = GameSettings(self.core, self) self.addTab(self.settings, self.tr("Settings")) self.tabBar().setCurrentIndex(1) - self.dlc = GameDlc(core, self.signals, self) + self.dlc_list = dlcs + self.dlc = GameDlc(self.dlc_list, self) self.addTab(self.dlc, self.tr("Downloadable Content")) def update_game(self, game: Game, dlcs: list): @@ -39,14 +40,11 @@ class InfoTabs(QTabWidget): self.settings.update_game(game) # DLC Tab: Disable if no dlcs available - if dlcs: - if len(dlcs[game.asset_info.catalog_item_id]) == 0: - self.setTabEnabled(3, False) - else: - self.setTabEnabled(3, True) - self.dlc.update_dlcs(game.app_name, dlcs) - else: + if len(self.dlc_list[game.asset_info.catalog_item_id]) == 0: self.setTabEnabled(3, False) + else: + self.setTabEnabled(3, True) + self.dlc.update_dlcs(game.app_name) def keyPressEvent(self, e: QKeyEvent): if e.key() == Qt.Key_Escape: diff --git a/rare/components/tabs/games/game_info/game_dlc.py b/rare/components/tabs/games/game_info/game_dlc.py index 955e2965..694e08b7 100644 --- a/rare/components/tabs/games/game_info/game_dlc.py +++ b/rare/components/tabs/games/game_info/game_dlc.py @@ -1,11 +1,13 @@ from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QFrame, QWidget, QMessageBox -from legendary.core import LegendaryCore from legendary.models.game import Game +from rare import shared +from rare.components.dialogs.uninstall_dialog import UninstallDialog from rare.ui.components.tabs.games.game_info.game_dlc import Ui_GameDlc from rare.ui.components.tabs.games.game_info.game_dlc_widget import Ui_GameDlcWidget -from rare.utils.models import Signals, InstallOptionsModel +from rare.utils import legendary_utils +from rare.utils.models import InstallOptionsModel from rare.utils.utils import get_pixmap @@ -13,21 +15,22 @@ class GameDlc(QWidget, Ui_GameDlc): install_dlc = pyqtSignal(str, bool) game: Game - def __init__(self, core: LegendaryCore, signals: Signals, parent=None): + def __init__(self, dlcs: list, parent=None): super(GameDlc, self).__init__(parent=parent) self.setupUi(self) self.available_dlc_scroll.setObjectName("noborder") self.installed_dlc_scroll.setObjectName("noborder") + self.signals = shared.signals + self.core = shared.legendary_core - self.signals = signals - self.core = core - self.installed_dlcs = list() + self.dlcs = dlcs self.installed_dlc_widgets = list() self.available_dlc_widgets = list() - def update_dlcs(self, app_name, dlcs: list): + def update_dlcs(self, app_name): self.game = self.core.get_game(app_name) + dlcs = self.dlcs[self.game.asset_info.catalog_item_id] self.game_title.setText(f"

{self.game.app_title}

") if self.installed_dlc_widgets: @@ -39,19 +42,19 @@ class GameDlc(QWidget, Ui_GameDlc): dlc_widget.install.disconnect() dlc_widget.deleteLater() self.available_dlc_widgets.clear() + for dlc in sorted(dlcs, key=lambda x: x.app_title): - self.installed_dlcs = [i.app_name for i in self.core.get_installed_dlc_list()] - - for dlc in sorted(dlcs[self.game.asset_info.catalog_item_id], key=lambda x: x.app_title): - if dlc.app_name in self.installed_dlcs: + if self.core.is_installed(dlc.app_name): dlc_widget = GameDlcWidget(dlc, True) - self.installed_dlc_widgets.append(dlc_widget) self.installed_dlc_contents_layout.addWidget(dlc_widget) + dlc_widget.uninstall.connect(self.uninstall) + self.installed_dlc_widgets.append(dlc_widget) + else: dlc_widget = GameDlcWidget(dlc, False) + self.available_dlc_contents_layout.addWidget(dlc_widget) dlc_widget.install.connect(self.install) self.available_dlc_widgets.append(dlc_widget) - self.available_dlc_contents_layout.addWidget(dlc_widget) self.installed_dlc_label.setVisible(not self.installed_dlc_widgets) self.installed_dlc_scroll.setVisible(bool(self.installed_dlc_widgets)) @@ -59,6 +62,13 @@ class GameDlc(QWidget, Ui_GameDlc): self.available_dlc_label.setVisible(not self.available_dlc_widgets) self.available_dlc_scroll.setVisible(bool(self.available_dlc_widgets)) + def uninstall(self, game): + infos = UninstallDialog(game).get_information() + if infos == 0: + return + legendary_utils.uninstall(game.app_name, self.core, infos) + self.update_dlcs(self.game.app_name) + def install(self, app_name): if not self.core.is_installed(self.game.app_name): QMessageBox.warning(self, "Error", self.tr("Base Game is not installed. Please install {} first").format( @@ -71,6 +81,7 @@ class GameDlc(QWidget, Ui_GameDlc): class GameDlcWidget(QFrame, Ui_GameDlcWidget): install = pyqtSignal(str) # Appname + uninstall = pyqtSignal(Game) def __init__(self, dlc: Game, installed: bool, parent=None): super(GameDlcWidget, self).__init__(parent=parent) @@ -84,12 +95,18 @@ class GameDlcWidget(QFrame, Ui_GameDlcWidget): self.version.setText(dlc.app_version) self.app_name.setText(dlc.app_name) - if not installed: - self.install_button.clicked.connect(lambda: self.install.emit(dlc.app_name)) - self.status.setText(self.tr("Not installed")) + if installed: + self.install_button.clicked.connect(self.uninstall_dlc) + self.status.setText(self.tr("Installed")) + self.install_button.setText("Uninstall") + else: - self.status.setText(self.tr("Installed. Uninstalling DLCs is not supported")) - self.install_button.setVisible(not installed) + self.install_button.clicked.connect(self.install_game) + self.status.setText(self.tr("Not installed")) + self.install_button.setText("Install") + + def uninstall_dlc(self): + self.uninstall.emit(self.dlc) def install_game(self): self.install_button.setDisabled(True)