aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2018-08-02 12:45:15 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2018-08-02 12:59:39 +0200
commit2c14c1fa2f0f63afd7c63a1648a9f33a0b7e3310 (patch)
tree22cfbbd5c9a354447efb847984fb26f2556f2992
parent660abc1713183c6d0bf96ef36f4a95e4f85427a0 (diff)
parent7bf22bf0c21d13557ec46a67413819ebcabc3df0 (diff)
Merge #13791: gui: Reject dialogs if key escape is pressed
7bf22bf0c21d13557ec46a67413819ebcabc3df0 gui: Reject options dialog when key escape is pressed (João Barbosa) 4a43306a4f643cf0d356d5d5e16913541f1bc893 gui: Reject edit address dialog when key escape is pressed (João Barbosa) f7a553177d4b969956bc04a0140fce34958971f5 gui: Add GUIUtil::ItemDelegate with keyEscapePressed signal (João Barbosa) Pull request description: Currently `EditAddressDialog` and `OptionsDialog` don't close when the escape key is pressed. The `QDataWidgetMapper` instances prevents closing the dialogs because the escape key is used to reset the widgets values. More details and workarounds in https://stackoverflow.com/a/51487847 and http://qtramblings.blogspot.com/2010/10/qdatawidgetmapper-annoyances.html. The adopted solution is different from the above references. It turns out that `QDataWidgetMapper::setItemDelegate` sets the event filter for all mapped widgets. So in this PR the mapper's delegate are changed to a custom `GUIUtil::ItemDelegate` that offers the signal `keyEscapePressed`, which is connected to the `QDialog::reject` slot. Note that the installed event filter lets all events pass, so the current behaviour isn't changed, meaning that widgets values are reset in addition to closing the dialog. Tree-SHA512: 9c961d488480b4ccc3880a11a8f1824b65f77570ee8918c7302c62775a1a73e52ae988a31a55ffff87b4170ddbecf833c2f09b66095c00eb6854a4d43f030f1f
-rw-r--r--src/qt/editaddressdialog.cpp4
-rw-r--r--src/qt/guiutil.cpp11
-rw-r--r--src/qt/guiutil.h13
-rw-r--r--src/qt/optionsdialog.cpp4
4 files changed, 32 insertions, 0 deletions
diff --git a/src/qt/editaddressdialog.cpp b/src/qt/editaddressdialog.cpp
index f26a31158e..6e7520e018 100644
--- a/src/qt/editaddressdialog.cpp
+++ b/src/qt/editaddressdialog.cpp
@@ -39,6 +39,10 @@ EditAddressDialog::EditAddressDialog(Mode _mode, QWidget *parent) :
mapper = new QDataWidgetMapper(this);
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
+
+ GUIUtil::ItemDelegate* delegate = new GUIUtil::ItemDelegate(mapper);
+ connect(delegate, &GUIUtil::ItemDelegate::keyEscapePressed, this, &EditAddressDialog::reject);
+ mapper->setItemDelegate(delegate);
}
EditAddressDialog::~EditAddressDialog()
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index 9dde2c392c..955f5cdfe3 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -49,6 +49,7 @@
#include <QDoubleValidator>
#include <QFileDialog>
#include <QFont>
+#include <QKeyEvent>
#include <QLineEdit>
#include <QSettings>
#include <QTextDocument> // for Qt::mightBeRichText
@@ -927,4 +928,14 @@ void ClickableProgressBar::mouseReleaseEvent(QMouseEvent *event)
Q_EMIT clicked(event->pos());
}
+bool ItemDelegate::eventFilter(QObject *object, QEvent *event)
+{
+ if (event->type() == QEvent::KeyPress) {
+ if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) {
+ Q_EMIT keyEscapePressed();
+ }
+ }
+ return QItemDelegate::eventFilter(object, event);
+}
+
} // namespace GUIUtil
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index 6aa65369fa..5b32f03aaf 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -10,6 +10,7 @@
#include <QEvent>
#include <QHeaderView>
+#include <QItemDelegate>
#include <QMessageBox>
#include <QObject>
#include <QProgressBar>
@@ -232,6 +233,18 @@ namespace GUIUtil
typedef ClickableProgressBar ProgressBar;
+ class ItemDelegate : public QItemDelegate
+ {
+ Q_OBJECT
+ public:
+ ItemDelegate(QObject* parent) : QItemDelegate(parent) {}
+
+ Q_SIGNALS:
+ void keyEscapePressed();
+
+ private:
+ bool eventFilter(QObject *object, QEvent *event);
+ };
} // namespace GUIUtil
#endif // BITCOIN_QT_GUIUTIL_H
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index a57343f036..eea9a882b1 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -115,6 +115,10 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) :
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
mapper->setOrientation(Qt::Vertical);
+ GUIUtil::ItemDelegate* delegate = new GUIUtil::ItemDelegate(mapper);
+ connect(delegate, &GUIUtil::ItemDelegate::keyEscapePressed, this, &OptionsDialog::reject);
+ mapper->setItemDelegate(delegate);
+
/* setup/change UI elements when proxy IPs are invalid/valid */
ui->proxyIp->setCheckValidator(new ProxyAddressValidator(parent));
ui->proxyIpTor->setCheckValidator(new ProxyAddressValidator(parent));