106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
"""
|
|
Toolbar am oberen Rand: Datei-Aktionen, Zoom-Kontrolle, Ansichtsoptionen.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from PySide6.QtWidgets import (
|
|
QToolBar, QLabel, QSlider, QPushButton, QWidget, QHBoxLayout,
|
|
QCheckBox,
|
|
)
|
|
from PySide6.QtCore import Signal, Qt
|
|
|
|
|
|
class MainToolbar(QToolBar):
|
|
open_file_requested = Signal()
|
|
save_file_requested = Signal()
|
|
zoom_to_fit_requested = Signal()
|
|
zoom_value_changed = Signal(float)
|
|
show_original_toggled = Signal(bool)
|
|
show_vectors_toggled = Signal(bool)
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__("Hauptwerkzeugleiste", parent)
|
|
self.setMovable(False)
|
|
self.setStyleSheet("""
|
|
QToolBar {
|
|
background: #1e1e1e;
|
|
border-bottom: 1px solid #333;
|
|
padding: 4px 8px;
|
|
spacing: 8px;
|
|
}
|
|
""")
|
|
self._build()
|
|
|
|
def _build(self):
|
|
btn_style = """
|
|
QPushButton {
|
|
background: #3c3c3c; color: #ddd; border: 1px solid #555;
|
|
border-radius: 3px; padding: 5px 12px; font-size: 12px;
|
|
}
|
|
QPushButton:hover { background: #505050; }
|
|
"""
|
|
|
|
# Datei öffnen
|
|
self.btn_open = QPushButton("PNG laden")
|
|
self.btn_open.setStyleSheet(btn_style)
|
|
self.btn_open.clicked.connect(self.open_file_requested.emit)
|
|
self.addWidget(self.btn_open)
|
|
|
|
# Speichern
|
|
self.btn_save = QPushButton("Speichern")
|
|
self.btn_save.setStyleSheet(btn_style)
|
|
self.btn_save.clicked.connect(self.save_file_requested.emit)
|
|
self.addWidget(self.btn_save)
|
|
|
|
self.addSeparator()
|
|
|
|
# Zoom
|
|
zoom_widget = QWidget()
|
|
zl = QHBoxLayout(zoom_widget)
|
|
zl.setContentsMargins(4, 0, 4, 0)
|
|
zl.setSpacing(6)
|
|
|
|
zl.addWidget(QLabel("Zoom:"))
|
|
|
|
self.zoom_slider = QSlider(Qt.Orientation.Horizontal)
|
|
self.zoom_slider.setRange(10, 3200)
|
|
self.zoom_slider.setValue(100)
|
|
self.zoom_slider.setFixedWidth(150)
|
|
self.zoom_slider.valueChanged.connect(
|
|
lambda v: self.zoom_value_changed.emit(v / 100.0)
|
|
)
|
|
zl.addWidget(self.zoom_slider)
|
|
|
|
self.zoom_label = QLabel("100%")
|
|
self.zoom_label.setFixedWidth(50)
|
|
zl.addWidget(self.zoom_label)
|
|
|
|
self.btn_fit = QPushButton("Einpassen")
|
|
self.btn_fit.setStyleSheet(btn_style)
|
|
self.btn_fit.clicked.connect(self.zoom_to_fit_requested.emit)
|
|
zl.addWidget(self.btn_fit)
|
|
|
|
self.addWidget(zoom_widget)
|
|
|
|
self.addSeparator()
|
|
|
|
# Ansichts-Toggles
|
|
self.chk_original = QCheckBox("Original")
|
|
self.chk_original.setChecked(True)
|
|
self.chk_original.setStyleSheet("color: #ccc;")
|
|
self.chk_original.toggled.connect(self.show_original_toggled.emit)
|
|
self.addWidget(self.chk_original)
|
|
|
|
self.chk_vectors = QCheckBox("Vektoren")
|
|
self.chk_vectors.setChecked(True)
|
|
self.chk_vectors.setStyleSheet("color: #ccc;")
|
|
self.chk_vectors.toggled.connect(self.show_vectors_toggled.emit)
|
|
self.addWidget(self.chk_vectors)
|
|
|
|
def update_zoom_display(self, zoom: float):
|
|
pct = int(zoom * 100)
|
|
self.zoom_label.setText(f"{pct}%")
|
|
self.zoom_slider.blockSignals(True)
|
|
self.zoom_slider.setValue(pct)
|
|
self.zoom_slider.blockSignals(False)
|