Delete qrangeslider.py
This commit is contained in:
parent
9ea47189f5
commit
064f4df62f
311
qrangeslider.py
311
qrangeslider.py
@ -1,311 +0,0 @@
|
|||||||
import sys, os
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
||||||
|
|
||||||
__all__ = ['QRangeSlider']
|
|
||||||
|
|
||||||
DEFAULT_CSS = """
|
|
||||||
QRangeSlider * {
|
|
||||||
border: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
QRangeSlider #Head {
|
|
||||||
background: #222;
|
|
||||||
}
|
|
||||||
QRangeSlider #Span {
|
|
||||||
background: #393;
|
|
||||||
}
|
|
||||||
QRangeSlider #Span:active {
|
|
||||||
background: #282;
|
|
||||||
}
|
|
||||||
QRangeSlider #Tail {
|
|
||||||
background: #222;
|
|
||||||
}
|
|
||||||
QRangeSlider > QSplitter::handle {
|
|
||||||
background: #393;
|
|
||||||
}
|
|
||||||
QRangeSlider > QSplitter::handle:vertical {
|
|
||||||
height: 4px;
|
|
||||||
}
|
|
||||||
QRangeSlider > QSplitter::handle:pressed {
|
|
||||||
background: #ca5;
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
def scale(val, src, dst):
|
|
||||||
return int(((val - src[0]) / float(src[1]-src[0])) * (dst[1]-dst[0]) + dst[0])
|
|
||||||
|
|
||||||
|
|
||||||
class Ui_Form(object):
|
|
||||||
def setupUi(self, Form):
|
|
||||||
Form.setObjectName("QRangeSlider")
|
|
||||||
Form.resize(300, 30)
|
|
||||||
Form.setStyleSheet(DEFAULT_CSS)
|
|
||||||
self.gridLayout = QtWidgets.QGridLayout(Form)
|
|
||||||
self.gridLayout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
self.gridLayout.setSpacing(0)
|
|
||||||
self.gridLayout.setObjectName("gridLayout")
|
|
||||||
self._splitter = QtWidgets.QSplitter(Form)
|
|
||||||
self._splitter.setMinimumSize(QtCore.QSize(0, 0))
|
|
||||||
self._splitter.setMaximumSize(QtCore.QSize(16777215, 16777215))
|
|
||||||
self._splitter.setOrientation(QtCore.Qt.Horizontal)
|
|
||||||
self._splitter.setObjectName("splitter")
|
|
||||||
self._head = QtWidgets.QGroupBox(self._splitter)
|
|
||||||
self._head.setTitle("")
|
|
||||||
self._head.setObjectName("Head")
|
|
||||||
self._handle = QtWidgets.QGroupBox(self._splitter)
|
|
||||||
self._handle.setTitle("")
|
|
||||||
self._handle.setObjectName("Span")
|
|
||||||
self._tail = QtWidgets.QGroupBox(self._splitter)
|
|
||||||
self._tail.setTitle("")
|
|
||||||
self._tail.setObjectName("Tail")
|
|
||||||
self.gridLayout.addWidget(self._splitter, 0, 0, 1, 1)
|
|
||||||
self.retranslateUi(Form)
|
|
||||||
QtCore.QMetaObject.connectSlotsByName(Form)
|
|
||||||
|
|
||||||
def retranslateUi(self, Form):
|
|
||||||
_translate = QtCore.QCoreApplication.translate
|
|
||||||
Form.setWindowTitle(_translate("QRangeSlider", "QRangeSlider"))
|
|
||||||
|
|
||||||
|
|
||||||
class Element(QtWidgets.QGroupBox):
|
|
||||||
def __init__(self, parent, main):
|
|
||||||
super(Element, self).__init__(parent)
|
|
||||||
self.main = main
|
|
||||||
|
|
||||||
def setStyleSheet(self, style):
|
|
||||||
self.parent().setStyleSheet(style)
|
|
||||||
|
|
||||||
def textColor(self):
|
|
||||||
return getattr(self, '__textColor', QtGui.QColor(125, 125, 125))
|
|
||||||
|
|
||||||
def setTextColor(self, color):
|
|
||||||
if type(color) == tuple and len(color) == 3:
|
|
||||||
color = QtGui.QColor(color[0], color[1], color[2])
|
|
||||||
elif type(color) == int:
|
|
||||||
color = QtGui.QColor(color, color, color)
|
|
||||||
setattr(self, '__textColor', color)
|
|
||||||
|
|
||||||
def paintEvent(self, event):
|
|
||||||
qp = QtGui.QPainter()
|
|
||||||
qp.begin(self)
|
|
||||||
if self.main.drawValues():
|
|
||||||
self.drawText(event, qp)
|
|
||||||
qp.end()
|
|
||||||
|
|
||||||
|
|
||||||
class Head(Element):
|
|
||||||
def __init__(self, parent, main):
|
|
||||||
super(Head, self).__init__(parent, main)
|
|
||||||
|
|
||||||
def drawText(self, event, qp):
|
|
||||||
qp.setPen(self.textColor())
|
|
||||||
qp.setFont(QtGui.QFont('Arial', 10))
|
|
||||||
qp.drawText(event.rect(), QtCore.Qt.AlignLeft, str(self.main.min()))
|
|
||||||
|
|
||||||
|
|
||||||
class Tail(Element):
|
|
||||||
def __init__(self, parent, main):
|
|
||||||
super(Tail, self).__init__(parent, main)
|
|
||||||
|
|
||||||
def drawText(self, event, qp):
|
|
||||||
qp.setPen(self.textColor())
|
|
||||||
qp.setFont(QtGui.QFont('Arial', 10))
|
|
||||||
qp.drawText(event.rect(), QtCore.Qt.AlignRight, str(self.main.max()))
|
|
||||||
|
|
||||||
|
|
||||||
class Handle(Element):
|
|
||||||
def __init__(self, parent, main):
|
|
||||||
super(Handle, self).__init__(parent, main)
|
|
||||||
|
|
||||||
def drawText(self, event, qp):
|
|
||||||
qp.setPen(self.textColor())
|
|
||||||
qp.setFont(QtGui.QFont('Arial', 10))
|
|
||||||
qp.drawText(event.rect(), QtCore.Qt.AlignLeft, str(self.main.start()))
|
|
||||||
qp.drawText(event.rect(), QtCore.Qt.AlignRight, str(self.main.end()))
|
|
||||||
|
|
||||||
def mouseMoveEvent(self, event):
|
|
||||||
event.accept()
|
|
||||||
mx = event.globalX()
|
|
||||||
_mx = getattr(self, '__mx', None)
|
|
||||||
if not _mx:
|
|
||||||
setattr(self, '__mx', mx)
|
|
||||||
dx = 0
|
|
||||||
else:
|
|
||||||
dx = mx - _mx
|
|
||||||
setattr(self, '__mx', mx)
|
|
||||||
if dx == 0:
|
|
||||||
event.ignore()
|
|
||||||
return
|
|
||||||
elif dx > 0:
|
|
||||||
dx = 1
|
|
||||||
elif dx < 0:
|
|
||||||
dx = -1
|
|
||||||
s = self.main.start() + dx
|
|
||||||
e = self.main.end() + dx
|
|
||||||
if s >= self.main.min() and e <= self.main.max():
|
|
||||||
self.main.setRange(s, e)
|
|
||||||
|
|
||||||
|
|
||||||
class QRangeSlider(QtWidgets.QWidget, Ui_Form):
|
|
||||||
endValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
maxValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
minValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
startValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
minValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
maxValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
startValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
endValueChanged = QtCore.pyqtSignal(int)
|
|
||||||
|
|
||||||
_SPLIT_START = 1
|
|
||||||
_SPLIT_END = 2
|
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
|
||||||
super(QRangeSlider, self).__init__(parent)
|
|
||||||
self.setupUi(self)
|
|
||||||
self.setMouseTracking(False)
|
|
||||||
self._splitter.splitterMoved.connect(self._handleMoveSplitter)
|
|
||||||
self._head_layout = QtWidgets.QHBoxLayout()
|
|
||||||
self._head_layout.setSpacing(0)
|
|
||||||
self._head_layout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
self._head.setLayout(self._head_layout)
|
|
||||||
self.head = Head(self._head, main=self)
|
|
||||||
self._head_layout.addWidget(self.head)
|
|
||||||
self._handle_layout = QtWidgets.QHBoxLayout()
|
|
||||||
self._handle_layout.setSpacing(0)
|
|
||||||
self._handle_layout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
self._handle.setLayout(self._handle_layout)
|
|
||||||
self.handle = Handle(self._handle, main=self)
|
|
||||||
self.handle.setTextColor((150, 255, 150))
|
|
||||||
self._handle_layout.addWidget(self.handle)
|
|
||||||
self._tail_layout = QtWidgets.QHBoxLayout()
|
|
||||||
self._tail_layout.setSpacing(0)
|
|
||||||
self._tail_layout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
self._tail.setLayout(self._tail_layout)
|
|
||||||
self.tail = Tail(self._tail, main=self)
|
|
||||||
self._tail_layout.addWidget(self.tail)
|
|
||||||
self.setMin(0)
|
|
||||||
self.setMax(99)
|
|
||||||
self.setStart(0)
|
|
||||||
self.setEnd(99)
|
|
||||||
self.setDrawValues(True)
|
|
||||||
|
|
||||||
def min(self):
|
|
||||||
return getattr(self, '__min', None)
|
|
||||||
|
|
||||||
def max(self):
|
|
||||||
return getattr(self, '__max', None)
|
|
||||||
|
|
||||||
def setMin(self, value):
|
|
||||||
setattr(self, '__min', value)
|
|
||||||
self.minValueChanged.emit(value)
|
|
||||||
|
|
||||||
def setMax(self, value):
|
|
||||||
setattr(self, '__max', value)
|
|
||||||
self.maxValueChanged.emit(value)
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
return getattr(self, '__start', None)
|
|
||||||
|
|
||||||
def end(self):
|
|
||||||
return getattr(self, '__end', None)
|
|
||||||
|
|
||||||
def _setStart(self, value):
|
|
||||||
setattr(self, '__start', value)
|
|
||||||
self.startValueChanged.emit(value)
|
|
||||||
|
|
||||||
def setStart(self, value):
|
|
||||||
v = self._valueToPos(value)
|
|
||||||
self._splitter.splitterMoved.disconnect()
|
|
||||||
self._splitter.moveSplitter(v, self._SPLIT_START)
|
|
||||||
self._splitter.splitterMoved.connect(self._handleMoveSplitter)
|
|
||||||
self._setStart(value)
|
|
||||||
|
|
||||||
def _setEnd(self, value):
|
|
||||||
setattr(self, '__end', value)
|
|
||||||
self.endValueChanged.emit(value)
|
|
||||||
|
|
||||||
def setEnd(self, value):
|
|
||||||
v = self._valueToPos(value)
|
|
||||||
self._splitter.splitterMoved.disconnect()
|
|
||||||
self._splitter.moveSplitter(v, self._SPLIT_END)
|
|
||||||
self._splitter.splitterMoved.connect(self._handleMoveSplitter)
|
|
||||||
self._setEnd(value)
|
|
||||||
|
|
||||||
def drawValues(self):
|
|
||||||
return getattr(self, '__drawValues', None)
|
|
||||||
|
|
||||||
def setDrawValues(self, draw):
|
|
||||||
setattr(self, '__drawValues', draw)
|
|
||||||
|
|
||||||
def getRange(self):
|
|
||||||
return (self.start(), self.end())
|
|
||||||
|
|
||||||
def setRange(self, start, end):
|
|
||||||
self.setStart(start)
|
|
||||||
self.setEnd(end)
|
|
||||||
|
|
||||||
def keyPressEvent(self, event):
|
|
||||||
key = event.key()
|
|
||||||
if key == QtCore.Qt.Key_Left:
|
|
||||||
s = self.start()-1
|
|
||||||
e = self.end()-1
|
|
||||||
elif key == QtCore.Qt.Key_Right:
|
|
||||||
s = self.start()+1
|
|
||||||
e = self.end()+1
|
|
||||||
else:
|
|
||||||
event.ignore()
|
|
||||||
return
|
|
||||||
event.accept()
|
|
||||||
if s >= self.min() and e <= self.max():
|
|
||||||
self.setRange(s, e)
|
|
||||||
|
|
||||||
def setBackgroundStyle(self, style):
|
|
||||||
self._tail.setStyleSheet(style)
|
|
||||||
self._head.setStyleSheet(style)
|
|
||||||
|
|
||||||
def setSpanStyle(self, style):
|
|
||||||
self._handle.setStyleSheet(style)
|
|
||||||
|
|
||||||
def _valueToPos(self, value):
|
|
||||||
return scale(value, (self.min(), self.max()), (0, self.width()))
|
|
||||||
|
|
||||||
def _posToValue(self, xpos):
|
|
||||||
return scale(xpos, (0, self.width()), (self.min(), self.max()))
|
|
||||||
|
|
||||||
def _handleMoveSplitter(self, xpos, index):
|
|
||||||
hw = self._splitter.handleWidth()
|
|
||||||
def _lockWidth(widget):
|
|
||||||
width = widget.size().width()
|
|
||||||
widget.setMinimumWidth(width)
|
|
||||||
widget.setMaximumWidth(width)
|
|
||||||
def _unlockWidth(widget):
|
|
||||||
widget.setMinimumWidth(0)
|
|
||||||
widget.setMaximumWidth(16777215)
|
|
||||||
v = self._posToValue(xpos)
|
|
||||||
if index == self._SPLIT_START:
|
|
||||||
_lockWidth(self._tail)
|
|
||||||
if v >= self.end():
|
|
||||||
return
|
|
||||||
offset = -20
|
|
||||||
w = xpos + offset
|
|
||||||
self._setStart(v)
|
|
||||||
elif index == self._SPLIT_END:
|
|
||||||
_lockWidth(self._head)
|
|
||||||
if v <= self.start():
|
|
||||||
return
|
|
||||||
offset = -40
|
|
||||||
w = self.width() - xpos + offset
|
|
||||||
self._setEnd(v)
|
|
||||||
_unlockWidth(self._tail)
|
|
||||||
_unlockWidth(self._head)
|
|
||||||
_unlockWidth(self._handle)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
|
|
||||||
app = QtWidgets.QApplication(sys.argv)
|
|
||||||
rs = QRangeSlider()
|
|
||||||
rs.show()
|
|
||||||
rs.setRange(15, 35)
|
|
||||||
rs.setBackgroundStyle('background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #222, stop:1 #333);')
|
|
||||||
rs.handle.setStyleSheet('background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #282, stop:1 #393);')
|
|
||||||
app.exec_()
|
|
Loading…
Reference in New Issue
Block a user