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