Skip to content

Commit

Permalink
slider with play button
Browse files Browse the repository at this point in the history
  • Loading branch information
Edgar committed Sep 29, 2024
1 parent 1191989 commit 5a9fc47
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/silx/gui/data/NumpyAxesSelector.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
import logging
import numpy
import functools
from silx.gui.widgets.FrameBrowser import HorizontalSliderWithBrowser
from silx.gui.widgets.FrameBrowser import HorizontalSliderWithBrowserPlay
from silx.gui import qt
from silx.gui.utils import blockSignals
import silx.utils.weakref
Expand Down Expand Up @@ -65,7 +65,7 @@ def __init__(self, parent=None):
self.__label = qt.QLabel(self)
self.__axes = qt.QComboBox(self)
self.__axes.currentIndexChanged[int].connect(self.__axisMappingChanged)
self.__slider = HorizontalSliderWithBrowser(self)
self.__slider = HorizontalSliderWithBrowserPlay(self)
self.__slider.valueChanged[int].connect(self.__sliderValueChanged)
layout = qt.QHBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
Expand Down
73 changes: 73 additions & 0 deletions src/silx/gui/widgets/FrameBrowser.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,3 +312,76 @@ def setValue(self, value):
def value(self):
"""Get selected value"""
return self._slider.value()

class FrameRateWidgetAction(qt.QWidgetAction):
def __init__(self, parent):
super().__init__(parent)
self._build()

def _build(self):
widget = qt.QWidget()
layout = qt.QHBoxLayout()
widget.setLayout(layout)
self.line_edit = qt.QLineEdit()
layout.addWidget(qt.QLabel("FPS:"))
layout.addWidget(self.line_edit)
self.setDefaultWidget(widget)

class PlayButtonContextMenu(qt.QMenu):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._build()

def _build(self):
self.line_edit_action = FrameRateWidgetAction(self)
self.addAction(self.line_edit_action)
self.setFrameRate("10")

def setFrameRate(self, value:str):
self.line_edit_action.line_edit.setText(value)

def getFrameRate(self):
return int(self.line_edit_action.line_edit.text())

class HorizontalSliderWithBrowserPlay(HorizontalSliderWithBrowser):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.__timer = qt.QTimer(self)
self.__timer.timeout.connect(self._updateState)

fontMetric = self.fontMetrics()
iconSize = qt.QSize(fontMetric.height(), fontMetric.height())

self.playButton = qt.QPushButton(self)
self.playButton.setIcon(icons.getQIcon("camera"))
self.playButton.setIconSize(iconSize)
self.mainLayout.addWidget(self.playButton)

self.playButton.clicked.connect(self._playStopSequence)
self.menu = PlayButtonContextMenu(self)

def contextMenuEvent(self, event):
self.menu.exec_(self.mapToGlobal(event.pos()))

def _playStopSequence(self):
if self.__timer.isActive():
self._stopTimer()
else:
self._startTimer()

def _updateState(self):
if self._browser.getValue() < self._browser.getRange()[-1]:
self._browser._nextClicked()
else:
self._stopTimer()

def _startTimer(self):
framerate = self.menu.getFrameRate()
waiting_time_ms = int(1 / framerate * 1e3)
self.__timer.start(waiting_time_ms)
self.playButton.setIcon(icons.getQIcon("close"))

def _stopTimer(self):
self.__timer.stop()
self.playButton.setIcon(icons.getQIcon("camera"))

0 comments on commit 5a9fc47

Please sign in to comment.