aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates/qquickcontainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/templates/qquickcontainer.cpp')
-rw-r--r--src/templates/qquickcontainer.cpp534
1 files changed, 0 insertions, 534 deletions
diff --git a/src/templates/qquickcontainer.cpp b/src/templates/qquickcontainer.cpp
deleted file mode 100644
index 58337752..00000000
--- a/src/templates/qquickcontainer.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Labs Templates module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later as published by the Free
-** Software Foundation and appearing in the file LICENSE.GPL included in
-** the packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickcontainer_p.h"
-#include "qquickcontainer_p_p.h"
-
-#include <QtQuick/private/qquickflickable_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \qmltype Container
- \inherits Control
- \instantiates QQuickContainer
- \inqmlmodule Qt.labs.controls
- \ingroup qtlabscontrols-containers
- \brief A container control base type.
-
- Container is the base type of container-like user interface controls.
-
- \labs
-
- \sa {Container Controls}
-*/
-
-static QQuickItem *effectiveContentItem(QQuickItem *item)
-{
- QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(item);
- if (flickable)
- return flickable->contentItem();
- return item;
-}
-
-QQuickContainerPrivate::QQuickContainerPrivate() : contentModel(Q_NULLPTR), currentIndex(-1), updatingCurrent(false)
-{
-}
-
-void QQuickContainerPrivate::init()
-{
- Q_Q(QQuickContainer);
- contentModel = new QQmlObjectModel(q);
- QObject::connect(contentModel, &QQmlObjectModel::countChanged, q, &QQuickContainer::countChanged);
- QObject::connect(contentModel, &QQmlObjectModel::childrenChanged, q, &QQuickContainer::contentChildrenChanged);
-}
-
-void QQuickContainerPrivate::cleanup()
-{
- Q_Q(QQuickContainer);
- // ensure correct destruction order (QTBUG-46798)
- const int count = contentModel->count();
- for (int i = 0; i < count; ++i) {
- QQuickItem *item = itemAt(i);
- if (item)
- QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent | QQuickItemPrivate::SiblingOrder);
- }
-
- QQuickItem *focusItem = QQuickItemPrivate::get(contentItem)->subFocusItem;
- if (focusItem && window)
- QQuickWindowPrivate::get(window)->clearFocusInScope(contentItem, focusItem, Qt::OtherFocusReason);
-
- q->contentItemChange(Q_NULLPTR, contentItem);
- delete contentItem;
-
- QObject::disconnect(contentModel, &QQmlObjectModel::countChanged, q, &QQuickContainer::countChanged);
- QObject::disconnect(contentModel, &QQmlObjectModel::childrenChanged, q, &QQuickContainer::contentChildrenChanged);
- delete contentModel;
-}
-
-QQuickItem *QQuickContainerPrivate::itemAt(int index) const
-{
- return qobject_cast<QQuickItem *>(contentModel->get(index));
-}
-
-void QQuickContainerPrivate::insertItem(int index, QQuickItem *item)
-{
- Q_Q(QQuickContainer);
- if (!q->isContent(item))
- return;
- contentData.append(item);
-
- updatingCurrent = true;
-
- item->setParentItem(effectiveContentItem(contentItem));
- QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent | QQuickItemPrivate::SiblingOrder);
- contentModel->insert(index, item);
-
- q->itemAdded(index, item);
-
- if (contentModel->count() == 1 && currentIndex == -1) {
- Q_Q(QQuickContainer);
- q->setCurrentIndex(index);
- }
-
- updatingCurrent = false;
-}
-
-void QQuickContainerPrivate::moveItem(int from, int to)
-{
- Q_Q(QQuickContainer);
- int oldCurrent = currentIndex;
- contentModel->move(from, to);
-
- updatingCurrent = true;
-
- if (from == oldCurrent)
- q->setCurrentIndex(to);
- else if (from < oldCurrent && to >= oldCurrent)
- q->setCurrentIndex(oldCurrent - 1);
- else if (from > oldCurrent && to <= oldCurrent)
- q->setCurrentIndex(oldCurrent + 1);
-
- updatingCurrent = false;
-}
-
-void QQuickContainerPrivate::removeItem(int index, QQuickItem *item)
-{
- Q_Q(QQuickContainer);
- if (!q->isContent(item))
- return;
- contentData.removeOne(item);
-
- updatingCurrent = true;
-
- bool currentChanged = false;
- if (index == currentIndex) {
- q->setCurrentIndex(currentIndex - 1);
- } else if (index < currentIndex) {
- --currentIndex;
- currentChanged = true;
- }
-
- QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent | QQuickItemPrivate::SiblingOrder);
- item->setParentItem(Q_NULLPTR);
- contentModel->remove(index);
-
- q->itemRemoved(index, item);
-
- if (currentChanged)
- emit q->currentIndexChanged();
-
- updatingCurrent = false;
-}
-
-void QQuickContainerPrivate::_q_currentIndexChanged()
-{
- Q_Q(QQuickContainer);
- if (!updatingCurrent)
- q->setCurrentIndex(contentItem ? contentItem->property("currentIndex").toInt() : -1);
-}
-
-void QQuickContainerPrivate::itemChildAdded(QQuickItem *, QQuickItem *child)
-{
- // add dynamically reparented items (eg. by a Repeater)
- if (!QQuickItemPrivate::get(child)->isTransparentForPositioner() && !contentData.contains(child))
- insertItem(contentModel->count(), child);
-}
-
-void QQuickContainerPrivate::itemParentChanged(QQuickItem *item, QQuickItem *parent)
-{
- // remove dynamically unparented items (eg. by a Repeater)
- if (!parent)
- removeItem(contentModel->indexOf(item, Q_NULLPTR), item);
-}
-
-void QQuickContainerPrivate::itemSiblingOrderChanged(QQuickItem *)
-{
- // reorder the restacked items (eg. by a Repeater)
- Q_Q(QQuickContainer);
- QList<QQuickItem *> siblings = effectiveContentItem(contentItem)->childItems();
- for (int i = 0; i < siblings.count(); ++i) {
- QQuickItem* sibling = siblings.at(i);
- int index = contentModel->indexOf(sibling, Q_NULLPTR);
- q->moveItem(index, i);
- }
-}
-
-void QQuickContainerPrivate::itemDestroyed(QQuickItem *item)
-{
- int index = contentModel->indexOf(item, Q_NULLPTR);
- if (index != -1)
- removeItem(index, item);
-}
-
-void QQuickContainerPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj)
-{
- QQuickContainerPrivate *p = static_cast<QQuickContainerPrivate *>(prop->data);
- QQuickContainer *q = static_cast<QQuickContainer *>(prop->object);
- QQuickItem *item = qobject_cast<QQuickItem *>(obj);
- if (item) {
- if (QQuickItemPrivate::get(item)->isTransparentForPositioner())
- item->setParentItem(effectiveContentItem(p->contentItem));
- else if (p->contentModel->indexOf(item, Q_NULLPTR) == -1)
- q->addItem(item);
- } else {
- p->contentData.append(obj);
- }
-}
-
-int QQuickContainerPrivate::contentData_count(QQmlListProperty<QObject> *prop)
-{
- QQuickContainerPrivate *p = static_cast<QQuickContainerPrivate *>(prop->data);
- return p->contentData.count();
-}
-
-QObject *QQuickContainerPrivate::contentData_at(QQmlListProperty<QObject> *prop, int index)
-{
- QQuickContainerPrivate *p = static_cast<QQuickContainerPrivate *>(prop->data);
- return p->contentData.value(index);
-}
-
-void QQuickContainerPrivate::contentData_clear(QQmlListProperty<QObject> *prop)
-{
- QQuickContainerPrivate *p = static_cast<QQuickContainerPrivate *>(prop->data);
- p->contentData.clear();
-}
-
-void QQuickContainerPrivate::contentChildren_append(QQmlListProperty<QQuickItem> *prop, QQuickItem *item)
-{
- QQuickContainer *q = static_cast<QQuickContainer *>(prop->object);
- q->addItem(item);
-}
-
-int QQuickContainerPrivate::contentChildren_count(QQmlListProperty<QQuickItem> *prop)
-{
- QQuickContainerPrivate *p = static_cast<QQuickContainerPrivate *>(prop->data);
- return p->contentModel->count();
-}
-
-QQuickItem *QQuickContainerPrivate::contentChildren_at(QQmlListProperty<QQuickItem> *prop, int index)
-{
- QQuickContainer *q = static_cast<QQuickContainer *>(prop->object);
- return q->itemAt(index);
-}
-
-void QQuickContainerPrivate::contentChildren_clear(QQmlListProperty<QQuickItem> *prop)
-{
- QQuickContainerPrivate *p = static_cast<QQuickContainerPrivate *>(prop->data);
- p->contentModel->clear();
-}
-
-QQuickContainer::QQuickContainer(QQuickItem *parent) :
- QQuickControl(*(new QQuickContainerPrivate), parent)
-{
- Q_D(QQuickContainer);
- d->init();
-}
-
-QQuickContainer::QQuickContainer(QQuickContainerPrivate &dd, QQuickItem *parent) :
- QQuickControl(dd, parent)
-{
- Q_D(QQuickContainer);
- d->init();
-}
-
-QQuickContainer::~QQuickContainer()
-{
- Q_D(QQuickContainer);
- d->cleanup();
-}
-
-/*!
- \qmlproperty int Qt.labs.controls::Container::count
- \readonly
-
- This property holds the number of items.
-*/
-int QQuickContainer::count() const
-{
- Q_D(const QQuickContainer);
- return d->contentModel->count();
-}
-
-/*!
- \qmlmethod Item Qt.labs.controls::Container::itemAt(int index)
-
- Returns the item at \a index, or \c null if it does not exist.
-*/
-QQuickItem *QQuickContainer::itemAt(int index) const
-{
- Q_D(const QQuickContainer);
- return d->itemAt(index);
-}
-
-/*!
- \qmlmethod void Qt.labs.controls::Container::addItem(Item item)
-
- Adds an \a item.
-*/
-void QQuickContainer::addItem(QQuickItem *item)
-{
- Q_D(QQuickContainer);
- insertItem(d->contentModel->count(), item);
-}
-
-/*!
- \qmlmethod void Qt.labs.controls::Container::insertItem(int index, Item item)
-
- Inserts an \a item at \a index.
-*/
-void QQuickContainer::insertItem(int index, QQuickItem *item)
-{
- Q_D(QQuickContainer);
- if (!item)
- return;
- const int count = d->contentModel->count();
- if (index < 0 || index > count)
- index = count;
-
- int oldIndex = d->contentModel->indexOf(item, Q_NULLPTR);
- if (oldIndex != -1) {
- if (oldIndex < index)
- --index;
- if (oldIndex != index)
- d->moveItem(oldIndex, index);
- } else {
- d->insertItem(index, item);
- }
-}
-
-/*!
- \qmlmethod void Qt.labs.controls::Container::moveItem(int from, int to)
-
- Moves an item \a from one index \a to another.
-*/
-void QQuickContainer::moveItem(int from, int to)
-{
- Q_D(QQuickContainer);
- const int count = d->contentModel->count();
- if (from < 0 || from > count - 1)
- return;
- if (to < 0 || to > count - 1)
- to = count - 1;
-
- if (from != to)
- d->moveItem(from, to);
-}
-
-/*!
- \qmlmethod void Qt.labs.controls::Container::removeItem(int index)
-
- Removes an item at \a index.
-
- \note The ownership of the item is transferred to the caller.
-*/
-void QQuickContainer::removeItem(int index)
-{
- Q_D(QQuickContainer);
- const int count = d->contentModel->count();
- if (index < 0 || index >= count)
- return;
-
- QQuickItem *item = itemAt(index);
- if (item)
- d->removeItem(index, item);
-}
-
-/*!
- \qmlproperty model Qt.labs.controls::Container::contentModel
- \readonly
-
- This property holds the content model of items.
-*/
-QVariant QQuickContainer::contentModel() const
-{
- Q_D(const QQuickContainer);
- return QVariant::fromValue(d->contentModel);
-}
-
-/*!
- \qmlproperty list<Object> Qt.labs.controls::Container::contentData
- \default
-
- This property holds the list of content data.
-
- \sa Item::data
-*/
-QQmlListProperty<QObject> QQuickContainer::contentData()
-{
- Q_D(QQuickContainer);
- return QQmlListProperty<QObject>(this, d,
- QQuickContainerPrivate::contentData_append,
- QQuickContainerPrivate::contentData_count,
- QQuickContainerPrivate::contentData_at,
- QQuickContainerPrivate::contentData_clear);
-}
-
-/*!
- \qmlproperty list<Item> Qt.labs.controls::Container::contentChildren
-
- This property holds the list of content children.
-
- \sa Item::children
-*/
-QQmlListProperty<QQuickItem> QQuickContainer::contentChildren()
-{
- Q_D(QQuickContainer);
- return QQmlListProperty<QQuickItem>(this, d,
- QQuickContainerPrivate::contentChildren_append,
- QQuickContainerPrivate::contentChildren_count,
- QQuickContainerPrivate::contentChildren_at,
- QQuickContainerPrivate::contentChildren_clear);
-}
-
-/*!
- \qmlproperty int Qt.labs.controls::Container::currentIndex
-
- This property holds the index of the current item in the container.
-*/
-int QQuickContainer::currentIndex() const
-{
- Q_D(const QQuickContainer);
- return d->currentIndex;
-}
-
-void QQuickContainer::setCurrentIndex(int index)
-{
- Q_D(QQuickContainer);
- if (d->currentIndex != index) {
- d->currentIndex = index;
- emit currentIndexChanged();
- emit currentItemChanged();
- }
-}
-
-/*!
- \qmlproperty Item Qt.labs.controls::Container::currentItem
-
- This property holds the current item.
-*/
-QQuickItem *QQuickContainer::currentItem() const
-{
- Q_D(const QQuickContainer);
- return itemAt(d->currentIndex);
-}
-
-void QQuickContainer::itemChange(ItemChange change, const ItemChangeData &data)
-{
- Q_D(QQuickContainer);
- QQuickControl::itemChange(change, data);
- if (change == QQuickItem::ItemChildAddedChange && isComponentComplete() && data.item != d->background && data.item != d->contentItem) {
- if (!QQuickItemPrivate::get(data.item)->isTransparentForPositioner() && d->contentModel->indexOf(data.item, Q_NULLPTR) == -1)
- addItem(data.item);
- }
-}
-
-void QQuickContainer::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
-{
- Q_D(QQuickContainer);
- QQuickControl::contentItemChange(newItem, oldItem);
-
- static const int slotIndex = metaObject()->indexOfSlot("_q_currentIndexChanged()");
-
- if (oldItem) {
- QQuickItemPrivate::get(oldItem)->removeItemChangeListener(d, QQuickItemPrivate::Children);
- QQuickItem *oldContentItem = effectiveContentItem(oldItem);
- if (oldContentItem != oldItem)
- QQuickItemPrivate::get(oldContentItem)->removeItemChangeListener(d, QQuickItemPrivate::Children);
-
- int signalIndex = oldItem->metaObject()->indexOfSignal("currentIndexChanged()");
- if (signalIndex != -1)
- QMetaObject::disconnect(oldItem, signalIndex, this, slotIndex);
- }
-
- if (newItem) {
- QQuickItemPrivate::get(newItem)->addItemChangeListener(d, QQuickItemPrivate::Children);
- QQuickItem *newContentItem = effectiveContentItem(newItem);
- if (newContentItem != newItem)
- QQuickItemPrivate::get(newContentItem)->addItemChangeListener(d, QQuickItemPrivate::Children);
-
- int signalIndex = newItem->metaObject()->indexOfSignal("currentIndexChanged()");
- if (signalIndex != -1)
- QMetaObject::connect(newItem, signalIndex, this, slotIndex);
- }
-}
-
-bool QQuickContainer::isContent(QQuickItem *item) const
-{
- // If the item has a QML context associated to it (it was created in QML),
- // we add it to the content model. Otherwise, it's probably the default
- // highlight item that is always created by the item views, which we need
- // to exclude.
- //
- // TODO: Find a better way to identify/exclude the highlight item...
- return qmlContext(item);
-}
-
-void QQuickContainer::itemAdded(int index, QQuickItem *item)
-{
- Q_UNUSED(index);
- Q_UNUSED(item);
-}
-
-void QQuickContainer::itemRemoved(int index, QQuickItem *item)
-{
- Q_UNUSED(index);
- Q_UNUSED(item);
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qquickcontainer_p.cpp"