98 lines
3.4 KiB
Python
98 lines
3.4 KiB
Python
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.setTickPosition(self._slider.TickPosition.TicksBelow)
|
|
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))
|
|
self._slider.setTickInterval(self._width)
|
|
|
|
def setWindowWidth(self, newsize):
|
|
self._width = newsize
|
|
self._slider.setTickInterval(self._width)
|
|
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)
|
|
self.signals.changed.emit(self._slider.sliderPosition())
|
|
|
|
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()
|