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)
|