1
0
Fork 0
mirror of synced 2024-06-24 01:00:43 +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.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
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_info import GameInfo
from .game_settings import GameSettings
@ -58,7 +58,7 @@ class GameInfoTabs(SideTabWidget):
self.back_clicked.emit()
class GameMetadataView(QTreeView):
class GameMetadataView(QTreeView, SideTabContents):
def __init__(self, parent=None):
super(GameMetadataView, self).__init__(parent=parent)
self.setColumnWidth(0, 300)
@ -69,7 +69,7 @@ class GameMetadataView(QTreeView):
def update_game(self, rgame: RareGame, view):
self.rgame = rgame
self.title.setTitle(self.rgame.app_title)
self.set_title.emit(self.rgame.app_title)
self.model.clear()
try:
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_widget import Ui_GameDlcWidget
from rare.widgets.image_widget import ImageWidget
from rare.widgets.side_tab import SideTabContents
from rare.utils.misc import widget_object_name
@ -71,7 +72,7 @@ class AvailableGameDlcWidget(GameDlcWidget):
self.rdlc.install()
class GameDlc(QToolBox):
class GameDlc(QToolBox, SideTabContents):
def __init__(self, parent=None):
super(GameDlc, self).__init__(parent=parent)
@ -147,7 +148,7 @@ class GameDlc(QToolBox):
def update_dlcs(self, rgame: RareGame):
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():
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.utils.misc import get_size
from rare.widgets.image_widget import ImageWidget
from rare.widgets.side_tab import SideTabContents
from .move_game import MoveGamePopUp, is_game_dir
logger = getLogger("GameInfo")
class GameInfo(QWidget):
class GameInfo(QWidget, SideTabContents):
def __init__(self, parent=None):
super(GameInfo, self).__init__(parent=parent)
self.ui = Ui_GameInfo()
@ -332,7 +333,7 @@ class GameInfo(QWidget):
if isinstance(worker, MoveWorker):
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.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.utils import config_helper
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
logger = getLogger("GameSettings")
class GameSettings(DefaultGameSettings):
class GameSettings(DefaultGameSettings, SideTabContents):
game: Game
igame: InstalledGame
@ -165,7 +166,7 @@ class GameSettings(DefaultGameSettings):
else:
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 self.igame and self.igame.platform == "Mac":
self.linux_settings_widget.setVisible(False)

View file

@ -53,14 +53,13 @@ class IntegrationsWidget(QWidget):
super(IntegrationsWidget, self).__init__(parent=parent)
self.info = QLabel(f"<b>{info}</b>")
layout = QVBoxLayout()
layout = QVBoxLayout(self)
if widget is not None:
layout.addWidget(widget)
layout.addWidget(self.info)
layout.addItem(
QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
)
self.setLayout(layout)
def addWidget(self, widget: QWidget, stretch: int = 0, alignment: Qt.AlignmentFlag = Qt.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):
def __init__(self, parent=None):
super(DebugSettings, self).__init__(parent=parent)
self.setLayout(QVBoxLayout())
layout = QVBoxLayout(self)
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.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.layout().addStretch(1)
layout.addStretch(1)
def raise_exception(self):
raise RuntimeError("Debug Crash")

View file

@ -1,4 +1,5 @@
from logging import getLogger
from typing import Union, Protocol
from PyQt5.QtCore import (
Qt,
@ -17,7 +18,7 @@ from PyQt5.QtWidgets import (
QTabBar,
QTabWidget,
QVBoxLayout,
QScrollArea,
QScrollArea, QLayout,
)
from rare.utils.misc import icon as qta_icon
@ -63,8 +64,24 @@ class SideTabBar(QTabBar):
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):
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)
self.title = QLabel(self)
self.setTitle(title)
@ -77,17 +94,16 @@ class SideTabContainer(QWidget):
if widget.layout():
widget.layout().setAlignment(Qt.AlignTop)
widget.layout().setContentsMargins(0, 0, 3, 0)
widget.title = self.title
widget.title.setTitle = self.setTitle
if hasattr(widget, "set_title"):
widget.set_title.connect(self.setTitle)
self.scrollarea.setMinimumWidth(
widget.sizeHint().width() + self.scrollarea.verticalScrollBar().sizeHint().width()
)
self.scrollarea.setWidget(widget)
layout = QVBoxLayout()
layout = QVBoxLayout(self)
layout.addWidget(self.title)
layout.addWidget(self.scrollarea)
self.setLayout(layout)
def setTitle(self, text: str) -> None:
self.title.setText(f"<h2>{text}</h2>")
@ -104,7 +120,7 @@ class SideTabWidget(QTabWidget):
self.setTabPosition(QTabWidget.West)
if show_back:
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)
@ -113,6 +129,6 @@ class SideTabWidget(QTabWidget):
if not tab:
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)
return super(SideTabWidget, self).addTab(container, a1)