1
0
Fork 0
mirror of synced 2024-06-28 11:11:15 +12:00

SideTabContainer: Use a signal to update the title instead of monkeypatching setTitle method into the widget

Widgets that need to implement a title should be of a dual subclass
of any `QWidget` subclass and the `SideTabContents` class which provides
the signal.
This commit is contained in:
loathingKernel 2023-02-21 15:26:19 +02:00
parent a3d09ae288
commit 5ba368a5bf
7 changed files with 41 additions and 23 deletions

View file

@ -7,7 +7,7 @@ from PyQt5.QtWidgets import QTreeView
from rare.models.game import RareGame from rare.models.game import RareGame
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
from rare.utils.json_formatter import QJsonModel from rare.utils.json_formatter import QJsonModel
from rare.widgets.side_tab import SideTabWidget from rare.widgets.side_tab import SideTabWidget, SideTabContents
from .game_dlc import GameDlc from .game_dlc import GameDlc
from .game_info import GameInfo from .game_info import GameInfo
from .game_settings import GameSettings from .game_settings import GameSettings
@ -58,7 +58,7 @@ class GameInfoTabs(SideTabWidget):
self.back_clicked.emit() self.back_clicked.emit()
class GameMetadataView(QTreeView): class GameMetadataView(QTreeView, SideTabContents):
def __init__(self, parent=None): def __init__(self, parent=None):
super(GameMetadataView, self).__init__(parent=parent) super(GameMetadataView, self).__init__(parent=parent)
self.setColumnWidth(0, 300) self.setColumnWidth(0, 300)
@ -69,7 +69,7 @@ class GameMetadataView(QTreeView):
def update_game(self, rgame: RareGame, view): def update_game(self, rgame: RareGame, view):
self.rgame = rgame self.rgame = rgame
self.title.setTitle(self.rgame.app_title) self.set_title.emit(self.rgame.app_title)
self.model.clear() self.model.clear()
try: try:
self.model.load(view.__dict__) self.model.load(view.__dict__)

View file

@ -9,6 +9,7 @@ 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 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.widgets.image_widget import ImageWidget from rare.widgets.image_widget import ImageWidget
from rare.widgets.side_tab import SideTabContents
from rare.utils.misc import widget_object_name from rare.utils.misc import widget_object_name
@ -71,7 +72,7 @@ class AvailableGameDlcWidget(GameDlcWidget):
self.rdlc.install() self.rdlc.install()
class GameDlc(QToolBox): class GameDlc(QToolBox, SideTabContents):
def __init__(self, parent=None): def __init__(self, parent=None):
super(GameDlc, self).__init__(parent=parent) super(GameDlc, self).__init__(parent=parent)
@ -147,7 +148,7 @@ class GameDlc(QToolBox):
def update_dlcs(self, rgame: RareGame): def update_dlcs(self, rgame: RareGame):
self.rgame = rgame self.rgame = rgame
self.title.setTitle(self.rgame.app_title) self.set_title.emit(self.rgame.app_title)
for i_widget in self.list_installed(): for i_widget in self.list_installed():
self.ui.installed_dlc_container.layout().removeWidget(i_widget) self.ui.installed_dlc_container.layout().removeWidget(i_widget)

View file

@ -23,12 +23,13 @@ from rare.shared.workers import VerifyWorker, MoveWorker
from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo
from rare.utils.misc import get_size from rare.utils.misc import get_size
from rare.widgets.image_widget import ImageWidget from rare.widgets.image_widget import ImageWidget
from rare.widgets.side_tab import SideTabContents
from .move_game import MoveGamePopUp, is_game_dir from .move_game import MoveGamePopUp, is_game_dir
logger = getLogger("GameInfo") logger = getLogger("GameInfo")
class GameInfo(QWidget): class GameInfo(QWidget, SideTabContents):
def __init__(self, parent=None): def __init__(self, parent=None):
super(GameInfo, self).__init__(parent=parent) super(GameInfo, self).__init__(parent=parent)
self.ui = Ui_GameInfo() self.ui = Ui_GameInfo()
@ -332,7 +333,7 @@ class GameInfo(QWidget):
if isinstance(worker, MoveWorker): if isinstance(worker, MoveWorker):
worker.signals.progress.connect(self.__on_move_progress) worker.signals.progress.connect(self.__on_move_progress)
self.title.setTitle(rgame.app_title) self.set_title.emit(rgame.app_title)
self.ui.app_name.setText(rgame.app_name) self.ui.app_name.setText(rgame.app_name)
self.ui.dev.setText(rgame.developer) self.ui.dev.setText(rgame.developer)

