diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2015-06-15 11:57:25 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2015-06-23 21:05:20 +0000 |
commit | a6fabdc379610e2ee527b27e1a1c0a612e8d4318 (patch) | |
tree | 17aff630acbc898a794fd9e9b4e1ad91590d784c /src | |
parent | 0b5035f02501ecadc3c7caf49a547aca240fb00f (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.cpp | 309 | ||||
-rw-r--r-- | src/controls/qquickcontainer_p.h | 24 | ||||
-rw-r--r-- | src/controls/qquickcontainer_p_p.h | 34 | ||||
-rw-r--r-- | src/controls/qquicktabbar.cpp | 320 | ||||
-rw-r--r-- | src/controls/qquicktabbar_p.h | 21 |
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: |