65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Dict, List, Optional
|
|
|
|
from PyQt6.QtCore import Qt, QTimer
|
|
from PyQt6.QtWidgets import QLabel, QHBoxLayout, QWidget
|
|
|
|
|
|
@dataclass
|
|
class TargetDisplay:
|
|
key: str
|
|
label: str
|
|
|
|
|
|
class TargetBar(QWidget):
|
|
"""Zeigt die konfigurierten Ziele als Leiste an und erlaubt visuelles Highlighting."""
|
|
|
|
def __init__(self, parent: Optional[QWidget] = None) -> None:
|
|
super().__init__(parent)
|
|
|
|
self._layout = QHBoxLayout(self)
|
|
self._layout.setContentsMargins(8, 4, 8, 4)
|
|
self._layout.setSpacing(12)
|
|
|
|
self._labels: Dict[str, QLabel] = {}
|
|
|
|
def set_targets(self, targets: List[TargetDisplay]) -> None:
|
|
# Alte Widgets entfernen
|
|
while self._layout.count():
|
|
item = self._layout.takeAt(0)
|
|
w = item.widget()
|
|
if w is not None:
|
|
w.deleteLater()
|
|
self._labels.clear()
|
|
|
|
for t in targets:
|
|
text = t.label or f"Ziel {t.key}"
|
|
lbl = QLabel(text, self)
|
|
lbl.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
lbl.setProperty("targetKey", t.key)
|
|
lbl.setStyleSheet(
|
|
"QLabel { padding: 4px 10px; border-radius: 4px; border: 1px solid #888; }"
|
|
)
|
|
self._layout.addWidget(lbl)
|
|
self._labels[t.key] = lbl
|
|
|
|
self._layout.addStretch(1)
|
|
|
|
def highlight_target(self, key: str, duration_ms: int = 200) -> None:
|
|
lbl = self._labels.get(key)
|
|
if not lbl:
|
|
return
|
|
|
|
original = lbl.styleSheet()
|
|
lbl.setStyleSheet(
|
|
"QLabel { padding: 4px 10px; border-radius: 4px; border: 2px solid #0078d7; "
|
|
"background-color: #e0f0ff; }"
|
|
)
|
|
|
|
def reset() -> None:
|
|
lbl.setStyleSheet(original)
|
|
|
|
QTimer.singleShot(duration_ms, reset)
|