diff --git a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp index 5811ef67bc8434efc4857f06589990eb08e84d3c..551e910fe0d835b0e0c031674d707be41a1a70ff 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp @@ -34,12 +34,12 @@ QT_BEGIN_NAMESPACE QML_DEFINE_TYPE(Bauhaus,1,0,QBoxLayout,QBoxLayoutObject); QBoxLayoutObject::QBoxLayoutObject(QObject *parent) -: QLayoutObject(parent), _widgets(this), _layout(0) +: QLayoutObject(parent), _layout(0) { } QBoxLayoutObject::QBoxLayoutObject(QBoxLayout *layout, QObject *parent) -: QLayoutObject(parent), _widgets(this), _layout(layout) +: QLayoutObject(parent), _layout(layout) { } diff --git a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h index 8315129c9a82610e2d229912e4f74d49f18caa68..1a17812dcdb51da5535669e683f78ec28c19c623 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h +++ b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h @@ -43,7 +43,7 @@ class QBoxLayoutObject : public QLayoutObject { Q_OBJECT - Q_PROPERTY(QmlList<QWidget *> *children READ children) + Q_PROPERTY(QmlListProperty<QWidget> children READ children) Q_PROPERTY(int topMargin READ topMargin WRITE setTopMargin) Q_PROPERTY(int bottomMargin READ bottomMargin WRITE setBottomMargin) @@ -57,30 +57,22 @@ public: explicit QBoxLayoutObject(QBoxLayout *, QObject *parent=0); virtual QLayout *layout() const; - QmlList<QWidget *> *children() { return &_widgets; } + QmlListProperty<QWidget> children() { + return QmlListProperty<QWidget>(this, 0, children_append, 0, 0, children_clear); + } private: friend class WidgetList; void addWidget(QWidget *); void clearWidget(); - //XXX need to provide real implementations once QBoxLayoutObject is finished - class WidgetList : public QmlList<QWidget *> - { - public: - WidgetList(QBoxLayoutObject *o) - : obj(o) {} - - virtual void append(QWidget *w) { obj->addWidget(w); } - virtual void clear() { obj->clearWidget(); } - virtual int count() const { return 0; } - virtual void removeAt(int) {} - virtual QWidget *at(int) const { return 0; } - virtual void insert(int, QWidget *) {} + static void children_append(QmlListProperty<QWidget> *property, QWidget *widget) { + static_cast<QBoxLayoutObject*>(property->object)->addWidget(widget); + } - private: - QBoxLayoutObject *obj; - }; + static void children_clear(QmlListProperty<QWidget> *property) { + static_cast<QBoxLayoutObject*>(property->object)->clearWidget(); + } void getMargins() { @@ -154,7 +146,6 @@ private: _layout->setSpacing(spacing); } - WidgetList _widgets; QBoxLayout *_layout; int mTop, mLeft, mBottom, mRight; diff --git a/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp b/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp index 910e40be4704fded601d0a1a913fa6e0e0cf2685..9bceaef6d915843bb211445c29d0d96bf2678232 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp @@ -51,39 +51,6 @@ QT_BEGIN_NAMESPACE class QWidgetDeclarativeUI; -class Actions : public QmlConcreteList<Action *> - { - public: - Actions(QObject *o) : widget(qobject_cast<QWidget*>(o)) {} - virtual void append(Action *o) - { - QmlConcreteList<Action *>::append(o); - o->setParent(widget); - widget->addAction(o); - } - virtual void clear() - { - QmlConcreteList<Action *>::clear(); - - while (!widget->actions().empty()) - widget->removeAction(widget->actions().first()); - //menu->clear(); - } - virtual void removeAt(int i) - { - QmlConcreteList<Action *>::removeAt(i); - widget->removeAction(widget->actions().at(i)); - } - virtual void insert(int i, Action *obj) - { - QmlConcreteList<Action *>::insert(i, obj); - obj->setParent(widget); - widget->addAction(obj); - } - private: - QWidget *widget; - }; - class ResizeEventFilter : public QObject { Q_OBJECT @@ -104,9 +71,9 @@ class QWidgetDeclarativeUI : public QObject { Q_OBJECT - Q_PROPERTY(QmlList<QObject *> *children READ children) + Q_PROPERTY(QmlListProperty<QObject> children READ children) Q_PROPERTY(QLayoutObject *layout READ layout WRITE setLayout) - Q_PROPERTY(QmlList<Action *> *actions READ actions) + Q_PROPERTY(QmlListProperty<Action> actions READ actions) Q_PROPERTY(QFont font READ font CONSTANT) Q_PROPERTY(QPoint pos READ pos) @@ -150,7 +117,7 @@ signals: void opacityChanged(); public: - QWidgetDeclarativeUI(QObject *other) : QObject(other), _children(other), _layout(0), _graphicsOpacityEffect(0), _actions(other) { + QWidgetDeclarativeUI(QObject *other) : QObject(other), _layout(0), _graphicsOpacityEffect(0) { q = qobject_cast<QWidget*>(other); ResizeEventFilter *filter(new ResizeEventFilter(q)); filter->setTarget(q); @@ -162,38 +129,6 @@ public: virtual ~QWidgetDeclarativeUI() { } - class Children : public QmlConcreteList<QObject *> - { - public: - Children(QObject *widget) : q(qobject_cast<QWidget *>(widget)) {} - virtual void append(QObject *o) - { - insert(-1, o); - } - virtual void clear() - { - for (int i = 0; i < count(); ++i) - at(i)->setParent(0); - QmlConcreteList<QObject *>::clear(); - } - virtual void removeAt(int i) - { - at(i)->setParent(0); - QmlConcreteList<QObject *>::removeAt(i); - } - virtual void insert(int i, QObject *o) - { - QmlConcreteList<QObject *>::insert(i, o); - if (QWidget *w = qobject_cast<QWidget *>(o)) - w->setParent(static_cast<QWidget *>(q)); - else - o->setParent(q); - } - - private: - QWidget *q; - }; - public: void setMouseOver(bool _mouseOver) @@ -223,7 +158,9 @@ public: emit mouseOverChanged(); } - QmlList<QObject *> *children() { return &_children; } + QmlListProperty<QObject> children() { + return QmlListProperty<QObject>(this, 0, children_append, children_count, children_at, children_clear); + } QLayoutObject *layout() const { return _layout; } void setLayout(QLayoutObject *lo) @@ -440,18 +377,73 @@ public: } - - QmlList<Action *> *actions() { return &_actions; } + QmlListProperty<Action> actions() { + return QmlListProperty<Action>(this, 0, actions_append, actions_count, actions_at, actions_clear); + } private: QWidget *q; - Children _children; QLayoutObject *_layout; QFont _font; QUrl _styleSheetFile; QGraphicsOpacityEffect *_graphicsOpacityEffect; bool m_mouseOver; - Actions _actions; + + static void children_append(QmlListProperty<QObject> *property, QObject *o) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *q = p->q; + if (QWidget *w = qobject_cast<QWidget *>(o)) + w->setParent(static_cast<QWidget *>(q)); + else + o->setParent(q); + } + + static int children_count(QmlListProperty<QObject> *property) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *q = p->q; + return q->children().count(); + } + + static QObject * children_at(QmlListProperty<QObject> *property, int index) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *q = p->q; + return q->children().at(index); + } + + static void children_clear(QmlListProperty<QObject> *property) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *q = p->q; + QObjectList c = q->children(); + for (int i = 0; i < c.count(); ++i) + c.at(i)->setParent(0); + } + + // ### Original had an insert, and removeAt + static void actions_append(QmlListProperty<Action> *property, Action *o) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *w = p->q; + o->setParent(w); + w->addAction(o); + } + + static int actions_count(QmlListProperty<Action> *property) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *w = p->q; + return w->actions().count(); + } + static Action *actions_at(QmlListProperty<Action> *property, int index) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *w = p->q; + return qobject_cast<Action *>(w->actions().at(index)); + } + + static void actions_clear(QmlListProperty<Action> *property) { + QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object); + QWidget *w = p->q; + + while (!w->actions().empty()) + w->removeAction(w->actions().first()); + } }; bool ResizeEventFilter::eventFilter(QObject *obj, QEvent *event) @@ -1073,7 +1065,7 @@ void QGroupBoxDeclarativeUI::collapse() return; m_contens = QPixmap::grabWidget (gb, 5, 5, gb->width() - 5, gb->height() - 5); gb->setPixmap(m_contens,1); - hideChildren(); + hideChildren(); m_expanded = false; m_timeLine.start(); } @@ -1113,50 +1105,28 @@ class QTabWidgetDeclarativeUI : public QObject { Q_OBJECT - Q_PROPERTY(QmlList<QTabObject *> *tabs READ tabs) + Q_PROPERTY(QmlListProperty<QTabObject> tabs READ tabs) Q_CLASSINFO("DefaultProperty", "tabs") public: - QTabWidgetDeclarativeUI(QObject *other) : QObject(other), _tabs(other) {} + QTabWidgetDeclarativeUI(QObject *other) : QObject(other) {} - QmlList<QTabObject *> *tabs() { return &_tabs; } + QmlListProperty<QTabObject> tabs() { + return QmlListProperty<QTabObject>(this, 0, tabs_append, 0, 0, tabs_clear); + } private: - //if not for the at() function, we could use QmlList instead - class Tabs : public QmlConcreteList<QTabObject *> - { - public: - Tabs(QObject *o) : tw(o) {} - virtual void append(QTabObject *o) - { - QmlConcreteList<QTabObject *>::append(o); - //XXX can we insertTab(-1, o) instead? - if (!o->icon().isNull()) - static_cast<QTabWidget *>(tw)->addTab(o->content(), o->icon(), o->label()); - else - static_cast<QTabWidget *>(tw)->addTab(o->content(), o->label()); - } - virtual void clear() - { - QmlConcreteList<QTabObject *>::clear(); - static_cast<QTabWidget *>(tw)->clear(); - } - virtual void removeAt(int i) - { - QmlConcreteList<QTabObject *>::removeAt(i); - static_cast<QTabWidget *>(tw)->removeTab(i); - } - virtual void insert(int i, QTabObject *obj) - { - QmlConcreteList<QTabObject *>::insert(i, obj); - if (!obj->icon().isNull()) - static_cast<QTabWidget *>(tw)->insertTab(i, obj->content(), obj->icon(), obj->label()); - else - static_cast<QTabWidget *>(tw)->insertTab(i, obj->content(), obj->label()); - } - private: - QObject *tw; - }; - Tabs _tabs; + static void tabs_append(QmlListProperty<QTabObject> *property, QTabObject *o) { + QTabWidget *tw = static_cast<QTabWidget*>(property->object->parent()); + if (!o->icon().isNull()) + tw->addTab(o->content(), o->icon(), o->label()); + else + tw->addTab(o->content(), o->label()); + } + + static void tabs_clear(QmlListProperty<QTabObject> *property) { + QTabWidget *tw = static_cast<QTabWidget*>(property->object->parent()); + tw->clear(); + } }; diff --git a/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp index 141019e0a267d5363efd3d23510b587339ae5d59..94dcea07110b6bf8f931686703565089fcde6e0a 100644 --- a/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp +++ b/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp @@ -52,7 +52,6 @@ #include <QEvent> #include <QGraphicsScene> #include <QmlContext> -#include <QmlList> #include <QmlError> #include <QmlBinding> #include <QmlMetaType> @@ -327,7 +326,7 @@ QPair<QString, NodeInstance> ObjectNodeInstance::anchor(const QString &/*name*/) static bool isList(const QmlMetaProperty &metaProperty) { - return metaProperty.propertyCategory() == QmlMetaProperty::List || metaProperty.propertyCategory() == QmlMetaProperty::QmlList; + return metaProperty.propertyCategory() == QmlMetaProperty::List; } static bool isObject(const QmlMetaProperty &metaProperty) @@ -342,15 +341,7 @@ static QVariant objectToVariant(QObject *object) static void removeObjectFromList(const QmlMetaProperty &metaProperty, QObject *object, QmlEngine *engine) { - QmlListAccessor listAccessor; - listAccessor.setList(metaProperty.read(), engine); - - for (int i = 0; i < listAccessor.count(); ++i) { - if (QmlMetaType::toQObject(listAccessor.at(i)) == object) { - listAccessor.removeAt(i); - break; - } - } + // ### Very few QML lists ever responded to removes } void ObjectNodeInstance::removeFromOldProperty(QObject *object, QObject *oldParent, const QString &oldParentProperty) @@ -371,9 +362,8 @@ void ObjectNodeInstance::addToNewProperty(QObject *object, QObject *newParent, c QmlMetaProperty metaProperty = QmlMetaProperty::createProperty(newParent, newParentProperty, context()); if (isList(metaProperty)) { - QmlListAccessor listAccessor; - listAccessor.setList(metaProperty.read(), nodeInstanceView()->engine()); - listAccessor.append(objectToVariant(object)); + QmlListReference list = qvariant_cast<QmlListReference>(metaProperty.read()); + list.append(object); } else if (isObject(metaProperty)) { metaProperty.write(objectToVariant(object)); } @@ -438,14 +428,13 @@ void ObjectNodeInstance::setPropertyBinding(const QString &name, const QString & void ObjectNodeInstance::deleteObjectsInList(const QmlMetaProperty &metaProperty) { QObjectList objectList; - QmlListAccessor listAccessor; - listAccessor.setList(metaProperty.read()); + QmlListReference list = qvariant_cast<QmlListReference>(metaProperty.read()); - for(int i = 0; i < listAccessor.count(); i++) { - objectList += QmlMetaType::toQObject(listAccessor.at(i)); + for(int i = 0; i < list.count(); i++) { + objectList += list.at(i); } - listAccessor.clear(); + list.clear(); } void ObjectNodeInstance::resetProperty(const QString &name) @@ -489,9 +478,8 @@ void ObjectNodeInstance::resetProperty(QObject *object, const QString &propertyN if (qmlMetaProperty.read() == resetValue(propertyName)) return; qmlMetaProperty.write(resetValue(propertyName)); - } else if (QmlMetaType::isList(qmlMetaProperty.propertyType()) || - QmlMetaType::isQmlList(qmlMetaProperty.propertyType())) { - QmlMetaType::clear(object->property(propertyName.toLatin1())); + } else if (qmlMetaProperty.propertyCategory() == QmlMetaProperty::List) { + qvariant_cast<QmlListReference>(qmlMetaProperty.read()).clear(); } } diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp index 3da27455a443dee3a05a93ae1c336719680efb69..40ad97937f4c38589ec4a0ccdeffd9a389338c51 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp @@ -14,7 +14,7 @@ public: QList<QmlFileFilterItem*> qmlFileFilters() const; // content property - QmlConcreteList<QmlProjectContentItem*> content; + QList<QmlProjectContentItem*> content; }; QList<QmlFileFilterItem*> QmlProjectItemPrivate::qmlFileFilters() const @@ -45,10 +45,10 @@ QmlProjectItem::~QmlProjectItem() delete d_ptr; } -QmlList<QmlProjectContentItem*> *QmlProjectItem::content() +QmlListProperty<QmlProjectContentItem> QmlProjectItem::content() { Q_D(QmlProjectItem); - return &d->content; + return QmlListProperty<QmlProjectContentItem>(this, d->content); } QString QmlProjectItem::sourceDirectory() const diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h index d64e95c0bc61944f7f7e4964eb968dcbbc43bc64..58bff010d9c042e76f899fbb29a0fb03850148d0 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h @@ -21,7 +21,7 @@ class QmlProjectItem : public QObject { Q_DECLARE_PRIVATE(QmlProjectItem) Q_DISABLE_COPY(QmlProjectItem) - Q_PROPERTY(QmlList<QmlProjectManager::QmlProjectContentItem*> *content READ content DESIGNABLE false) + Q_PROPERTY(QmlListProperty<QmlProjectManager::QmlProjectContentItem> content READ content DESIGNABLE false) Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged) Q_PROPERTY(QStringList libraryPaths READ libraryPaths WRITE setLibraryPaths NOTIFY libraryPathsChanged) @@ -31,7 +31,7 @@ public: QmlProjectItem(QObject *parent = 0); ~QmlProjectItem(); - QmlList<QmlProjectContentItem*> *content(); + QmlListProperty<QmlProjectContentItem> content(); QString sourceDirectory() const; void setSourceDirectory(const QString &directoryPath);