Skip to content

Commit 049bd11

Browse files
committedMar 28, 2016
scanwidget: handle min, max, suffix (closes #352)
1 parent 1d8b0d4 commit 049bd11

File tree

2 files changed

+54
-14
lines changed

2 files changed

+54
-14
lines changed
 

‎artiq/gui/entries.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -139,20 +139,20 @@ def __init__(self, procdesc, state):
139139

140140
scale = procdesc["scale"]
141141

142-
def apply_properties(spinbox):
143-
spinbox.setDecimals(procdesc["ndecimals"])
142+
def apply_properties(widget):
143+
widget.setDecimals(procdesc["ndecimals"])
144144
if procdesc["global_min"] is not None:
145-
spinbox.setMinimum(procdesc["global_min"]/scale)
145+
widget.setMinimum(procdesc["global_min"]/scale)
146146
else:
147-
spinbox.setMinimum(float("-inf"))
147+
widget.setMinimum(float("-inf"))
148148
if procdesc["global_max"] is not None:
149-
spinbox.setMaximum(procdesc["global_max"]/scale)
149+
widget.setMaximum(procdesc["global_max"]/scale)
150150
else:
151-
spinbox.setMaximum(float("inf"))
151+
widget.setMaximum(float("inf"))
152152
if procdesc["global_step"] is not None:
153-
spinbox.setSingleStep(procdesc["global_step"]/scale)
153+
widget.setSingleStep(procdesc["global_step"]/scale)
154154
if procdesc["unit"]:
155-
spinbox.setSuffix(" " + procdesc["unit"])
155+
widget.setSuffix(" " + procdesc["unit"])
156156

157157
scanner = ScanWidget()
158158
disable_scroll_wheel(scanner)
@@ -200,6 +200,7 @@ def update_npoints(value):
200200
scanner.setStop(state["stop"]/scale)
201201
apply_properties(start)
202202
apply_properties(stop)
203+
apply_properties(scanner)
203204

204205

205206
class _ExplicitScan(LayoutWidget):

‎artiq/gui/scanwidget.py

+45-6
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ class ScanWidget(QtWidgets.QWidget):
1414
stopChanged = QtCore.pyqtSignal(float)
1515
numChanged = QtCore.pyqtSignal(int)
1616

17-
def __init__(self, zoomFactor=1.05, zoomMargin=.1, dynamicRange=1e9):
17+
def __init__(self):
1818
QtWidgets.QWidget.__init__(self)
19-
self.zoomMargin = zoomMargin
20-
self.dynamicRange = dynamicRange
21-
self.zoomFactor = zoomFactor
19+
self.zoomMargin = .1
20+
self.zoomFactor = 1.05
21+
self.dynamicRange = 1e9
22+
self.suffix = ""
2223

2324
self.ticker = Ticker()
2425

@@ -40,6 +41,7 @@ def __init__(self, zoomFactor=1.05, zoomMargin=.1, dynamicRange=1e9):
4041
qfm.lineSpacing())
4142

4243
self._start, self._stop, self._num = None, None, None
44+
self._min, self._max = None, None
4345
self._axisView = None
4446
self._offset, self._drag, self._rubber = None, None, None
4547

@@ -68,14 +70,23 @@ def _setViewAxis(self, center, scale):
6870
left = self.width()/2 - center*scale
6971
self._setView(left, scale)
7072

73+
def _clamp(self, v):
74+
if self._min is not None:
75+
v = max(self._min, v)
76+
if self._max is not None:
77+
v = min(self._max, v)
78+
return v
79+
7180
def setStart(self, val):
81+
val = self._clamp(val)
7282
if self._start == val:
7383
return
7484
self._start = val
7585
self.update()
7686
self.startChanged.emit(val)
7787

7888
def setStop(self, val):
89+
val = self._clamp(val)
7990
if self._stop == val:
8091
return
8192
self._stop = val
@@ -89,6 +100,31 @@ def setNum(self, val):
89100
self.update()
90101
self.numChanged.emit(val)
91102

103+
def setMinimum(self, v):
104+
self._min = v
105+
self.setStart(self._start)
106+
self.setStop(self._stop)
107+
108+
def setMaximum(self, v):
109+
self._max = v
110+
self.setStart(self._start)
111+
self.setStop(self._stop)
112+
113+
def setDecimals(self, n):
114+
# TODO
115+
# the axis should always use compressed notation is useful
116+
# do not:
117+
# self.ticker.precision = n
118+
pass
119+
120+
def setSingleStep(self, v):
121+
# TODO
122+
# use this (and maybe decimals) to snap to "nice" values when dragging
123+
pass
124+
125+
def setSuffix(self, v):
126+
self.suffix = v
127+
92128
def viewRange(self):
93129
center = (self._stop + self._start)/2
94130
scale = self.width()*(1 - 2*self.zoomMargin)
@@ -207,8 +243,11 @@ def paintEvent(self, ev):
207243

208244
ticks, prefix, labels = self.ticker(self._pixelToAxis(0),
209245
self._pixelToAxis(self.width()))
210-
painter.drawText(0, 0, prefix)
211-
painter.translate(0, lineSpacing)
246+
rect = QtCore.QRect(0, 0, self.width(), lineSpacing)
247+
painter.drawText(rect, QtCore.Qt.AlignLeft, prefix)
248+
painter.drawText(rect, QtCore.Qt.AlignRight, self.suffix)
249+
250+
painter.translate(0, lineSpacing + ascent)
212251

213252
for t, l in zip(ticks, labels):
214253
t = self._axisToPixel(t)

0 commit comments

Comments
 (0)
Please sign in to comment.