diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2009-04-22 04:47:24 (GMT) |
---|---|---|
committer | Michael Brasser <michael.brasser@nokia.com> | 2009-04-22 04:47:24 (GMT) |
commit | 2366667fc97eb6a56203b2dd7dac776ff4164abd (patch) | |
tree | b2acb6cc6bfe475d7e619e4788973b61fff775e0 /src/declarative/widgets | |
parent | 2c762f3b8b284a7c6dc0c499b7052013bad5b707 (diff) | |
download | Qt-2366667fc97eb6a56203b2dd7dac776ff4164abd.zip Qt-2366667fc97eb6a56203b2dd7dac776ff4164abd.tar.gz Qt-2366667fc97eb6a56203b2dd7dac776ff4164abd.tar.bz2 |
Initial import of kinetic-dui branch from the old kinetic
Diffstat (limited to 'src/declarative/widgets')
-rw-r--r-- | src/declarative/widgets/graphicslayouts.cpp | 325 | ||||
-rw-r--r-- | src/declarative/widgets/graphicslayouts.h | 190 | ||||
-rw-r--r-- | src/declarative/widgets/graphicswidgets.cpp | 173 | ||||
-rw-r--r-- | src/declarative/widgets/graphicswidgets.h | 60 | ||||
-rw-r--r-- | src/declarative/widgets/widgets.pri | 10 |
5 files changed, 758 insertions, 0 deletions
diff --git a/src/declarative/widgets/graphicslayouts.cpp b/src/declarative/widgets/graphicslayouts.cpp new file mode 100644 index 0000000..1ecde71 --- /dev/null +++ b/src/declarative/widgets/graphicslayouts.cpp @@ -0,0 +1,325 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "graphicslayouts.h" +#include <QtGui/qgraphicswidget.h> +#include <QtCore/qdebug.h> + +QT_BEGIN_NAMESPACE + +QML_DEFINE_INTERFACE(QGraphicsLayoutItem); +QML_DEFINE_INTERFACE(QGraphicsLayout); + +class LinearLayoutAttached : public QObject +{ + Q_OBJECT + + Q_PROPERTY(int stretchFactor READ stretchFactor WRITE setStretchFactor NOTIFY stretchChanged) + Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged) +public: + LinearLayoutAttached(QObject *parent) + : QObject(parent), _stretch(1), _alignment(Qt::AlignCenter) + { + } + + int stretchFactor() const { return _stretch; } + void setStretchFactor(int f) + { + if (_stretch == f) + return; + + _stretch = f; + emit stretchChanged(reinterpret_cast<QGraphicsLayoutItem*>(parent()), _stretch); + } + + Qt::Alignment alignment() const { return _alignment; } + void setAlignment(Qt::Alignment a) + { + if (_alignment == a) + return; + + _alignment = a; + emit alignmentChanged(reinterpret_cast<QGraphicsLayoutItem*>(parent()), _alignment); + } + +Q_SIGNALS: + void stretchChanged(QGraphicsLayoutItem*,int); + void alignmentChanged(QGraphicsLayoutItem*,Qt::Alignment); + +private: + int _stretch; + Qt::Alignment _alignment; +}; + +QML_DEFINE_TYPE(QGraphicsLinearLayoutStretchItemObject,QGraphicsLinearLayoutStretchItem); + +QGraphicsLinearLayoutStretchItemObject::QGraphicsLinearLayoutStretchItemObject(QObject *parent) + : QObject(parent) +{ +} + +QSizeF QGraphicsLinearLayoutStretchItemObject::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const +{ + Q_UNUSED(which); + Q_UNUSED(constraint); + return QSizeF(); +} + +QML_DEFINE_TYPE(QGraphicsLinearLayoutObject,QGraphicsLinearLayout); + +QGraphicsLinearLayoutObject::QGraphicsLinearLayoutObject(QObject *parent) +: QObject(parent), _children(this) +{ +} + +QGraphicsLinearLayoutObject::~QGraphicsLinearLayoutObject() +{ +} + +void QGraphicsLinearLayoutObject::insertLayoutItem(int index, QGraphicsLayoutItem *item) +{ + insertItem(index, item); + + //connect attached properties + if(QObject *obj = attachedProperties.value(item)) { + setStretchFactor(item, static_cast<LinearLayoutAttached *>(obj)->stretchFactor()); + setAlignment(item, static_cast<LinearLayoutAttached *>(obj)->alignment()); + QObject::connect(obj, SIGNAL(stretchChanged(QGraphicsLayoutItem*,int)), + this, SLOT(updateStretch(QGraphicsLayoutItem*,int))); + QObject::connect(obj, SIGNAL(alignmentChanged(QGraphicsLayoutItem*,Qt::Alignment)), + this, SLOT(updateAlignment(QGraphicsLayoutItem*,Qt::Alignment))); + //XXX need to disconnect when widget is removed? + } +} + +//XXX is there a better way to do this? +void QGraphicsLinearLayoutObject::clearChildren() +{ + for (int i = 0; i < count(); ++i) + removeAt(i); +} + +void QGraphicsLinearLayoutObject::updateStretch(QGraphicsLayoutItem *item, int stretch) +{ + QGraphicsLinearLayout::setStretchFactor(item, stretch); +} + +void QGraphicsLinearLayoutObject::updateAlignment(QGraphicsLayoutItem *item, Qt::Alignment alignment) +{ + QGraphicsLinearLayout::setAlignment(item, alignment); +} + +QHash<QGraphicsLayoutItem*, QObject*> QGraphicsLinearLayoutObject::attachedProperties; +QObject *QGraphicsLinearLayoutObject::qmlAttachedProperties(QObject *obj) +{ + if (!qobject_cast<QGraphicsLayoutItem*>(obj)) + return 0; + if(!attachedProperties.contains(qobject_cast<QGraphicsLayoutItem*>(obj))) { + LinearLayoutAttached *rv = new LinearLayoutAttached(obj); + /*if (QGraphicsLinearLayoutObject *lo = qobject_cast<QGraphicsLinearLayoutObject*>(obj->parent())) + QObject::connect(rv, SIGNAL(stretchChanged(QGraphicsLayoutItem*,int)), + lo, SLOT(updateStretch(QGraphicsLayoutItem*,int))); + QObject::connect(rv, SIGNAL(alignmentChanged(QGraphicsLayoutItem*,Qt::Alignment)), + lo, SLOT(updateAlignment(QGraphicsLayoutItem*,Qt::Alignment)));*/ + attachedProperties.insert(qobject_cast<QGraphicsLayoutItem*>(obj), rv); + } + return attachedProperties.value(qobject_cast<QGraphicsLayoutItem*>(obj)); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////// +// QGraphicsGridLayout-related classes +////////////////////////////////////////////////////////////////////////////////////////////////////// +class GridLayoutAttached : public QObject +{ + Q_OBJECT + + Q_PROPERTY(int row READ row WRITE setRow) + Q_PROPERTY(int column READ column WRITE setColumn) + Q_PROPERTY(int rowSpan READ rowSpan WRITE setRowSpan) + Q_PROPERTY(int columnSpan READ columnSpan WRITE setColumnSpan) + Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment) +public: + GridLayoutAttached(QObject *parent) + : QObject(parent), _row(-1), _column(-1), _rowspan(1), _colspan(1), _alignment(-1) + { + } + + int row() const { return _row; } + void setRow(int r) + { + if (_row == r) + return; + + _row = r; + //emit rowChanged(reinterpret_cast<QGraphicsLayoutItem*>(parent()), _row); + } + + int column() const { return _column; } + void setColumn(int c) + { + if (_column == c) + return; + + _column = c; + //emit columnChanged(reinterpret_cast<QGraphicsLayoutItem*>(parent()), _column); + } + + int rowSpan() const { return _rowspan; } + void setRowSpan(int rs) + { + if (_rowspan == rs) + return; + + _rowspan = rs; + //emit rowSpanChanged(reinterpret_cast<QGraphicsLayoutItem*>(parent()), _rowSpan); + } + + int columnSpan() const { return _colspan; } + void setColumnSpan(int cs) + { + if (_colspan == cs) + return; + + _colspan = cs; + //emit columnSpanChanged(reinterpret_cast<QGraphicsLayoutItem*>(parent()), _columnSpan); + } + + Qt::Alignment alignment() const { return _alignment; } + void setAlignment(Qt::Alignment a) + { + if (_alignment == a) + return; + + _alignment = a; + //emit alignmentChanged(reinterpret_cast<QGraphicsLayoutItem*>(parent()), _alignment); + } + +Q_SIGNALS: + //void rowChanged(QGraphicsLayoutItem*,int); + //void columnSpanChanged(QGraphicsLayoutItem*,int); + //void rowSpanChanged(QGraphicsLayoutItem*,int); + //void columnChanged(QGraphicsLayoutItem*,int); + //void alignmentChanged(QGraphicsLayoutItem*,Qt::Alignment); + +private: + int _row; + int _column; + int _rowspan; + int _colspan; + Qt::Alignment _alignment; +}; + +QML_DEFINE_TYPE(QGraphicsGridLayoutObject,QGraphicsGridLayout); + + +QGraphicsGridLayoutObject::QGraphicsGridLayoutObject(QObject *parent) +: QObject(parent), _children(this) +{ +} + +QGraphicsGridLayoutObject::~QGraphicsGridLayoutObject() +{ +} + +void QGraphicsGridLayoutObject::addWidget(QGraphicsWidget *wid) +{ + //use attached properties + if(QObject *obj = attachedProperties.value(qobject_cast<QGraphicsLayoutItem*>(wid))) { + int row = static_cast<GridLayoutAttached *>(obj)->row(); + int column = static_cast<GridLayoutAttached *>(obj)->column(); + int rowSpan = static_cast<GridLayoutAttached *>(obj)->rowSpan(); + int columnSpan = static_cast<GridLayoutAttached *>(obj)->columnSpan(); + if (row == -1 || column == -1) { + qWarning() << "Must set row and column for an item in a grid layout"; + return; + } + addItem(wid, row, column, rowSpan, columnSpan); + } +} + +void QGraphicsGridLayoutObject::addLayoutItem(QGraphicsLayoutItem *item) +{ + //use attached properties + if(QObject *obj = attachedProperties.value(item)) { + int row = static_cast<GridLayoutAttached *>(obj)->row(); + int column = static_cast<GridLayoutAttached *>(obj)->column(); + int rowSpan = static_cast<GridLayoutAttached *>(obj)->rowSpan(); + int columnSpan = static_cast<GridLayoutAttached *>(obj)->columnSpan(); + Qt::Alignment alignment = static_cast<GridLayoutAttached *>(obj)->alignment(); + if (row == -1 || column == -1) { + qWarning() << "Must set row and column for an item in a grid layout"; + return; + } + addItem(item, row, column, rowSpan, columnSpan); + if (alignment != -1) + setAlignment(item,alignment); + } +} + +//XXX is there a better way to do this? +void QGraphicsGridLayoutObject::clearChildren() +{ + for (int i = 0; i < count(); ++i) + removeAt(i); +} + +qreal QGraphicsGridLayoutObject::spacing() const +{ + if (verticalSpacing() == horizontalSpacing()) + return verticalSpacing(); + return -1; //XXX +} + +QHash<QGraphicsLayoutItem*, QObject*> QGraphicsGridLayoutObject::attachedProperties; +QObject *QGraphicsGridLayoutObject::qmlAttachedProperties(QObject *obj) +{ + if (!qobject_cast<QGraphicsLayoutItem*>(obj)) + return 0; + if(!attachedProperties.contains(qobject_cast<QGraphicsLayoutItem*>(obj))) { + GridLayoutAttached *rv = new GridLayoutAttached(obj); + attachedProperties.insert(qobject_cast<QGraphicsLayoutItem*>(obj), rv); + } + return attachedProperties.value(qobject_cast<QGraphicsLayoutItem*>(obj)); +} + +QT_END_NAMESPACE + +#include "graphicslayouts.moc" diff --git a/src/declarative/widgets/graphicslayouts.h b/src/declarative/widgets/graphicslayouts.h new file mode 100644 index 0000000..beb4b65 --- /dev/null +++ b/src/declarative/widgets/graphicslayouts.h @@ -0,0 +1,190 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef GRAPHICSLAYOUTS_H +#define GRAPHICSLAYOUTS_H + +#include "graphicswidgets.h" +#include <QGraphicsLinearLayout> +#include <QGraphicsGridLayout> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Declarative) + +QML_DECLARE_INTERFACE(QGraphicsLayoutItem); +QML_DECLARE_INTERFACE(QGraphicsLayout); + +class QGraphicsLinearLayoutStretchItemObject : public QObject, public QGraphicsLayoutItem +{ + Q_OBJECT + Q_INTERFACES(QGraphicsLayoutItem) +public: + QGraphicsLinearLayoutStretchItemObject(QObject *parent = 0); + + virtual QSizeF sizeHint(Qt::SizeHint, const QSizeF &) const; +}; +QML_DECLARE_TYPE(QGraphicsLinearLayoutStretchItemObject); + +//TODO: +// -content margins +// -per-item spacing (does this need to be exposed?) +// -per-item alignment +class LinearLayoutAttached; +class QGraphicsLinearLayoutObject : public QObject, public QGraphicsLinearLayout +{ + Q_OBJECT + Q_INTERFACES(QGraphicsLayout QGraphicsLayoutItem) + + Q_PROPERTY(QmlList<QGraphicsLayoutItem *> *children READ children) + Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation) + Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing) + Q_CLASSINFO("DefaultProperty", "children") +public: + QGraphicsLinearLayoutObject(QObject * = 0); + ~QGraphicsLinearLayoutObject(); + + QmlList<QGraphicsLayoutItem *> *children() { return &_children; } + + static QObject *qmlAttachedProperties(QObject *); + +private Q_SLOTS: + void updateStretch(QGraphicsLayoutItem*,int); + void updateAlignment(QGraphicsLayoutItem*,Qt::Alignment); + +private: + friend class LinearLayoutAttached; + void clearChildren(); + void insertLayoutItem(int, QGraphicsLayoutItem *); + static QHash<QGraphicsLayoutItem*, QObject*> attachedProperties; + + class ChildList : public QmlList<QGraphicsLayoutItem *> + { + public: + ChildList(QGraphicsLinearLayoutObject *o) + : obj(o) {} + + virtual void append(QGraphicsLayoutItem *item) + { + insert(-1, item); + } + virtual void clear() { obj->clearChildren(); } + virtual int count() const { return obj->count(); } + virtual void removeAt(int i) { obj->removeAt(i); } + virtual QGraphicsLayoutItem *at(int i) const { return obj->itemAt(i); } + virtual void insert(int i, QGraphicsLayoutItem *item) { obj->insertLayoutItem(i, item); } + + private: + QGraphicsLinearLayoutObject *obj; + }; + + ChildList _children; +}; +QML_DECLARE_TYPE(QGraphicsLinearLayoutObject); + +//TODO: +// -content margins +// -column and row specific settings: +// -alignment +// -fixed/min/max/preferred width +// -spacing +// -stretch +class QGraphicsGridLayoutObject : public QObject, public QGraphicsGridLayout +{ + Q_OBJECT + Q_INTERFACES(QGraphicsLayout QGraphicsLayoutItem) + + Q_PROPERTY(QmlList<QGraphicsLayoutItem *> *children READ children) + Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing) + Q_PROPERTY(qreal verticalSpacing READ verticalSpacing WRITE setVerticalSpacing) + Q_PROPERTY(qreal horizontalSpacing READ horizontalSpacing WRITE setHorizontalSpacing) + Q_CLASSINFO("DefaultProperty", "children") +public: + QGraphicsGridLayoutObject(QObject * = 0); + ~QGraphicsGridLayoutObject(); + + QmlList<QGraphicsLayoutItem *> *children() { return &_children; } + + qreal spacing() const; + + static QObject *qmlAttachedProperties(QObject *); + +private: + friend class GraphicsLayoutAttached; + void addWidget(QGraphicsWidget *); + void clearChildren(); + void addLayoutItem(QGraphicsLayoutItem *); + static QHash<QGraphicsLayoutItem*, QObject*> attachedProperties; + + class ChildList : public QmlList<QGraphicsLayoutItem *> + { + public: + ChildList(QGraphicsGridLayoutObject *o) + : obj(o) {} + + virtual void append(QGraphicsLayoutItem *o) + { + obj->addLayoutItem(o); + } + virtual void clear() { obj->clearChildren(); } + virtual int count() const { return obj->count(); } + virtual void removeAt(int i) { obj->removeAt(i); } + virtual QGraphicsLayoutItem *at(int i) const { return obj->itemAt(i); } + //XXX GridLayout doesn't have an insert, so for now we treat it as an append. + // this is obviously potenitally dangerous -- perhaps should be a concrete + // list with no relation to layout index, etc at all. + virtual void insert(int, QGraphicsLayoutItem *item) { append(item); } + + private: + QGraphicsGridLayoutObject *obj; + }; + + ChildList _children; +}; +QML_DECLARE_TYPE(QGraphicsGridLayoutObject); + +#endif // GRAPHICSLAYOUTS_H + +QT_END_NAMESPACE + +QT_END_HEADER diff --git a/src/declarative/widgets/graphicswidgets.cpp b/src/declarative/widgets/graphicswidgets.cpp new file mode 100644 index 0000000..1d0e638 --- /dev/null +++ b/src/declarative/widgets/graphicswidgets.cpp @@ -0,0 +1,173 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "graphicswidgets.h" + +QT_BEGIN_NAMESPACE + +//### the single (default) property could alternatively be added to graphics view directly +class QGraphicsViewDeclarativeUI : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QGraphicsScene *scene READ scene WRITE setScene) + Q_CLASSINFO("DefaultProperty", "scene") +public: + QGraphicsViewDeclarativeUI(QObject *other) : QObject(other) {} + + QGraphicsScene *scene() const { return static_cast<QGraphicsView *>(parent())->scene(); } + void setScene(QGraphicsScene *scene) + { + static_cast<QGraphicsView *>(parent())->setScene(scene); + } +}; +QML_DEFINE_EXTENDED_TYPE(QGraphicsView,QGraphicsView,QGraphicsViewDeclarativeUI); + +class QGraphicsSceneDeclarativeUI : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QmlList<QObject *> *children READ children) + Q_CLASSINFO("DefaultProperty", "children") +public: + QGraphicsSceneDeclarativeUI(QObject *other) : QObject(other), _children(other) {} + + QmlList<QObject *> *children() { return &_children; } + +private: + class Children : public QmlConcreteList<QObject *> + { + public: + Children(QObject *scene) : q(scene) {} + virtual void append(QObject *o) + { + insert(-1, o); + } + virtual void clear() + { + for (int i = 0; i < count(); ++i) + if(QGraphicsWidget *w = qobject_cast<QGraphicsWidget *>(at(i))) + static_cast<QGraphicsScene *>(q)->removeItem(w); + QmlConcreteList<QObject *>::clear(); + } + virtual void removeAt(int i) + { + if(QGraphicsWidget *w = qobject_cast<QGraphicsWidget *>(at(i))) + static_cast<QGraphicsScene *>(q)->removeItem(w); + QmlConcreteList<QObject *>::removeAt(i); + } + virtual void insert(int i, QObject *o) + { + QmlConcreteList<QObject *>::insert(i, o); + + //XXX are there any cases when insertion should be different from appension? + if(QGraphicsWidget *w = qobject_cast<QGraphicsWidget *>(o)) + static_cast<QGraphicsScene *>(q)->addItem(w); + //else if (QWidget *w = qobject_cast<QWidget *>(o)) + // static_cast<QGraphicsScene *>(q)->addWidget(w); + //else + // qWarning() << "Can't add" << o << "to a QGraphicsScene"; + } + private: + QObject *q; + }; + Children _children; +}; +QML_DEFINE_EXTENDED_TYPE(QGraphicsScene,QGraphicsScene,QGraphicsSceneDeclarativeUI); + +class QGraphicsWidgetDeclarativeUI : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QmlList<QObject *> *data READ data) + Q_PROPERTY(QmlList<QGraphicsItem *> *children READ children) + Q_PROPERTY(QGraphicsLayout *layout READ layout WRITE setLayout) + Q_CLASSINFO("DefaultProperty", "children") +public: + QGraphicsWidgetDeclarativeUI(QObject *other) : QObject(other), _widgets(this) {} + + QmlList<QObject *> *data() { return &_data; } + + QmlList<QGraphicsItem *> *children() { return &_widgets; } + + QGraphicsLayout *layout() const { return static_cast<QGraphicsWidget *>(parent())->layout(); } + void setLayout(QGraphicsLayout *lo) + { + static_cast<QGraphicsWidget *>(parent())->setLayout(lo); + } + +private: + friend class WidgetList; + void setItemParent(QGraphicsItem *wid) + { + wid->setParentItem(static_cast<QGraphicsWidget *>(parent())); + } + + //### + void clearWidget() + { + } + + class WidgetList : public QmlConcreteList<QGraphicsItem *> + { + public: + WidgetList(QGraphicsWidgetDeclarativeUI *o) + : obj(o) {} + + virtual void append(QGraphicsItem *w) { QmlConcreteList<QGraphicsItem *>::append(w); obj->setItemParent(w); } + virtual void clear() { QmlConcreteList<QGraphicsItem *>::clear(); obj->clearWidget(); } + virtual void removeAt(int i) { QmlConcreteList<QGraphicsItem *>::removeAt(i); } //XXX + virtual void insert(int i, QGraphicsItem *item) { QmlConcreteList<QGraphicsItem *>::insert(i, item); obj->setItemParent(item); } + + private: + QGraphicsWidgetDeclarativeUI *obj; + }; + WidgetList _widgets; + QmlConcreteList<QObject *> _data; +}; + +QML_DEFINE_EXTENDED_TYPE(QGraphicsWidget,QGraphicsWidget,QGraphicsWidgetDeclarativeUI); + +QML_DEFINE_INTERFACE(QGraphicsItem); + +#include "graphicswidgets.moc" + +QT_END_NAMESPACE diff --git a/src/declarative/widgets/graphicswidgets.h b/src/declarative/widgets/graphicswidgets.h new file mode 100644 index 0000000..47a753a --- /dev/null +++ b/src/declarative/widgets/graphicswidgets.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef GRAPHICSWIDGETS_H +#define GRAPHICSWIDGETS_H + +#include <qml.h> +#include <QGraphicsScene> +#include <QGraphicsView> +#include <QGraphicsWidget> +#include <QGraphicsItem> + +QT_BEGIN_NAMESPACE + +QML_DECLARE_TYPE(QGraphicsView); +QML_DECLARE_TYPE_HASMETATYPE(QGraphicsScene); +QML_DECLARE_TYPE(QGraphicsWidget); +QML_DECLARE_INTERFACE_HASMETATYPE(QGraphicsItem); + +QT_END_NAMESPACE + +#endif // GRAPHICSWIDGETS_H diff --git a/src/declarative/widgets/widgets.pri b/src/declarative/widgets/widgets.pri new file mode 100644 index 0000000..41c50d8 --- /dev/null +++ b/src/declarative/widgets/widgets.pri @@ -0,0 +1,10 @@ +SOURCES += \ + widgets/graphicswidgets.cpp \ + widgets/graphicslayouts.cpp \ + +HEADERS += \ + widgets/graphicswidgets.h \ + widgets/graphicslayouts.h \ + + + |