forked from M-Labs/artiq
1
0
Fork 0

scanwidget: add shift-lmb and ctrl-lmb drag modes (1d78c78)

This commit is contained in:
Robert Jördens 2016-03-18 00:07:28 +01:00
parent 33da27a749
commit f816c7d8d8
1 changed files with 50 additions and 29 deletions

View File

@ -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,45 +105,66 @@ class ScanWidget(QtWidgets.QWidget):
if ev.buttons() ^ ev.button(): # buttons changed if ev.buttons() ^ ev.button(): # buttons changed
ev.ignore() ev.ignore()
return return
qfm = QtGui.QFontMetrics(self.font()) if ev.modifiers() & QtCore.Qt.ShiftModifier:
if ev.y() <= 2.5*qfm.lineSpacing(): # axis self._drag = "select"
self._drag = "axis" self.setStart(self._pixelToAxis(ev.x()))
self._offset = ev.x() - self._axisView[0] self.setStop(self._start)
elif abs(self._axisToPixel(self._stop) - elif ev.modifiers() & QtCore.Qt.ControlModifier:
ev.x()) < qfm.lineSpacing()/2: self._drag = "zoom"
self._drag = "stop" self._offset = ev.pos()
self._offset = ev.x() - self._axisToPixel(self._stop) self._rubber = QtWidgets.QRubberBand(
elif abs(self._axisToPixel(self._start) - QtWidgets.QRubberBand.Rectangle, self)
ev.x()) < qfm.lineSpacing()/2: self._rubber.setGeometry(
self._drag = "start" QtCore.QRect(self._offset, QtCore.QSize()))
self._offset = ev.x() - self._axisToPixel(self._start) self._rubber.show()
else: else:
self._drag = "both" qfm = QtGui.QFontMetrics(self.font())
self._offset = (ev.x() - self._axisToPixel(self._start), if ev.y() <= 2.5*qfm.lineSpacing():
ev.x() - self._axisToPixel(self._stop)) self._drag = "axis"
self._offset = ev.x() - self._axisView[0]
# testing should match inverse drawing order for start/stop
elif abs(self._axisToPixel(self._stop) -
ev.x()) < qfm.lineSpacing()/2:
self._drag = "stop"
self._offset = ev.x() - self._axisToPixel(self._stop)
elif abs(self._axisToPixel(self._start) -
ev.x()) < qfm.lineSpacing()/2:
self._drag = "start"
self._offset = ev.x() - self._axisToPixel(self._start)
else:
self._drag = "both"
self._offset = (ev.x() - self._axisToPixel(self._start),
ev.x() - self._axisToPixel(self._stop))
def mouseMoveEvent(self, ev): def mouseMoveEvent(self, ev):
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):