From 5a9fc470761c467f285064d83ebb8f93b168fcf4 Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 29 Sep 2024 17:16:15 +0200 Subject: [PATCH] slider with play button --- src/silx/gui/data/NumpyAxesSelector.py | 4 +- src/silx/gui/widgets/FrameBrowser.py | 73 ++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/silx/gui/data/NumpyAxesSelector.py b/src/silx/gui/data/NumpyAxesSelector.py index d1e5412d5f..54bd11f1a0 100644 --- a/src/silx/gui/data/NumpyAxesSelector.py +++ b/src/silx/gui/data/NumpyAxesSelector.py @@ -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 @@ -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) diff --git a/src/silx/gui/widgets/FrameBrowser.py b/src/silx/gui/widgets/FrameBrowser.py index c03b2a8121..25f7ba2e19 100644 --- a/src/silx/gui/widgets/FrameBrowser.py +++ b/src/silx/gui/widgets/FrameBrowser.py @@ -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")) \ No newline at end of file