#/*##########################################################################
# Copyright (C) 2004-2014 V.A. Sole, European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
from PyMca5.PyMcaGui import PyMcaQt as qt
icon_first = ["22 22 2 1",
". c None",
"# c #000000",
"......................",
"......................",
".#.................##.",
".#...............####.",
".#.............######.",
".#...........########.",
".#.........##########.",
".#.......############.",
".#.....##############.",
".#...################.",
".#.##################.",
".#.##################.",
".#...################.",
".#.....##############.",
".#.......############.",
".#.........##########.",
".#...........########.",
".#.............######.",
".#...............####.",
".#.................##.",
"......................",
"......................"]
icon_previous = ["22 22 2 1",
". c None",
"# c #000000",
"......................",
"......................",
"...................##.",
".................####.",
"...............######.",
".............########.",
"...........##########.",
".........############.",
".......##############.",
".....################.",
"...##################.",
"...##################.",
".....################.",
".......##############.",
".........############.",
"...........##########.",
".............########.",
"...............######.",
".................####.",
"...................##.",
"......................",
"......................"]
icon_next = ["22 22 2 1",
". c None",
"# c #000000",
"......................",
"......................",
".##...................",
".####.................",
".######...............",
".########.............",
".##########...........",
".############.........",
".##############.......",
".################.....",
".##################...",
".##################...",
".################.....",
".##############.......",
".############.........",
".##########...........",
".########.............",
".######...............",
".####.................",
".##...................",
"......................",
"......................"]
icon_last = ["22 22 2 1",
". c None",
"# c #000000",
"......................",
"......................",
".##.................#.",
".####...............#.",
".######.............#.",
".########...........#.",
".##########.........#.",
".############.......#.",
".##############.....#.",
".################...#.",
".##################.#.",
".##################.#.",
".################...#.",
".##############.....#.",
".############.......#.",
".##########.........#.",
".########...........#.",
".######.............#.",
".####...............#.",
".##.................#.",
"......................",
"......................"]
[docs]class FrameBrowser(qt.QWidget):
sigIndexChanged = qt.pyqtSignal(object)
def __init__(self, parent=None, n=1):
qt.QWidget.__init__(self, parent)
self.mainLayout=qt.QHBoxLayout(self)
self.mainLayout.setContentsMargins(0, 0, 0, 0)
self.mainLayout.setSpacing(0)
self.firstButton = qt.QPushButton(self)
self.firstButton.setIcon(qt.QIcon(qt.QPixmap(icon_first)))
self.previousButton = qt.QPushButton(self)
self.previousButton.setIcon(qt.QIcon(qt.QPixmap(icon_previous)))
self.lineEdit = qt.QLineEdit(self)
self.lineEdit.setFixedWidth(self.lineEdit.fontMetrics().width('%05d' % n))
validator = qt.QIntValidator(1, n, self.lineEdit)
self.lineEdit.setText("1")
self._oldIndex = 0
self.lineEdit.setValidator(validator)
self.label = qt.QLabel(self)
self.label.setText("of %d" % n)
self.nextButton = qt.QPushButton(self)
self.nextButton.setIcon(qt.QIcon(qt.QPixmap(icon_next)))
self.lastButton = qt.QPushButton(self)
self.lastButton.setIcon(qt.QIcon(qt.QPixmap(icon_last)))
self.mainLayout.addWidget(qt.HorizontalSpacer(self))
self.mainLayout.addWidget(self.firstButton)
self.mainLayout.addWidget(self.previousButton)
self.mainLayout.addWidget(self.lineEdit)
self.mainLayout.addWidget(self.label)
self.mainLayout.addWidget(self.nextButton)
self.mainLayout.addWidget(self.lastButton)
self.mainLayout.addWidget(qt.HorizontalSpacer(self))
self.firstButton.clicked.connect(self._firstClicked)
self.previousButton.clicked.connect(self._previousClicked)
self.nextButton.clicked.connect(self._nextClicked)
self.lastButton.clicked.connect(self._lastClicked)
self.lineEdit.editingFinished.connect(self._textChangedSlot)
def _firstClicked(self):
self.lineEdit.setText("%d" % self.lineEdit.validator().bottom())
self._textChangedSlot()
def _previousClicked(self):
if self._oldIndex >= self.lineEdit.validator().bottom():
self.lineEdit.setText("%d" % (self._oldIndex))
self._textChangedSlot()
def _nextClicked(self):
if self._oldIndex < (self.lineEdit.validator().top()-1):
self.lineEdit.setText("%d" % (self._oldIndex+2))
self._textChangedSlot()
def _lastClicked(self):
self.lineEdit.setText("%d" % self.lineEdit.validator().top())
self._textChangedSlot()
def _textChangedSlot(self):
txt = str(self.lineEdit.text())
if not len(txt):
self.lineEdit.setText("%d" % (self._oldIndex+1))
return
newValue = int(txt) - 1
if newValue == self._oldIndex:
return
ddict = {}
ddict["event"] = "indexChanged"
ddict["old"] = self._oldIndex + 1
self._oldIndex = newValue
ddict["new"] = self._oldIndex + 1
self.sigIndexChanged.emit(ddict)
[docs] def setRange(self, first, last):
return self.setLimits(first, last)
[docs] def setLimits(self, first, last):
bottom = min(first, last)
top = max(first, last)
self.lineEdit.validator().setTop(top)
self.lineEdit.validator().setBottom(bottom)
self._oldIndex = bottom - 1
self.lineEdit.setText("%d" % (self._oldIndex + 1))
self.label.setText(" limits = %d, %d" % (bottom, top))
[docs] def setNFrames(self, nframes):
bottom = 1
top = nframes
self.lineEdit.validator().setTop(top)
self.lineEdit.validator().setBottom(bottom)
self._oldIndex = bottom - 1
self.lineEdit.setText("%d" % (self._oldIndex + 1))
self.label.setText(" of %d" % (top))
[docs] def getCurrentIndex(self):
return self._oldIndex + 1
[docs] def setValue(self, value):
self.lineEdit.setText("%d" % value)
self._textChangedSlot()
[docs]class HorizontalSliderWithBrowser(qt.QAbstractSlider):
def __init__(self, *var):
qt.QAbstractSlider.__init__(self, *var)
self.setOrientation(qt.Qt.Horizontal)
self.mainLayout = qt.QHBoxLayout(self)
self.mainLayout.setContentsMargins(0, 0, 0, 0)
self.mainLayout.setSpacing(2)
self._slider = qt.QSlider(self)
self._slider.setOrientation(qt.Qt.Horizontal)
self._browser = FrameBrowser(self)
self.mainLayout.addWidget(self._slider)
self.mainLayout.addWidget(self._browser)
self._slider.valueChanged[int].connect(self._sliderSlot)
self._browser.sigIndexChanged.connect(self._browserSlot)
[docs] def setMinimum(self, value):
self._slider.setMinimum(value)
maximum = self._slider.maximum()
if value == 1:
self._browser.setNFrames(maximum)
else:
self._browser.setRange(value, maximum)
[docs] def setMaximum(self, value):
self._slider.setMaximum(value)
minimum = self._slider.minimum()
if minimum == 1:
self._browser.setNFrames(value)
else:
self._browser.setRange(minimum, value)
[docs] def setRange(self, *var):
self._slider.setRange(*var)
self._browser.setRange(*var)
def _sliderSlot(self, value):
self._browser.setValue(value)
self.valueChanged.emit(value)
def _browserSlot(self, ddict):
self._slider.setValue(ddict['new'])
[docs] def setValue(self, value):
self._slider.setValue(value)
self._browser.setValue(value)
[docs] def value(self):
return self._slider.value()
[docs]def test1(args):
app=qt.QApplication(args)
w=HorizontalSliderWithBrowser()
def slot(ddict):
print(ddict)
w.valueChanged[int].connect(slot)
w.setRange(8, 20)
w.show()
app.exec_()
[docs]def test2(args):
app=qt.QApplication(args)
w=FrameBrowser()
def slot(ddict):
print(ddict)
w.sigIndexChanged.connect(slot)
if len(args) > 1:
w.setLimits(8, 20)
w.show()
app.exec_()
if __name__=="__main__":
import sys
test1(sys.argv)