1
0
Fork 0
mirror of synced 2024-06-24 01:00:43 +12:00

GameDlc: Re-write the form to use a QToolBox instead of two separate QGroupBoxes.

By using a QToolBox, we can better utilize the available space for
long lists of DLCs. `GameDlcWidget` is now responsible for handling
installing and uninstalling the DLC based on RareGame's functionality.

Since `GameUtils` is not used for uninstalling any more, remove it the
arguments of `GameInfoTabs` completely.
This commit is contained in:
loathingKernel 2023-01-26 16:18:32 +02:00
parent 84694a68a8
commit 304ad0388e
8 changed files with 338 additions and 364 deletions

View file

@ -57,7 +57,7 @@ class GamesTab(QStackedWidget):
self.head_bar.goto_eos_ubisoft.connect(self.show_eos_ubisoft)
self.games.layout().addWidget(self.head_bar)
self.game_info_tabs = GameInfoTabs(self.game_utils, self)
self.game_info_tabs = GameInfoTabs(self)
self.game_info_tabs.back_clicked.connect(lambda: self.setCurrentWidget(self.games))
self.addWidget(self.game_info_tabs)
@ -152,8 +152,8 @@ class GamesTab(QStackedWidget):
@pyqtSlot(RareGame)
def show_game_info(self, rgame):
self.game_info_tabs.update_game(rgame)
self.setCurrentWidget(self.game_info_tabs)
self.game_info_tabs.update_game(rgame)
@pyqtSlot()
def update_count_games_label(self):

View file

@ -6,7 +6,6 @@ from PyQt5.QtWidgets import QTreeView
from rare.models.game import RareGame
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
from rare.shared.game_utils import GameUtils
from rare.utils.extra_widgets import SideTabWidget
from rare.utils.json_formatter import QJsonModel
from .game_dlc import GameDlc
@ -15,20 +14,20 @@ from .game_settings import GameSettings
class GameInfoTabs(SideTabWidget):
def __init__(self, game_utils: GameUtils, parent=None):
def __init__(self, parent=None):
super(GameInfoTabs, self).__init__(show_back=True, parent=parent)
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
self.args = ArgumentsSingleton()
self.info = GameInfo(game_utils, self)
self.addTab(self.info, self.tr("Information"))
self.info_tab = GameInfo(self)
self.addTab(self.info_tab, self.tr("Information"))
self.settings = GameSettings(self)
self.addTab(self.settings, self.tr("Settings"))
self.settings_tab = GameSettings(self)
self.addTab(self.settings_tab, self.tr("Settings"))
self.dlc = GameDlc(game_utils, self)
self.addTab(self.dlc, self.tr("Downloadable Content"))
self.dlc_tab = GameDlc(self)
self.addTab(self.dlc_tab, self.tr("Downloadable Content"))
# FIXME: Hiding didn't work, so don't add these tabs in normal mode. Fix this properly later
if self.args.debug:
@ -37,21 +36,23 @@ class GameInfoTabs(SideTabWidget):
self.igame_meta_view = GameMetadataView(self)
self.addTab(self.igame_meta_view, self.tr("InstalledGame Metadata"))
self.tabBar().setCurrentIndex(1)
# self.setCurrentWidget(self.info_tab)
self.setCurrentIndex(1)
def update_game(self, rgame: RareGame):
self.info.update_game(rgame)
self.info_tab.update_game(rgame)
self.settings.load_settings(rgame)
self.settings.setEnabled(rgame.is_installed)
self.settings_tab.load_settings(rgame)
self.settings_tab.setEnabled(rgame.is_installed)
self.dlc.update_dlcs(rgame)
self.dlc.setEnabled(bool(rgame.owned_dlcs))
self.dlc_tab.update_dlcs(rgame)
self.dlc_tab.setEnabled(bool(rgame.owned_dlcs))
if self.args.debug:
self.game_meta_view.update_game(rgame, rgame.game)
self.igame_meta_view.update_game(rgame, rgame.igame)
# self.setCurrentWidget(self.info_tab)
self.setCurrentIndex(1)
def keyPressEvent(self, e: QKeyEvent):

