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/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 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..c9306c176d --- /dev/null +++ b/ui/src/virtualconsole/vcscrollarea.cpp @@ -0,0 +1,18 @@ +#include "vcscrollarea.h" +#include "qevent.h" + +VCScrollArea::VCScrollArea(QWidget *parent) : QScrollArea(parent), m_keyPassthru(false) { + // 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 */ 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()