diff --git a/pyqtgraph/graphicsItems/GradientEditorItem.py b/pyqtgraph/graphicsItems/GradientEditorItem.py index 39d9b610..d00f804f 100644 --- a/pyqtgraph/graphicsItems/GradientEditorItem.py +++ b/pyqtgraph/graphicsItems/GradientEditorItem.py @@ -44,7 +44,10 @@ class TickSliderItem(GraphicsWidget): """**Bases:** :class:`GraphicsWidget ` A rectangular item with tick marks along its length that can (optionally) be moved by the user.""" - + + sigTicksChanged = QtCore.Signal(object) + sigTicksChangeFinished = QtCore.Signal(object) + def __init__(self, orientation='bottom', allowAdd=True, **kargs): """ ============== ================================================================================= @@ -147,7 +150,7 @@ class TickSliderItem(GraphicsWidget): self.translate(self.tickSize/2., 0) - def addTick(self, x, color=None, movable=True): + def addTick(self, x, color=None, movable=True, finish=True): ## public """ Add a tick to the item. @@ -163,12 +166,22 @@ class TickSliderItem(GraphicsWidget): if color is None: color = QtGui.QColor(255,255,255) - tick = Tick(self, [x*self.length, 0], color, movable, self.tickSize, pen=self.tickPen) + tick = Tick([x*self.length, 0], color, movable, self.tickSize, pen=self.tickPen) self.ticks[tick] = x tick.setParentItem(self) + + tick.sigMoving.connect(self.tickMoved) + tick.sigMoved.connect(self.tickMoveFinished) + tick.sigClicked.connect(self.tickClicked) + + self.sigTicksChanged.emit(self) + + if finish: + self.sigTicksChangeFinished.emit(self) + return tick - def removeTick(self, tick): + def removeTick(self, tick, finish=True): ## public """ Removes the specified tick. @@ -177,6 +190,11 @@ class TickSliderItem(GraphicsWidget): tick.setParentItem(None) if self.scene() is not None: self.scene().removeItem(tick) + + self.sigTicksChanged.emit(self) + + if finish: + self.sigTicksChangeFinished.emit(self) def tickMoved(self, tick, pos): #print "tick changed" @@ -185,9 +203,11 @@ class TickSliderItem(GraphicsWidget): pos.setX(newX) tick.setPos(pos) self.ticks[tick] = float(newX) / self.length + + self.sigTicksChanged.emit(self) def tickMoveFinished(self, tick): - pass + self.sigTicksChangeFinished.emit(self) def tickClicked(self, tick, ev): if ev.button() == QtCore.Qt.RightButton: @@ -294,6 +314,9 @@ class TickSliderItem(GraphicsWidget): tick.color = color tick.update() #tick.setBrush(QtGui.QBrush(QtGui.QColor(tick.color))) + + self.sigTicksChanged.emit(self) + self.sigTicksChangeFinished.emit(self) def setTickValue(self, tick, val): ## public @@ -316,7 +339,9 @@ class TickSliderItem(GraphicsWidget): pos.setX(x) tick.setPos(pos) self.ticks[tick] = val - self.updateGradient() + + self.sigTicksChanged.emit(self) + self.sigTicksChangeFinished.emit(self) def tickValue(self, tick): ## public @@ -462,6 +487,9 @@ class GradientEditorItem(TickSliderItem): self.setColorMode('rgb') self.updateGradient() self.linkedGradients = {} + + self.sigTicksChanged.connect(lambda *args, **kwargs: self.updateGradient()) + self.sigTicksChangeFinished.connect(self.sigGradientChangeFinished.emit) def showTicks(self, show=True): for tick in self.ticks.keys(): @@ -529,7 +557,9 @@ class GradientEditorItem(TickSliderItem): self.rgbAction.blockSignals(False) self.hsvAction.blockSignals(False) self.colorMode = cm - self.updateGradient() + + self.sigTicksChanged.emit(self) + self.sigGradientChangeFinished.emit(self) def colorMap(self): """Return a ColorMap object representing the current state of the editor.""" @@ -554,18 +584,16 @@ class GradientEditorItem(TickSliderItem): TickSliderItem.setLength(self, newLen) self.backgroundRect.setRect(1, -self.rectSize, newLen, self.rectSize) self.gradRect.setRect(1, -self.rectSize, newLen, self.rectSize) - self.updateGradient() + self.sigTicksChanged.emit(self) def currentColorChanged(self, color): #private if color.isValid() and self.currentTick is not None: self.setTickColor(self.currentTick, color) - self.updateGradient() def currentColorRejected(self): #private self.setTickColor(self.currentTick, self.currentTickColor) - self.updateGradient() def currentColorAccepted(self): self.sigGradientChangeFinished.emit(self) @@ -588,15 +616,9 @@ class GradientEditorItem(TickSliderItem): def raiseTickContextMenu(self, tick, ev): self.tickMenu = TickMenu(tick, self) self.tickMenu.popup(ev.screenPos().toQPoint()) - - def tickMoved(self, tick, pos): - #private - TickSliderItem.tickMoved(self, tick, pos) - self.updateGradient() def tickMoveFinished(self, tick): self.sigGradientChangeFinished.emit(self) - def getGradient(self): """Return a QLinearGradient object.""" @@ -726,12 +748,6 @@ class GradientEditorItem(TickSliderItem): if c1 != (0,0,0,255) or c2 != (255,255,255,255): return False return True - - - def mouseReleaseEvent(self, ev): - #private - TickSliderItem.mouseReleaseEvent(self, ev) - self.updateGradient() def addTick(self, x, color=None, movable=True, finish=True): """ @@ -746,24 +762,13 @@ class GradientEditorItem(TickSliderItem): ============== ================================================================== """ - if color is None: color = self.getColor(x) - t = TickSliderItem.addTick(self, x, color=color, movable=movable) + t = TickSliderItem.addTick(self, x, color=color, movable=movable, finish=finish) t.colorChangeAllowed = True t.removeAllowed = True - if finish: - self.sigGradientChangeFinished.emit(self) return t - - - def removeTick(self, tick, finish=True): - TickSliderItem.removeTick(self, tick) - if finish: - self.updateGradient() - self.sigGradientChangeFinished.emit(self) - def saveState(self): """ @@ -798,6 +803,10 @@ class GradientEditorItem(TickSliderItem): ============== ==================================================================== """ ## public + + # Mass edit ticks without graphics update + signalsBlocked = self.blockSignals(True) + self.setColorMode(state['mode']) for t in list(self.ticks.keys()): self.removeTick(t, finish=False) @@ -806,10 +815,16 @@ class GradientEditorItem(TickSliderItem): self.addTick(t[0], c, finish=False) self.showTicks( state.get('ticksVisible', next(iter(self.ticks)).isVisible()) ) - self.updateGradient() + + # Close with graphics update + self.blockSignals(signalsBlocked) + self.sigTicksChanged.emit(self) self.sigGradientChangeFinished.emit(self) def setColorMap(self, cm): + # Mass edit ticks without graphics update + signalsBlocked = self.blockSignals(True) + self.setColorMode('rgb') for t in list(self.ticks.keys()): self.removeTick(t, finish=False) @@ -818,7 +833,10 @@ class GradientEditorItem(TickSliderItem): x = cm.pos[i] c = colors[i] self.addTick(x, c, finish=False) - self.updateGradient() + + # Close with graphics update + self.blockSignals(signalsBlocked) + self.sigTicksChanged.emit(self) self.sigGradientChangeFinished.emit(self) def linkGradient(self, slaveGradient, connect=True): @@ -842,13 +860,13 @@ class Tick(QtGui.QGraphicsWidget): ## NOTE: Making this a subclass of GraphicsO # ..GraphicsScene.items(self, *args) will get Tick object as a # class of QtGui.QMultimediaWidgets.QGraphicsVideoItem in python2.7-PyQt5(5.4.0) - sigMoving = QtCore.Signal(object) + sigMoving = QtCore.Signal(object, object) sigMoved = QtCore.Signal(object) + sigClicked = QtCore.Signal(object, object) - def __init__(self, view, pos, color, movable=True, scale=10, pen='w'): + def __init__(self, pos, color, movable=True, scale=10, pen='w'): self.movable = movable self.moving = False - self.view = weakref.ref(view) self.scale = scale self.color = color self.pen = fn.mkPen(pen) @@ -895,23 +913,20 @@ class Tick(QtGui.QGraphicsWidget): ## NOTE: Making this a subclass of GraphicsO newPos.setY(self.pos().y()) self.setPos(newPos) - self.view().tickMoved(self, newPos) - self.sigMoving.emit(self) + self.sigMoving.emit(self, newPos) if ev.isFinish(): self.moving = False self.sigMoved.emit(self) - self.view().tickMoveFinished(self) def mouseClickEvent(self, ev): ev.accept() if ev.button() == QtCore.Qt.RightButton and self.moving: self.setPos(self.startPosition) - self.view().tickMoved(self, self.startPosition) self.moving = False - self.sigMoving.emit(self) + self.sigMoving.emit(self, self.startPosition) self.sigMoved.emit(self) else: - self.view().tickClicked(self, ev) + self.sigClicked.emit(self, ev) def hoverEvent(self, ev): if (not ev.isExit()) and ev.acceptDrags(QtCore.Qt.LeftButton):