import pyqtgraph as pg
import os
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.Qt as Qt
import PyQt5
[docs]class FractionSelectionBar( QtGui.QWidget ):
fractionChanged = QtCore.pyqtSignal(float)
def __init__( self, initial_fraction=1., parent=None ):
super(FractionSelectionBar, self).__init__( parent=parent )
self._fraction = initial_fraction
self._lmbDown = False
[docs] def fraction( self ):
return self._fraction
[docs] def setFraction( self, value ):
if value == self._fraction:
return
if(value < 0.):
value = 0.
warnings.warn("FractionSelectionBar.setFraction(): value has to be between 0. and 1. (was %s); setting to 0." % str(value))
if(value > 1.):
value = 1.
warnings.warn("FractionSelectionBar.setFraction(): value has to be between 0. and 1. (was %s); setting to 1." % str(value))
self._fraction = float(value)
self.update()
[docs] def mouseMoveEvent(self, event):
if self._lmbDown:
self.setFraction(self._fractionFromPosition( event.localPos() ))
self.fractionChanged.emit(self._fraction)
[docs] def mousePressEvent(self, event):
if event.button() == QtCore.Qt.RightButton:
return
self._lmbDown = True
self.setFraction(self._fractionFromPosition( event.localPos() ))
self.fractionChanged.emit(self._fraction)
[docs] def mouseReleaseEvent(self, event):
self._lmbDown = False
[docs] def paintEvent( self, ev ):
painter = QtGui.QPainter(self)
# calc bar offset
y_offset =(self.height() - self._barHeight()) // 2
## prevent negative offset
y_offset = 0 if y_offset < 0 else y_offset
# frame around fraction indicator
painter.setBrush(self.palette().dark())
painter.save()
## no fill color
b = painter.brush(); b.setStyle(QtCore.Qt.NoBrush); painter.setBrush(b)
painter.drawRect(
QtCore.QRect(QtCore.QPoint(0, y_offset),
QtCore.QSize(self._barWidth(), self._barHeight())))
painter.restore()
# fraction indicator
painter.drawRect(
QtCore.QRect(QtCore.QPoint(0, y_offset),
QtCore.QSize(self._barWidth()*self._fraction, self._barHeight())))
[docs] def sizeHint( self ):
return QtCore.QSize(100, 10)
[docs] def minimumSizeHint( self ):
return QtCore.QSize(1, 3)
def _barWidth( self ):
return self.width()-1
def _barHeight( self ):
return self.height()-1
def _fractionFromPosition( self, pointf ):
frac = float(pointf.x())/ self.width()
# mouse has left the widget
if frac < 0.:
frac = 0.
if frac > 1.:
frac = 1.
return frac