diff options
Diffstat (limited to 'src/quicktemplates2')
-rw-r--r-- | src/quicktemplates2/qquickcombobox.cpp | 88 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcombobox_p.h | 8 |
2 files changed, 89 insertions, 7 deletions
diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp index 3aa67688..298a795f 100644 --- a/src/quicktemplates2/qquickcombobox.cpp +++ b/src/quicktemplates2/qquickcombobox.cpp @@ -165,14 +165,13 @@ class QQuickComboBoxPrivate : public QQuickControlPrivate Q_DECLARE_PUBLIC(QQuickComboBox) public: - QQuickComboBoxPrivate() : flat(false), pressed(false), ownModel(false), hasDisplayText(false), hasCurrentIndex(false), - highlightedIndex(-1), currentIndex(-1), delegateModel(nullptr), - delegate(nullptr), indicator(nullptr), popup(nullptr) { } + QQuickComboBoxPrivate(); bool isPopupVisible() const; void showPopup(); void hidePopup(bool accept); void togglePopup(bool accept); + void popupVisibleChanged(); void itemClicked(); @@ -187,6 +186,8 @@ public: void createDelegateModel(); bool flat; + bool down; + bool hasDown; bool pressed; bool ownModel; bool hasDisplayText; @@ -204,6 +205,23 @@ public: QQuickPopup *popup; }; +QQuickComboBoxPrivate::QQuickComboBoxPrivate() + : flat(false), + down(false), + hasDown(false), + pressed(false), + ownModel(false), + hasDisplayText(false), + hasCurrentIndex(false), + highlightedIndex(-1), + currentIndex(-1), + delegateModel(nullptr), + delegate(nullptr), + indicator(nullptr), + popup(nullptr) +{ +} + bool QQuickComboBoxPrivate::isPopupVisible() const { return popup && popup->isVisible(); @@ -237,6 +255,16 @@ void QQuickComboBoxPrivate::togglePopup(bool accept) showPopup(); } +void QQuickComboBoxPrivate::popupVisibleChanged() +{ + Q_Q(QQuickComboBox); + updateHighlightedIndex(); + if (!hasDown) { + q->setDown(pressed || isPopupVisible()); + hasDown = false; + } +} + void QQuickComboBoxPrivate::itemClicked() { Q_Q(QQuickComboBox); @@ -484,9 +512,52 @@ void QQuickComboBox::setFlat(bool flat) } /*! + \since QtQuick.Controls 2.2 + \qmlproperty bool QtQuick.Controls::ComboBox::down + + This property holds whether the combo box button is visually down. + + Unless explicitly set, this property is \c true when either \c pressed + or \c popup.visible is \c true. To return to the default value, set this + property to \c undefined. + + \sa pressed, popup +*/ +bool QQuickComboBox::isDown() const +{ + Q_D(const QQuickComboBox); + return d->down; +} + +void QQuickComboBox::setDown(bool down) +{ + Q_D(QQuickComboBox); + d->hasDown = true; + + if (d->down == down) + return; + + d->down = down; + emit downChanged(); +} + +void QQuickComboBox::resetDown() +{ + Q_D(QQuickComboBox); + if (!d->hasDown) + return; + + setDown(d->pressed || d->isPopupVisible()); + d->hasDown = false; +} + +/*! \qmlproperty bool QtQuick.Controls::ComboBox::pressed - This property holds whether the combo box button is pressed. + This property holds whether the combo box button is physically pressed. + A button can be pressed by either touch or key events. + + \sa down */ bool QQuickComboBox::isPressed() const { @@ -502,6 +573,11 @@ void QQuickComboBox::setPressed(bool pressed) d->pressed = pressed; emit pressedChanged(); + + if (!d->hasDown) { + setDown(d->pressed || d->isPopupVisible()); + d->hasDown = false; + } } /*! @@ -733,12 +809,12 @@ void QQuickComboBox::setPopup(QQuickPopup *popup) return; if (d->popup) - QObjectPrivate::disconnect(d->popup, &QQuickPopup::visibleChanged, d, &QQuickComboBoxPrivate::updateHighlightedIndex); + QObjectPrivate::disconnect(d->popup, &QQuickPopup::visibleChanged, d, &QQuickComboBoxPrivate::popupVisibleChanged); d->deleteDelegate(d->popup); if (popup) { QQuickPopupPrivate::get(popup)->allowVerticalFlip = true; popup->setClosePolicy(QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutsideParent); - QObjectPrivate::connect(popup, &QQuickPopup::visibleChanged, d, &QQuickComboBoxPrivate::updateHighlightedIndex); + QObjectPrivate::connect(popup, &QQuickPopup::visibleChanged, d, &QQuickComboBoxPrivate::popupVisibleChanged); } d->popup = popup; emit popupChanged(); diff --git a/src/quicktemplates2/qquickcombobox_p.h b/src/quicktemplates2/qquickcombobox_p.h index 3788d56a..1feab73c 100644 --- a/src/quicktemplates2/qquickcombobox_p.h +++ b/src/quicktemplates2/qquickcombobox_p.h @@ -63,7 +63,8 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickComboBox : public QQuickControl Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged FINAL) Q_PROPERTY(QQmlInstanceModel *delegateModel READ delegateModel NOTIFY delegateModelChanged FINAL) Q_PROPERTY(bool flat READ isFlat WRITE setFlat NOTIFY flatChanged FINAL REVISION 1) - Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) + Q_PROPERTY(bool down READ isDown WRITE setDown RESET resetDown NOTIFY downChanged FINAL REVISION 2) + Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) // ### Qt 6: should not be writable Q_PROPERTY(int highlightedIndex READ highlightedIndex NOTIFY highlightedIndexChanged FINAL) Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged FINAL) Q_PROPERTY(QString currentText READ currentText NOTIFY currentTextChanged FINAL) @@ -86,6 +87,10 @@ public: bool isFlat() const; void setFlat(bool flat); + bool isDown() const; + void setDown(bool down); + void resetDown(); + bool isPressed() const; void setPressed(bool pressed); @@ -124,6 +129,7 @@ Q_SIGNALS: void modelChanged(); void delegateModelChanged(); Q_REVISION(1) void flatChanged(); + Q_REVISION(2) void downChanged(); void pressedChanged(); void highlightedIndexChanged(); void currentIndexChanged(); |