View file

@ -12,12 +12,13 @@ from rare.models.game import RareGame
from rare.shared.workers.wine_resolver import WineResolver from rare.shared.workers.wine_resolver import WineResolver
from rare.utils import config_helper from rare.utils import config_helper
from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon
from rare.widgets.side_tab import SideTabContents
from rare.utils.misc import icon, get_raw_save_path from rare.utils.misc import icon, get_raw_save_path
logger = getLogger("GameSettings") logger = getLogger("GameSettings")
class GameSettings(DefaultGameSettings): class GameSettings(DefaultGameSettings, SideTabContents):
game: Game game: Game
igame: InstalledGame igame: InstalledGame
@ -165,7 +166,7 @@ class GameSettings(DefaultGameSettings):
else: else:
self.skip_update.setCurrentIndex(0) self.skip_update.setCurrentIndex(0)
self.title.setTitle(self.game.app_title) self.set_title.emit(self.game.app_title)
if platform.system() != "Windows": if platform.system() != "Windows":
if self.igame and self.igame.platform == "Mac": if self.igame and self.igame.platform == "Mac":
self.linux_settings_widget.setVisible(False) self.linux_settings_widget.setVisible(False)

View file

@ -53,14 +53,13 @@ class IntegrationsWidget(QWidget):
super(IntegrationsWidget, self).__init__(parent=parent) super(IntegrationsWidget, self).__init__(parent=parent)
self.info = QLabel(f"<b>{info}</b>") self.info = QLabel(f"<b>{info}</b>")
layout = QVBoxLayout() layout = QVBoxLayout(self)
if widget is not None: if widget is not None:
layout.addWidget(widget) layout.addWidget(widget)
layout.addWidget(self.info) layout.addWidget(self.info)
layout.addItem( layout.addItem(
QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
) )
self.setLayout(layout)
def addWidget(self, widget: QWidget, stretch: int = 0, alignment: Qt.AlignmentFlag = Qt.Alignment()): def addWidget(self, widget: QWidget, stretch: int = 0, alignment: Qt.AlignmentFlag = Qt.Alignment()):
self.layout().insertWidget(self.layout().count() - 2, widget, stretch, alignment) self.layout().insertWidget(self.layout().count() - 2, widget, stretch, alignment)

View file

@ -6,16 +6,16 @@ from rare.shared import GlobalSignalsSingleton
class DebugSettings(QWidget): class DebugSettings(QWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super(DebugSettings, self).__init__(parent=parent) super(DebugSettings, self).__init__(parent=parent)
self.setLayout(QVBoxLayout()) layout = QVBoxLayout(self)
self.raise_runtime_exception_button = QPushButton("Raise Exception") self.raise_runtime_exception_button = QPushButton("Raise Exception")
self.layout().addWidget(self.raise_runtime_exception_button) layout.addWidget(self.raise_runtime_exception_button)
self.raise_runtime_exception_button.clicked.connect(self.raise_exception) self.raise_runtime_exception_button.clicked.connect(self.raise_exception)
self.restart_button = QPushButton("Restart") self.restart_button = QPushButton("Restart")
self.layout().addWidget(self.restart_button) layout.addWidget(self.restart_button)
self.restart_button.clicked.connect(lambda: GlobalSignalsSingleton().application.quit.emit(-133742)) self.restart_button.clicked.connect(lambda: GlobalSignalsSingleton().application.quit.emit(-133742))
self.layout().addStretch(1) layout.addStretch(1)
def raise_exception(self): def raise_exception(self):
raise RuntimeError("Debug Crash") raise RuntimeError("Debug Crash")

View file

@ -1,4 +1,5 @@
from logging import getLogger from logging import getLogger
from typing import Union, Protocol
from PyQt5.QtCore import ( from PyQt5.QtCore import (
Qt, Qt,
@ -17,7 +18,7 @@ from PyQt5.QtWidgets import (
QTabBar, QTabBar,
QTabWidget, QTabWidget,
QVBoxLayout, QVBoxLayout,
QScrollArea, QScrollArea, QLayout,
) )
from rare.utils.misc import icon as qta_icon from rare.utils.misc import icon as qta_icon
@ -63,8 +64,24 @@ class SideTabBar(QTabBar):
painter.restore() painter.restore()
class SideTabContents(object):
# str: title
set_title = pyqtSignal(str)
class SideTabContentsProtocol(Protocol):
def layout(self) -> QLayout:
pass
def set_title(self) -> pyqtSignal:
pass
def sizeHint(self) -> QSize:
pass
class SideTabContainer(QWidget): class SideTabContainer(QWidget):
def __init__(self, widget: QWidget, title: str = "", parent: QWidget = None): def __init__(self, widget: Union[QWidget, SideTabContentsProtocol], title: str = "", parent: QWidget = None):
super(SideTabContainer, self).__init__(parent=parent) super(SideTabContainer, self).__init__(parent=parent)
self.title = QLabel(self) self.title = QLabel(self)
self.setTitle(title) self.setTitle(title)
@ -77,17 +94,16 @@ class SideTabContainer(QWidget):
if widget.layout(): if widget.layout():
widget.layout().setAlignment(Qt.AlignTop) widget.layout().setAlignment(Qt.AlignTop)
widget.layout().setContentsMargins(0, 0, 3, 0) widget.layout().setContentsMargins(0, 0, 3, 0)
widget.title = self.title if hasattr(widget, "set_title"):
widget.title.setTitle = self.setTitle widget.set_title.connect(self.setTitle)
self.scrollarea.setMinimumWidth( self.scrollarea.setMinimumWidth(
widget.sizeHint().width() + self.scrollarea.verticalScrollBar().sizeHint().width() widget.sizeHint().width() + self.scrollarea.verticalScrollBar().sizeHint().width()
) )
self.scrollarea.setWidget(widget) self.scrollarea.setWidget(widget)
layout = QVBoxLayout() layout = QVBoxLayout(self)
layout.addWidget(self.title) layout.addWidget(self.title)
layout.addWidget(self.scrollarea) layout.addWidget(self.scrollarea)
self.setLayout(layout)
def setTitle(self, text: str) -> None: def setTitle(self, text: str) -> None:
self.title.setText(f"<h2>{text}</h2>") self.title.setText(f"<h2>{text}</h2>")
@ -104,7 +120,7 @@ class SideTabWidget(QTabWidget):
self.setTabPosition(QTabWidget.West) self.setTabPosition(QTabWidget.West)
if show_back: if show_back:
super(SideTabWidget, self).addTab( super(SideTabWidget, self).addTab(
QWidget(), qta_icon("mdi.keyboard-backspace", "ei.backward"), self.tr("Back") QWidget(self), qta_icon("mdi.keyboard-backspace", "ei.backward"), self.tr("Back")
) )
self.tabBarClicked.connect(self.back_func) self.tabBarClicked.connect(self.back_func)
@ -113,6 +129,6 @@ class SideTabWidget(QTabWidget):
if not tab: if not tab:
self.back_clicked.emit() self.back_clicked.emit()
def addTab(self, widget: QWidget, a1: str, title: str = "") -> int: def addTab(self, widget: Union[QWidget, SideTabContentsProtocol], a1: str, title: str = "") -> int:
container = SideTabContainer(widget, title, parent=self) container = SideTabContainer(widget, title, parent=self)
return super(SideTabWidget, self).addTab(container, a1) return super(SideTabWidget, self).addTab(container, a1)