Add support for uninstalling dlcs
This commit is contained in:
parent
214db50a40
commit
3f7d8b10e2
|
@ -39,10 +39,16 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
||||||
self.signals.games_tab.connect(lambda x: self.signal_received(*x))
|
self.signals.games_tab.connect(lambda x: self.signal_received(*x))
|
||||||
self.settings = QSettings()
|
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.head_bar = GameListHeadBar()
|
||||||
self.games.layout().insertWidget(0, self.head_bar)
|
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.addWidget(self.game_info)
|
||||||
|
|
||||||
self.import_widget = ImportWidget()
|
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.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.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 = []
|
self.no_asset_names = []
|
||||||
if not shared.args.offline:
|
if not shared.args.offline:
|
||||||
for game in self.no_assets:
|
for game in self.no_assets:
|
||||||
|
@ -262,7 +263,6 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
||||||
w.setVisible(True)
|
w.setVisible(True)
|
||||||
|
|
||||||
def update_list(self, app_name=None):
|
def update_list(self, app_name=None):
|
||||||
print(app_name)
|
|
||||||
if app_name:
|
if app_name:
|
||||||
if widgets := self.widgets.get(app_name):
|
if widgets := self.widgets.get(app_name):
|
||||||
|
|
||||||
|
|
|
@ -4,19 +4,19 @@ from PyQt5.QtWidgets import QWidget, QTabWidget
|
||||||
from qtawesome import icon
|
from qtawesome import icon
|
||||||
|
|
||||||
from legendary.models.game import Game
|
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_dlc import GameDlc
|
||||||
from rare.components.tabs.games.game_info.game_info import GameInfo
|
from rare.components.tabs.games.game_info.game_info import GameInfo
|
||||||
from rare.components.tabs.games.game_info.game_settings import GameSettings
|
from rare.components.tabs.games.game_info.game_settings import GameSettings
|
||||||
from rare.utils.extra_widgets import SideTabBar
|
from rare.utils.extra_widgets import SideTabBar
|
||||||
from rare.utils.models import Signals
|
|
||||||
|
|
||||||
|
|
||||||
class InfoTabs(QTabWidget):
|
class InfoTabs(QTabWidget):
|
||||||
def __init__(self, core, signals: Signals, parent):
|
def __init__(self, dlcs: list, parent):
|
||||||
super(InfoTabs, self).__init__(parent=parent)
|
super(InfoTabs, self).__init__(parent=parent)
|
||||||
self.app_name = ""
|
self.app_name = ""
|
||||||
self.core = core
|
self.core = shared.legendary_core
|
||||||
self.signals = signals
|
self.signals = shared.signals
|
||||||
self.setTabBar(SideTabBar())
|
self.setTabBar(SideTabBar())
|
||||||
self.setTabPosition(QTabWidget.West)
|
self.setTabPosition(QTabWidget.West)
|
||||||
|
|
||||||
|
@ -26,11 +26,12 @@ class InfoTabs(QTabWidget):
|
||||||
self.info = GameInfo(self.core, self.signals, self)
|
self.info = GameInfo(self.core, self.signals, self)
|
||||||
self.addTab(self.info, self.tr("Information"))
|
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.addTab(self.settings, self.tr("Settings"))
|
||||||
self.tabBar().setCurrentIndex(1)
|
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"))
|
self.addTab(self.dlc, self.tr("Downloadable Content"))
|
||||||
|
|
||||||
def update_game(self, game: Game, dlcs: list):
|
def update_game(self, game: Game, dlcs: list):
|
||||||
|
@ -39,14 +40,11 @@ class InfoTabs(QTabWidget):
|
||||||
self.settings.update_game(game)
|
self.settings.update_game(game)
|
||||||
|
|
||||||
# DLC Tab: Disable if no dlcs available
|
# DLC Tab: Disable if no dlcs available
|
||||||
if dlcs:
|
if len(self.dlc_list[game.asset_info.catalog_item_id]) == 0:
|
||||||
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:
|
|
||||||
self.setTabEnabled(3, False)
|
self.setTabEnabled(3, False)
|
||||||
|
else:
|
||||||
|
self.setTabEnabled(3, True)
|
||||||
|
self.dlc.update_dlcs(game.app_name)
|
||||||
|
|
||||||
def keyPressEvent(self, e: QKeyEvent):
|
def keyPressEvent(self, e: QKeyEvent):
|
||||||
if e.key() == Qt.Key_Escape:
|
if e.key() == Qt.Key_Escape:
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
from PyQt5.QtCore import pyqtSignal
|
from PyQt5.QtCore import pyqtSignal
|
||||||
from PyQt5.QtWidgets import QFrame, QWidget, QMessageBox
|
from PyQt5.QtWidgets import QFrame, QWidget, QMessageBox
|
||||||
|
|
||||||
from legendary.core import LegendaryCore
|
|
||||||
from legendary.models.game import Game
|
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 import Ui_GameDlc
|
||||||
from rare.ui.components.tabs.games.game_info.game_dlc_widget import Ui_GameDlcWidget
|
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
|
from rare.utils.utils import get_pixmap
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,21 +15,22 @@ class GameDlc(QWidget, Ui_GameDlc):
|
||||||
install_dlc = pyqtSignal(str, bool)
|
install_dlc = pyqtSignal(str, bool)
|
||||||
game: Game
|
game: Game
|
||||||
|
|
||||||
def __init__(self, core: LegendaryCore, signals: Signals, parent=None):
|
def __init__(self, dlcs: list, parent=None):
|
||||||
super(GameDlc, self).__init__(parent=parent)
|
super(GameDlc, self).__init__(parent=parent)
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
|
|
||||||
self.available_dlc_scroll.setObjectName("noborder")
|
self.available_dlc_scroll.setObjectName("noborder")
|
||||||
self.installed_dlc_scroll.setObjectName("noborder")
|
self.installed_dlc_scroll.setObjectName("noborder")
|
||||||
|
self.signals = shared.signals
|
||||||
|
self.core = shared.legendary_core
|
||||||
|
|
||||||
self.signals = signals
|
self.dlcs = dlcs
|
||||||
self.core = core
|
|
||||||
self.installed_dlcs = list()
|
|
||||||
self.installed_dlc_widgets = list()
|
self.installed_dlc_widgets = list()
|
||||||
self.available_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)
|
self.game = self.core.get_game(app_name)
|
||||||
|
dlcs = self.dlcs[self.game.asset_info.catalog_item_id]
|
||||||
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
|
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
|
||||||
|
|
||||||
if self.installed_dlc_widgets:
|
if self.installed_dlc_widgets:
|
||||||
|
@ -39,19 +42,19 @@ class GameDlc(QWidget, Ui_GameDlc):
|
||||||
dlc_widget.install.disconnect()
|
dlc_widget.install.disconnect()
|
||||||
dlc_widget.deleteLater()
|
dlc_widget.deleteLater()
|
||||||
self.available_dlc_widgets.clear()
|
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()]
|
if self.core.is_installed(dlc.app_name):
|
||||||
|
|
||||||
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:
|
|
||||||
dlc_widget = GameDlcWidget(dlc, True)
|
dlc_widget = GameDlcWidget(dlc, True)
|
||||||
self.installed_dlc_widgets.append(dlc_widget)
|
|
||||||
self.installed_dlc_contents_layout.addWidget(dlc_widget)
|
self.installed_dlc_contents_layout.addWidget(dlc_widget)
|
||||||
|
dlc_widget.uninstall.connect(self.uninstall)
|
||||||
|
self.installed_dlc_widgets.append(dlc_widget)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
dlc_widget = GameDlcWidget(dlc, False)
|
dlc_widget = GameDlcWidget(dlc, False)
|
||||||
|
self.available_dlc_contents_layout.addWidget(dlc_widget)
|
||||||
dlc_widget.install.connect(self.install)
|
dlc_widget.install.connect(self.install)
|
||||||
self.available_dlc_widgets.append(dlc_widget)
|
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_label.setVisible(not self.installed_dlc_widgets)
|
||||||
self.installed_dlc_scroll.setVisible(bool(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_label.setVisible(not self.available_dlc_widgets)
|
||||||
self.available_dlc_scroll.setVisible(bool(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):
|
def install(self, app_name):
|
||||||
if not self.core.is_installed(self.game.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(
|
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):
|
class GameDlcWidget(QFrame, Ui_GameDlcWidget):
|
||||||
install = pyqtSignal(str) # Appname
|
install = pyqtSignal(str) # Appname
|
||||||
|
uninstall = pyqtSignal(Game)
|
||||||
|
|
||||||
def __init__(self, dlc: Game, installed: bool, parent=None):
|
def __init__(self, dlc: Game, installed: bool, parent=None):
|
||||||
super(GameDlcWidget, self).__init__(parent=parent)
|
super(GameDlcWidget, self).__init__(parent=parent)
|
||||||
|
@ -84,12 +95,18 @@ class GameDlcWidget(QFrame, Ui_GameDlcWidget):
|
||||||
self.version.setText(dlc.app_version)
|
self.version.setText(dlc.app_version)
|
||||||
self.app_name.setText(dlc.app_name)
|
self.app_name.setText(dlc.app_name)
|
||||||
|
|
||||||
if not installed:
|
if installed:
|
||||||
self.install_button.clicked.connect(lambda: self.install.emit(dlc.app_name))
|
self.install_button.clicked.connect(self.uninstall_dlc)
|
||||||
self.status.setText(self.tr("Not installed"))
|
self.status.setText(self.tr("Installed"))
|
||||||
|
self.install_button.setText("Uninstall")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.status.setText(self.tr("Installed. Uninstalling DLCs is not supported"))
|
self.install_button.clicked.connect(self.install_game)
|
||||||
self.install_button.setVisible(not installed)
|
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):
|
def install_game(self):
|
||||||
self.install_button.setDisabled(True)
|
self.install_button.setDisabled(True)
|
||||||
|
|
Loading…
Reference in a new issue