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:
parent
a3d09ae288
commit
5ba368a5bf
7 changed files with 41 additions and 23 deletions
|
@ -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__)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue