[timeline] new widget for timeline navigation

This commit is contained in:
Jan Grewe 2025-01-24 17:19:37 +01:00
parent adb9703f96
commit d1285c8da7

View File

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