From c5fd6b2ce7a7ba16c17f69a46574890ab9aeed83 Mon Sep 17 00:00:00 2001 From: Michal Falowski Date: Wed, 5 Dec 2018 16:41:43 +0100 Subject: [PATCH 1/8] Change the way how edit widget is being hide --- lib/taurus/qt/qtgui/input/qwheel.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 48dd9da0e..27d6e6159 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -176,12 +176,19 @@ def setText(self, t): class _NumericEditor(Qt.QLineEdit): """A private editor to be used by QWheelEdit widget""" + focusOut = Qt.pyqtSignal() def __init__(self, parent=None): Qt.QLineEdit.__init__(self, parent) self.setValidator(Qt.QDoubleValidator(self)) self.setFrame(False) + def focusOutEvent(self, event): + self.focusOut.emit() + print event.reason() + + Qt.QLineEdit.focusOutEvent(self, event) + class QWheelEdit(Qt.QFrame): """A widget designed to handle numeric scalar values. It allows interaction @@ -321,7 +328,7 @@ def _build(self): ed = _NumericEditor(self) ed.returnPressed.connect(self.editingFinished) - ed.editingFinished.connect(ed.hide) + ed.focusOut.connect(self.hideEditWidget) rect = Qt.QRect(l.cellRect(1, 0).topLeft(), l.cellRect(1, l.columnCount() - 1).bottomRight()) ed.setGeometry(rect) @@ -770,6 +777,7 @@ def showEditWidget(self): ed.selectAll() ed.setFocus() ed.setVisible(True) + self._editing = True def hideEditWidget(self): """hideEditWidget(self) -> None @@ -778,6 +786,7 @@ def hideEditWidget(self): """ ed = self.getEditWidget() ed.setVisible(False) + self._editing = False self.setFocus() def wheelEvent(self, evt): @@ -803,7 +812,6 @@ def mouseDoubleClickEvent(self, mouse_event): widget when this happens """ self.showEditWidget() - self._editing = True def keyPressEvent(self, key_event): """keyPressEvent(self, key_event) -> None @@ -815,20 +823,16 @@ def keyPressEvent(self, key_event): if k == Qt.Qt.Key_F2: if self._editing: self.hideEditWidget() - self._editing = False else: self.showEditWidget() - self._editing = True return elif k == Qt.Qt.Key_Escape: if self._editing: self.hideEditWidget() - self._editing = False return elif k in (Qt.Qt.Key_Return, Qt.Qt.Key_Enter): if self._editing: self.hideEditWidget() - self._editing = False else: self.returnPressed.emit() From 47236fce302c45ac7c6d16ab50b9ab84f0a79cfc Mon Sep 17 00:00:00 2001 From: Michal Falowski Date: Wed, 5 Dec 2018 16:44:17 +0100 Subject: [PATCH 2/8] Allows to decide if edit widget should hide on focusOut event --- lib/taurus/qt/qtgui/input/qwheel.py | 53 ++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 27d6e6159..5a5b80d69 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -219,6 +219,7 @@ def __init__(self, parent=None): self._maxValue = numpy.finfo('d').max # inf self._editor = None self._editing = False + self._hideEditWidget = True self._showArrowButtons = True self._setDigits(QWheelEdit.DefaultIntDigitCount, QWheelEdit.DefaultDecDigitCount) @@ -511,7 +512,12 @@ def _setValue(self, v): return self._previous_value = self._value self._value = v - self._buildValueStr(v) + + str_value = self._buildValueStr(v) + ed = self.getEditWidget() + if ed is not None: + ed.setText(str_value) + def setWarning(self, msg): """setWarning(self, msg) -> None @@ -849,6 +855,36 @@ def setShowArrowButtons(self, yesno): def resetShowArrowButtons(self): self.setShowArrowButtons(True) + def getHideEditWidget(self): + """getHideEditWidget(self) -> bool + + Gets the info if edition widget should be hidden when 'focusOut' event + occurs. + + @return (bool) + """ + return self._hideEditWidget + + def setHideEditWidget(self, focus_out=True): + """setFocusOut(self, focus_out=True) -> None + + Sets if edition widget should be hidden when 'focusOut' event occurs. + If set to False, edition widget is hidden only when 'F2', 'Esc', + 'Enter' and arrow button are pressed. Default set to True. + + @param[in] focus_out (bool) whether or not to hide edition widget + after 'focusOut' event. + """ + if focus_out and not self._hideEditWidget: + ed = self.getEditWidget() + ed.focusOut.connect(self.hideEditWidget) + self._hideEditWidget = True + elif not focus_out and self._hideEditWidget: + ed = self.getEditWidget() + ed.focusOut.disconnect(self.hideEditWidget) + self._hideEditWidget = False + + #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- # QT properties #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- @@ -897,6 +933,13 @@ def setNAN(): def setNone(): arrowWidget.setValue(None) + + def disableHideEditWidget(): + arrowWidget.setHideEditWidget(False) + + def enableHideEditWidget(): + arrowWidget.setHideEditWidget(True) + a = Qt.QApplication([]) panel = Qt.QWidget() l = Qt.QFormLayout(panel) @@ -908,6 +951,10 @@ def setNone(): resetbutton.setDefault(True) nanbutton = Qt.QPushButton("Set NAN", panel) nonebutton = Qt.QPushButton("Set None", panel) + disablehideeditwidgetbutton = Qt.QPushButton("Show edit widget on " + "FocusOut", panel) + enablehideeditwidgetbutton = Qt.QPushButton("Hide edit widget on " + "FocusOut", panel) showarrowbutton = Qt.QCheckBox("", panel) l.addRow("Value", arrowWidget) @@ -920,6 +967,8 @@ def setNone(): button_layout.addWidget(nanbutton) button_layout.addWidget(nonebutton) button_layout.addWidget(resetbutton) + button_layout.addWidget(disablehideeditwidgetbutton) + button_layout.addWidget(enablehideeditwidgetbutton) isb.setValue(arrowWidget.getIntDigitCount()) dsb.setValue(arrowWidget.getDecDigitCount()) minv.setRange(numpy.finfo('d').min, numpy.finfo('d').max) @@ -933,6 +982,8 @@ def setNone(): showarrowbutton.stateChanged.connect(arrowWidget.setShowArrowButtons) nanbutton.clicked.connect(setNAN) nonebutton.clicked.connect(setNone) + disablehideeditwidgetbutton.clicked.connect(disableHideEditWidget) + enablehideeditwidgetbutton.clicked.connect(enableHideEditWidget) resetbutton.clicked.connect(resetAll) panel.setVisible(True) a.exec_() From aa7a43ff9f497491e93dced806a461f358f95921 Mon Sep 17 00:00:00 2001 From: Michal Falowski Date: Wed, 5 Dec 2018 16:45:06 +0100 Subject: [PATCH 3/8] Hide edit widget if arrow is pressed and widget is not hide on focusOut --- lib/taurus/qt/qtgui/input/qwheel.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 5a5b80d69..8ff64f35d 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -547,8 +547,11 @@ def buttonPressed(self, b): @param[in] b (_ArrowButton) the button which was pressed """ - self._setValue(self.getValue() + b._inc) - self._updateValue() + if self._editing: + self.hideEditWidget() + else: + self._setValue(self.getValue() + b._inc) + self._updateValue() def setDigitCount(self, int_nb, dec_nb): """setDigitCount(self, int_nb, dec_nb) -> None From 02a2e4a204a97eced06e0379c6c38fbef2fa6505 Mon Sep 17 00:00:00 2001 From: Michal Falowski Date: Wed, 5 Dec 2018 16:46:08 +0100 Subject: [PATCH 4/8] Add forward returnPressed signal from edit widget to QWheelEdit widget --- lib/taurus/qt/qtgui/input/qwheel.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 8ff64f35d..f933a4ec1 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -221,6 +221,7 @@ def __init__(self, parent=None): self._editing = False self._hideEditWidget = True self._showArrowButtons = True + self._forwardReturn = False self._setDigits(QWheelEdit.DefaultIntDigitCount, QWheelEdit.DefaultDecDigitCount) self._setValue(0) @@ -887,6 +888,33 @@ def setHideEditWidget(self, focus_out=True): ed.focusOut.disconnect(self.hideEditWidget) self._hideEditWidget = False + def getForwardReturn(self): + """getForwardReturn(self) -> bool + + Gets the info if returnPressed is forwarded. + + @return (bool) + """ + return self._forwardReturn + + def setForwardReturn(self, forward_rtn=False): + """setForwardReturn(self, forward_rtn=False) -> None + + Sets forwarding of returnPressed. If set to True, returnPressed from + edition widget emits returnPressed of 'QWheelEdit' widget. + + @param[in] forward_rtn (bool) whether or not to forward returnPressed + signal + """ + if forward_rtn and not self._forwardReturn: + ed = self.getEditWidget() + ed.returnPressed.connect(self.returnPressed) + self._forwardReturn = True + + elif not forward_rtn and self._forwardReturn: + ed = self.getEditWidget() + ed.returnPressed.disconnect(self.returnPressed) + self._forwardReturn = False #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- # QT properties From 096786d75762a04bd7c6f406587ab583180884fe Mon Sep 17 00:00:00 2001 From: Michal Falowski Date: Thu, 6 Dec 2018 15:57:35 +0100 Subject: [PATCH 5/8] Remove unnecessary print --- lib/taurus/qt/qtgui/input/qwheel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index f933a4ec1..b5fddc374 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -185,7 +185,6 @@ def __init__(self, parent=None): def focusOutEvent(self, event): self.focusOut.emit() - print event.reason() Qt.QLineEdit.focusOutEvent(self, event) From 2dfe15af64eaf97f97d02cf30e66dc3a4c1ed5f9 Mon Sep 17 00:00:00 2001 From: Michal Falowski Date: Wed, 29 May 2019 13:36:36 +0200 Subject: [PATCH 6/8] Rename (get/set)ForwardReturn to (is/set)ReturnForwaded --- lib/taurus/qt/qtgui/input/qwheel.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index b5fddc374..533671b9c 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -887,8 +887,8 @@ def setHideEditWidget(self, focus_out=True): ed.focusOut.disconnect(self.hideEditWidget) self._hideEditWidget = False - def getForwardReturn(self): - """getForwardReturn(self) -> bool + def isReturnForwarded(self): + """isReturnForwarded(self) -> bool Gets the info if returnPressed is forwarded. @@ -896,8 +896,8 @@ def getForwardReturn(self): """ return self._forwardReturn - def setForwardReturn(self, forward_rtn=False): - """setForwardReturn(self, forward_rtn=False) -> None + def setReturnForwarded(self, forward_rtn=False): + """setReturnForwarded(self, forward_rtn=False) -> None Sets forwarding of returnPressed. If set to True, returnPressed from edition widget emits returnPressed of 'QWheelEdit' widget. From f8cbc6ca76ca6b7295c8bbef2346d29fd1d28997 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 22 Jul 2019 21:23:52 +0200 Subject: [PATCH 7/8] Replace focusOut custom signal by editingFinished Refactor QwheelEdit to use editingFinished instead of a custom focusOut event handler and a focusOut signal. --- lib/taurus/qt/qtgui/input/qwheel.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 339000ac8..97b817f91 100644 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -176,18 +176,12 @@ def setText(self, t): class _NumericEditor(Qt.QLineEdit): """A private editor to be used by QWheelEdit widget""" - focusOut = Qt.pyqtSignal() def __init__(self, parent=None): Qt.QLineEdit.__init__(self, parent) self.setValidator(Qt.QDoubleValidator(self)) self.setFrame(False) - def focusOutEvent(self, event): - self.focusOut.emit() - - Qt.QLineEdit.focusOutEvent(self, event) - class QWheelEdit(Qt.QFrame): """A widget designed to handle numeric scalar values. It allows interaction @@ -329,7 +323,7 @@ def _build(self): ed = _NumericEditor(self) ed.returnPressed.connect(self.editingFinished) - ed.focusOut.connect(self.hideEditWidget) + ed.editingFinished.connect(self.hideEditWidget) rect = Qt.QRect(l.cellRect(1, 0).topLeft(), l.cellRect(1, l.columnCount() - 1).bottomRight()) ed.setGeometry(rect) @@ -880,11 +874,11 @@ def setHideEditWidget(self, focus_out=True): """ if focus_out and not self._hideEditWidget: ed = self.getEditWidget() - ed.focusOut.connect(self.hideEditWidget) + ed.editingFinished.connect(self.hideEditWidget) self._hideEditWidget = True elif not focus_out and self._hideEditWidget: ed = self.getEditWidget() - ed.focusOut.disconnect(self.hideEditWidget) + ed.editingFinished.disconnect(self.hideEditWidget) self._hideEditWidget = False def isReturnForwarded(self): From 75ae2e4b04ab103c0748db7c77673efd451aa825 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 22 Jul 2019 21:33:59 +0200 Subject: [PATCH 8/8] (m) Simplify main function Substitute 2 buttons for a checkbox and simplify implementation of demo. --- lib/taurus/qt/qtgui/input/qwheel.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 97b817f91..8b3ac6f0d 100644 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -958,12 +958,6 @@ def setNAN(): def setNone(): arrowWidget.setValue(None) - def disableHideEditWidget(): - arrowWidget.setHideEditWidget(False) - - def enableHideEditWidget(): - arrowWidget.setHideEditWidget(True) - a = Qt.QApplication([]) panel = Qt.QWidget() l = Qt.QFormLayout(panel) @@ -975,10 +969,8 @@ def enableHideEditWidget(): resetbutton.setDefault(True) nanbutton = Qt.QPushButton("Set NAN", panel) nonebutton = Qt.QPushButton("Set None", panel) - disablehideeditwidgetbutton = Qt.QPushButton("Show edit widget on " - "FocusOut", panel) - enablehideeditwidgetbutton = Qt.QPushButton("Hide edit widget on " - "FocusOut", panel) + hideEditCB = Qt.QCheckBox() + hideEditCB.setChecked(True) showarrowbutton = Qt.QCheckBox("", panel) l.addRow("Value", arrowWidget) @@ -987,12 +979,11 @@ def enableHideEditWidget(): l.addRow("Minimum value:", minv) l.addRow("Maximum value:", maxv) l.addRow("Show arrows:", showarrowbutton) + l.addRow("hideEditCB", hideEditCB) l.addRow(button_layout) button_layout.addWidget(nanbutton) button_layout.addWidget(nonebutton) button_layout.addWidget(resetbutton) - button_layout.addWidget(disablehideeditwidgetbutton) - button_layout.addWidget(enablehideeditwidgetbutton) isb.setValue(arrowWidget.getIntDigitCount()) dsb.setValue(arrowWidget.getDecDigitCount()) minv.setRange(numpy.finfo('d').min, numpy.finfo('d').max) @@ -1006,8 +997,7 @@ def enableHideEditWidget(): showarrowbutton.stateChanged.connect(arrowWidget.setShowArrowButtons) nanbutton.clicked.connect(setNAN) nonebutton.clicked.connect(setNone) - disablehideeditwidgetbutton.clicked.connect(disableHideEditWidget) - enablehideeditwidgetbutton.clicked.connect(enableHideEditWidget) + hideEditCB.toggled.connect(arrowWidget.setHideEditWidget) resetbutton.clicked.connect(resetAll) panel.setVisible(True) a.exec_()