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