diff options
Diffstat (limited to 'src/templates/qquickcombobox.cpp')
-rw-r--r-- | src/templates/qquickcombobox.cpp | 163 |
1 files changed, 103 insertions, 60 deletions
diff --git a/src/templates/qquickcombobox.cpp b/src/templates/qquickcombobox.cpp index e37b0f52..f352eb6b 100644 --- a/src/templates/qquickcombobox.cpp +++ b/src/templates/qquickcombobox.cpp @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE \instantiates QQuickComboBox \inqmlmodule Qt.labs.controls \ingroup qtlabscontrols-input - \brief A combo box control. + \brief A combined button and popup list taking minimal space. \image qtlabscontrols-combobox.png @@ -123,7 +123,7 @@ class QQuickComboBoxDelegateModel : public QQmlDelegateModel { public: explicit QQuickComboBoxDelegateModel(QQuickComboBox *combo); - QString stringValue(int index, const QString &role) Q_DECL_OVERRIDE; + QString stringValue(int index, const QString &role) override; private: QQuickComboBox *combo; @@ -155,8 +155,8 @@ class QQuickComboBoxPrivate : public QQuickControlPrivate public: QQuickComboBoxPrivate() : pressed(false), ownModel(false), hasDisplayText(false), - highlightedIndex(-1), currentIndex(-1), delegateModel(Q_NULLPTR), - delegate(Q_NULLPTR), popup(Q_NULLPTR) { } + highlightedIndex(-1), currentIndex(-1), delegateModel(nullptr), + delegate(nullptr), popup(nullptr) { } bool isPopupVisible() const; void showPopup(); @@ -227,7 +227,7 @@ void QQuickComboBoxPrivate::togglePopup(bool accept) void QQuickComboBoxPrivate::itemClicked() { Q_Q(QQuickComboBox); - int index = delegateModel->indexOf(q->sender(), Q_NULLPTR); + int index = delegateModel->indexOf(q->sender(), nullptr); if (index != -1) { setHighlightedIndex(index); emit q->highlighted(index); @@ -302,10 +302,11 @@ void QQuickComboBoxPrivate::decrease() void QQuickComboBoxPrivate::setHighlightedIndex(int index) { Q_Q(QQuickComboBox); - if (highlightedIndex != index) { - highlightedIndex = index; - emit q->highlightedIndexChanged(); - } + if (highlightedIndex == index) + return; + + highlightedIndex = index; + emit q->highlightedIndexChanged(); } void QQuickComboBoxPrivate::createDelegateModel() @@ -348,7 +349,7 @@ void QQuickComboBoxPrivate::createDelegateModel() QQuickComboBox::QQuickComboBox(QQuickItem *parent) : QQuickControl(*(new QQuickComboBoxPrivate), parent) { - setActiveFocusOnTab(true); + setFocusPolicy(Qt::StrongFocus); setFlag(QQuickItem::ItemIsFocusScope); setAcceptedMouseButtons(Qt::LeftButton); } @@ -357,7 +358,7 @@ QQuickComboBox::~QQuickComboBox() { Q_D(QQuickComboBox); delete d->popup; - d->popup = Q_NULLPTR; + d->popup = nullptr; } /*! @@ -403,15 +404,16 @@ void QQuickComboBox::setModel(const QVariant& m) if (model.userType() == qMetaTypeId<QJSValue>()) model = model.value<QJSValue>().toVariant(); - if (d->model != model) { - d->model = model; - d->createDelegateModel(); - if (isComponentComplete()) { - setCurrentIndex(count() > 0 ? 0 : -1); - d->updateCurrentText(); - } - emit modelChanged(); + if (d->model == model) + return; + + d->model = model; + d->createDelegateModel(); + if (isComponentComplete()) { + setCurrentIndex(count() > 0 ? 0 : -1); + d->updateCurrentText(); } + emit modelChanged(); } /*! @@ -440,10 +442,11 @@ bool QQuickComboBox::isPressed() const void QQuickComboBox::setPressed(bool pressed) { Q_D(QQuickComboBox); - if (d->pressed != pressed) { - d->pressed = pressed; - emit pressedChanged(); - } + if (d->pressed == pressed) + return; + + d->pressed = pressed; + emit pressedChanged(); } /*! @@ -476,12 +479,13 @@ int QQuickComboBox::currentIndex() const void QQuickComboBox::setCurrentIndex(int index) { Q_D(QQuickComboBox); - if (d->currentIndex != index) { - d->currentIndex = index; - emit currentIndexChanged(); - if (isComponentComplete()) - d->updateCurrentText(); - } + if (d->currentIndex == index) + return; + + d->currentIndex = index; + emit currentIndexChanged(); + if (isComponentComplete()) + d->updateCurrentText(); } /*! @@ -527,19 +531,21 @@ void QQuickComboBox::setDisplayText(const QString &text) { Q_D(QQuickComboBox); d->hasDisplayText = true; - if (d->displayText != text) { - d->displayText = text; - emit displayTextChanged(); - } + if (d->displayText == text) + return; + + d->displayText = text; + emit displayTextChanged(); } void QQuickComboBox::resetDisplayText() { Q_D(QQuickComboBox); - if (d->hasDisplayText) { - d->hasDisplayText = false; - d->updateCurrentText(); - } + if (!d->hasDisplayText) + return; + + d->hasDisplayText = false; + d->updateCurrentText(); } /*! @@ -558,12 +564,13 @@ QString QQuickComboBox::textRole() const void QQuickComboBox::setTextRole(const QString &role) { Q_D(QQuickComboBox); - if (d->textRole != role) { - d->textRole = role; - if (isComponentComplete()) - d->updateCurrentText(); - emit textRoleChanged(); - } + if (d->textRole == role) + return; + + d->textRole = role; + if (isComponentComplete()) + d->updateCurrentText(); + emit textRoleChanged(); } /*! @@ -582,14 +589,15 @@ QQmlComponent *QQuickComboBox::delegate() const void QQuickComboBox::setDelegate(QQmlComponent* delegate) { Q_D(QQuickComboBox); - if (d->delegate != delegate) { - delete d->delegate; - d->delegate = delegate; - QQmlDelegateModel *delegateModel = qobject_cast<QQmlDelegateModel*>(d->delegateModel); - if (delegateModel) - delegateModel->setDelegate(d->delegate); - emit delegateChanged(); - } + if (d->delegate == delegate) + return; + + delete d->delegate; + d->delegate = delegate; + QQmlDelegateModel *delegateModel = qobject_cast<QQmlDelegateModel*>(d->delegateModel); + if (delegateModel) + delegateModel->setDelegate(d->delegate); + emit delegateChanged(); } /*! @@ -608,13 +616,14 @@ QQuickPopup *QQuickComboBox::popup() const void QQuickComboBox::setPopup(QQuickPopup *popup) { Q_D(QQuickComboBox); - if (d->popup != popup) { - delete d->popup; - if (popup) - popup->setClosePolicy(QQuickPopup::OnEscape | QQuickPopup::OnPressOutsideParent); - d->popup = popup; - emit popupChanged(); - } + if (d->popup == popup) + return; + + delete d->popup; + if (popup) + popup->setClosePolicy(QQuickPopup::OnEscape | QQuickPopup::OnPressOutsideParent); + d->popup = popup; + emit popupChanged(); } /*! @@ -696,6 +705,28 @@ int QQuickComboBox::find(const QString &text, Qt::MatchFlags flags) const return -1; } +/*! + \qmlmethod void Qt.labs.controls::ComboBox::increase() + + Select next value. +*/ +void QQuickComboBox::increase() +{ + Q_D(QQuickComboBox); + d->increase(); +} + +/*! + \qmlmethod void Qt.labs.controls::ComboBox::decrease() + + Select previous value. +*/ +void QQuickComboBox::decrease() +{ + Q_D(QQuickComboBox); + d->decrease(); +} + void QQuickComboBox::focusOutEvent(QFocusEvent *event) { Q_D(QQuickComboBox); @@ -787,8 +818,6 @@ void QQuickComboBox::mouseReleaseEvent(QMouseEvent *event) QQuickControl::mouseReleaseEvent(event); if (d->pressed) { setPressed(false); - if (!d->isPopupVisible()) - forceActiveFocus(Qt::MouseFocusReason); d->togglePopup(false); } } @@ -799,6 +828,20 @@ void QQuickComboBox::mouseUngrabEvent() setPressed(false); } +void QQuickComboBox::wheelEvent(QWheelEvent *event) +{ + Q_D(QQuickComboBox); + QQuickControl::wheelEvent(event); + if (d->wheelEnabled && !d->isPopupVisible()) { + const int oldIndex = d->currentIndex; + if (event->angleDelta().y() > 0) + d->decrease(); + else + d->increase(); + event->setAccepted(d->currentIndex != oldIndex); + } +} + void QQuickComboBox::componentComplete() { Q_D(QQuickComboBox); |