Skip to content

Commit

Permalink
add VisibleItemModel
Browse files Browse the repository at this point in the history
This is a VisualItemModel only including the shown items.
  • Loading branch information
Jeroen Hofstee committed Nov 13, 2022
1 parent 8872916 commit e0d874b
Show file tree
Hide file tree
Showing 3 changed files with 171 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/declarative/graphicsitems/qdeclarativeitemsmodule.cpp
Expand Up @@ -149,6 +149,7 @@ void QDeclarativeItemModule::defineModule()
qmlRegisterType<QDeclarativeTextInput>("QtQuick",1,0,"TextInput");
#endif
qmlRegisterType<QDeclarativeViewSection>("QtQuick",1,0,"ViewSection");
qmlRegisterType<QDeclarativeVisibleItemModel>("QtQuick",1,0,"VisibleItemModel");
qmlRegisterType<QDeclarativeVisualDataModel>("QtQuick",1,0,"VisualDataModel");
qmlRegisterType<QDeclarativeVisualItemModel>("QtQuick",1,0,"VisualItemModel");
qmlRegisterType<QDeclarativeVisualModels>("QtQuick",1,0,"VisualModels");
Expand Down Expand Up @@ -258,6 +259,7 @@ void QDeclarativeItemModule::defineModuleCompat()
qmlRegisterType<QDeclarativeTextInput>("Qt",4,7,"TextInput");
#endif
qmlRegisterType<QDeclarativeViewSection>("Qt",4,7,"ViewSection");
qmlRegisterType<QDeclarativeVisibleItemModel>("Qt",4,7,"VisibleItemModel");
qmlRegisterType<QDeclarativeVisualDataModel>("Qt",4,7,"VisualDataModel");
qmlRegisterType<QDeclarativeVisualItemModel>("Qt",4,7,"VisualItemModel");
qmlRegisterType<QDeclarativeVisualModels>("Qt",4,7,"VisualModels");
Expand Down
113 changes: 113 additions & 0 deletions src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
Expand Up @@ -136,6 +136,8 @@ class QDeclarativeVisualItemModelPrivate : public QObjectPrivate

Item item = children[i];
children.removeAt(i);
QDeclarativeVisualItemModelAttached *attached = QDeclarativeVisualItemModelAttached::properties(item.item);
attached->setIndex(-1);
updateIndices();

emit q->countChanged();
Expand Down Expand Up @@ -1683,6 +1685,117 @@ QDeclarativeVisualModel *QDeclarativeVisualModels::model_at(QDeclarativeListProp
return visualModules->mModels.at(index);
}


bool QDeclarativeVisibleWatcher::show()
{
return !mShow.isProperty() || mShow.read().toBool() == true;
}

QDeclarativeVisibleItemModel::QDeclarativeVisibleItemModel(QObject *parent) :
QDeclarativeVisualItemModel(parent)
{
}

QDeclarativeListProperty<QDeclarativeItem> QDeclarativeVisibleItemModel::getAllChildren()
{
return QDeclarativeListProperty<QDeclarativeItem>(this, this,
QDeclarativeVisibleItemModel::all_children_append,
QDeclarativeVisibleItemModel::all_children_count,
QDeclarativeVisibleItemModel::all_children_at,
QDeclarativeVisibleItemModel::all_children_clear);
}

void QDeclarativeVisibleItemModel::append(QDeclarativeItem *item)
{
QDeclarativeVisibleWatcher watch(item);
allChildren.append(watch);
watch.mShow.connectNotifySignal(this, SLOT(onShowChanged()));
if (watch.show()) {
QDeclarativeVisualItemModel::append(item);
} else {
item->setVisible(false);
QDeclarativeVisualItemModelAttached *attached = QDeclarativeVisualItemModel::qmlAttachedProperties(item);
attached->setIndex(-1);
}
}

void QDeclarativeVisibleItemModel::clear()
{
while (allChildren.count()) {
QDeclarativeVisibleWatcher watch = allChildren.takeFirst();
watch.mItem->disconnect(this);
int n = getVisibleIndex(watch.mItem);
if (n >= 0)
QDeclarativeVisualItemModel::remove(n);
}
}

void QDeclarativeVisibleItemModel::onShowChanged()
{
QDeclarativeItem *item = static_cast<QDeclarativeItem *>(sender());

if (item->property("show").toBool()) {
int n = getAllIndex(item);
if (n < 0)
return;

item->setVisible(true);

// Find the correct position to insert the item.
int visibleIndex = -1;
n -= 1;
while (n >= 0) {
visibleIndex = getVisibleIndex(allChildren[n].mItem);
if (visibleIndex >= 0) {
visibleIndex++;
break;
}
n--;
}
if (visibleIndex < 0)
visibleIndex = 0;

QDeclarativeVisualItemModel::insert(visibleIndex, item);
} else {
int n = getVisibleIndex(item);
QDeclarativeVisualItemModel::remove(n);
item->setVisible(false);
}
}

void QDeclarativeVisibleItemModel::all_children_append(QDeclarativeListProperty<QDeclarativeItem> *prop, QDeclarativeItem *item)
{
QDeclarative_setParent_noEvent(item, prop->object);
static_cast<QDeclarativeVisibleItemModel *>(prop->data)->append(item);
}

int QDeclarativeVisibleItemModel::all_children_count(QDeclarativeListProperty<QDeclarativeItem> *prop) {
return static_cast<QDeclarativeVisibleItemModel *>(prop->data)->allChildren.count();
}

QDeclarativeItem *QDeclarativeVisibleItemModel::all_children_at(QDeclarativeListProperty<QDeclarativeItem> *prop, int index) {
return static_cast<QDeclarativeVisibleItemModel *>(prop->data)->allChildren.at(index).mItem;
}

void QDeclarativeVisibleItemModel::all_children_clear(QDeclarativeListProperty<QDeclarativeItem> *prop)
{
static_cast<QDeclarativeVisibleItemModel *>(prop->data)->clear();
}

int QDeclarativeVisibleItemModel::getAllIndex(QDeclarativeItem *item)
{
for (int n=0; n < allChildren.count(); n++)
if (allChildren[n].mItem == item)
return n;
return -1;
}

int QDeclarativeVisibleItemModel::getVisibleIndex(QDeclarativeItem *item)
{
QDeclarativeVisualItemModelAttached *attached = QDeclarativeVisualItemModel::qmlAttachedProperties(item);
return attached ? attached->index() : -1;
}

QT_END_NAMESPACE

QML_DECLARE_TYPE(QListModelInterface)
Expand Down
56 changes: 56 additions & 0 deletions src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h
Expand Up @@ -46,6 +46,8 @@

#include <QtCore/qobject.h>
#include <QtCore/qabstractitemmodel.h>
#include "qdeclarativeitem.h"
#include <qdeclarativeproperty.h>

QT_BEGIN_HEADER

Expand Down Expand Up @@ -294,8 +296,62 @@ private slots:
Q_DISABLE_COPY(QDeclarativeVisualModels)
};

class QDeclarativeVisibleWatcher {
public:
QDeclarativeVisibleWatcher(QDeclarativeItem *item) :
mItem(item),
mShow(item, "show")
{
}

QDeclarativeItem *mItem;
QDeclarativeProperty mShow;

bool show();
};

class Q_AUTOTEST_EXPORT QDeclarativeVisibleItemModel : public QDeclarativeVisualItemModel
{
Q_OBJECT
Q_PROPERTY(QDeclarativeListProperty<QDeclarativeItem> allChildren READ getAllChildren NOTIFY allChildrenChanged)
Q_CLASSINFO("DefaultProperty", "allChildren")

public:
QDeclarativeVisibleItemModel(QObject *parent = 0);
virtual ~QDeclarativeVisibleItemModel() {}

QDeclarativeListProperty<QDeclarativeItem> getAllChildren();

Q_INVOKABLE void append(QDeclarativeItem *item);
Q_INVOKABLE void clear(void);

Q_SIGNALS:
void allChildrenChanged();

private slots:
void onShowChanged();

private:
static void all_children_append(QDeclarativeListProperty<QDeclarativeItem> *prop, QDeclarativeItem *item);
static int all_children_count(QDeclarativeListProperty<QDeclarativeItem> *prop);
static QDeclarativeItem *all_children_at(QDeclarativeListProperty<QDeclarativeItem> *prop, int index);
static void all_children_clear(QDeclarativeListProperty<QDeclarativeItem> *prop);

Q_INVOKABLE void insert(int, QDeclarativeItem *) {}
Q_INVOKABLE void remove(int) {}

int getAllIndex(QDeclarativeItem *item);
int getVisibleIndex(QDeclarativeItem *item);

QList<QDeclarativeVisibleWatcher> allChildren;

Q_DISABLE_COPY(QDeclarativeVisibleItemModel)
};

QT_END_NAMESPACE

QML_DECLARE_TYPE(QDeclarativeVisibleItemModel)
QML_DECLARE_TYPEINFO(QDeclarativeVisibleItemModel, QML_HAS_ATTACHED_PROPERTIES)
QML_DECLARE_TYPE(QDeclarativeVisualModel)
QML_DECLARE_TYPE(QDeclarativeVisualItemModel)
QML_DECLARE_TYPE(QDeclarativeVisualModels)
Expand Down

0 comments on commit e0d874b

Please sign in to comment.