From f6f5182bc31cd1a81630f67729b9b6c327884939 Mon Sep 17 00:00:00 2001 From: 0penBrain <48731257+0penBrain@users.noreply.github.com> Date: Sat, 13 Jun 2020 16:19:32 +0200 Subject: [PATCH] Gui : susbtitute dot with local decimal separator for spin boxes Main goal is to improve user-friendlyness for several locales Substitution of dot is performed : * Always if dot is neither decimal nor group/thousand separator of current locale * Only on NUMPAD dot if dot is not decimal but is group separator of current locale --- src/Gui/Application.cpp | 6 ++++++ src/Gui/GuiApplication.cpp | 26 ++++++++++++++++++++++++++ src/Gui/GuiApplication.h | 9 +++++++++ 3 files changed, 41 insertions(+) diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index 6af9e09da9..be017ae1cc 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -2080,6 +2080,12 @@ void Application::runApplication(void) WheelEventFilter* filter = new WheelEventFilter(&mainApp); mainApp.installEventFilter(filter); } + + //filter keyboard events to substitute decimal separator + if (hGrp->GetBool("SubstituteDecimalSeparator", false)) { + KeyboardFilter* filter = new KeyboardFilter(&mainApp); + mainApp.installEventFilter(filter); + } #if defined(HAVE_QT5_OPENGL) { diff --git a/src/Gui/GuiApplication.cpp b/src/Gui/GuiApplication.cpp index 2431a5f76d..b254658000 100644 --- a/src/Gui/GuiApplication.cpp +++ b/src/Gui/GuiApplication.cpp @@ -26,12 +26,14 @@ #ifndef _PreComp_ # include # include +# include # include # include # include # include # include # include +# include # include # include #endif @@ -323,5 +325,29 @@ bool WheelEventFilter::eventFilter(QObject* obj, QEvent* ev) return false; } +KeyboardFilter::KeyboardFilter(QObject* parent) + : QObject(parent) +{ +} + +bool KeyboardFilter::eventFilter(QObject* obj, QEvent* ev) +{ + if (ev->type() == QEvent::KeyPress || ev->type() == QEvent::KeyRelease) { + QKeyEvent *kev = static_cast(ev); + QAbstractSpinBox *target = dynamic_cast(obj); + if (kev->key() == Qt::Key_Period && target) + { + QChar decimalPoint = QLocale().decimalPoint(); + QChar groupSeparator = QLocale().groupSeparator(); + if (decimalPoint != Qt::Key_Period && (groupSeparator != Qt::Key_Period || (kev->modifiers() & Qt::KeypadModifier))) { + QKeyEvent modifiedKeyEvent(kev->type(), decimalPoint.digitValue(), kev->modifiers(), QString(decimalPoint), kev->isAutoRepeat(), kev->count()); + qApp->sendEvent(obj, &modifiedKeyEvent); + return true; + } + } + } + return false; +} + #include "moc_GuiApplication.cpp" diff --git a/src/Gui/GuiApplication.h b/src/Gui/GuiApplication.h index 191148e216..85b7f2cf31 100644 --- a/src/Gui/GuiApplication.h +++ b/src/Gui/GuiApplication.h @@ -92,6 +92,15 @@ public: bool eventFilter(QObject* obj, QEvent* ev); }; +class KeyboardFilter : public QObject +{ + Q_OBJECT + +public: + KeyboardFilter(QObject* parent); + bool eventFilter(QObject* obj, QEvent* ev); +}; + } #endif // GUI_APPLICATION_H