aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2015-06-15 11:57:25 +0200
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2015-06-23 21:05:20 +0000
commita6fabdc379610e2ee527b27e1a1c0a612e8d4318 (patch)
tree17aff630acbc898a794fd9e9b4e1ad91590d784c /src
parent0b5035f02501ecadc3c7caf49a547aca240fb00f (diff)
Promote the content management API from TabBar to Container
Properties: - int count - var contentModel - list<Object> contentData [default] - list<Item> contentChildren Methods: - Item itemAt(int index) - void addItem(Item item) - void insertItem(int index, Item item) - void moveItem(int from, int to) - void removeItem(int index) Change-Id: I1c3ddbd7fc091a6602b08ff34ad2b7e288108684 Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/controls/qquickcontainer.cpp309
-rw-r--r--src/controls/qquickcontainer_p.h24
-rw-r--r--src/controls/qquickcontainer_p_p.h34
-rw-r--r--src/controls/qquicktabbar.cpp320
-rw-r--r--src/controls/qquicktabbar_p.h21
5 files changed, 393 insertions, 315 deletions
diff --git a/src/controls/qquickcontainer.cpp b/src/controls/qquickcontainer.cpp
index a4e10372..939994fb 100644
--- a/src/controls/qquickcontainer.cpp
+++ b/src/controls/qquickcontainer.cpp
@@ -48,14 +48,323 @@ QT_BEGIN_NAMESPACE
\internal
*/
+QQuickContainerPrivate::QQuickContainerPrivate() : contentModel(Q_NULLPTR)
+{
+}
+
+void QQuickContainerPrivate::init()
+{
+ Q_Q(QQuickContainer);
+ contentModel = new QQmlObjectModel(q);
+ QObject::connect(contentModel, &QQmlObjectModel::countChanged, q, &QQuickContainer::countChanged);
+}
+
+void QQuickContainerPrivate::cleanup()
+{
+ // ensure correct destruction order (QTBUG-46798)
+ delete contentItem;
+ 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);
+ delete item;
+ }
+ }
+ delete contentModel;
+}
+
+QQuickItem *QQuickContainerPrivate::itemAt(int index) const
+{
+ return qobject_cast<QQuickItem *>(contentModel->get(index));
+}
+
+void QQuickContainerPrivate::insertItem(int index, QQuickItem *item)
+{
+ QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent);
+ contentData.append(item);
+ contentModel->insert(index, item);
+}
+
+void QQuickContainerPrivate::moveItem(int from, int to)
+{
+ contentModel->move(from, to);
+}
+
+void QQuickContainerPrivate::removeItem(int index, QQuickItem *item)
+{
+ QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent);
+ contentData.removeOne(item);
+ contentModel->remove(index);
+}
+
+void QQuickContainerPrivate::itemChildAdded(QQuickItem *, QQuickItem *child)
+{
+ // add dynamically reparented items (eg. by a Repeater)
+ if (!QQuickItemPrivate::get(child)->isTransparentForPositioner() && contentModel->indexOf(child, Q_NULLPTR) == -1)
+ 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 = 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 *bar = static_cast<QQuickContainer *>(prop->object);
+ QQuickItem *item = qobject_cast<QQuickItem *>(obj);
+ if (item) {
+ if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) {
+ QQuickItemPrivate::get(item)->addItemChangeListener(p, QQuickItemPrivate::SiblingOrder);
+ item->setParentItem(p->contentItem);
+ } else if (p->contentModel->indexOf(item, Q_NULLPTR) == -1) {
+ bar->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 *bar = static_cast<QQuickContainer *>(prop->object);
+ bar->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 *bar = static_cast<QQuickContainer *>(prop->object);
+ return bar->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 QtQuickControls2::TabBar::count
+ \readonly
+
+ TODO
+*/
+int QQuickContainer::count() const
+{
+ Q_D(const QQuickContainer);
+ return d->contentModel->count();
+}
+
+/*!
+ \qmlmethod Item QtQuickControls2::TabBar::itemAt(int index)
+
+ TODO
+*/
+QQuickItem *QQuickContainer::itemAt(int index) const
+{
+ Q_D(const QQuickContainer);
+ return d->itemAt(index);
+}
+
+/*!
+ \qmlmethod void QtQuickControls2::TabBar::addItem(Item item)
+
+ TODO
+*/
+void QQuickContainer::addItem(QQuickItem *item)
+{
+ Q_D(QQuickContainer);
+ insertItem(d->contentModel->count(), item);
+}
+
+/*!
+ \qmlmethod void QtQuickControls2::TabBar::insertItem(int index, Item item)
+
+ TODO
+*/
+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 QtQuickControls2::TabBar::moveItem(int from, int to)
+
+ TODO
+*/
+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 QtQuickControls2::TabBar::removeItem(int index)
+
+ TODO
+*/
+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 QtQuickControls2::TabBar::contentModel
+ \readonly
+
+ TODO
+*/
+QVariant QQuickContainer::contentModel() const
+{
+ Q_D(const QQuickContainer);
+ return QVariant::fromValue(d->contentModel);
+}
+
+/*!
+ \qmlproperty list<Object> QtQuickControls2::TabBar::contentData
+ \default
+
+ TODO
+*/
+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> QtQuickControls2::TabBar::contentChildren
+
+ TODO
+*/
+QQmlListProperty<QQuickItem> QQuickContainer::contentChildren()
+{
+ Q_D(QQuickContainer);
+ return QQmlListProperty<QQuickItem>(this, d,
+ QQuickContainerPrivate::contentChildren_append,
+ QQuickContainerPrivate::contentChildren_count,
+ QQuickContainerPrivate::contentChildren_at,
+ QQuickContainerPrivate::contentChildren_clear);
+}
+
+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);
+ if (oldItem)
+ QQuickItemPrivate::get(oldItem)->removeItemChangeListener(d, QQuickItemPrivate::Children);
+ if (newItem)
+ QQuickItemPrivate::get(newItem)->addItemChangeListener(d, QQuickItemPrivate::Children);
}
QT_END_NAMESPACE
diff --git a/src/controls/qquickcontainer_p.h b/src/controls/qquickcontainer_p.h
index 346eeb34..1f0875ee 100644
--- a/src/controls/qquickcontainer_p.h
+++ b/src/controls/qquickcontainer_p.h
@@ -49,6 +49,7 @@
//
#include <QtQuickControls/private/qquickcontrol_p.h>
+#include <QtQml/qqmllist.h>
QT_BEGIN_NAMESPACE
@@ -57,13 +58,36 @@ class QQuickContainerPrivate;
class Q_QUICKCONTROLS_EXPORT QQuickContainer : public QQuickControl
{
Q_OBJECT
+ Q_PROPERTY(int count READ count NOTIFY countChanged FINAL)
+ Q_PROPERTY(QVariant contentModel READ contentModel CONSTANT FINAL)
+ Q_PROPERTY(QQmlListProperty<QObject> contentData READ contentData FINAL)
+ Q_PROPERTY(QQmlListProperty<QQuickItem> contentChildren READ contentChildren FINAL)
+ Q_CLASSINFO("DefaultProperty", "contentData")
public:
explicit QQuickContainer(QQuickItem *parent = Q_NULLPTR);
+ ~QQuickContainer();
+
+ int count() const;
+ Q_INVOKABLE QQuickItem *itemAt(int index) const;
+ Q_INVOKABLE void addItem(QQuickItem *item);
+ Q_INVOKABLE void insertItem(int index, QQuickItem *item);
+ Q_INVOKABLE void moveItem(int from, int to);
+ Q_INVOKABLE void removeItem(int index);
+
+ QVariant contentModel() const;
+ QQmlListProperty<QObject> contentData();
+ QQmlListProperty<QQuickItem> contentChildren();
+
+Q_SIGNALS:
+ void countChanged();
protected:
QQuickContainer(QQuickContainerPrivate &dd, QQuickItem *parent);
+ void itemChange(ItemChange change, const ItemChangeData &data) Q_DECL_OVERRIDE;
+ void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) Q_DECL_OVERRIDE;
+
private:
Q_DISABLE_COPY(QQuickContainer)
Q_DECLARE_PRIVATE(QQuickContainer)
diff --git a/src/controls/qquickcontainer_p_p.h b/src/controls/qquickcontainer_p_p.h
index 7201aa16..b10486c5 100644
--- a/src/controls/qquickcontainer_p_p.h
+++ b/src/controls/qquickcontainer_p_p.h
@@ -49,11 +49,43 @@
//
#include <QtQuickControls/private/qquickcontrol_p_p.h>
+#include <QtQuick/private/qquickitemchangelistener_p.h>
+#include <QtQml/private/qqmlobjectmodel_p.h>
QT_BEGIN_NAMESPACE
-class Q_QUICKCONTROLS_EXPORT QQuickContainerPrivate : public QQuickControlPrivate
+class Q_QUICKCONTROLS_EXPORT QQuickContainerPrivate : public QQuickControlPrivate, public QQuickItemChangeListener
{
+ Q_DECLARE_PUBLIC(QQuickContainer)
+
+public:
+ QQuickContainerPrivate();
+
+ void init();
+ void cleanup();
+
+ QQuickItem *itemAt(int index) const;
+ virtual void insertItem(int index, QQuickItem *item);
+ virtual void moveItem(int from, int to);
+ virtual void removeItem(int index, QQuickItem *item);
+
+ void itemChildAdded(QQuickItem *item, QQuickItem *child) Q_DECL_OVERRIDE;
+ void itemSiblingOrderChanged(QQuickItem *item) Q_DECL_OVERRIDE;
+ void itemParentChanged(QQuickItem *item, QQuickItem *parent) Q_DECL_OVERRIDE;
+ void itemDestroyed(QQuickItem *item) Q_DECL_OVERRIDE;
+
+ static void contentData_append(QQmlListProperty<QObject> *prop, QObject *obj);
+ static int contentData_count(QQmlListProperty<QObject> *prop);
+ static QObject *contentData_at(QQmlListProperty<QObject> *prop, int index);
+ static void contentData_clear(QQmlListProperty<QObject> *prop);
+
+ static void contentChildren_append(QQmlListProperty<QQuickItem> *prop, QQuickItem *obj);
+ static int contentChildren_count(QQmlListProperty<QQuickItem> *prop);
+ static QQuickItem *contentChildren_at(QQmlListProperty<QQuickItem> *prop, int index);
+ static void contentChildren_clear(QQmlListProperty<QQuickItem> *prop);
+
+ QObjectList contentData;
+ QQmlObjectModel *contentModel;
};
QT_END_NAMESPACE
diff --git a/src/controls/qquicktabbar.cpp b/src/controls/qquicktabbar.cpp
index b3fd3593..c868f41c 100644
--- a/src/controls/qquicktabbar.cpp
+++ b/src/controls/qquicktabbar.cpp
@@ -38,10 +38,6 @@
#include "qquickcontainer_p_p.h"
#include "qquickexclusivegroup_p.h"
-#include <QtQuick/private/qquickitem_p.h>
-#include <QtQuick/private/qquickitemchangelistener_p.h>
-#include <QtQml/private/qqmlobjectmodel_p.h>
-
QT_BEGIN_NAMESPACE
/*!
@@ -55,34 +51,21 @@ QT_BEGIN_NAMESPACE
TODO
*/
-class QQuickTabBarPrivate : public QQuickContainerPrivate, public QQuickItemChangeListener
+class QQuickTabBarPrivate : public QQuickContainerPrivate
{
Q_DECLARE_PUBLIC(QQuickTabBar)
public:
- QQuickTabBarPrivate() : currentIndex(0), contentModel(Q_NULLPTR), group(Q_NULLPTR) { }
+ QQuickTabBarPrivate() : currentIndex(0), group(Q_NULLPTR) { }
void updateLayout();
void updateCurrent();
- void itemChildAdded(QQuickItem *item, QQuickItem *child) Q_DECL_OVERRIDE;
- void itemSiblingOrderChanged(QQuickItem *item) Q_DECL_OVERRIDE;
- void itemParentChanged(QQuickItem *item, QQuickItem *parent) Q_DECL_OVERRIDE;
- void itemDestroyed(QQuickItem *item) Q_DECL_OVERRIDE;
-
- static void contentData_append(QQmlListProperty<QObject> *prop, QObject *obj);
- static int contentData_count(QQmlListProperty<QObject> *prop);
- static QObject *contentData_at(QQmlListProperty<QObject> *prop, int index);
- static void contentData_clear(QQmlListProperty<QObject> *prop);
-
- static void contentChildren_append(QQmlListProperty<QQuickItem> *prop, QQuickItem *obj);
- static int contentChildren_count(QQmlListProperty<QQuickItem> *prop);
- static QQuickItem *contentChildren_at(QQmlListProperty<QQuickItem> *prop, int index);
- static void contentChildren_clear(QQmlListProperty<QQuickItem> *prop);
+ void insertItem(int index, QQuickItem *item) Q_DECL_OVERRIDE;
+ void moveItem(int from, int to) Q_DECL_OVERRIDE;
+ void removeItem(int index, QQuickItem *item) Q_DECL_OVERRIDE;
int currentIndex;
- QObjectList contentData;
- QQmlObjectModel *contentModel;
QQuickExclusiveGroup *group;
};
@@ -113,99 +96,40 @@ void QQuickTabBarPrivate::updateCurrent()
q->setCurrentIndex(contentModel->indexOf(group->current(), Q_NULLPTR));
}
-void QQuickTabBarPrivate::itemChildAdded(QQuickItem *, QQuickItem *child)
+void QQuickTabBarPrivate::insertItem(int index, QQuickItem *item)
{
- // add dynamically reparented items (eg. by a Repeater)
- Q_Q(QQuickTabBar);
- if (!QQuickItemPrivate::get(child)->isTransparentForPositioner() && contentModel->indexOf(child, Q_NULLPTR) == -1)
- q->addItem(child);
-}
+ QQuickContainerPrivate::insertItem(index, item);
-void QQuickTabBarPrivate::itemParentChanged(QQuickItem *item, QQuickItem *parent)
-{
- // remove dynamically unparented items (eg. by a Repeater)
- Q_Q(QQuickTabBar);
- if (!parent)
- q->removeItem(contentModel->indexOf(item, Q_NULLPTR));
+ group->addCheckable(item);
+ if (contentModel->count() == 1 || currentIndex == index)
+ group->setCurrent(item);
+ else
+ updateCurrent();
}
-void QQuickTabBarPrivate::itemSiblingOrderChanged(QQuickItem *)
+void QQuickTabBarPrivate::moveItem(int from, int to)
{
- // reorder the restacked items (eg. by a Repeater)
- Q_Q(QQuickTabBar);
- QList<QQuickItem *> siblings = 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);
- }
-}
+ QQuickContainerPrivate::moveItem(from, to);
-void QQuickTabBarPrivate::itemDestroyed(QQuickItem *item)
-{
- Q_Q(QQuickTabBar);
- int index = contentModel->indexOf(item, Q_NULLPTR);
- if (index != -1)
- q->removeItem(index);
+ updateCurrent();
}
-void QQuickTabBarPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj)
+void QQuickTabBarPrivate::removeItem(int index, QQuickItem *item)
{
- QQuickTabBarPrivate *p = static_cast<QQuickTabBarPrivate *>(prop->data);
- QQuickTabBar *bar = static_cast<QQuickTabBar *>(prop->object);
- QQuickItem *item = qobject_cast<QQuickItem *>(obj);
- if (item) {
- if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) {
- QQuickItemPrivate::get(item)->addItemChangeListener(p, QQuickItemPrivate::SiblingOrder);
- item->setParentItem(p->contentItem);
- } else if (p->contentModel->indexOf(item, Q_NULLPTR) == -1) {
- bar->addItem(item);
- }
- } else {
- p->contentData.append(obj);
+ Q_Q(QQuickTabBar);
+ bool currentChanged = false;
+ if (index == currentIndex) {
+ group->setCurrent(contentModel->get(index - 1));
+ } else if (index < currentIndex) {
+ --currentIndex;
+ currentChanged = true;
}
-}
+ group->removeCheckable(item);
-int QQuickTabBarPrivate::contentData_count(QQmlListProperty<QObject> *prop)
-{
- QQuickTabBarPrivate *p = static_cast<QQuickTabBarPrivate *>(prop->data);
- return p->contentData.count();
-}
-
-QObject *QQuickTabBarPrivate::contentData_at(QQmlListProperty<QObject> *prop, int index)
-{
- QQuickTabBarPrivate *p = static_cast<QQuickTabBarPrivate *>(prop->data);
- return p->contentData.value(index);
-}
-
-void QQuickTabBarPrivate::contentData_clear(QQmlListProperty<QObject> *prop)
-{
- QQuickTabBarPrivate *p = static_cast<QQuickTabBarPrivate *>(prop->data);
- p->contentData.clear();
-}
-
-void QQuickTabBarPrivate::contentChildren_append(QQmlListProperty<QQuickItem> *prop, QQuickItem *item)
-{
- QQuickTabBar *bar = static_cast<QQuickTabBar *>(prop->object);
- bar->addItem(item);
-}
-
-int QQuickTabBarPrivate::contentChildren_count(QQmlListProperty<QQuickItem> *prop)
-{
- QQuickTabBarPrivate *p = static_cast<QQuickTabBarPrivate *>(prop->data);
- return p->contentModel->count();
-}
-
-QQuickItem *QQuickTabBarPrivate::contentChildren_at(QQmlListProperty<QQuickItem> *prop, int index)
-{
- QQuickTabBar *bar = static_cast<QQuickTabBar *>(prop->object);
- return bar->itemAt(index);
-}
+ QQuickContainerPrivate::removeItem(index, item);
-void QQuickTabBarPrivate::contentChildren_clear(QQmlListProperty<QQuickItem> *prop)
-{
- QQuickTabBarPrivate *p = static_cast<QQuickTabBarPrivate *>(prop->data);
- p->contentModel->clear();
+ if (currentChanged)
+ emit q->currentIndexChanged();
}
QQuickTabBar::QQuickTabBar(QQuickItem *parent) :
@@ -215,42 +139,11 @@ QQuickTabBar::QQuickTabBar(QQuickItem *parent) :
setFlag(ItemIsFocusScope);
setActiveFocusOnTab(true);
- d->contentModel = new QQmlObjectModel(this);
- connect(d->contentModel, &QQmlObjectModel::countChanged, this, &QQuickTabBar::countChanged);
- connect(d->contentModel, &QQmlObjectModel::modelUpdated, this, &QQuickTabBar::polish);
-
d->group = new QQuickExclusiveGroup(this);
connect(d->group, &QQuickExclusiveGroup::currentChanged, this, &QQuickTabBar::currentItemChanged);
QObjectPrivate::connect(d->group, &QQuickExclusiveGroup::currentChanged, d, &QQuickTabBarPrivate::updateCurrent);
}
-QQuickTabBar::~QQuickTabBar()
-{
- Q_D(QQuickTabBar);
- delete d->contentItem;
- const int count = d->contentModel->count();
- for (int i = 0; i < count; ++i) {
- QQuickItem *item = itemAt(i);
- if (item) {
- QQuickItemPrivate::get(item)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent);
- delete item;
- }
- }
- delete d->contentModel;
-}
-
-/*!
- \qmlproperty int QtQuickControls2::TabBar::count
- \readonly
-
- TODO
-*/
-int QQuickTabBar::count() const
-{
- Q_D(const QQuickTabBar);
- return d->contentModel->count();
-}
-
/*!
\qmlproperty int QtQuickControls2::TabBar::currentIndex
@@ -284,145 +177,6 @@ QQuickItem *QQuickTabBar::currentItem() const
return qobject_cast<QQuickItem *>(d->group->current());
}
-/*!
- \qmlproperty model QtQuickControls2::TabBar::contentModel
- \readonly
-
- TODO
-*/
-QVariant QQuickTabBar::contentModel() const
-{
- Q_D(const QQuickTabBar);
- return QVariant::fromValue(d->contentModel);
-}
-
-QQmlListProperty<QObject> QQuickTabBar::contentData()
-{
- Q_D(QQuickTabBar);
- return QQmlListProperty<QObject>(this, d,
- QQuickTabBarPrivate::contentData_append,
- QQuickTabBarPrivate::contentData_count,
- QQuickTabBarPrivate::contentData_at,
- QQuickTabBarPrivate::contentData_clear);
-}
-
-QQmlListProperty<QQuickItem> QQuickTabBar::contentChildren()
-{
- Q_D(QQuickTabBar);
- return QQmlListProperty<QQuickItem>(this, d,
- QQuickTabBarPrivate::contentChildren_append,
- QQuickTabBarPrivate::contentChildren_count,
- QQuickTabBarPrivate::contentChildren_at,
- QQuickTabBarPrivate::contentChildren_clear);
-}
-
-/*!
- \qmlmethod Item QtQuickControls2::TabBar::itemAt(int index)
-
- TODO
-*/
-QQuickItem *QQuickTabBar::itemAt(int index) const
-{
- Q_D(const QQuickTabBar);
- return qobject_cast<QQuickItem *>(d->contentModel->get(index));
-}
-
-/*!
- \qmlmethod void QtQuickControls2::TabBar::addItem(Item item)
-
- TODO
-*/
-void QQuickTabBar::addItem(QQuickItem *item)
-{
- Q_D(QQuickTabBar);
- insertItem(d->contentModel->count(), item);
-}
-
-/*!
- \qmlmethod void QtQuickControls2::TabBar::insertItem(int index, Item item)
-
- TODO
-*/
-void QQuickTabBar::insertItem(int index, QQuickItem *item)
-{
- Q_D(QQuickTabBar);
- 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)
- moveItem(oldIndex, index);
- } else {
- QQuickItemPrivate::get(item)->addItemChangeListener(d, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent);
- d->contentData.append(item);
- d->contentModel->insert(index, item);
- d->group->addCheckable(item);
-
- if (count == 0 || d->currentIndex == index)
- d->group->setCurrent(item);
- else
- d->updateCurrent();
- }
-}
-
-/*!
- \qmlmethod void QtQuickControls2::TabBar::moveItem(int from, int to)
-
- TODO
-*/
-void QQuickTabBar::moveItem(int from, int to)
-{
- Q_D(QQuickTabBar);
- 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->contentModel->move(from, to);
- d->updateCurrent();
- }
-}
-
-/*!
- \qmlmethod void QtQuickControls2::TabBar::removeItem(int index)
-
- TODO
-*/
-void QQuickTabBar::removeItem(int index)
-{
- Q_D(QQuickTabBar);
- const int count = d->contentModel->count();
- if (index < 0 || index >= count)
- return;
-
- QQuickItem *item = itemAt(index);
- if (item) {
- bool currentChanged = false;
- if (index == d->currentIndex) {
- d->group->setCurrent(d->contentModel->get(index - 1));
- } else if (index < d->currentIndex) {
- --d->currentIndex;
- currentChanged = true;
- }
-
- QQuickItemPrivate::get(item)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent);
- d->group->removeCheckable(item);
- d->contentData.removeOne(item);
- d->contentModel->remove(index);
-
- if (currentChanged)
- emit currentIndexChanged();
- }
-}
-
void QQuickTabBar::updatePolish()
{
Q_D(QQuickTabBar);
@@ -438,26 +192,6 @@ void QQuickTabBar::componentComplete()
d->updateLayout();
}
-void QQuickTabBar::itemChange(ItemChange change, const ItemChangeData &data)
-{
- Q_D(QQuickTabBar);
- QQuickContainer::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 QQuickTabBar::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
-{
- Q_D(QQuickTabBar);
- QQuickContainer::contentItemChange(newItem, oldItem);
- if (oldItem)
- QQuickItemPrivate::get(oldItem)->removeItemChangeListener(d, QQuickItemPrivate::Children);
- if (newItem)
- QQuickItemPrivate::get(newItem)->addItemChangeListener(d, QQuickItemPrivate::Children);
-}
-
void QQuickTabBar::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
{
Q_D(QQuickTabBar);
diff --git a/src/controls/qquicktabbar_p.h b/src/controls/qquicktabbar_p.h
index ac6e29cf..4512b841 100644
--- a/src/controls/qquicktabbar_p.h
+++ b/src/controls/qquicktabbar_p.h
@@ -49,7 +49,6 @@
//
#include <QtQuickControls/private/qquickcontainer_p.h>
-#include <QtQml/qqmllist.h>
QT_BEGIN_NAMESPACE
@@ -58,45 +57,25 @@ class QQuickTabBarPrivate;
class Q_QUICKCONTROLS_EXPORT QQuickTabBar : public QQuickContainer
{
Q_OBJECT
- Q_PROPERTY(int count READ count NOTIFY countChanged FINAL)
Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged FINAL)
Q_PROPERTY(QQuickItem *currentItem READ currentItem NOTIFY currentItemChanged FINAL)
- Q_PROPERTY(QVariant contentModel READ contentModel CONSTANT FINAL)
- Q_PROPERTY(QQmlListProperty<QObject> contentData READ contentData FINAL)
- Q_PROPERTY(QQmlListProperty<QQuickItem> contentChildren READ contentChildren FINAL)
- Q_CLASSINFO("DefaultProperty", "contentData")
public:
explicit QQuickTabBar(QQuickItem *parent = Q_NULLPTR);
- ~QQuickTabBar();
- int count() const;
int currentIndex() const;
QQuickItem *currentItem() const;
- QVariant contentModel() const;
- QQmlListProperty<QObject> contentData();
- QQmlListProperty<QQuickItem> contentChildren();
-
- Q_INVOKABLE QQuickItem *itemAt(int index) const;
- Q_INVOKABLE void addItem(QQuickItem *item);
- Q_INVOKABLE void insertItem(int index, QQuickItem *item);
- Q_INVOKABLE void moveItem(int from, int to);
- Q_INVOKABLE void removeItem(int index);
-
public Q_SLOTS:
void setCurrentIndex(int index);
Q_SIGNALS:
- void countChanged();
void currentIndexChanged();
void currentItemChanged();
protected:
void updatePolish() Q_DECL_OVERRIDE;
void componentComplete() Q_DECL_OVERRIDE;
- void itemChange(ItemChange change, const ItemChangeData &data) Q_DECL_OVERRIDE;
- void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) Q_DECL_OVERRIDE;
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
private: