From d1285c8da7f3bd07d42a66f0b3b8c10e0be05d08 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Fri, 24 Jan 2025 17:19:37 +0100 Subject: [PATCH] [timeline] new widget for timeline navigation --- fixtracks/widgets/timeline.py | 93 +++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 fixtracks/widgets/timeline.py diff --git a/fixtracks/widgets/timeline.py b/fixtracks/widgets/timeline.py new file mode 100644 index 0000000..d71dd37 --- /dev/null +++ b/fixtracks/widgets/timeline.py @@ -0,0 +1,93 @@ +import logging +import pathlib +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSlider, QSpinBox + +from fixtracks.utils.signals import TimelineSignals + +class Timeline(QWidget): + signals = TimelineSignals() + + def __init__(self, start=0, stop=100, parent=None): + super().__init__(parent) + self._width = stop//10 + self._slider = QSlider(Qt.Orientation.Horizontal) + self._slider.setRange(start, stop) + self._slider.setTickInterval(int(stop // 10)) + self._slider.sliderReleased.connect(self._on_sliderReleased) + self._slider.valueChanged.connect(self._on_sliderChanged) + + self._widthspinner = QSpinBox() + self._widthspinner.setRange(0, int(stop // 10)) + self._widthspinner.setSingleStep(int(stop // 100)) + self._positionLabel = QLabel("") + font = self._positionLabel.font() + font.setPointSize(9) + self._positionLabel.setFont(font) + self._startlabel = QLabel("0") + self._startlabel.setFont(font) + self._stoplabel = QLabel(str(stop)) + self._stoplabel.setFont(font) + + messagelabel = QLabel("current position:") + messagelabel.setFont(font) + + messagebox = QHBoxLayout() + messagebox.addWidget(self._startlabel) + messagebox.addWidget(messagelabel) + messagebox.addWidget(self._positionLabel) + messagebox.addWidget(self._stoplabel) + + sliderbox = QHBoxLayout() + sliderbox.addWidget(self._startlabel) + sliderbox.addWidget(self._slider) + sliderbox.addWidget(self._stoplabel) + + lyt= QVBoxLayout() + lyt.addLayout(sliderbox) + lyt.addLayout(messagebox) + self.setLayout(lyt) + + def setRange(self, stop, width): + self._slider.setRange(0, stop) + self._width = width + self._stoplabel.setText(str(stop)) + self._slider.setSliderPosition(int(stop // 2)) + + def setWindowWidth(self, newsize): + self._width = newsize + if self._slider.value() < newsize // 2: + self._slider.setSliderPosition(int(newsize // 2)) + elif self.sliderPosition > self._slider.maximum() - self._width //2: + self._slider.setSliderPosition(self._slider.maximum() - self._width //2) + + def _on_sliderReleased(self): + value = self._slider.value() + if value < self._width //2: + self._slider.setSliderPosition(self._width //2) + elif value > self._slider.maximum() - self._width //2: + self._slider.setSliderPosition(self._slider.maximum() - self._width //2) + self.signals.changed.emit(self._slider.sliderPosition()) + + def _on_sliderChanged(self, value): + self._positionLabel.setText(str(self._slider.value())) + + @property + def sliderPosition(self): + return self._slider.value() + +def main(): + from PySide6.QtWidgets import QApplication + + app = QApplication([]) + window = QWidget() + window.setMinimumSize(200, 50) + layout = QVBoxLayout() + timeline = Timeline(0, 100) + layout.addWidget(timeline) + window.setLayout(layout) + window.show() + app.exec() + +if __name__ == "__main__": + main()