View file

@ -1,22 +1,79 @@
from typing import Optional
from typing import Optional, List
from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QFrame, QWidget, QMessageBox
from PyQt5.QtCore import Qt, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QFrame, QMessageBox, QToolBox
from rare.models.game import RareGame
from rare.models.install import InstallOptionsModel
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
from rare.shared.game_utils import GameUtils
from rare.shared.image_manager import ImageSize
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.widgets.image_widget import ImageWidget
from rare.utils.misc import widget_object_name
class GameDlc(QWidget):
install_dlc = pyqtSignal(str, bool)
class GameDlcWidget(QFrame):
def __init__(self, rgame: RareGame, rdlc: RareGame, parent=None):
super(GameDlcWidget, self).__init__(parent=parent)
self.ui = Ui_GameDlcWidget()
self.ui.setupUi(self)
self.setObjectName(widget_object_name(self, rdlc.app_name))
self.rgame = rgame
self.rdlc = rdlc
def __init__(self, game_utils: GameUtils, parent=None):
self.image = ImageWidget(self)
self.image.setFixedSize(ImageSize.Icon)
self.ui.dlc_layout.insertWidget(0, self.image)
self.ui.dlc_name.setText(rdlc.app_title)
self.ui.version.setText(rdlc.version)
self.ui.app_name.setText(rdlc.app_name)
self.image.setPixmap(rdlc.pixmap)
class InstalledGameDlcWidget(GameDlcWidget):
uninstalled = pyqtSignal(RareGame)
def __init__(self, rgame: RareGame, rdlc: RareGame, parent=None):
super(InstalledGameDlcWidget, self).__init__(rgame=rgame, rdlc=rdlc, parent=parent)
# lk: set object names for CSS properties
self.ui.action_button.setObjectName("UninstallButton")
self.ui.action_button.clicked.connect(self.uninstall_dlc)
self.ui.action_button.setText(self.tr("Uninstall DLC"))
# lk: don't reference `self.rdlc` here because the object has been deleted
rdlc.signals.game.uninstalled.connect(lambda: self.uninstalled.emit(rdlc))
def uninstall_dlc(self):
self.rdlc.uninstall()
class AvailableGameDlcWidget(GameDlcWidget):
installed = pyqtSignal(RareGame)
def __init__(self, rgame: RareGame, rdlc: RareGame, parent=None):
super(AvailableGameDlcWidget, self).__init__(rgame=rgame, rdlc=rdlc, parent=parent)
# lk: set object names for CSS properties
self.ui.action_button.setObjectName("InstallButton")
self.ui.action_button.clicked.connect(self.install_dlc)
self.ui.action_button.setText(self.tr("Install DLC"))
# lk: don't reference `self.rdlc` here because the object has been deleted
rdlc.signals.game.installed.connect(lambda: self.installed.emit(rdlc))
def install_dlc(self):
if not self.rgame.is_installed:
QMessageBox.warning(
self,
self.tr("Error"),
self.tr("Base Game is not installed. Please install {} first").format(self.rgame.app_title),
)
return
self.rdlc.install()
class GameDlc(QToolBox):
def __init__(self, parent=None):
super(GameDlc, self).__init__(parent=parent)
self.ui = Ui_GameDlc()
self.ui.setupUi(self)
@ -24,100 +81,89 @@ class GameDlc(QWidget):
self.signals = GlobalSignalsSingleton()
self.rgame: Optional[RareGame] = None
self.game_utils = game_utils
self.ui.available_dlc_scroll.setFrameStyle(QFrame.NoFrame)
self.ui.installed_dlc_scroll.setFrameStyle(QFrame.NoFrame)
def list_installed(self) -> List[InstalledGameDlcWidget]:
return self.ui.installed_dlc_container.findChildren(InstalledGameDlcWidget, options=Qt.FindDirectChildrenOnly)
self.installed_dlc_widgets = list()
self.available_dlc_widgets = list()
def list_available(self) -> List[AvailableGameDlcWidget]:
return self.ui.available_dlc_container.findChildren(AvailableGameDlcWidget, options=Qt.FindDirectChildrenOnly)
def get_installed(self, app_name: str) -> Optional[InstalledGameDlcWidget]:
return self.ui.installed_dlc_container.findChild(
InstalledGameDlcWidget,
name=widget_object_name(InstalledGameDlcWidget, app_name),
options = Qt.FindDirectChildrenOnly
)
def get_available(self, app_name: str) -> Optional[AvailableGameDlcWidget]:
return self.ui.available_dlc_container.findChild(
AvailableGameDlcWidget,
name=widget_object_name(AvailableGameDlcWidget, app_name),
options=Qt.FindDirectChildrenOnly
)
def update_installed_page(self):
have_installed = bool(self.list_installed())
self.ui.installed_dlc_label.setVisible(not have_installed)
self.ui.installed_dlc_container.setVisible(have_installed)
if not have_installed:
self.setCurrentWidget(self.ui.available_dlc_page)
def update_available_page(self):
have_available = bool(self.list_available())
self.ui.available_dlc_label.setVisible(not have_available)
self.ui.available_dlc_container.setVisible(have_available)
if not have_available:
self.setCurrentWidget(self.ui.installed_dlc_page)
def append_installed(self, rdlc: RareGame):
self.ui.installed_dlc_label.setVisible(False)
self.ui.installed_dlc_container.setVisible(True)
a_widget: AvailableGameDlcWidget = self.get_available(rdlc.app_name)
if a_widget is not None:
self.ui.available_dlc_container.layout().removeWidget(a_widget)
a_widget.deleteLater()
i_widget: InstalledGameDlcWidget = InstalledGameDlcWidget(
self.rgame, rdlc, self.ui.installed_dlc_container
)
i_widget.destroyed.connect(self.update_installed_page)
i_widget.uninstalled.connect(self.append_available)
self.ui.installed_dlc_container.layout().addWidget(i_widget)
def append_available(self, rdlc: RareGame):
self.ui.available_dlc_label.setVisible(False)
self.ui.available_dlc_container.setVisible(True)
i_widget: InstalledGameDlcWidget = self.get_installed(rdlc.app_name)
if i_widget is not None:
self.ui.available_dlc_container.layout().removeWidget(i_widget)
i_widget.deleteLater()
a_widget: AvailableGameDlcWidget = AvailableGameDlcWidget(
self.rgame, rdlc, self.ui.available_dlc_container
)
a_widget.destroyed.connect(self.update_available_page)
a_widget.installed.connect(self.append_installed)
self.ui.available_dlc_container.layout().addWidget(a_widget)
def update_dlcs(self, rgame: RareGame):
self.rgame = rgame
self.title.setTitle(self.rgame.app_title)
if self.installed_dlc_widgets:
for dlc_widget in self.installed_dlc_widgets:
dlc_widget.uninstall.disconnect()
dlc_widget.deleteLater()
self.installed_dlc_widgets.clear()
if self.available_dlc_widgets:
for dlc_widget in self.available_dlc_widgets:
dlc_widget.install.disconnect()
dlc_widget.deleteLater()
self.available_dlc_widgets.clear()
for i_widget in self.list_installed():
self.ui.installed_dlc_container.layout().removeWidget(i_widget)
i_widget.deleteLater()
for a_widget in self.list_available():
self.ui.available_dlc_container.layout().removeWidget(a_widget)
a_widget.deleteLater()
for dlc in sorted(self.rgame.owned_dlcs, key=lambda x: x.app_title):
if dlc.is_installed:
dlc_widget = GameDlcWidget(dlc, True)
self.ui.installed_dlc_contents_layout.addWidget(dlc_widget)
dlc_widget.uninstall.connect(self.uninstall)
self.installed_dlc_widgets.append(dlc_widget)
self.append_installed(rdlc=dlc)
else:
dlc_widget = GameDlcWidget(dlc, False)
self.ui.available_dlc_contents_layout.addWidget(dlc_widget)
dlc_widget.install.connect(self.install)
self.available_dlc_widgets.append(dlc_widget)
self.append_available(rdlc=dlc)
self.ui.installed_dlc_label.setVisible(not self.installed_dlc_widgets)
self.ui.installed_dlc_scroll.setVisible(bool(self.installed_dlc_widgets))
self.ui.available_dlc_label.setVisible(not self.available_dlc_widgets)
self.ui.available_dlc_scroll.setVisible(bool(self.available_dlc_widgets))
@pyqtSlot(RareGame)
def uninstall(self, rgame: RareGame):
if self.game_utils.uninstall_game(rgame.app_name):
self.update_dlcs(self.rgame)
def install(self, app_name):
if not self.core.is_installed(self.rgame.app_name):
QMessageBox.warning(
self,
"Error",
self.tr("Base Game is not installed. Please install {} first").format(self.rgame.app_title),
)
return
self.signals.game.install.emit(InstallOptionsModel(app_name=app_name, update=True))
class GameDlcWidget(QFrame):
install = pyqtSignal(RareGame)
uninstall = pyqtSignal(RareGame)
def __init__(self, dlc: RareGame, installed: bool, parent=None):
super(GameDlcWidget, self).__init__(parent=parent)
self.ui = Ui_GameDlcWidget()
self.ui.setupUi(self)
self.dlc = dlc
self.image = ImageWidget(self)
self.image.setFixedSize(ImageSize.Smaller)
self.ui.dlc_layout.insertWidget(0, self.image)
self.ui.dlc_name.setText(dlc.app_title)
self.ui.version.setText(dlc.version)
self.ui.app_name.setText(dlc.app_name)
self.image.setPixmap(dlc.pixmap)
if installed:
self.ui.action_button.setProperty("uninstall", 1)
self.ui.action_button.clicked.connect(self.uninstall_dlc)
self.ui.action_button.setText(self.tr("Uninstall DLC"))
else:
self.ui.action_button.setProperty("install", 1)
self.ui.action_button.clicked.connect(self.install_game)
self.ui.action_button.setText(self.tr("Install DLC"))
def uninstall_dlc(self):
self.ui.action_button.setDisabled(True)
self.ui.action_button.setText(self.tr("Uninstalling"))
self.uninstall.emit(self.dlc)
def install_game(self):
self.ui.action_button.setDisabled(True)
self.ui.action_button.setText(self.tr("Installing"))
self.install.emit(self.dlc)
if not self.list_available():
self.setCurrentWidget(self.ui.installed_dlc_page)
if not self.list_installed():
self.setCurrentWidget(self.ui.available_dlc_page)

