forked from M-Labs/artiq
scanwidget: add shift-lmb and ctrl-lmb drag modes (1d78c78)
This commit is contained in:
parent
33da27a749
commit
f816c7d8d8
|
@ -41,7 +41,7 @@ class ScanWidget(QtWidgets.QWidget):
|
||||||
|
|
||||||
self._start, self._stop, self._num = None, None, None
|
self._start, self._stop, self._num = None, None, None
|
||||||
self._axisView = None
|
self._axisView = None
|
||||||
self._offset, self._drag = None, None
|
self._offset, self._drag, self._rubber = None, None, None
|
||||||
|
|
||||||
def sizeHint(self):
|
def sizeHint(self):
|
||||||
return self.minimumSizeHint()
|
return self.minimumSizeHint()
|
||||||
|
@ -105,10 +105,24 @@ class ScanWidget(QtWidgets.QWidget):
|
||||||
if ev.buttons() ^ ev.button(): # buttons changed
|
if ev.buttons() ^ ev.button(): # buttons changed
|
||||||
ev.ignore()
|
ev.ignore()
|
||||||
return
|
return
|
||||||
|
if ev.modifiers() & QtCore.Qt.ShiftModifier:
|
||||||
|
self._drag = "select"
|
||||||
|
self.setStart(self._pixelToAxis(ev.x()))
|
||||||
|
self.setStop(self._start)
|
||||||
|
elif ev.modifiers() & QtCore.Qt.ControlModifier:
|
||||||
|
self._drag = "zoom"
|
||||||
|
self._offset = ev.pos()
|
||||||
|
self._rubber = QtWidgets.QRubberBand(
|
||||||
|
QtWidgets.QRubberBand.Rectangle, self)
|
||||||
|
self._rubber.setGeometry(
|
||||||
|
QtCore.QRect(self._offset, QtCore.QSize()))
|
||||||
|
self._rubber.show()
|
||||||
|
else:
|
||||||
qfm = QtGui.QFontMetrics(self.font())
|
qfm = QtGui.QFontMetrics(self.font())
|
||||||
if ev.y() <= 2.5*qfm.lineSpacing(): # axis
|
if ev.y() <= 2.5*qfm.lineSpacing():
|
||||||
self._drag = "axis"
|
self._drag = "axis"
|
||||||
self._offset = ev.x() - self._axisView[0]
|
self._offset = ev.x() - self._axisView[0]
|
||||||
|
# testing should match inverse drawing order for start/stop
|
||||||
elif abs(self._axisToPixel(self._stop) -
|
elif abs(self._axisToPixel(self._stop) -
|
||||||
ev.x()) < qfm.lineSpacing()/2:
|
ev.x()) < qfm.lineSpacing()/2:
|
||||||
self._drag = "stop"
|
self._drag = "stop"
|
||||||
|
@ -126,24 +140,31 @@ class ScanWidget(QtWidgets.QWidget):
|
||||||
if not self._drag:
|
if not self._drag:
|
||||||
ev.ignore()
|
ev.ignore()
|
||||||
return
|
return
|
||||||
if self._drag == "axis":
|
if self._drag == "select":
|
||||||
|
self.setStop(self._pixelToAxis(ev.x()))
|
||||||
|
elif self._drag == "zoom":
|
||||||
|
self._rubber.setGeometry(QtCore.QRect(
|
||||||
|
self._offset, ev.pos()).normalized())
|
||||||
|
elif self._drag == "axis":
|
||||||
self._setView(ev.x() - self._offset, self._axisView[1])
|
self._setView(ev.x() - self._offset, self._axisView[1])
|
||||||
elif self._drag == "stop":
|
|
||||||
self._stop = self._pixelToAxis(ev.x() - self._offset)
|
|
||||||
self.update()
|
|
||||||
self.stopChanged.emit(self._stop)
|
|
||||||
elif self._drag == "start":
|
elif self._drag == "start":
|
||||||
self._start = self._pixelToAxis(ev.x() - self._offset)
|
self.setStart(self._pixelToAxis(ev.x() - self._offset))
|
||||||
self.update()
|
elif self._drag == "stop":
|
||||||
self.startChanged.emit(self._start)
|
self.setStop(self._pixelToAxis(ev.x() - self._offset))
|
||||||
elif self._drag == "both":
|
elif self._drag == "both":
|
||||||
self._start = self._pixelToAxis(ev.x() - self._offset[0])
|
self.setStart(self._pixelToAxis(ev.x() - self._offset[0]))
|
||||||
self._stop = self._pixelToAxis(ev.x() - self._offset[1])
|
self.setStop(self._pixelToAxis(ev.x() - self._offset[1]))
|
||||||
self.update()
|
|
||||||
self.startChanged.emit(self._start)
|
|
||||||
self.stopChanged.emit(self._stop)
|
|
||||||
|
|
||||||
def mouseReleaseEvent(self, ev):
|
def mouseReleaseEvent(self, ev):
|
||||||
|
if self._drag == "zoom":
|
||||||
|
self._rubber.hide()
|
||||||
|
left, scale = self._axisView
|
||||||
|
scale *= self.width()/self._rubber.geometry().width()
|
||||||
|
center = self._pixelToAxis(self._rubber.geometry().center().x())
|
||||||
|
if center:
|
||||||
|
scale = min(scale, self.dynamicRange/abs(center))
|
||||||
|
left = self.width()/2 - center*scale
|
||||||
|
self._setView(left, scale)
|
||||||
self._drag = None
|
self._drag = None
|
||||||
|
|
||||||
def _zoom(self, z, x):
|
def _zoom(self, z, x):
|
||||||
|
|
Loading…
Reference in New Issue