[timeline] new widget for timeline navigation
This commit is contained in:
parent
adb9703f96
commit
d1285c8da7
93
fixtracks/widgets/timeline.py
Normal file
93
fixtracks/widgets/timeline.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user