diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-01-26 11:46:56 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-01-26 11:46:56 +0100 |
commit | 9225ac7348c9023093b6ef8d4519087c7dddeaa2 (patch) | |
tree | 4660e25bd5cfd4a2a40b0ad97ea689c4acb22a8c /src/imports | |
parent | 9d8fe2ac121162c15be6728495be2235b728325a (diff) | |
parent | 0076c44d3993f377ad6417d3bb08109b608dfbd2 (diff) |
Merge remote-tracking branch 'origin/dev' into wip/pointerhandler
Change-Id: I7962fd2282792c43af69784c8e98fb050fd928a7
Diffstat (limited to 'src/imports')
-rw-r--r-- | src/imports/imports.pro | 4 | ||||
-rw-r--r-- | src/imports/layouts/qquicklayout.cpp | 29 | ||||
-rw-r--r-- | src/imports/layouts/qquicklayout_p.h | 2 | ||||
-rw-r--r-- | src/imports/layouts/qquicklayoutstyleinfo.cpp | 2 | ||||
-rw-r--r-- | src/imports/layouts/qquicklinearlayout.cpp | 36 | ||||
-rw-r--r-- | src/imports/layouts/qquicklinearlayout_p.h | 2 | ||||
-rw-r--r-- | src/imports/layouts/qquickstacklayout.cpp | 6 | ||||
-rw-r--r-- | src/imports/statemachine/signaltransition.cpp | 2 | ||||
-rw-r--r-- | src/imports/statemachine/state.cpp | 2 | ||||
-rw-r--r-- | src/imports/statemachine/statemachine.cpp | 2 | ||||
-rw-r--r-- | src/imports/statemachine/timeouttransition.cpp | 2 | ||||
-rw-r--r-- | src/imports/xmllistmodel/qqmlxmllistmodel.cpp | 8 | ||||
-rw-r--r-- | src/imports/xmllistmodel/qqmlxmllistmodel_p.h | 4 |
13 files changed, 61 insertions, 40 deletions
diff --git a/src/imports/imports.pro b/src/imports/imports.pro index 7d5596e86e..0d84bf538f 100644 --- a/src/imports/imports.pro +++ b/src/imports/imports.pro @@ -5,10 +5,10 @@ SUBDIRS += \ qtqml \ folderlistmodel \ localstorage \ - models \ - statemachine + models qtConfig(settings): SUBDIRS += settings +qtConfig(statemachine): SUBDIRS += statemachine qtHaveModule(quick) { SUBDIRS += \ diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp index 3786d21727..55ee3b63c6 100644 --- a/src/imports/layouts/qquicklayout.cpp +++ b/src/imports/layouts/qquicklayout.cpp @@ -42,6 +42,7 @@ #include <QtCore/qcoreapplication.h> #include <QtCore/private/qnumeric_p.h> #include <QtCore/qmath.h> +#include <QtQml/qqmlinfo.h> #include <limits> /*! @@ -678,7 +679,7 @@ QQuickLayout *QQuickLayoutAttached::parentLayout() const parentItem = parentItem->parentItem(); return qobject_cast<QQuickLayout *>(parentItem); } else { - qWarning("Layout must be attached to Item elements"); + qmlWarning(parent()) << "Layout must be attached to Item elements"; } return 0; } @@ -762,9 +763,11 @@ bool QQuickLayout::shouldIgnoreItem(QQuickItem *child, QQuickLayoutAttached *&in void QQuickLayout::itemChange(ItemChange change, const ItemChangeData &value) { if (change == ItemChildAddedChange) { + Q_D(QQuickLayout); QQuickItem *item = value.item; qmlobject_connect(item, QQuickItem, SIGNAL(baselineOffsetChanged(qreal)), this, QQuickLayout, SLOT(invalidateSenderItem())); QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::SiblingOrder | QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight | QQuickItemPrivate::Destroyed | QQuickItemPrivate::Visibility); + d->m_hasItemChangeListeners = true; if (isReady()) updateLayoutItems(); } else if (change == ItemChildRemovedChange) { @@ -802,6 +805,30 @@ bool QQuickLayout::isReady() const return d_func()->m_isReady; } +/*! + * \brief QQuickLayout::deactivateRecur + * \internal + * + * Call this from the dtor of the top-level layout. + * Otherwise, it will trigger lots of unneeded item change listeners (itemVisibleChanged()) for all its descendants + * that will have its impact thrown away. + */ +void QQuickLayout::deactivateRecur() +{ + if (d_func()->m_hasItemChangeListeners) { + for (int i = 0; i < itemCount(); ++i) { + QQuickItem *item = itemAt(i); + // When deleting a layout with children, there is no reason for the children to inform the layout that their + // e.g. visibility got changed. The layout already knows that all its children will eventually become invisible, so + // we therefore remove its change listener. + QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::SiblingOrder | QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight | QQuickItemPrivate::Destroyed | QQuickItemPrivate::Visibility); + if (QQuickLayout *layout = qobject_cast<QQuickLayout*>(item)) + layout->deactivateRecur(); + } + d_func()->m_hasItemChangeListeners = false; + } +} + void QQuickLayout::itemSiblingOrderChanged(QQuickItem *item) { Q_UNUSED(item); diff --git a/src/imports/layouts/qquicklayout_p.h b/src/imports/layouts/qquicklayout_p.h index eece6f8658..113498eb2b 100644 --- a/src/imports/layouts/qquicklayout_p.h +++ b/src/imports/layouts/qquicklayout_p.h @@ -95,6 +95,7 @@ public: void itemChange(ItemChange change, const ItemChangeData &value) Q_DECL_OVERRIDE; void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; bool isReady() const; + void deactivateRecur(); /* QQuickItemChangeListener */ @@ -134,6 +135,7 @@ public: protected: unsigned m_isReady : 1; unsigned m_disableRearrange : 1; + unsigned m_hasItemChangeListeners : 1; // if false, we don't need to remove its item change listeners... mutable QSet<QQuickItem *> m_ignoredItems; }; diff --git a/src/imports/layouts/qquicklayoutstyleinfo.cpp b/src/imports/layouts/qquicklayoutstyleinfo.cpp index c33ceffb2d..5c8be8f306 100644 --- a/src/imports/layouts/qquicklayoutstyleinfo.cpp +++ b/src/imports/layouts/qquicklayoutstyleinfo.cpp @@ -50,7 +50,7 @@ QQuickLayoutStyleInfo::QQuickLayoutStyleInfo() qreal QQuickLayoutStyleInfo::spacing(Qt::Orientation /*orientation*/) const { -#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(Q_OS_BLACKBERRY) || defined(Q_OS_QNX) || defined(Q_OS_WINRT) +#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(Q_OS_QNX) || defined(Q_OS_WINRT) // On Android and iOS the default spacing between each UI element is 8dp qreal spacing = 8.0; #else diff --git a/src/imports/layouts/qquicklinearlayout.cpp b/src/imports/layouts/qquicklinearlayout.cpp index 13fdd496c2..887b9b1fa1 100644 --- a/src/imports/layouts/qquicklinearlayout.cpp +++ b/src/imports/layouts/qquicklinearlayout.cpp @@ -41,6 +41,7 @@ #include "qquickgridlayoutengine_p.h" #include "qquicklayoutstyleinfo_p.h" #include <QtCore/private/qnumeric_p.h> +#include <QtQml/qqmlinfo.h> #include "qdebug.h" #include <limits> @@ -305,11 +306,7 @@ QQuickGridLayoutBase::~QQuickGridLayoutBase() // Remove item listeners so we do not act on signalling unnecessarily // (there is no point, as the layout will be torn down anyway). - for (int i = 0; i < itemCount(); ++i) { - QQuickItem *item = itemAt(i); - QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::SiblingOrder | QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight | QQuickItemPrivate::Destroyed | QQuickItemPrivate::Visibility); - } - + deactivateRecur(); delete d->styleInfo; } @@ -668,34 +665,25 @@ void QQuickGridLayout::insertLayoutItems() int &columnSpan = span[0]; int &rowSpan = span[1]; - bool invalidRowColumn = false; if (info) { if (info->isRowSet() || info->isColumnSet()) { // If row is specified and column is not specified (or vice versa), // the unspecified component of the cell position should default to 0 - row = column = 0; - if (info->isRowSet()) { - row = info->row(); - invalidRowColumn = row < 0; - } - if (info->isColumnSet()) { - column = info->column(); - invalidRowColumn = column < 0; - } - } - if (invalidRowColumn) { - qWarning("QQuickGridLayoutBase::insertLayoutItems: invalid row/column: %d", - row < 0 ? row : column); - return; + // The getters do this for us, as they will return 0 for an + // unset (or negative) value. + row = info->row(); + column = info->column(); } rowSpan = info->rowSpan(); columnSpan = info->columnSpan(); - if (columnSpan < 1 || rowSpan < 1) { - qWarning("QQuickGridLayoutBase::addItem: invalid row span/column span: %d", - rowSpan < 1 ? rowSpan : columnSpan); + if (columnSpan < 1) { + qmlWarning(child) << "Layout: invalid column span: " << columnSpan; return; - } + } else if (rowSpan < 1) { + qmlWarning(child) << "Layout: invalid row span: " << rowSpan; + return; + } alignment = info->alignment(); } diff --git a/src/imports/layouts/qquicklinearlayout_p.h b/src/imports/layouts/qquicklinearlayout_p.h index b425df0fa4..f796c8a855 100644 --- a/src/imports/layouts/qquicklinearlayout_p.h +++ b/src/imports/layouts/qquicklinearlayout_p.h @@ -152,8 +152,8 @@ public: int rows() const; void setRows(int rows); - Q_ENUMS(Flow) enum Flow { LeftToRight, TopToBottom }; + Q_ENUM(Flow) Flow flow() const; void setFlow(Flow flow); diff --git a/src/imports/layouts/qquickstacklayout.cpp b/src/imports/layouts/qquickstacklayout.cpp index a223dd0374..0bfe63816d 100644 --- a/src/imports/layouts/qquickstacklayout.cpp +++ b/src/imports/layouts/qquickstacklayout.cpp @@ -307,7 +307,11 @@ void QQuickStackLayout::rearrange(const QSizeF &newSize) QQuickItem *item = itemAt(d->currentIndex); Q_ASSERT(item); item->setPosition(QPointF(0,0)); // ### respect alignment? - item->setSize(newSize.expandedTo(hints.min()).boundedTo(hints.max())); + const QSizeF oldSize(item->width(), item->height()); + const QSizeF effectiveNewSize = newSize.expandedTo(hints.min()).boundedTo(hints.max()); + item->setSize(effectiveNewSize); + if (effectiveNewSize == oldSize) + item->polish(); QQuickLayout::rearrange(newSize); } diff --git a/src/imports/statemachine/signaltransition.cpp b/src/imports/statemachine/signaltransition.cpp index 2e6381fc08..44fbf69431 100644 --- a/src/imports/statemachine/signaltransition.cpp +++ b/src/imports/statemachine/signaltransition.cpp @@ -127,7 +127,7 @@ void SignalTransition::setSignal(const QJSValue &signal) Q_ASSERT(sender); signalMethod = sender->metaObject()->method(signalObject->signalIndex()); } else { - qmlInfo(this) << tr("Specified signal does not exist."); + qmlWarning(this) << tr("Specified signal does not exist."); return; } diff --git a/src/imports/statemachine/state.cpp b/src/imports/statemachine/state.cpp index 09d246cc1e..f1294b0de0 100644 --- a/src/imports/statemachine/state.cpp +++ b/src/imports/statemachine/state.cpp @@ -54,7 +54,7 @@ void State::componentComplete() static bool once = false; if (!once) { once = true; - qmlInfo(this) << "No top level StateMachine found. Nothing will run without a StateMachine."; + qmlWarning(this) << "No top level StateMachine found. Nothing will run without a StateMachine."; } } } diff --git a/src/imports/statemachine/statemachine.cpp b/src/imports/statemachine/statemachine.cpp index 76de01fe94..a9ea5f7a95 100644 --- a/src/imports/statemachine/statemachine.cpp +++ b/src/imports/statemachine/statemachine.cpp @@ -69,7 +69,7 @@ void StateMachine::setRunning(bool running) void StateMachine::componentComplete() { if (QStateMachine::initialState() == NULL && childMode() == QState::ExclusiveStates) - qmlInfo(this) << "No initial state set for StateMachine"; + qmlWarning(this) << "No initial state set for StateMachine"; // Everything is proper setup, now start the state-machine if we got // asked to do so. diff --git a/src/imports/statemachine/timeouttransition.cpp b/src/imports/statemachine/timeouttransition.cpp index 4bb1df3c28..0d208b919b 100644 --- a/src/imports/statemachine/timeouttransition.cpp +++ b/src/imports/statemachine/timeouttransition.cpp @@ -72,7 +72,7 @@ void TimeoutTransition::componentComplete() { QState *state = qobject_cast<QState*>(parent()); if (!state) { - qmlInfo(this) << "Parent needs to be a State"; + qmlWarning(this) << "Parent needs to be a State"; return; } diff --git a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp index 4306f477e9..61c8665a14 100644 --- a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp +++ b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp @@ -596,7 +596,7 @@ void QQuickXmlListModelPrivate::append_role(QQmlListProperty<QQuickXmlListModelR int i = _this->d_func()->roleObjects.count(); _this->d_func()->roleObjects.append(role); if (_this->d_func()->roleNames.contains(role->name())) { - qmlInfo(role) << QQuickXmlListModel::tr("\"%1\" duplicates a previous role name and will be disabled.").arg(role->name()); + qmlWarning(role) << QQuickXmlListModel::tr("\"%1\" duplicates a previous role name and will be disabled.").arg(role->name()); return; } _this->d_func()->roles.insert(i, _this->d_func()->highestRole); @@ -847,7 +847,7 @@ void QQuickXmlListModel::setQuery(const QString &query) { Q_D(QQuickXmlListModel); if (!query.startsWith(QLatin1Char('/'))) { - qmlInfo(this) << QCoreApplication::translate("QQuickXmlRoleList", "An XmlListModel query must start with '/' or \"//\""); + qmlWarning(this) << QCoreApplication::translate("QQuickXmlRoleList", "An XmlListModel query must start with '/' or \"//\""); return; } @@ -1136,11 +1136,11 @@ void QQuickXmlListModel::queryError(void* object, const QString& error) Q_D(QQuickXmlListModel); for (int i=0; i<d->roleObjects.count(); i++) { if (d->roleObjects.at(i) == static_cast<QQuickXmlListModelRole*>(object)) { - qmlInfo(d->roleObjects.at(i)) << QQuickXmlListModel::tr("invalid query: \"%1\"").arg(error); + qmlWarning(d->roleObjects.at(i)) << QQuickXmlListModel::tr("invalid query: \"%1\"").arg(error); return; } } - qmlInfo(this) << QQuickXmlListModel::tr("invalid query: \"%1\"").arg(error); + qmlWarning(this) << QQuickXmlListModel::tr("invalid query: \"%1\"").arg(error); } void QQuickXmlListModel::queryCompleted(const QQuickXmlQueryResult &result) diff --git a/src/imports/xmllistmodel/qqmlxmllistmodel_p.h b/src/imports/xmllistmodel/qqmlxmllistmodel_p.h index 3a4487a085..e6a0898bb9 100644 --- a/src/imports/xmllistmodel/qqmlxmllistmodel_p.h +++ b/src/imports/xmllistmodel/qqmlxmllistmodel_p.h @@ -79,7 +79,6 @@ class QQuickXmlListModel : public QAbstractListModel, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) - Q_ENUMS(Status) Q_PROPERTY(Status status READ status NOTIFY statusChanged) Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged) @@ -119,6 +118,7 @@ public: Q_INVOKABLE QQmlV4Handle get(int index) const; enum Status { Null, Ready, Loading, Error }; + Q_ENUM(Status) Status status() const; qreal progress() const; @@ -177,7 +177,7 @@ public: void setQuery(const QString &query) { if (query.startsWith(QLatin1Char('/'))) { - qmlInfo(this) << tr("An XmlRole query must not start with '/'"); + qmlWarning(this) << tr("An XmlRole query must not start with '/'"); return; } if (m_query == query) |