From 856b498bbe9a7d806852525e1532e88715809a51 Mon Sep 17 00:00:00 2001 From: Paolo Cancedda Date: Tue, 18 Jun 2024 00:31:40 +0200 Subject: [PATCH 1/4] ui: improve key capture The QLineEdit in assignhotkey.ui intercepts several key events, (e.g. backspace, delete, home, end, left and right arrows...). Replace the QLineEdit with a simple QLabel to improve key capture. Moreover, inhibit completely the CTRL+ combinations. --- ui/src/assignhotkey.cpp | 11 +++++------ ui/src/assignhotkey.ui | 23 +++++++++++++++++++---- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/ui/src/assignhotkey.cpp b/ui/src/assignhotkey.cpp index d9e56d971e..f88c669f1e 100644 --- a/ui/src/assignhotkey.cpp +++ b/ui/src/assignhotkey.cpp @@ -30,6 +30,7 @@ #define SETTINGS_GEOMETRY "assignhotkey/geometry" #define SETTINGS_AUTOCLOSE "assignhotkey/autoclose" + /***************************************************************************** * Initialization *****************************************************************************/ @@ -59,11 +60,8 @@ AssignHotKey::AssignHotKey(QWidget* parent, const QKeySequence& keySequence) m_infoText->setFocusPolicy(Qt::NoFocus); m_buttonBox->setFocusPolicy(Qt::NoFocus); - m_previewEdit->setReadOnly(true); - m_previewEdit->setAlignment(Qt::AlignCenter); - m_keySequence = QKeySequence(keySequence); - m_previewEdit->setText(m_keySequence.toString(QKeySequence::NativeText)); + m_previewLabel->setText(m_keySequence.toString(QKeySequence::NativeText)); QSettings settings; m_autoCloseCheckBox->setChecked(settings.value(SETTINGS_AUTOCLOSE).toBool()); @@ -89,13 +87,14 @@ void AssignHotKey::keyPressEvent(QKeyEvent* event) { int key = event->key(); if (event->key() == Qt::Key_Control || event->key() == Qt::Key_Alt || - event->key() == Qt::Key_Shift || event->key() == Qt::Key_Meta) + event->key() == Qt::Key_Shift || event->key() == Qt::Key_Meta || + event->modifiers() == Qt::ControlModifier) { key = 0; } m_keySequence = QKeySequence(key | (event->modifiers() & ~Qt::ControlModifier)); - m_previewEdit->setText(m_keySequence.toString(QKeySequence::NativeText)); + m_previewLabel->setText(m_keySequence.toString(QKeySequence::NativeText)); if (m_autoCloseCheckBox->isChecked() == true && key != 0) accept(); diff --git a/ui/src/assignhotkey.ui b/ui/src/assignhotkey.ui index a97f1030e4..0742b74dbd 100644 --- a/ui/src/assignhotkey.ui +++ b/ui/src/assignhotkey.ui @@ -37,7 +37,7 @@ - + Key combination @@ -47,12 +47,27 @@ - + + + + 0 + 0 + + + + Qt::StrongFocus + + + QFrame::Box + + + + Qt::AlignCenter - - true + + 3 From ee5b1760f74f16cae467f80a81ee90d9d152751d Mon Sep 17 00:00:00 2001 From: Paolo Cancedda Date: Tue, 18 Jun 2024 22:59:55 +0200 Subject: [PATCH 2/4] ui/test: replace m_previewEdit with m_previewLabel in AssignHotKey --- ui/test/assignhotkey/assignhotkey_test.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui/test/assignhotkey/assignhotkey_test.cpp b/ui/test/assignhotkey/assignhotkey_test.cpp index 37bb4b9a52..97551cf4bc 100644 --- a/ui/test/assignhotkey/assignhotkey_test.cpp +++ b/ui/test/assignhotkey/assignhotkey_test.cpp @@ -32,8 +32,7 @@ void AssignHotKey_Test::initial() QKeySequence seq(Qt::Key_A | Qt::SHIFT); AssignHotKey ahk(NULL, seq); QCOMPARE(ahk.keySequence(), seq); - QCOMPARE(ahk.m_previewEdit->text(), seq.toString(QKeySequence::NativeText)); - QCOMPARE(ahk.m_previewEdit->isReadOnly(), true); + QCOMPARE(ahk.m_previewLabel->text(), seq.toString(QKeySequence::NativeText)); } void AssignHotKey_Test::keyPressEventAuto() From 617c210dc7accc1cf389db157639bae50f1811d9 Mon Sep 17 00:00:00 2001 From: Paolo Cancedda Date: Wed, 19 Jun 2024 00:13:48 +0200 Subject: [PATCH 3/4] ui: introduce keyboard scroll flag in Virtual Console Introduce in Virtual Console Settings a flag to enable/disable standard keyboard management on scroll area. The flag, when enabled (default), guarantees current behaviour: arrow keys and PgUp/PgDown keys are used to scroll the console and cannot be used as key combinations for controls. When disabled, the scroll area does not consume key events anymore, leaving all the keys available as key combinations on the controls. --- ui/src/CMakeLists.txt | 1 + ui/src/src.pro | 2 + ui/src/virtualconsole/vcproperties.cpp | 27 ++++++++++++ ui/src/virtualconsole/vcproperties.h | 22 ++++++++-- ui/src/virtualconsole/vcproperties.ui | 46 ++++++++++++++++++++ ui/src/virtualconsole/vcpropertieseditor.cpp | 6 +++ ui/src/virtualconsole/vcpropertieseditor.h | 1 + ui/src/virtualconsole/vcscrollarea.cpp | 18 ++++++++ ui/src/virtualconsole/vcscrollarea.h | 23 ++++++++++ ui/src/virtualconsole/virtualconsole.cpp | 11 ++++- ui/src/virtualconsole/virtualconsole.h | 6 ++- 11 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 ui/src/virtualconsole/vcscrollarea.cpp create mode 100644 ui/src/virtualconsole/vcscrollarea.h diff --git a/ui/src/CMakeLists.txt b/ui/src/CMakeLists.txt index acb69d739b..5f09c7bf82 100644 --- a/ui/src/CMakeLists.txt +++ b/ui/src/CMakeLists.txt @@ -141,6 +141,7 @@ add_library(${module_name} virtualconsole/vcmatrixproperties.cpp virtualconsole/vcmatrixproperties.h virtualconsole/vcmatrixproperties.ui virtualconsole/vcproperties.cpp virtualconsole/vcproperties.h virtualconsole/vcproperties.ui virtualconsole/vcpropertieseditor.cpp virtualconsole/vcpropertieseditor.h + virtualconsole/vcscrollarea.cpp virtualconsole/vcscrollarea.h virtualconsole/vcslider.cpp virtualconsole/vcslider.h virtualconsole/vcsliderproperties.cpp virtualconsole/vcsliderproperties.h virtualconsole/vcsliderproperties.ui virtualconsole/vcsoloframe.cpp virtualconsole/vcsoloframe.h diff --git a/ui/src/src.pro b/ui/src/src.pro index 8f80738cca..8f6a5f6caf 100644 --- a/ui/src/src.pro +++ b/ui/src/src.pro @@ -155,6 +155,7 @@ HEADERS += virtualconsole/addvcbuttonmatrix.h \ virtualconsole/vcmatrixproperties.h \ virtualconsole/vcproperties.h \ virtualconsole/vcpropertieseditor.h \ + virtualconsole/vcscrollarea.h \ virtualconsole/vcslider.h \ virtualconsole/vcsliderproperties.h \ virtualconsole/vcsoloframe.h \ @@ -337,6 +338,7 @@ SOURCES += virtualconsole/addvcbuttonmatrix.cpp \ virtualconsole/vcmatrixproperties.cpp \ virtualconsole/vcproperties.cpp \ virtualconsole/vcpropertieseditor.cpp \ + virtualconsole/vcscrollarea.cpp \ virtualconsole/vcslider.cpp \ virtualconsole/vcsliderproperties.cpp \ virtualconsole/vcsoloframe.cpp \ diff --git a/ui/src/virtualconsole/vcproperties.cpp b/ui/src/virtualconsole/vcproperties.cpp index 5d6f96c6a8..7adbc46f2f 100644 --- a/ui/src/virtualconsole/vcproperties.cpp +++ b/ui/src/virtualconsole/vcproperties.cpp @@ -33,6 +33,7 @@ VCProperties::VCProperties() : m_size(QSize(1920, 1080)) + , m_keyboardScroll(true) , m_gmChannelMode(GrandMaster::Intensity) , m_gmValueMode(GrandMaster::Reduce) , m_gmSliderMode(GrandMaster::Normal) @@ -43,6 +44,7 @@ VCProperties::VCProperties() VCProperties::VCProperties(const VCProperties& properties) : m_size(properties.m_size) + , m_keyboardScroll(properties.m_keyboardScroll) , m_gmChannelMode(properties.m_gmChannelMode) , m_gmValueMode(properties.m_gmValueMode) , m_gmSliderMode(properties.m_gmSliderMode) @@ -60,6 +62,7 @@ VCProperties &VCProperties::operator=(const VCProperties &props) if (this != &props) { m_size = props.m_size; + m_keyboardScroll = props.m_keyboardScroll; m_gmChannelMode = props.m_gmChannelMode; m_gmValueMode = props.m_gmValueMode; m_gmSliderMode = props.m_gmSliderMode; @@ -84,6 +87,20 @@ QSize VCProperties::size() const return m_size; } +/***************************************************************************** + * Keyboard scrolling + *****************************************************************************/ + +void VCProperties::setKeyboardScroll(const bool enable) +{ + m_keyboardScroll = enable; +} + +bool VCProperties::keyboardScroll() const +{ + return m_keyboardScroll; +} + /***************************************************************************** * Grand Master *****************************************************************************/ @@ -166,6 +183,15 @@ bool VCProperties::loadXML(QXmlStreamReader &root) /* Set size if both are valid */ if (sz.isValid() == true) setSize(sz); +\ + bool keyboardScroll = true; + + /* Keyboard scrolling */ + str = root.attributes().value(KXMLQLCVCPropertiesKeyboardScroll).toString(); + if (str.isEmpty() == false) + keyboardScroll = QVariant(str).toBool(); + setKeyboardScroll(keyboardScroll); + root.skipCurrentElement(); } else if (root.name() == KXMLQLCVCPropertiesGrandMaster) @@ -224,6 +250,7 @@ bool VCProperties::saveXML(QXmlStreamWriter *doc) const doc->writeStartElement(KXMLQLCVCPropertiesSize); doc->writeAttribute(KXMLQLCVCPropertiesSizeWidth, QString::number(size().width())); doc->writeAttribute(KXMLQLCVCPropertiesSizeHeight, QString::number(size().height())); + doc->writeAttribute(KXMLQLCVCPropertiesKeyboardScroll, QVariant(keyboardScroll()).toString()); doc->writeEndElement(); /*********************** diff --git a/ui/src/virtualconsole/vcproperties.h b/ui/src/virtualconsole/vcproperties.h index c8eadd6fbc..cd29565acc 100644 --- a/ui/src/virtualconsole/vcproperties.h +++ b/ui/src/virtualconsole/vcproperties.h @@ -37,10 +37,11 @@ class Doc; #define KXMLQLCVirtualConsole QString("VirtualConsole") -#define KXMLQLCVCProperties QString("Properties") -#define KXMLQLCVCPropertiesSize QString("Size") -#define KXMLQLCVCPropertiesSizeWidth QString("Width") -#define KXMLQLCVCPropertiesSizeHeight QString("Height") +#define KXMLQLCVCProperties QString("Properties") +#define KXMLQLCVCPropertiesSize QString("Size") +#define KXMLQLCVCPropertiesSizeWidth QString("Width") +#define KXMLQLCVCPropertiesSizeHeight QString("Height") +#define KXMLQLCVCPropertiesKeyboardScroll QString("KeyboardScroll") #define KXMLQLCVCPropertiesGrandMaster QString("GrandMaster") #define KXMLQLCVCPropertiesGrandMasterVisible QString("Visible") @@ -78,6 +79,19 @@ class VCProperties private: QSize m_size; + /********************************************************************* + * Keyboard scrolling + *********************************************************************/ +public: + /** Set Virtual Console keyboard scrolling */ + void setKeyboardScroll(const bool enable); + + /** Get Virtual Console keyboard scrolling */ + bool keyboardScroll() const; + +private: + bool m_keyboardScroll; + /************************************************************************* * Grand Master *************************************************************************/ diff --git a/ui/src/virtualconsole/vcproperties.ui b/ui/src/virtualconsole/vcproperties.ui index 746132181c..93a672dc5e 100644 --- a/ui/src/virtualconsole/vcproperties.ui +++ b/ui/src/virtualconsole/vcproperties.ui @@ -105,6 +105,35 @@ + + + Scrolling + + + + + + Use arrow and PgUp/PgDown keys to scroll + + + true + + + + + + + Note: enabling keyboard scroll prevents using arrow and PgUp/PgDown keys in Key combinations for console controls. + + + true + + + + + + + Qt::Vertical @@ -820,6 +849,7 @@ m_sizeXSpin m_sizeYSpin + m_enableKeyboardScroll m_buttonWspin m_buttonHspin m_sliderWspin @@ -994,6 +1024,22 @@ + + m_enableKeyboardScroll + toggled(bool) + VCPropertiesEditor + slotKeyboardScrollToggled(bool) + + + 190 + 198 + + + 190 + 245 + + + slotGridXChanged(int) diff --git a/ui/src/virtualconsole/vcpropertieseditor.cpp b/ui/src/virtualconsole/vcpropertieseditor.cpp index ef1663d1cd..7349d694cf 100644 --- a/ui/src/virtualconsole/vcpropertieseditor.cpp +++ b/ui/src/virtualconsole/vcpropertieseditor.cpp @@ -56,6 +56,7 @@ VCPropertiesEditor::VCPropertiesEditor(QWidget* parent, const VCProperties& prop /* General page */ m_sizeXSpin->setValue(properties.size().width()); m_sizeYSpin->setValue(properties.size().height()); + m_enableKeyboardScroll->setChecked(properties.keyboardScroll()); /* Widgets page */ QSettings settings; @@ -319,6 +320,11 @@ void VCPropertiesEditor::slotSizeYChanged(int value) m_properties.setSize(sz); } +void VCPropertiesEditor::slotKeyboardScrollToggled(bool checked) +{ + m_properties.setKeyboardScroll(checked); +} + void VCPropertiesEditor::slotSpeedDialConfirmed() { if (m_speedValueEdit->text().contains(".") == false) diff --git a/ui/src/virtualconsole/vcpropertieseditor.h b/ui/src/virtualconsole/vcpropertieseditor.h index 48ba480e46..a4f920838c 100644 --- a/ui/src/virtualconsole/vcpropertieseditor.h +++ b/ui/src/virtualconsole/vcpropertieseditor.h @@ -84,6 +84,7 @@ class VCPropertiesEditor : public QDialog, public Ui_VCPropertiesEditor private slots: void slotSizeXChanged(int value); void slotSizeYChanged(int value); + void slotKeyboardScrollToggled(bool checked); /************************************************************************* * Widgets page diff --git a/ui/src/virtualconsole/vcscrollarea.cpp b/ui/src/virtualconsole/vcscrollarea.cpp new file mode 100644 index 0000000000..a608e09b88 --- /dev/null +++ b/ui/src/virtualconsole/vcscrollarea.cpp @@ -0,0 +1,18 @@ +#include "vcscrollarea.h" +#include "qevent.h" + +VCScrollArea::VCScrollArea(QWidget *parent) : QScrollArea(parent) { + // nothing more right now +} + +void VCScrollArea::keyPressEvent(QKeyEvent *ev) { + if (m_keyPassthru) { + ev->ignore(); + } else { + QScrollArea::keyPressEvent(ev); + } +} + +void VCScrollArea::setKeyPassthruEnabled(bool enable) { + m_keyPassthru = enable; +} diff --git a/ui/src/virtualconsole/vcscrollarea.h b/ui/src/virtualconsole/vcscrollarea.h new file mode 100644 index 0000000000..da2bee9ddb --- /dev/null +++ b/ui/src/virtualconsole/vcscrollarea.h @@ -0,0 +1,23 @@ +#ifndef VCSCROLLAREA_H +#define VCSCROLLAREA_H + +#include +#include +#include + +class VCScrollArea : public QScrollArea +{ + Q_OBJECT +public: + explicit VCScrollArea(QWidget *parent = nullptr); + + void setKeyPassthruEnabled(bool enabled); + +protected: + void keyPressEvent(QKeyEvent *) override; + +private: + bool m_keyPassthru; +}; + +#endif // VCSCROLLAREA_H diff --git a/ui/src/virtualconsole/virtualconsole.cpp b/ui/src/virtualconsole/virtualconsole.cpp index 44aeda860a..fb99a73306 100644 --- a/ui/src/virtualconsole/virtualconsole.cpp +++ b/ui/src/virtualconsole/virtualconsole.cpp @@ -133,6 +133,7 @@ VirtualConsole::VirtualConsole(QWidget* parent, Doc* doc) , m_contents(NULL) , m_liveEdit(false) + , m_keyboardScroll(true) { Q_ASSERT(s_instance == NULL); s_instance = this; @@ -1583,7 +1584,7 @@ void VirtualConsole::initContents() { Q_ASSERT(layout() != NULL); - m_scrollArea = new QScrollArea(this); + m_scrollArea = new VCScrollArea(this); m_contentsLayout->addWidget(m_scrollArea); m_scrollArea->setAlignment(Qt::AlignCenter); m_scrollArea->setWidgetResizable(false); @@ -1707,6 +1708,9 @@ void VirtualConsole::enableEdit() m_stackingRaiseAction->setShortcut(QKeySequence("SHIFT+UP")); m_stackingLowerAction->setShortcut(QKeySequence("SHIFT+DOWN")); + // disable key passthru + m_scrollArea->setKeyPassthruEnabled(false); + // Show toolbar m_toolbar->show(); } @@ -1759,6 +1763,10 @@ void VirtualConsole::disableEdit() m_stackingRaiseAction->setShortcut(QKeySequence()); m_stackingLowerAction->setShortcut(QKeySequence()); + + // manage key passthru + m_scrollArea->setKeyPassthruEnabled(!m_keyboardScroll); + // Hide toolbar; there's nothing usable there in operate mode m_toolbar->hide(); @@ -1821,6 +1829,7 @@ bool VirtualConsole::loadXML(QXmlStreamReader &root) QSize size(m_properties.size()); contents()->resize(size); contents()->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + m_keyboardScroll = m_properties.keyboardScroll(); } else if (root.name() == KXMLQLCVCFrame) { diff --git a/ui/src/virtualconsole/virtualconsole.h b/ui/src/virtualconsole/virtualconsole.h index 9b3d642626..db63ba1a1f 100644 --- a/ui/src/virtualconsole/virtualconsole.h +++ b/ui/src/virtualconsole/virtualconsole.h @@ -26,6 +26,7 @@ #include #include +#include "vcscrollarea.h" #include "vcproperties.h" #include "doc.h" @@ -34,7 +35,7 @@ class QXmlStreamWriter; class VirtualConsole; class QActionGroup; class QVBoxLayout; -class QScrollArea; +class VCScrollArea; class VCDockArea; class QKeyEvent; class QToolBar; @@ -336,7 +337,7 @@ public slots: protected: QVBoxLayout* m_contentsLayout; - QScrollArea* m_scrollArea; + VCScrollArea* m_scrollArea; VCFrame* m_contents; QHash m_widgetsMap; @@ -363,6 +364,7 @@ public slots: *********************************************************************/ private: bool m_liveEdit; + bool m_keyboardScroll; public: /** Toggle Virtual Console live editting */ From e0912e5a06d5b044bc1671c376b3441002206bf1 Mon Sep 17 00:00:00 2001 From: Paolo Cancedda Date: Wed, 19 Jun 2024 00:58:53 +0200 Subject: [PATCH 4/4] fix: initialize m_keyPassthru in VCScrollArea constructor --- ui/src/virtualconsole/vcscrollarea.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/virtualconsole/vcscrollarea.cpp b/ui/src/virtualconsole/vcscrollarea.cpp index a608e09b88..c9306c176d 100644 --- a/ui/src/virtualconsole/vcscrollarea.cpp +++ b/ui/src/virtualconsole/vcscrollarea.cpp @@ -1,7 +1,7 @@ #include "vcscrollarea.h" #include "qevent.h" -VCScrollArea::VCScrollArea(QWidget *parent) : QScrollArea(parent) { +VCScrollArea::VCScrollArea(QWidget *parent) : QScrollArea(parent), m_keyPassthru(false) { // nothing more right now }