View file

@ -38,16 +38,19 @@ logger = getLogger("GameInfo")
class GameInfo(QWidget):
def __init__(self, game_utils, parent=None):
def __init__(self, parent=None):
super(GameInfo, self).__init__(parent=parent)
self.ui = Ui_GameInfo()
self.ui.setupUi(self)
# lk: set object names for CSS properties
self.ui.install_button.setObjectName("InstallButton")
self.ui.uninstall_button.setObjectName("UninstallButton")
self.rcore = RareCore.instance()
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
self.args = ArgumentsSingleton()
self.image_manager = ImageManagerSingleton()
self.game_utils = game_utils
self.rgame: Optional[RareGame] = None

View file

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/game_dlc.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
@ -14,96 +14,60 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_GameDlc(object):
def setupUi(self, GameDlc):
GameDlc.setObjectName("GameDlc")
GameDlc.resize(287, 354)
self.game_dlc_layout = QtWidgets.QVBoxLayout(GameDlc)
self.game_dlc_layout.setObjectName("game_dlc_layout")
self.installed_dlc_group = QtWidgets.QGroupBox(GameDlc)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.installed_dlc_group.sizePolicy().hasHeightForWidth())
self.installed_dlc_group.setSizePolicy(sizePolicy)
self.installed_dlc_group.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.installed_dlc_group.setObjectName("installed_dlc_group")
self.installed_dlc_group_layout = QtWidgets.QVBoxLayout(self.installed_dlc_group)
self.installed_dlc_group_layout.setObjectName("installed_dlc_group_layout")
self.installed_dlc_label = QtWidgets.QLabel(self.installed_dlc_group)
GameDlc.resize(271, 139)
GameDlc.setWindowTitle("GameDlc")
GameDlc.setFrameShape(QtWidgets.QFrame.StyledPanel)
GameDlc.setFrameShadow(QtWidgets.QFrame.Sunken)
GameDlc.setLineWidth(0)
self.installed_dlc_page = QtWidgets.QWidget()
self.installed_dlc_page.setGeometry(QtCore.QRect(0, 0, 267, 79))
self.installed_dlc_page.setObjectName("installed_dlc_page")
self.installed_dlc_page_layout = QtWidgets.QVBoxLayout(self.installed_dlc_page)
self.installed_dlc_page_layout.setContentsMargins(0, 0, 0, 0)
self.installed_dlc_page_layout.setObjectName("installed_dlc_page_layout")
self.installed_dlc_label = QtWidgets.QLabel(self.installed_dlc_page)
self.installed_dlc_label.setObjectName("installed_dlc_label")
self.installed_dlc_group_layout.addWidget(self.installed_dlc_label)
self.installed_dlc_scroll = QtWidgets.QScrollArea(self.installed_dlc_group)
self.installed_dlc_scroll.setFocusPolicy(QtCore.Qt.WheelFocus)
self.installed_dlc_scroll.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.installed_dlc_scroll.setFrameShadow(QtWidgets.QFrame.Sunken)
self.installed_dlc_scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.installed_dlc_scroll.setWidgetResizable(True)
self.installed_dlc_scroll.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.installed_dlc_scroll.setObjectName("installed_dlc_scroll")
self.installed_dlc_contents = QtWidgets.QWidget()
self.installed_dlc_contents.setGeometry(QtCore.QRect(0, 0, 255, 16))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.installed_dlc_contents.sizePolicy().hasHeightForWidth())
self.installed_dlc_contents.setSizePolicy(sizePolicy)
self.installed_dlc_contents.setObjectName("installed_dlc_contents")
self.installed_dlc_contents_layout = QtWidgets.QVBoxLayout(self.installed_dlc_contents)
self.installed_dlc_contents_layout.setContentsMargins(0, 0, 9, 0)
self.installed_dlc_contents_layout.setObjectName("installed_dlc_contents_layout")
self.installed_dlc_scroll.setWidget(self.installed_dlc_contents)
self.installed_dlc_group_layout.addWidget(self.installed_dlc_scroll)
self.game_dlc_layout.addWidget(self.installed_dlc_group)
self.available_dlc_group = QtWidgets.QGroupBox(GameDlc)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.available_dlc_group.sizePolicy().hasHeightForWidth())
self.available_dlc_group.setSizePolicy(sizePolicy)
self.available_dlc_group.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.available_dlc_group.setObjectName("available_dlc_group")
self.available_dlc_group_layout = QtWidgets.QVBoxLayout(self.available_dlc_group)
self.available_dlc_group_layout.setObjectName("available_dlc_group_layout")
self.available_dlc_label = QtWidgets.QLabel(self.available_dlc_group)
self.installed_dlc_page_layout.addWidget(self.installed_dlc_label, 0, QtCore.Qt.AlignTop)
self.installed_dlc_container = QtWidgets.QWidget(self.installed_dlc_page)
self.installed_dlc_container.setObjectName("installed_dlc_container")
self.installed_dlc_container_layout = QtWidgets.QVBoxLayout(self.installed_dlc_container)
self.installed_dlc_container_layout.setContentsMargins(0, 0, 3, 0)
self.installed_dlc_container_layout.setObjectName("installed_dlc_container_layout")
self.installed_dlc_page_layout.addWidget(self.installed_dlc_container, 0, QtCore.Qt.AlignTop)
self.installed_dlc_page_layout.setStretch(1, 1)
GameDlc.addItem(self.installed_dlc_page, "")
self.available_dlc_page = QtWidgets.QWidget()
self.available_dlc_page.setGeometry(QtCore.QRect(0, 0, 267, 79))
self.available_dlc_page.setObjectName("available_dlc_page")
self.available_dlc_page_layou = QtWidgets.QVBoxLayout(self.available_dlc_page)
self.available_dlc_page_layou.setContentsMargins(0, 0, 0, 0)
self.available_dlc_page_layou.setObjectName("available_dlc_page_layou")
self.available_dlc_label = QtWidgets.QLabel(self.available_dlc_page)
self.available_dlc_label.setObjectName("available_dlc_label")
self.available_dlc_group_layout.addWidget(self.available_dlc_label)
self.available_dlc_scroll = QtWidgets.QScrollArea(self.available_dlc_group)
self.available_dlc_scroll.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.available_dlc_scroll.setFrameShadow(QtWidgets.QFrame.Sunken)
self.available_dlc_scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.available_dlc_scroll.setWidgetResizable(True)
self.available_dlc_scroll.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.available_dlc_scroll.setObjectName("available_dlc_scroll")
self.available_dlc_contents = QtWidgets.QWidget()
self.available_dlc_contents.setGeometry(QtCore.QRect(0, 0, 255, 16))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.available_dlc_contents.sizePolicy().hasHeightForWidth())
self.available_dlc_contents.setSizePolicy(sizePolicy)
self.available_dlc_contents.setObjectName("available_dlc_contents")
self.available_dlc_contents_layout = QtWidgets.QVBoxLayout(self.available_dlc_contents)
self.available_dlc_contents_layout.setContentsMargins(0, 0, 9, 0)
self.available_dlc_contents_layout.setObjectName("available_dlc_contents_layout")
self.available_dlc_scroll.setWidget(self.available_dlc_contents)
self.available_dlc_group_layout.addWidget(self.available_dlc_scroll)
self.game_dlc_layout.addWidget(self.available_dlc_group)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.game_dlc_layout.addItem(spacerItem)
self.available_dlc_page_layou.addWidget(self.available_dlc_label, 0, QtCore.Qt.AlignTop)
self.available_dlc_container = QtWidgets.QWidget(self.available_dlc_page)
self.available_dlc_container.setObjectName("available_dlc_container")
self.available_dlc_container_layout = QtWidgets.QVBoxLayout(self.available_dlc_container)
self.available_dlc_container_layout.setContentsMargins(0, 0, 3, 0)
self.available_dlc_container_layout.setObjectName("available_dlc_container_layout")
self.available_dlc_page_layou.addWidget(self.available_dlc_container, 0, QtCore.Qt.AlignTop)
self.available_dlc_page_layou.setStretch(1, 1)
GameDlc.addItem(self.available_dlc_page, "")
self.retranslateUi(GameDlc)
def retranslateUi(self, GameDlc):
_translate = QtCore.QCoreApplication.translate
GameDlc.setWindowTitle(_translate("GameDlc", "GameDlc"))
self.installed_dlc_group.setTitle(_translate("GameDlc", "Installed DLCs"))
self.installed_dlc_label.setText(_translate("GameDlc", "No Downloadable Content has been installed."))
self.available_dlc_group.setTitle(_translate("GameDlc", "Available DLCs"))
GameDlc.setItemText(GameDlc.indexOf(self.installed_dlc_page), _translate("GameDlc", "Installed DLCs"))
self.available_dlc_label.setText(_translate("GameDlc", "No Downloadable Content is available"))
GameDlc.setItemText(GameDlc.indexOf(self.available_dlc_page), _translate("GameDlc", "Available DLCs"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
GameDlc = QtWidgets.QWidget()
GameDlc = QtWidgets.QToolBox()
ui = Ui_GameDlc()
ui.setupUi(GameDlc)
GameDlc.show()

View file

@ -1,184 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>GameDlc</class>
<widget class="QWidget" name="GameDlc">
<widget class="QToolBox" name="GameDlc">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>287</width>
<height>354</height>
<width>271</width>
<height>139</height>
</rect>
</property>
<property name="windowTitle">
<string>GameDlc</string>
<string notr="true">GameDlc</string>
</property>
<layout class="QVBoxLayout" name="game_dlc_layout">
<item>
<widget class="QGroupBox" name="installed_dlc_group">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Installed DLCs</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<layout class="QVBoxLayout" name="installed_dlc_group_layout">
<item>
<widget class="QLabel" name="installed_dlc_label">
<property name="text">
<string>No Downloadable Content has been installed.</string>
</property>
</widget>
</item>
<item>
<widget class="QScrollArea" name="installed_dlc_scroll">
<property name="focusPolicy">
<enum>Qt::WheelFocus</enum>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<widget class="QWidget" name="installed_dlc_contents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>255</width>
<height>16</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="installed_dlc_contents_layout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="available_dlc_group">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Available DLCs</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<layout class="QVBoxLayout" name="available_dlc_group_layout">
<item>
<widget class="QLabel" name="available_dlc_label">
<property name="text">
<string>No Downloadable Content is available</string>
</property>
</widget>
</item>
<item>
<widget class="QScrollArea" name="available_dlc_scroll">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<widget class="QWidget" name="available_dlc_contents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>255</width>
<height>16</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="available_dlc_contents_layout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="vspacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<widget class="QWidget" name="installed_dlc_page">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>267</width>
<height>79</height>
</rect>
</property>
<attribute name="label">
<string>Installed DLCs</string>
</attribute>
<layout class="QVBoxLayout" name="installed_dlc_page_layout" stretch="0,1">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item alignment="Qt::AlignTop">
<widget class="QLabel" name="installed_dlc_label">
<property name="text">
<string>No Downloadable Content has been installed.</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignTop">
<widget class="QWidget" name="installed_dlc_container" native="true">
<layout class="QVBoxLayout" name="installed_dlc_container_layout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="available_dlc_page">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>267</width>
<height>79</height>
</rect>
</property>
<attribute name="label">
<string>Available DLCs</string>
</attribute>
<layout class="QVBoxLayout" name="available_dlc_page_layou" stretch="0,1">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item alignment="Qt::AlignTop">
<widget class="QLabel" name="available_dlc_label">
<property name="text">
<string>No Downloadable Content is available</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignTop">
<widget class="QWidget" name="available_dlc_container" native="true">
<layout class="QVBoxLayout" name="available_dlc_container_layout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>

View file

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/game_dlc_widget.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_GameDlcWidget(object):
def setupUi(self, GameDlcWidget):
GameDlcWidget.setObjectName("GameDlcWidget")
GameDlcWidget.resize(517, 70)
GameDlcWidget.resize(454, 58)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
@ -24,6 +24,7 @@ class Ui_GameDlcWidget(object):
GameDlcWidget.setFrameShape(QtWidgets.QFrame.StyledPanel)
GameDlcWidget.setFrameShadow(QtWidgets.QFrame.Plain)
self.dlc_layout = QtWidgets.QHBoxLayout(GameDlcWidget)
self.dlc_layout.setContentsMargins(0, 0, 0, 0)
self.dlc_layout.setObjectName("dlc_layout")
self.dlc_info = QtWidgets.QWidget(GameDlcWidget)
self.dlc_info.setObjectName("dlc_info")
@ -98,7 +99,7 @@ class Ui_GameDlcWidget(object):
self.action_button.setStyleSheet("")
self.action_button.setText("Action")
self.action_button.setObjectName("action_button")
self.dlc_layout.addWidget(self.action_button, 0, QtCore.Qt.AlignTop)
self.dlc_layout.addWidget(self.action_button, 0, QtCore.Qt.AlignBottom)
self.dlc_layout.setStretch(1, 1)
self.retranslateUi(GameDlcWidget)

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>517</width>
<height>70</height>
<width>454</width>
<height>58</height>
</rect>
</property>
<property name="sizePolicy">
@ -26,6 +26,18 @@
<enum>QFrame::Plain</enum>
</property>
<layout class="QHBoxLayout" name="dlc_layout" stretch="0,1,0">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="dlc_info" native="true">
<layout class="QFormLayout" name="dlc_info_layout">
@ -165,7 +177,7 @@
</property>
</spacer>
</item>
<item alignment="Qt::AlignTop">
<item alignment="Qt::AlignBottom">
<widget class="QPushButton" name="action_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">