diff --git a/artiq/applets/big_number.py b/artiq/applets/big_number.py index b637847ff..d18b4f601 100755 --- a/artiq/applets/big_number.py +++ b/artiq/applets/big_number.py @@ -1,22 +1,72 @@ #!/usr/bin/env python3 -from PyQt5 import QtWidgets - +from PyQt5 import QtWidgets, QtCore, QtGui from artiq.applets.simple import SimpleApplet -class NumberWidget(QtWidgets.QLCDNumber): +class QResponsiveLCDNumber(QtWidgets.QLCDNumber): + doubleClicked = QtCore.pyqtSignal() + + def mouseDoubleClickEvent(self, event): + self.doubleClicked.emit() + + +class QCancellableLineEdit(QtWidgets.QLineEdit): + editCancelled = QtCore.pyqtSignal() + + def keyPressEvent(self, event): + if event.key() == QtCore.Qt.Key_Escape: + self.editCancelled.emit() + else: + super().keyPressEvent(event) + + +class NumberWidget(QtWidgets.QStackedWidget): def __init__(self, args, ctl): - QtWidgets.QLCDNumber.__init__(self) - self.setDigitCount(args.digit_count) + QtWidgets.QStackedWidget.__init__(self) self.dataset_name = args.dataset + self.ctl = ctl + + self.lcd_widget = QResponsiveLCDNumber() + self.lcd_widget.setDigitCount(args.digit_count) + self.lcd_widget.doubleClicked.connect(self.start_edit) + self.addWidget(self.lcd_widget) + + self.edit_widget = QCancellableLineEdit() + self.edit_widget.setValidator(QtGui.QDoubleValidator()) + self.edit_widget.setAlignment(QtCore.Qt.AlignRight) + self.edit_widget.editCancelled.connect(self.cancel_edit) + self.edit_widget.returnPressed.connect(self.confirm_edit) + self.addWidget(self.edit_widget) + + font = QtGui.QFont() + font.setPointSize(60) + self.edit_widget.setFont(font) + + self.setCurrentWidget(self.lcd_widget) + + def start_edit(self): + # QLCDNumber value property contains the value of zero + # if the displayed value is not a number. + self.edit_widget.setText(str(self.lcd_widget.value())) + self.edit_widget.selectAll() + self.edit_widget.setFocus() + self.setCurrentWidget(self.edit_widget) + + def confirm_edit(self): + value = float(self.edit_widget.text()) + self.ctl.set_dataset(self.dataset_name, value) + self.setCurrentWidget(self.lcd_widget) + + def cancel_edit(self): + self.setCurrentWidget(self.lcd_widget) def data_changed(self, data, mods): try: n = float(data[self.dataset_name][1]) except (KeyError, ValueError, TypeError): n = "---" - self.display(n) + self.lcd_widget.display(n) def main():