aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates/qquickcombobox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/templates/qquickcombobox.cpp')
-rw-r--r--src/templates/qquickcombobox.cpp163
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);