summaryrefslogtreecommitdiffstats
path: root/src/declarative/fx
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2009-10-09 01:36:11 (GMT)
committerBea Lam <bea.lam@nokia.com>2009-10-09 01:36:11 (GMT)
commit91c85c76d83260d794701100b36a0cc04f848932 (patch)
tree86fd1204ad8358a0a41d8a61307e1d3e1ce16177 /src/declarative/fx
parentccb3f7c3bda46ace7b42bff5a27a11bd07602b68 (diff)
parentdda314e206162215e60dd306b6347a04f19ca5df (diff)
downloadQt-91c85c76d83260d794701100b36a0cc04f848932.zip
Qt-91c85c76d83260d794701100b36a0cc04f848932.tar.gz
Qt-91c85c76d83260d794701100b36a0cc04f848932.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Conflicts: examples/declarative/layouts/Button.qml
Diffstat (limited to 'src/declarative/fx')
-rw-r--r--src/declarative/fx/qfxgraphicsobjectcontainer.cpp119
-rw-r--r--src/declarative/fx/qfxgraphicsobjectcontainer.h8
-rw-r--r--src/declarative/fx/qfxgridview.cpp15
-rw-r--r--src/declarative/fx/qfxlistview.cpp19
-rw-r--r--src/declarative/fx/qfxvisualitemmodel.cpp76
5 files changed, 135 insertions, 102 deletions
diff --git a/src/declarative/fx/qfxgraphicsobjectcontainer.cpp b/src/declarative/fx/qfxgraphicsobjectcontainer.cpp
index c0cac6c..5a61d12 100644
--- a/src/declarative/fx/qfxgraphicsobjectcontainer.cpp
+++ b/src/declarative/fx/qfxgraphicsobjectcontainer.cpp
@@ -43,9 +43,42 @@
#include <QGraphicsObject>
#include <QGraphicsWidget>
#include <QGraphicsSceneResizeEvent>
+#include <private/qfxitem_p.h>
QT_BEGIN_NAMESPACE
+class QFxGraphicsObjectContainerPrivate : public QFxItemPrivate
+{
+ Q_DECLARE_PUBLIC(QFxGraphicsObjectContainer)
+
+public:
+ QFxGraphicsObjectContainerPrivate() : QFxItemPrivate(), graphicsObject(0), syncedResize(false)
+ { }
+
+ void _q_updateSize();
+
+ void setFiltering(bool on)
+ {
+ Q_Q(QFxGraphicsObjectContainer);
+ if (graphicsObject && graphicsObject->isWidget()) {
+ if (!on) {
+ graphicsObject->removeEventFilter(q);
+ QObject::disconnect(q, SIGNAL(widthChanged()), q, SLOT(_q_updateSize()));
+ QObject::disconnect(q, SIGNAL(heightChanged()), q, SLOT(_q_updateSize()));
+ } else {
+ graphicsObject->installEventFilter(q);
+ QObject::connect(q, SIGNAL(widthChanged()), q, SLOT(_q_updateSize()));
+ QObject::connect(q, SIGNAL(heightChanged()), q, SLOT(_q_updateSize()));
+ }
+ }
+ }
+
+
+ QGraphicsObject *graphicsObject;
+ bool syncedResize;
+};
+
+
/*!
\qmlclass GraphicsObjectContainer QFxGraphicsObjectContainer
\brief The GraphicsObjectContainer element allows you to add QGraphicsObjects into Fluid UI elements.
@@ -61,7 +94,7 @@ QML_DEFINE_NOCREATE_TYPE(QGraphicsObject)
QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,GraphicsObjectContainer,QFxGraphicsObjectContainer)
QFxGraphicsObjectContainer::QFxGraphicsObjectContainer(QFxItem *parent)
-: QFxItem(parent), _graphicsObject(0), _syncedResize(false)
+: QFxItem(*new QFxGraphicsObjectContainerPrivate, parent)
{
}
@@ -71,7 +104,8 @@ QFxGraphicsObjectContainer::~QFxGraphicsObjectContainer()
QGraphicsObject *QFxGraphicsObjectContainer::graphicsObject() const
{
- return _graphicsObject;
+ Q_D(const QFxGraphicsObjectContainer);
+ return d->graphicsObject;
}
/*!
@@ -80,30 +114,45 @@ QGraphicsObject *QFxGraphicsObjectContainer::graphicsObject() const
*/
void QFxGraphicsObjectContainer::setGraphicsObject(QGraphicsObject *object)
{
- if (object == _graphicsObject)
+ Q_D(QFxGraphicsObjectContainer);
+ if (object == d->graphicsObject)
return;
- //### what should we do with previously set object?
+ //### remove previously set item?
+
+ d->setFiltering(false);
+
+ d->graphicsObject = object;
- _graphicsObject = object;
+ if (d->graphicsObject) {
+ d->graphicsObject->setParentItem(this);
- if (_graphicsObject) {
- _graphicsObject->setParentItem(this);
+ if (d->syncedResize && d->graphicsObject->isWidget()) {
+ QGraphicsWidget *gw = static_cast<QGraphicsWidget*>(d->graphicsObject);
+ QSizeF gwSize = gw->size(); //### should we use sizeHint?
+ QSizeF newSize = gwSize;
+ if (heightValid())
+ newSize.setHeight(height());
+ if (widthValid())
+ newSize.setWidth(width());
+ if (gwSize != newSize)
+ gw->resize(newSize);
- if (_syncedResize && _graphicsObject->isWidget()) {
- _graphicsObject->installEventFilter(this);
- QSizeF newSize = static_cast<QGraphicsWidget*>(_graphicsObject)->size(); //### use sizeHint?
- setImplicitWidth(newSize.width());
- setImplicitHeight(newSize.height());
+ gwSize = gw->size();
+ setImplicitWidth(gwSize.width());
+ setImplicitHeight(gwSize.height());
+
+ d->setFiltering(true);
}
}
}
QVariant QFxGraphicsObjectContainer::itemChange(GraphicsItemChange change, const QVariant &value)
{
+ Q_D(QFxGraphicsObjectContainer);
if (change == ItemSceneHasChanged) {
- QGraphicsObject *o = _graphicsObject;
- _graphicsObject = 0;
+ QGraphicsObject *o = d->graphicsObject;
+ d->graphicsObject = 0;
setGraphicsObject(o);
}
return QFxItem::itemChange(change, value);
@@ -111,9 +160,10 @@ QVariant QFxGraphicsObjectContainer::itemChange(GraphicsItemChange change, const
bool QFxGraphicsObjectContainer::eventFilter(QObject *watched, QEvent *e)
{
- if (watched == _graphicsObject && e->type() == QEvent::GraphicsSceneResize) {
- if (_graphicsObject && _graphicsObject->isWidget() && _syncedResize) {
- QSizeF newSize = static_cast<QGraphicsWidget*>(_graphicsObject)->size();
+ Q_D(QFxGraphicsObjectContainer);
+ if (watched == d->graphicsObject && e->type() == QEvent::GraphicsSceneResize) {
+ if (d->graphicsObject && d->graphicsObject->isWidget() && d->syncedResize) {
+ QSizeF newSize = static_cast<QGraphicsWidget*>(d->graphicsObject)->size();
setImplicitWidth(newSize.width());
setImplicitHeight(newSize.height());
}
@@ -142,40 +192,27 @@ bool QFxGraphicsObjectContainer::eventFilter(QObject *watched, QEvent *e)
*/
bool QFxGraphicsObjectContainer::synchronizedResizing() const
{
- return _syncedResize;
+ Q_D(const QFxGraphicsObjectContainer);
+ return d->syncedResize;
}
void QFxGraphicsObjectContainer::setSynchronizedResizing(bool on)
{
- if (on == _syncedResize)
+ Q_D(QFxGraphicsObjectContainer);
+ if (on == d->syncedResize)
return;
- if (_graphicsObject && _graphicsObject->isWidget()) {
- if (!on) {
- _graphicsObject->removeEventFilter(this);
- disconnect(this, SIGNAL(widthChanged()), this, SLOT(_q_updateSize()));
- disconnect(this, SIGNAL(heightChanged()), this, SLOT(_q_updateSize()));
- }
- }
-
- _syncedResize = on;
-
- if (_graphicsObject && _graphicsObject->isWidget()) {
- if (on) {
- _graphicsObject->installEventFilter(this);
- connect(this, SIGNAL(widthChanged()), this, SLOT(_q_updateSize()));
- connect(this, SIGNAL(heightChanged()), this, SLOT(_q_updateSize()));
- }
- }
+ d->syncedResize = on;
+ d->setFiltering(on);
}
-void QFxGraphicsObjectContainer::_q_updateSize()
+void QFxGraphicsObjectContainerPrivate::_q_updateSize()
{
- if (!_graphicsObject || !_graphicsObject->isWidget() || !_syncedResize)
+ if (!graphicsObject || !graphicsObject->isWidget() || !syncedResize)
return;
- QGraphicsWidget *gw = static_cast<QGraphicsWidget*>(_graphicsObject);
- const QSizeF newSize(width(), height());
+ QGraphicsWidget *gw = static_cast<QGraphicsWidget*>(graphicsObject);
+ const QSizeF newSize(width, height);
gw->resize(newSize);
//### will respecting the widgets min/max ever get us in trouble? (all other items always
@@ -189,3 +226,5 @@ void QFxGraphicsObjectContainer::_q_updateSize()
}
QT_END_NAMESPACE
+
+#include "moc_qfxgraphicsobjectcontainer.cpp"
diff --git a/src/declarative/fx/qfxgraphicsobjectcontainer.h b/src/declarative/fx/qfxgraphicsobjectcontainer.h
index a8b7c8c..656a7f8 100644
--- a/src/declarative/fx/qfxgraphicsobjectcontainer.h
+++ b/src/declarative/fx/qfxgraphicsobjectcontainer.h
@@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
class QGraphicsObject;
+class QFxGraphicsObjectContainerPrivate;
class Q_DECLARATIVE_EXPORT QFxGraphicsObjectContainer : public QFxItem
{
@@ -74,12 +75,9 @@ protected:
QVariant itemChange(GraphicsItemChange change, const QVariant &value);
bool eventFilter(QObject *watched, QEvent *e);
-private Q_SLOTS:
- void _q_updateSize();
-
private:
- QGraphicsObject *_graphicsObject;
- bool _syncedResize;
+ Q_PRIVATE_SLOT(d_func(), void _q_updateSize())
+ Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QFxGraphicsObjectContainer)
};
QT_END_NAMESPACE
diff --git a/src/declarative/fx/qfxgridview.cpp b/src/declarative/fx/qfxgridview.cpp
index a8b27f4..2d25d56 100644
--- a/src/declarative/fx/qfxgridview.cpp
+++ b/src/declarative/fx/qfxgridview.cpp
@@ -149,7 +149,7 @@ class QFxGridViewPrivate : public QFxFlickablePrivate
public:
QFxGridViewPrivate()
- : model(0), currentItem(0), tmpCurrent(0), flow(QFxGridView::LeftToRight)
+ : model(0), currentItem(0), flow(QFxGridView::LeftToRight)
, visiblePos(0), visibleIndex(0) , currentIndex(-1)
, cellWidth(100), cellHeight(100), columns(1), requestedIndex(-1)
, highlightComponent(0), highlight(0), trackedItem(0)
@@ -298,7 +298,6 @@ public:
QList<FxGridItem*> visibleItems;
QHash<QFxItem*,int> unrequestedItems;
FxGridItem *currentItem;
- QFxItem *tmpCurrent;
QFxGridView::Flow flow;
int visiblePos;
int visibleIndex;
@@ -640,10 +639,6 @@ void QFxGridViewPrivate::updateCurrent(int modelIndex)
return;
}
- if (tmpCurrent) {
- delete tmpCurrent;
- tmpCurrent = 0;
- }
FxGridItem *oldCurrentItem = currentItem;
currentIndex = modelIndex;
currentItem = createItem(modelIndex);
@@ -821,12 +816,8 @@ void QFxGridView::setCurrentIndex(int index)
QFxItem *QFxGridView::currentItem()
{
Q_D(QFxGridView);
- if (!d->currentItem) {
- // Always return something valid
- if (!d->tmpCurrent)
- d->tmpCurrent = new QFxItem(viewport());
- return d->tmpCurrent;
- }
+ if (!d->currentItem)
+ return 0;
return d->currentItem->item;
}
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index 1247021..5afd881 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -170,15 +170,15 @@ class QFxListViewPrivate : public QFxFlickablePrivate
public:
QFxListViewPrivate()
- : model(0), currentItem(0), tmpCurrent(0), orient(Qt::Vertical)
+ : model(0), currentItem(0), orient(Qt::Vertical)
, visiblePos(0), visibleIndex(0)
, averageSize(100.0), currentIndex(-1), requestedIndex(-1)
, highlightRangeStart(0), highlightRangeEnd(0)
, highlightComponent(0), highlight(0), trackedItem(0)
, moveReason(Other), buffer(0), highlightPosAnimator(0), highlightSizeAnimator(0), spacing(0.0)
+ , highlightMoveSpeed(400), highlightResizeSpeed(400)
, ownModel(false), wrap(false), autoHighlight(true)
, haveHighlightRange(false), strictHighlightRange(false)
- , highlightMoveSpeed(400), highlightResizeSpeed(400)
{}
void init();
@@ -371,7 +371,6 @@ public:
QList<FxListItem*> visibleItems;
QHash<QFxItem*,int> unrequestedItems;
FxListItem *currentItem;
- QFxItem *tmpCurrent;
Qt::Orientation orient;
int visiblePos;
int visibleIndex;
@@ -752,10 +751,6 @@ void QFxListViewPrivate::updateCurrent(int modelIndex)
return;
}
- if (tmpCurrent) {
- delete tmpCurrent;
- tmpCurrent = 0;
- }
FxListItem *oldCurrentItem = currentItem;
currentIndex = modelIndex;
currentItem = createItem(modelIndex);
@@ -991,14 +986,8 @@ void QFxListView::setCurrentIndex(int index)
QFxItem *QFxListView::currentItem()
{
Q_D(QFxListView);
- if (!d->currentItem) {
- // Always return something valid
- if (!d->tmpCurrent) {
- d->tmpCurrent = new QFxItem;
- d->tmpCurrent->setParent(viewport());
- }
- return d->tmpCurrent;
- }
+ if (!d->currentItem)
+ return 0;
return d->currentItem->item;
}
diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp
index b7248ea..943f909 100644
--- a/src/declarative/fx/qfxvisualitemmodel.cpp
+++ b/src/declarative/fx/qfxvisualitemmodel.cpp
@@ -239,6 +239,10 @@ class QFxVisualDataModelPrivate : public QObjectPrivate
public:
QFxVisualDataModelPrivate(QmlContext *);
+ static QFxVisualDataModelPrivate *get(QFxVisualDataModel *m) {
+ return static_cast<QFxVisualDataModelPrivate *>(QObjectPrivate::get(m));
+ }
+
QGuard<QListModelInterface> m_listModelInterface;
QGuard<QAbstractItemModel> m_abstractItemModel;
QGuard<QFxVisualDataModel> m_visualItemModel;
@@ -363,7 +367,8 @@ class QFxVisualDataModelData : public QObject
{
Q_OBJECT
public:
- QFxVisualDataModelData(int index, QFxVisualDataModelPrivate *model);
+ QFxVisualDataModelData(int index, QFxVisualDataModel *model);
+ ~QFxVisualDataModelData();
Q_PROPERTY(int index READ index NOTIFY indexChanged)
int index() const;
@@ -379,7 +384,7 @@ Q_SIGNALS:
private:
friend class QFxVisualDataModelDataMetaObject;
int m_index;
- QFxVisualDataModelPrivate *m_model;
+ QGuard<QFxVisualDataModel> m_model;
QFxVisualDataModelDataMetaObject *m_meta;
};
@@ -404,15 +409,19 @@ int QFxVisualDataModelDataMetaObject::createProperty(const char *name, const cha
QFxVisualDataModelData *data =
static_cast<QFxVisualDataModelData *>(object());
- if ((!data->m_model->m_listModelInterface || !data->m_model->m_abstractItemModel)
- && data->m_model->m_listAccessor) {
- data->m_model->ensureRoles();
- if (data->m_model->m_roleNames.contains(QLatin1String(name)))
+ if (!data->m_model)
+ return -1;
+
+ QFxVisualDataModelPrivate *model = QFxVisualDataModelPrivate::get(data->m_model);
+
+ if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
+ model->ensureRoles();
+ if (model->m_roleNames.contains(QLatin1String(name)))
return QmlOpenMetaObject::createProperty(name, type);
} else {
- data->m_model->ensureRoles();
+ model->ensureRoles();
const QLatin1String sname(name);
- if (data->m_model->m_roleNames.contains(sname))
+ if (model->m_roleNames.contains(sname))
return QmlOpenMetaObject::createProperty(name, type);
}
return -1;
@@ -425,45 +434,48 @@ QFxVisualDataModelDataMetaObject::propertyCreated(int, QMetaPropertyBuilder &pro
QFxVisualDataModelData *data =
static_cast<QFxVisualDataModelData *>(object());
+
+ Q_ASSERT(data->m_model);
+ QFxVisualDataModelPrivate *model = QFxVisualDataModelPrivate::get(data->m_model);
+
QString name = QLatin1String(prop.name());
- if ((!data->m_model->m_listModelInterface || !data->m_model->m_abstractItemModel)
- && data->m_model->m_listAccessor) {
+ if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
if (name == QLatin1String("modelData")) {
- if (data->m_model->m_listAccessor->type() == QmlListAccessor::Instance) {
- QObject *object = data->m_model->m_listAccessor->at(0).value<QObject*>();
+ if (model->m_listAccessor->type() == QmlListAccessor::Instance) {
+ QObject *object = model->m_listAccessor->at(0).value<QObject*>();
return object->metaObject()->property(1).read(object); // the first property after objectName
}
- return data->m_model->m_listAccessor->at(data->m_index);
+ return model->m_listAccessor->at(data->m_index);
} else {
// return any property of a single object instance.
- QObject *object = data->m_model->m_listAccessor->at(0).value<QObject*>();
+ QObject *object = model->m_listAccessor->at(0).value<QObject*>();
return object->property(prop.name());
}
- } else if (data->m_model->m_listModelInterface) {
- data->m_model->ensureRoles();
- QHash<QString,int>::const_iterator it = data->m_model->m_roleNames.find(name);
- if (it != data->m_model->m_roleNames.end()) {
+ } else if (model->m_listModelInterface) {
+ model->ensureRoles();
+ QHash<QString,int>::const_iterator it = model->m_roleNames.find(name);
+ if (it != model->m_roleNames.end()) {
roles.append(*it);
- QHash<int,QVariant> values = data->m_model->m_listModelInterface->data(data->m_index, QList<int>() << *it);
+ QHash<int,QVariant> values = model->m_listModelInterface->data(data->m_index, QList<int>() << *it);
if (values.isEmpty())
return QVariant();
else
return values.value(*it);
- } else if (data->m_model->m_roles.count() == 1 && name == QLatin1String("modelData")) {
+ } else if (model->m_roles.count() == 1 && name == QLatin1String("modelData")) {
//for compatability with other lists, assign modelData if there is only a single role
- QHash<int,QVariant> values = data->m_model->m_listModelInterface->data(data->m_index, QList<int>() << data->m_model->m_roles.first());
+ QHash<int,QVariant> values = model->m_listModelInterface->data(data->m_index, QList<int>() << model->m_roles.first());
if (values.isEmpty())
return QVariant();
else
return *values.begin();
}
- } else if (data->m_model->m_abstractItemModel) {
- data->m_model->ensureRoles();
- QHash<QString,int>::const_iterator it = data->m_model->m_roleNames.find(name);
- if (it != data->m_model->m_roleNames.end()) {
+ } else if (model->m_abstractItemModel) {
+ model->ensureRoles();
+ QHash<QString,int>::const_iterator it = model->m_roleNames.find(name);
+ if (it != model->m_roleNames.end()) {
roles.append(*it);
- QModelIndex index = data->m_model->m_abstractItemModel->index(data->m_index, 0);
- return data->m_model->m_abstractItemModel->data(index, *it);
+ QModelIndex index = model->m_abstractItemModel->index(data->m_index, 0);
+ return model->m_abstractItemModel->data(index, *it);
}
}
Q_ASSERT(!"Can never be reached");
@@ -471,12 +483,16 @@ QFxVisualDataModelDataMetaObject::propertyCreated(int, QMetaPropertyBuilder &pro
}
QFxVisualDataModelData::QFxVisualDataModelData(int index,
- QFxVisualDataModelPrivate *model)
+ QFxVisualDataModel *model)
: m_index(index), m_model(model),
m_meta(new QFxVisualDataModelDataMetaObject(this))
{
}
+QFxVisualDataModelData::~QFxVisualDataModelData()
+{
+}
+
int QFxVisualDataModelData::index() const
{
return m_index;
@@ -752,7 +768,7 @@ QFxItem *QFxVisualDataModel::item(int index, const QByteArray &viewId, bool comp
QmlContext *ccontext = d->m_context;
if (!ccontext) ccontext = qmlContext(this);
QmlContext *ctxt = new QmlContext(ccontext);
- QFxVisualDataModelData *data = new QFxVisualDataModelData(index, d);
+ QFxVisualDataModelData *data = new QFxVisualDataModelData(index, this);
ctxt->setContextProperty(QLatin1String("model"), data);
ctxt->addDefaultObject(data);
nobj = d->m_delegate->beginCreate(ctxt);
@@ -821,7 +837,7 @@ QVariant QFxVisualDataModel::evaluate(int index, const QString &expression, QObj
QmlContext *ccontext = d->m_context;
if (!ccontext) ccontext = qmlContext(this);
QmlContext *ctxt = new QmlContext(ccontext);
- QFxVisualDataModelData *data = new QFxVisualDataModelData(index, d);
+ QFxVisualDataModelData *data = new QFxVisualDataModelData(index, this);
ctxt->addDefaultObject(data);
QmlExpression e(ctxt, expression, objectContext);
e.setTrackChange(false);