From 0425562e14e41b62dc7631c7c02768b8294454d0 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Wed, 11 Dec 2019 16:38:14 +0100 Subject: ComboBox: add selectTextByMouse property Allows configuring the selectByMouse property of the underlying TextField for editable combo boxes. Named selectTextByMouse instead of selectByMouse to avoid confusion with selection of the items themselves. [ChangeLog][Controls][ComboBox] Added selectTextByMouse property. Change-Id: I852e4cd44ebe6b2a1ed2535513ea2fc35cbe0a32 Fixes: QTBUG-71406 Reviewed-by: Shawn Rutledge --- src/imports/controls/ComboBox.qml | 11 +++++----- src/imports/controls/fusion/ComboBox.qml | 15 +++++++------- src/imports/controls/imagine/ComboBox.qml | 13 ++++++------ src/imports/controls/material/ComboBox.qml | 15 +++++++------- src/imports/controls/universal/ComboBox.qml | 13 ++++++------ src/imports/templates/qtquicktemplates2plugin.cpp | 3 +++ src/quicktemplates2/qquickcombobox.cpp | 25 +++++++++++++++++++++++ src/quicktemplates2/qquickcombobox_p.h | 8 ++++++++ tests/auto/controls/data/tst_combobox.qml | 16 +++++++++++++++ 9 files changed, 88 insertions(+), 31 deletions(-) diff --git a/src/imports/controls/ComboBox.qml b/src/imports/controls/ComboBox.qml index 8eefc686..b30293f5 100644 --- a/src/imports/controls/ComboBox.qml +++ b/src/imports/controls/ComboBox.qml @@ -34,11 +34,11 @@ ** ****************************************************************************/ -import QtQuick 2.14 -import QtQuick.Window 2.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.impl 2.14 -import QtQuick.Templates 2.14 as T +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.impl 2.15 +import QtQuick.Templates 2.15 as T T.ComboBox { id: control @@ -84,6 +84,7 @@ T.ComboBox { readOnly: control.down inputMethodHints: control.inputMethodHints validator: control.validator + selectByMouse: control.selectTextByMouse font: control.font color: control.editable ? control.palette.text : control.palette.buttonText diff --git a/src/imports/controls/fusion/ComboBox.qml b/src/imports/controls/fusion/ComboBox.qml index e9b836ef..d8ef1888 100644 --- a/src/imports/controls/fusion/ComboBox.qml +++ b/src/imports/controls/fusion/ComboBox.qml @@ -34,13 +34,13 @@ ** ****************************************************************************/ -import QtQuick 2.14 -import QtQuick.Window 2.14 -import QtQuick.Templates 2.14 as T -import QtQuick.Controls 2.14 -import QtQuick.Controls.impl 2.14 -import QtQuick.Controls.Fusion 2.14 -import QtQuick.Controls.Fusion.impl 2.14 +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Templates 2.15 as T +import QtQuick.Controls 2.15 +import QtQuick.Controls.impl 2.15 +import QtQuick.Controls.Fusion 2.15 +import QtQuick.Controls.Fusion.impl 2.15 T.ComboBox { id: control @@ -84,6 +84,7 @@ T.ComboBox { readOnly: control.down inputMethodHints: control.inputMethodHints validator: control.validator + selectByMouse: control.selectTextByMouse font: control.font color: control.editable ? control.palette.text : control.palette.buttonText diff --git a/src/imports/controls/imagine/ComboBox.qml b/src/imports/controls/imagine/ComboBox.qml index 2d582e98..92937826 100644 --- a/src/imports/controls/imagine/ComboBox.qml +++ b/src/imports/controls/imagine/ComboBox.qml @@ -34,12 +34,12 @@ ** ****************************************************************************/ -import QtQuick 2.14 -import QtQuick.Window 2.14 -import QtQuick.Templates 2.14 as T -import QtQuick.Controls 2.14 -import QtQuick.Controls.Imagine 2.14 -import QtQuick.Controls.Imagine.impl 2.14 +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Templates 2.15 as T +import QtQuick.Controls 2.15 +import QtQuick.Controls.Imagine 2.15 +import QtQuick.Controls.Imagine.impl 2.15 T.ComboBox { id: control @@ -98,6 +98,7 @@ T.ComboBox { readOnly: control.down inputMethodHints: control.inputMethodHints validator: control.validator + selectByMouse: control.selectTextByMouse font: control.font color: control.flat ? control.palette.windowText : control.editable ? control.palette.text : control.palette.buttonText diff --git a/src/imports/controls/material/ComboBox.qml b/src/imports/controls/material/ComboBox.qml index 7d635902..e4ee332b 100644 --- a/src/imports/controls/material/ComboBox.qml +++ b/src/imports/controls/material/ComboBox.qml @@ -34,13 +34,13 @@ ** ****************************************************************************/ -import QtQuick 2.14 -import QtQuick.Window 2.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.impl 2.14 -import QtQuick.Templates 2.14 as T -import QtQuick.Controls.Material 2.14 -import QtQuick.Controls.Material.impl 2.14 +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.impl 2.15 +import QtQuick.Templates 2.15 as T +import QtQuick.Controls.Material 2.15 +import QtQuick.Controls.Material.impl 2.15 T.ComboBox { id: control @@ -89,6 +89,7 @@ T.ComboBox { readOnly: control.down inputMethodHints: control.inputMethodHints validator: control.validator + selectByMouse: control.selectTextByMouse font: control.font color: control.enabled ? control.Material.foreground : control.Material.hintTextColor diff --git a/src/imports/controls/universal/ComboBox.qml b/src/imports/controls/universal/ComboBox.qml index 9a4e119b..fd2d8935 100644 --- a/src/imports/controls/universal/ComboBox.qml +++ b/src/imports/controls/universal/ComboBox.qml @@ -34,12 +34,12 @@ ** ****************************************************************************/ -import QtQuick 2.14 -import QtQuick.Window 2.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.impl 2.14 -import QtQuick.Templates 2.14 as T -import QtQuick.Controls.Universal 2.14 +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.impl 2.15 +import QtQuick.Templates 2.15 as T +import QtQuick.Controls.Universal 2.15 T.ComboBox { id: control @@ -94,6 +94,7 @@ T.ComboBox { readOnly: control.down inputMethodHints: control.inputMethodHints validator: control.validator + selectByMouse: control.selectTextByMouse font: control.font color: !control.enabled ? control.Universal.chromeDisabledLowColor : diff --git a/src/imports/templates/qtquicktemplates2plugin.cpp b/src/imports/templates/qtquicktemplates2plugin.cpp index e84db606..9645e4ce 100644 --- a/src/imports/templates/qtquicktemplates2plugin.cpp +++ b/src/imports/templates/qtquicktemplates2plugin.cpp @@ -358,6 +358,9 @@ void QtQuickTemplates2Plugin::registerTypes(const char *uri) // QtQuick.Templates 2.14 (new types and revisions in Qt 5.14) qmlRegisterType(uri, 2, 14, "ComboBox"); + + // QtQuick.Templates 2.15 (new types and revisions in Qt 5.15) + qmlRegisterType(uri, 2, 15, "ComboBox"); } QT_END_NAMESPACE diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp index 199e3408..79ee6663 100644 --- a/src/quicktemplates2/qquickcombobox.cpp +++ b/src/quicktemplates2/qquickcombobox.cpp @@ -293,6 +293,7 @@ public: bool editable = false; bool accepting = false; bool allowComplete = false; + bool selectTextByMouse = false; Qt::InputMethodHints inputMethodHints = Qt::ImhNone; QString editText; QValidator *validator = nullptr; @@ -1567,6 +1568,30 @@ int QQuickComboBox::indexOfValue(const QVariant &value) const return -1; } +/*! + \since QtQuick.Controls 2.15 (Qt 5.15) + \qmlproperty bool QtQuick.Controls::ComboBox::selectTextByMouse + + This property holds whether the text field for an editable ComboBox + can be selected with the mouse. + + The default value is \c false. +*/ +bool QQuickComboBox::selectTextByMouse() const +{ + Q_D(const QQuickComboBox); + return d->extra.isAllocated() ? d->extra->selectTextByMouse : false; +} + +void QQuickComboBox::setSelectTextByMouse(bool canSelect) +{ + Q_D(QQuickComboBox); + if (canSelect == selectTextByMouse()) + return; + + d->extra.value().selectTextByMouse = canSelect; + emit selectTextByMouseChanged(); +} /*! \qmlmethod string QtQuick.Controls::ComboBox::textAt(int index) diff --git a/src/quicktemplates2/qquickcombobox_p.h b/src/quicktemplates2/qquickcombobox_p.h index 00bc1242..b52d7545 100644 --- a/src/quicktemplates2/qquickcombobox_p.h +++ b/src/quicktemplates2/qquickcombobox_p.h @@ -92,6 +92,8 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickComboBox : public QQuickControl // 2.14 (Qt 5.14) Q_PROPERTY(QVariant currentValue READ currentValue NOTIFY currentValueChanged FINAL REVISION 14) Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY valueRoleChanged FINAL REVISION 14) + // 2.15 (Qt 5.15) + Q_PROPERTY(bool selectTextByMouse READ selectTextByMouse WRITE setSelectTextByMouse NOTIFY selectTextByMouseChanged FINAL REVISION 15) public: explicit QQuickComboBox(QQuickItem *parent = nullptr); @@ -169,6 +171,10 @@ public: Q_REVISION(14) Q_INVOKABLE QVariant valueAt(int index) const; Q_REVISION(14) Q_INVOKABLE int indexOfValue(const QVariant &value) const; + // 2.15 (Qt 5.15) + bool selectTextByMouse() const; + void setSelectTextByMouse(bool canSelect); + public Q_SLOTS: void incrementCurrentIndex(); void decrementCurrentIndex(); @@ -206,6 +212,8 @@ Q_SIGNALS: // 2.14 (Qt 5.14) Q_REVISION(14) void valueRoleChanged(); Q_REVISION(14) void currentValueChanged(); + // 2.15 (Qt 5.15) + Q_REVISION(15) void selectTextByMouseChanged(); protected: bool eventFilter(QObject *object, QEvent *event) override; diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml index 2cf71f73..0f1f0bdc 100644 --- a/tests/auto/controls/data/tst_combobox.qml +++ b/tests/auto/controls/data/tst_combobox.qml @@ -1853,4 +1853,20 @@ TestCase { closedSpy.wait() compare(closedSpy.count, 1) } + + function test_comboBoxSelectTextByMouse() { + let control = createTemporaryObject(comboBox, testCase, + { editable: true, selectTextByMouse: true, model: [ "Some text" ], width: parent.width }) + verify(control) + waitForRendering(control) + control.forceActiveFocus() + + // Position the text cursor at the beginning of the text. + mouseClick(control, control.leftPadding, control.height / 2) + // Select all of the text. + mousePress(control, control.leftPadding, control.height / 2) + mouseMove(control, control.leftPadding + control.contentItem.width, control.height / 2) + mouseRelease(control, control.leftPadding + control.contentItem.width, control.height / 2) + compare(control.contentItem.selectedText, "Some text") + } } -- cgit v1.2.3