diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-10-31 01:01:32 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-10-31 09:44:09 +0100 |
commit | 9c050d452961f348c8bcc33e3422aed6316bb18b (patch) | |
tree | b8af41758d885bfad84ccbd52e24eb1544908fda /src | |
parent | 59760e6ce0da6780fcbdf0b2dc123f989baaa3eb (diff) | |
parent | bcbc3c9cec1f7d7bb8c9d5f5ea94eb5c81ec2853 (diff) |
Merge remote-tracking branch 'origin/5.13' into 5.14
Conflicts:
.qmake.conf
src/qml/common/qv4compileddata_p.h
src/qml/types/qqmlbind.cpp
tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
Change-Id: I6a137907e63445f17a3d6181b832a6bd76135bb2
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/layouts/qquicklinearlayout.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmlproperty.cpp | 12 | ||||
-rw-r--r-- | src/quick/items/qquickdrag.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquickevents.cpp | 8 | ||||
-rw-r--r-- | src/quick/items/qquickitem.cpp | 21 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 34 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquickloader.cpp | 3 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 4 |
9 files changed, 63 insertions, 29 deletions
diff --git a/src/imports/layouts/qquicklinearlayout.cpp b/src/imports/layouts/qquicklinearlayout.cpp index fa51ef1f2f..2e3b12064b 100644 --- a/src/imports/layouts/qquicklinearlayout.cpp +++ b/src/imports/layouts/qquicklinearlayout.cpp @@ -283,8 +283,11 @@ Qt::LayoutDirection QQuickGridLayoutBase::layoutDirection() const void QQuickGridLayoutBase::setLayoutDirection(Qt::LayoutDirection dir) { Q_D(QQuickGridLayoutBase); + if (d->m_layoutDirection == dir) + return; d->m_layoutDirection = dir; invalidate(); + emit layoutDirectionChanged(); } Qt::LayoutDirection QQuickGridLayoutBase::effectiveLayoutDirection() const @@ -524,6 +527,7 @@ void QQuickGridLayout::setColumnSpacing(qreal spacing) d->engine.setSpacing(spacing, Qt::Horizontal); invalidate(); + emit columnSpacingChanged(); } /*! @@ -546,6 +550,7 @@ void QQuickGridLayout::setRowSpacing(qreal spacing) d->engine.setSpacing(spacing, Qt::Vertical); invalidate(); + emit rowSpacingChanged(); } /*! @@ -817,6 +822,7 @@ void QQuickLinearLayout::setSpacing(qreal space) d->engine.setSpacing(space, Qt::Horizontal | Qt::Vertical); invalidate(); + emit spacingChanged(); } void QQuickLinearLayout::insertLayoutItems() diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index b6baa86bd7..f5aae8f462 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -63,6 +63,7 @@ #include <private/qqmlvaluetypewrapper_p.h> #include <QtCore/qdebug.h> #include <cmath> +#include <QtQml/QQmlPropertyMap> Q_DECLARE_METATYPE(QList<int>) Q_DECLARE_METATYPE(QList<qreal>) @@ -331,10 +332,15 @@ void QQmlPropertyPrivate::initProperty(QObject *obj, const QString &name) return; } else { - if (!property->isQObject()) - return; // Not an object property + if (!property->isQObject()) { + if (auto asPropertyMap = qobject_cast<QQmlPropertyMap*>(currentObject)) + currentObject = asPropertyMap->value(path.at(ii).toString()).value<QObject*>(); + else + return; // Not an object property, and not a property map + } else { + property->readProperty(currentObject, ¤tObject); + } - property->readProperty(currentObject, ¤tObject); if (!currentObject) return; // No value } diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp index 8fe1929a2c..7c6f1caa54 100644 --- a/src/quick/items/qquickdrag.cpp +++ b/src/quick/items/qquickdrag.cpp @@ -440,7 +440,7 @@ void QQuickDragAttached::setImageSource(const QUrl &url) if (url.isEmpty()) { d->pixmapLoader.clear(); } else { - d->pixmapLoader.load(qmlEngine(this), url); + d->pixmapLoader.load(qmlEngine(parent()), url); } Q_EMIT imageSourceChanged(); diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index f9a8c77a7f..0c697739fa 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -1942,6 +1942,10 @@ Q_QUICK_PRIVATE_EXPORT QDebug operator<<(QDebug dbg, const QQuickPointerEvent *e { QDebugStateSaver saver(dbg); dbg.nospace(); + if (!event) { + dbg << "QQuickPointerEvent(0)"; + return dbg; + } dbg << "QQuickPointerEvent("; dbg << event->timestamp(); dbg << " dev:"; @@ -1962,6 +1966,10 @@ Q_QUICK_PRIVATE_EXPORT QDebug operator<<(QDebug dbg, const QQuickEventPoint *eve { QDebugStateSaver saver(dbg); dbg.nospace(); + if (!event) { + dbg << "QQuickEventPoint(0)"; + return dbg; + } dbg << "QQuickEventPoint(accepted:" << event->isAccepted() << " state:"; QtDebugUtils::formatQEnum(dbg, event->state()); diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index c6a19219ff..0e035af9a6 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -2748,22 +2748,35 @@ void QQuickItem::setParentItem(QQuickItem *parentItem) } QQuickWindow *parentWindow = parentItem ? QQuickItemPrivate::get(parentItem)->window : nullptr; + bool alreadyAddedChild = false; if (d->window == parentWindow) { // Avoid freeing and reallocating resources if the window stays the same. d->parentItem = parentItem; } else { - if (d->window) - d->derefWindow(); + auto oldParentItem = d->parentItem; d->parentItem = parentItem; + if (d->parentItem) { + QQuickItemPrivate::get(d->parentItem)->addChild(this); + alreadyAddedChild = true; + } + if (d->window) { + d->derefWindow(); + // as we potentially changed d->parentWindow above + // the check in derefWindow could not work + // thus, we redo it here with the old parent + if (!oldParentItem) { + QQuickWindowPrivate::get(d->window)->parentlessItems.remove(this); + } + } if (parentWindow) d->refWindow(parentWindow); } d->dirty(QQuickItemPrivate::ParentChanged); - if (d->parentItem) + if (d->parentItem && !alreadyAddedChild) QQuickItemPrivate::get(d->parentItem)->addChild(this); - else if (d->window) + else if (d->window && !alreadyAddedChild) QQuickWindowPrivate::get(d->window)->parentlessItems.insert(this); d->setEffectiveVisibleRecur(d->calcEffectiveVisible()); diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index fccd467274..661f19509a 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1581,9 +1581,7 @@ FxViewItem *QQuickItemViewPrivate::visibleItem(int modelIndex) const { return nullptr; } -// should rename to firstItemInView() to avoid confusion with other "*visible*" methods -// that don't look at the view position and size -FxViewItem *QQuickItemViewPrivate::firstVisibleItem() const { +FxViewItem *QQuickItemViewPrivate::firstItemInView() const { const qreal pos = isContentFlowReversed() ? -position()-size() : position(); for (FxViewItem *item : visibleItems) { if (item->index != -1 && item->endPosition() > pos) @@ -1955,22 +1953,22 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult bool viewportChanged = !currentChanges.pendingChanges.removes().isEmpty() || !currentChanges.pendingChanges.inserts().isEmpty(); - FxViewItem *prevFirstVisible = firstVisibleItem(); - QQmlNullableValue<qreal> prevViewPos; - int prevFirstVisibleIndex = -1; - if (prevFirstVisible) { - prevViewPos = prevFirstVisible->position(); - prevFirstVisibleIndex = prevFirstVisible->index; + FxViewItem *prevFirstItemInView = firstItemInView(); + QQmlNullableValue<qreal> prevFirstItemInViewPos; + int prevFirstItemInViewIndex = -1; + if (prevFirstItemInView) { + prevFirstItemInViewPos = prevFirstItemInView->position(); + prevFirstItemInViewIndex = prevFirstItemInView->index; } qreal prevVisibleItemsFirstPos = visibleItems.count() ? visibleItems.constFirst()->position() : 0.0; - totalInsertionResult->visiblePos = prevViewPos; - totalRemovalResult->visiblePos = prevViewPos; + totalInsertionResult->visiblePos = prevFirstItemInViewPos; + totalRemovalResult->visiblePos = prevFirstItemInViewPos; const QVector<QQmlChangeSet::Change> &removals = currentChanges.pendingChanges.removes(); const QVector<QQmlChangeSet::Change> &insertions = currentChanges.pendingChanges.inserts(); - ChangeResult insertionResult(prevViewPos); - ChangeResult removalResult(prevViewPos); + ChangeResult insertionResult(prevFirstItemInViewPos); + ChangeResult removalResult(prevFirstItemInViewPos); int removedCount = 0; for (const QQmlChangeSet::Change &r : removals) { @@ -1979,7 +1977,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult visibleAffected = true; if (!visibleAffected && needsRefillForAddedOrRemovedIndex(r.index)) visibleAffected = true; - const int correctedFirstVisibleIndex = prevFirstVisibleIndex - removalResult.countChangeBeforeVisible; + const int correctedFirstVisibleIndex = prevFirstItemInViewIndex - removalResult.countChangeBeforeVisible; if (correctedFirstVisibleIndex >= 0 && r.index < correctedFirstVisibleIndex) { if (r.index + r.count < correctedFirstVisibleIndex) removalResult.countChangeBeforeVisible += r.count; @@ -2006,7 +2004,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult // set positions correctly for the next insertion if (!insertions.isEmpty()) { - repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult); layoutVisibleItems(removals.first().index); } } @@ -2026,7 +2024,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult // set positions correctly for the next insertion if (i < insertions.count() - 1) { - repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult); layoutVisibleItems(insertions[i].index); } itemCount += insertions[i].count; @@ -2043,7 +2041,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult for (const MovedItem &m : qAsConst(movingIntoView)) { int fromIndex = findMoveKeyIndex(m.moveKey, removals); if (fromIndex >= 0) { - if (prevFirstVisibleIndex >= 0 && fromIndex < prevFirstVisibleIndex) + if (prevFirstItemInViewIndex >= 0 && fromIndex < prevFirstItemInViewIndex) repositionItemAt(m.item, fromIndex, -totalInsertionResult->sizeChangesAfterVisiblePos); else repositionItemAt(m.item, fromIndex, totalInsertionResult->sizeChangesAfterVisiblePos); @@ -2054,7 +2052,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult // reposition visibleItems.first() correctly so that the content y doesn't jump if (removedCount != prevVisibleItemsCount) - repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstVisible, &insertionResult, &removalResult); + repositionFirstItem(prevVisibleItemsFirst, prevVisibleItemsFirstPos, prevFirstItemInView, &insertionResult, &removalResult); // Whatever removed/moved items remain are no longer visible items. prepareRemoveTransitions(¤tChanges.removedItems); diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 860cf5fa20..6442fee27d 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -158,7 +158,7 @@ public: qreal contentStartOffset() const; int findLastVisibleIndex(int defaultValue = -1) const; FxViewItem *visibleItem(int modelIndex) const; - FxViewItem *firstVisibleItem() const; + FxViewItem *firstItemInView() const; int findLastIndexInView() const; int mapFromModel(int modelIndex) const; diff --git a/src/quick/items/qquickloader.cpp b/src/quick/items/qquickloader.cpp index d0e29c204e..b389e7a11b 100644 --- a/src/quick/items/qquickloader.cpp +++ b/src/quick/items/qquickloader.cpp @@ -590,8 +590,8 @@ void QQuickLoader::setSource(QQmlV4Function *args) d->clear(); QUrl sourceUrl = d->resolveSourceUrl(args); + d->disposeInitialPropertyValues(); if (!ipv->isUndefined()) { - d->disposeInitialPropertyValues(); d->initialPropertyValues.set(args->v4engine(), ipv); } d->qmlCallingContext.set(scope.engine, scope.engine->qmlContext()); @@ -601,6 +601,7 @@ void QQuickLoader::setSource(QQmlV4Function *args) void QQuickLoaderPrivate::disposeInitialPropertyValues() { + initialPropertyValues.clear(); } void QQuickLoaderPrivate::load() diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index c975404d69..083b7dbae1 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -885,7 +885,9 @@ void QQuickWidgetPrivate::createContext() context = new QOpenGLContext; context->setFormat(offscreenWindow->requestedFormat()); - + const QWindow *win = q->window()->windowHandle(); + if (win && win->screen()) + context->setScreen(win->screen()); QOpenGLContext *shareContext = qt_gl_global_share_context(); if (!shareContext) shareContext = QWidgetPrivate::get(q->window())->shareContext(); |