Line data Source code
1 : # SPDX-FileCopyrightText: 2025 PairInteraction Developers 2 : # SPDX-License-Identifier: LGPL-3.0-or-later 3 1 : from __future__ import annotations 4 : 5 1 : import logging 6 1 : from typing import TYPE_CHECKING, Generic, TypeVar 7 : 8 1 : from PySide6.QtWidgets import QStackedWidget, QWidget 9 : 10 : if TYPE_CHECKING: 11 : from collections.abc import ItemsView 12 : 13 1 : logger = logging.getLogger(__name__) 14 : 15 : 16 1 : WidgetType = TypeVar("WidgetType", bound=QWidget) 17 : 18 : 19 1 : class NamedStackedWidget(QStackedWidget, Generic[WidgetType]): 20 1 : def __init__(self, parent: QWidget | None = None) -> None: 21 1 : super().__init__(parent) 22 1 : self._widgets: dict[str, WidgetType] = {} 23 : 24 1 : def addNamedWidget(self, widget: WidgetType, name: str) -> None: 25 1 : widget.setObjectName(name) 26 1 : self.addWidget(widget) 27 1 : self._widgets[name] = widget 28 : 29 1 : def setCurrentNamedWidget(self, name: str) -> None: 30 1 : widget = self.getNamedWidget(name) 31 1 : current_widget = self.currentWidget() 32 1 : if widget == current_widget: 33 1 : return 34 1 : self.setCurrentWidget(widget) 35 1 : logger.debug("Switched NamedStackedWidget to %s", name) 36 : 37 1 : def getNamedWidget(self, name: str) -> WidgetType: 38 1 : return self._widgets[name] 39 : 40 1 : def items(self) -> ItemsView[str, WidgetType]: 41 1 : return self._widgets.items() 42 : 43 1 : def currentWidget(self) -> WidgetType: 44 1 : return super().currentWidget() # type: ignore [return-value] # explicitly override type hints 45 : 46 1 : def addWidget(self, widget: WidgetType) -> int: # type: ignore [override] # explicitly override type hints 47 1 : return super().addWidget(widget)