on xenial help sign in
use qmlquicklistproperty for children surfaces
commit1e08db98f4c7d795d826d7d3dadcc088b4a7e953 authorNick Dedekind <nicholas.dedekind@gmail.com> dateWed 23 Jul 2014, 12:59 (12 years ago) parent0a25972
3 files changed+38−17
tests/mocks/Unity/Application/ApplicationDBusAdaptor.cpp+6−11 tests/mocks/Unity/Application/MirSurfaceItem.cpp+26−4 tests/mocks/Unity/Application/MirSurfaceItem.h+6−2
tests/mocks/Unity/Application/ApplicationDBusAdaptor.cpp+6−11
@@ -33,17 +33,12 @@ MirSurfaceItem* topSurface(MirSurfaceItem* surface)
3333 if (!surface)
3434 return nullptr;
3535
36− QList<QObject*> children = surface->childSurfaces();
37− if (children.count() > 0) {
38− MirSurfaceItem* child = nullptr;
39− int i = 0;
40− while(!child && i < children.count()) {
41− child = qobject_cast<MirSurfaceItem*>(children[i++]);
42− }
43− if (child)
44− return topSurface(child);
45− }
46− return surface;
36+ MirSurfaceItem* child = NULL;
37+ surface->foreachChildSurface([&](MirSurfaceItem* childSurface) {
38+ if (!child)
39+ child = topSurface(childSurface);
40+ });
41+ return child ? child : surface;
4742}
4843
4944quint32 ApplicationDBusAdaptor::addChildSurface(const QString &appId, const QString &surfaceImage)
tests/mocks/Unity/Application/MirSurfaceItem.cpp+26−4
@@ -118,15 +118,37 @@ void MirSurfaceItem::addChildSurface(MirSurfaceItem* surface)
118118 Q_EMIT childSurfacesChanged();
119119}
120120
121−QList<QObject*> MirSurfaceItem::childSurfaces() const
121+void MirSurfaceItem::foreachChildSurface(std::function<void(MirSurfaceItem*)> f) const
122122{
123− QList<QObject*> children;
124123 for(MirSurfaceItem* child : m_children) {
125− children.append(child);
124+ f(child);
126125 }
127− return children;
128126}
129127
128+QQmlListProperty<MirSurfaceItem> MirSurfaceItem::childSurfaces()
129+{
130+ return QQmlListProperty<MirSurfaceItem>(this,
131+ 0,
132+ MirSurfaceItem::childSurfaceCount,
133+ MirSurfaceItem::childSurfaceAt);
134+}
135+
136+int MirSurfaceItem::childSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop)
137+{
138+ MirSurfaceItem *p = qobject_cast<MirSurfaceItem*>(prop->object);
139+ return p->m_children.count();
140+}
141+
142+MirSurfaceItem* MirSurfaceItem::childSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index)
143+{
144+ MirSurfaceItem *p = qobject_cast<MirSurfaceItem*>(prop->object);
145+
146+ if (index < 0 || index >= p->m_children.count())
147+ return nullptr;
148+ return p->m_children[index];
149+}
150+
151+
130152void MirSurfaceItem::touchEvent(QTouchEvent * event)
131153{
132154 if (event->type() == QEvent::TouchBegin && hasFocus()) {
tests/mocks/Unity/Application/MirSurfaceItem.h+6−2
@@ -32,7 +32,7 @@ class MirSurfaceItem : public QQuickPaintedItem
3232 Q_PROPERTY(State state READ state NOTIFY stateChanged)
3333 Q_PROPERTY(QString name READ name NOTIFY nameChanged)
3434 Q_PROPERTY(MirSurfaceItem* parentSurface READ parentSurface NOTIFY parentSurfaceChanged)
35− Q_PROPERTY(QList<QObject*> childSurfaces READ childSurfaces NOTIFY childSurfacesChanged)
35+ Q_PROPERTY(QQmlListProperty<MirSurfaceItem> childSurfaces READ childSurfaces NOTIFY childSurfacesChanged DESIGNABLE false)
3636
3737public:
3838 enum Type {
@@ -68,7 +68,7 @@ public:
6868 State state() const { return m_state; }
6969 QString name() const { return m_name; }
7070 MirSurfaceItem* parentSurface() const { return m_parentSurface; }
71− QList<QObject*> childSurfaces() const;
71+ void foreachChildSurface(std::function<void(MirSurfaceItem*)> f) const;
7272
7373 void setState(State newState);
7474 void setApplication(ApplicationInfo* item);
@@ -101,6 +101,10 @@ private:
101101 void addChildSurface(MirSurfaceItem* surface);
102102 void removeChildSurface(MirSurfaceItem* surface);
103103
104+ QQmlListProperty<MirSurfaceItem> childSurfaces();
105+ static int childSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop);
106+ static MirSurfaceItem* childSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index);
107+
104108 ApplicationInfo* m_application;
105109 const QString m_name;
106110 const Type m_type;