Source code for pySimBlocks.gui.widgets.view_navigation_bar
# ******************************************************************************
# pySimBlocks
# Copyright (c) 2026 Université de Lille & INRIA
# ******************************************************************************
from __future__ import annotations
from typing import Callable
from PySide6.QtCore import Qt, Signal
from PySide6.QtGui import QFont
from PySide6.QtWidgets import (
QHBoxLayout,
QLabel,
QPushButton,
QSizePolicy,
QWidget,
)
[docs]
class ViewNavigationBar(QWidget):
"""Breadcrumb bar for diagram / group view navigation."""
navigate_requested = Signal(int)
ROOT_LABEL = "Diagram"
def __init__(
self,
resolve_group_name: Callable[[str], str | None],
parent: QWidget | None = None,
):
super().__init__(parent)
self._resolve_group_name = resolve_group_name
self._view_stack: list[str] = []
self._layout = QHBoxLayout(self)
self._layout.setContentsMargins(6, 4, 6, 4)
self._layout.setSpacing(4)
self._layout.addStretch(1)
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
[docs]
def set_view_stack(self, stack_uids: list[str]) -> None:
"""Rebuild breadcrumb buttons from the current view stack."""
self._view_stack = list(stack_uids)
while self._layout.count():
item = self._layout.takeAt(0)
widget = item.widget()
if widget is not None:
widget.deleteLater()
self._add_segment_button(self.ROOT_LABEL, depth=0, enabled=len(stack_uids) > 0)
for depth, group_uid in enumerate(stack_uids, start=1):
self._layout.addWidget(self._separator())
name = self._resolve_group_name(group_uid) or "Group"
is_current = depth == len(stack_uids)
self._add_segment_button(name, depth=depth, enabled=not is_current)
self._layout.addStretch(1)
def _separator(self) -> QLabel:
label = QLabel("›", self)
font = QFont(label.font())
if font.pointSize() > 0:
font.setPointSize(font.pointSize() + 2)
font.setBold(True)
label.setFont(font)
label.setStyleSheet("color: palette(windowText); padding: 0 4px;")
label.setAlignment(Qt.AlignCenter)
return label
def _add_segment_button(self, text: str, depth: int, enabled: bool) -> None:
button = QPushButton(text, self)
button.setFlat(True)
button.setCursor(Qt.PointingHandCursor if enabled else Qt.ArrowCursor)
button.setEnabled(enabled)
if not enabled:
font = button.font()
font.setBold(True)
button.setFont(font)
if enabled:
button.clicked.connect(lambda _checked=False, d=depth: self.navigate_requested.emit(d))
self._layout.addWidget(button)