aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickmenu.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-06-15 11:41:19 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-06-15 11:41:19 +0200
commitb669a429d0b2d4c58d47a6b3513d12ca57cf8fb6 (patch)
tree0316635d6ebebb2f0fe3667016828d291af0c419 /src/quicktemplates2/qquickmenu.cpp
parenta8dd4f7d5b8f61b52a5aea7b8418a6a3961cae1e (diff)
parent513363e940e0978931083544374bfe092107b9fb (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: src/imports/controls/ButtonGroup.qml tests/auto/controls/data/tst_container.qml tests/auto/menu/tst_menu.cpp Change-Id: Ie8ee7e4f83f3fda6a09507b060576ebda929a7cd
Diffstat (limited to 'src/quicktemplates2/qquickmenu.cpp')
-rw-r--r--src/quicktemplates2/qquickmenu.cpp42
1 files changed, 32 insertions, 10 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp
index 5a2ad066..8639e504 100644
--- a/src/quicktemplates2/qquickmenu.cpp
+++ b/src/quicktemplates2/qquickmenu.cpp
@@ -330,10 +330,14 @@ void QQuickMenuPrivate::itemSiblingOrderChanged(QQuickItem *)
// reorder the restacked items (eg. by a Repeater)
Q_Q(QQuickMenu);
QList<QQuickItem *> siblings = contentItem->childItems();
+
+ int to = 0;
for (int i = 0; i < siblings.count(); ++i) {
QQuickItem* sibling = siblings.at(i);
+ if (QQuickItemPrivate::get(sibling)->isTransparentForPositioner())
+ continue;
int index = contentModel->indexOf(sibling, nullptr);
- q->moveItem(index, i);
+ q->moveItem(index, to++);
}
}
@@ -513,6 +517,31 @@ void QQuickMenuPrivate::setCurrentIndex(int index)
}
}
+void QQuickMenuPrivate::activateNextItem()
+{
+ int index = currentIndex();
+ int count = contentModel->count();
+ while (++index < count) {
+ QQuickItem *item = itemAt(index);
+ if (!item || !item->activeFocusOnTab())
+ continue;
+ item->forceActiveFocus(Qt::TabFocusReason);
+ break;
+ }
+}
+
+void QQuickMenuPrivate::activatePreviousItem()
+{
+ int index = currentIndex();
+ while (--index >= 0) {
+ QQuickItem *item = itemAt(index);
+ if (!item || !item->activeFocusOnTab())
+ continue;
+ item->forceActiveFocus(Qt::BacktabFocusReason);
+ break;
+ }
+}
+
void QQuickMenuPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj)
{
QQuickMenu *q = qobject_cast<QQuickMenu *>(prop->object);
@@ -1158,13 +1187,11 @@ void QQuickMenu::keyReleaseEvent(QKeyEvent *event)
// shown at once.
switch (event->key()) {
case Qt::Key_Up:
- if (d->contentItem->metaObject()->indexOfMethod("decrementCurrentIndex()") != -1)
- QMetaObject::invokeMethod(d->contentItem, "decrementCurrentIndex");
+ d->activatePreviousItem();
break;
case Qt::Key_Down:
- if (d->contentItem->metaObject()->indexOfMethod("incrementCurrentIndex()") != -1)
- QMetaObject::invokeMethod(d->contentItem, "incrementCurrentIndex");
+ d->activateNextItem();
break;
case Qt::Key_Left:
@@ -1180,11 +1207,6 @@ void QQuickMenu::keyReleaseEvent(QKeyEvent *event)
default:
break;
}
-
- int index = d->currentIndex();
- QQuickItem *item = itemAt(index);
- if (item)
- item->forceActiveFocus();
}
void QQuickMenu::timerEvent(QTimerEvent *event)