summaryrefslogtreecommitdiffstats
path: root/src/declarative/graphicsitems
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/graphicsitems')
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage.cpp26
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase.cpp10
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview.cpp5
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners.cpp138
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners_p.h17
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext.cpp109
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext_p.h5
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext_p_p.h5
-rw-r--r--src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp18
9 files changed, 266 insertions, 67 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
index 420ed90..be9d8bd 100644
--- a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
@@ -43,6 +43,7 @@
#include "private/qdeclarativeborderimage_p_p.h"
#include <qdeclarativeengine.h>
+#include <qdeclarativeinfo.h>
#include <QNetworkRequest>
#include <QNetworkReply>
@@ -218,7 +219,8 @@ void QDeclarativeBorderImage::load()
}
} else {
QSize impsize;
- QDeclarativePixmapReply::Status status = QDeclarativePixmapCache::get(d->url, &d->pix, &impsize, d->async);
+ QString errorString;
+ QDeclarativePixmapReply::Status status = QDeclarativePixmapCache::get(d->url, &d->pix, &errorString, &impsize, d->async);
if (status != QDeclarativePixmapReply::Ready && status != QDeclarativePixmapReply::Error) {
QDeclarativePixmapReply *reply = QDeclarativePixmapCache::request(qmlEngine(this), d->url);
d->pendingPixmapCache = true;
@@ -230,8 +232,10 @@ void QDeclarativeBorderImage::load()
setImplicitWidth(impsize.width());
setImplicitHeight(impsize.height());
- if (d->pix.isNull())
+ if (d->pix.isNull()) {
d->status = Error;
+ qmlInfo(this) << errorString;
+ }
if (d->status == Loading)
d->status = Ready;
d->progress = 1.0;
@@ -338,7 +342,8 @@ void QDeclarativeBorderImage::setGridScaledImage(const QDeclarativeGridScaledIma
d->sciurl = d->url.resolved(QUrl(sci.pixmapUrl()));
QSize impsize;
- QDeclarativePixmapReply::Status status = QDeclarativePixmapCache::get(d->sciurl, &d->pix, &impsize, d->async);
+ QString errorString;
+ QDeclarativePixmapReply::Status status = QDeclarativePixmapCache::get(d->sciurl, &d->pix, &errorString, &impsize, d->async);
if (status != QDeclarativePixmapReply::Ready && status != QDeclarativePixmapReply::Error) {
QDeclarativePixmapReply *reply = QDeclarativePixmapCache::request(qmlEngine(this), d->sciurl);
d->sciPendingPixmapCache = true;
@@ -367,8 +372,10 @@ void QDeclarativeBorderImage::setGridScaledImage(const QDeclarativeGridScaledIma
setImplicitWidth(impsize.width());
setImplicitHeight(impsize.height());
- if (d->pix.isNull())
+ if (d->pix.isNull()) {
d->status = Error;
+ qmlInfo(this) << errorString;
+ }
if (d->status == Loading)
d->status = Ready;
d->progress = 1.0;
@@ -386,11 +393,18 @@ void QDeclarativeBorderImage::requestFinished()
QSize impsize;
if (d->url.path().endsWith(QLatin1String(".sci"))) {
d->sciPendingPixmapCache = false;
- QDeclarativePixmapCache::get(d->sciurl, &d->pix, &impsize, d->async);
+ QString errorString;
+ if (QDeclarativePixmapCache::get(d->sciurl, &d->pix, &errorString, &impsize, d->async) != QDeclarativePixmapReply::Ready) {
+ d->status = Error;
+ qmlInfo(this) << errorString;
+ }
} else {
d->pendingPixmapCache = false;
- if (QDeclarativePixmapCache::get(d->url, &d->pix, &impsize, d->async) != QDeclarativePixmapReply::Ready)
+ QString errorString;
+ if (QDeclarativePixmapCache::get(d->url, &d->pix, &errorString, &impsize, d->async) != QDeclarativePixmapReply::Ready) {
d->status = Error;
+ qmlInfo(this) << errorString;
+ }
}
setImplicitWidth(impsize.width());
setImplicitHeight(impsize.height());
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
index 3acafe8..c3f8195 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
@@ -43,6 +43,7 @@
#include "private/qdeclarativeimagebase_p_p.h"
#include <qdeclarativeengine.h>
+#include <qdeclarativeinfo.h>
#include <qdeclarativepixmapcache_p.h>
#include <QFile>
@@ -154,7 +155,8 @@ void QDeclarativeImageBase::load()
int reqwidth = d->sourcesize.width();
int reqheight = d->sourcesize.height();
QSize impsize;
- QDeclarativePixmapReply::Status status = QDeclarativePixmapCache::get(d->url, &d->pix, &impsize, d->async, reqwidth, reqheight);
+ QString errorString;
+ QDeclarativePixmapReply::Status status = QDeclarativePixmapCache::get(d->url, &d->pix, &errorString, &impsize, d->async, reqwidth, reqheight);
if (status != QDeclarativePixmapReply::Ready && status != QDeclarativePixmapReply::Error) {
QDeclarativePixmapReply *reply = QDeclarativePixmapCache::request(qmlEngine(this), d->url, reqwidth, reqheight);
d->pendingPixmapCache = true;
@@ -191,6 +193,7 @@ void QDeclarativeImageBase::load()
emit sourceSizeChanged();
} else {
d->status = Error;
+ qmlInfo(this) << errorString;
}
d->progress = 1.0;
emit statusChanged(d->status);
@@ -210,8 +213,11 @@ void QDeclarativeImageBase::requestFinished()
d->pendingPixmapCache = false;
QSize impsize;
- if (QDeclarativePixmapCache::get(d->url, &d->pix, &impsize, d->async, d->sourcesize.width(), d->sourcesize.height()) != QDeclarativePixmapReply::Ready)
+ QString errorString;
+ if (QDeclarativePixmapCache::get(d->url, &d->pix, &errorString, &impsize, d->async, d->sourcesize.width(), d->sourcesize.height()) != QDeclarativePixmapReply::Ready) {
d->status = Error;
+ qmlInfo(this) << errorString;
+ }
setImplicitWidth(impsize.width());
setImplicitHeight(impsize.height());
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index cf7b96f..307c0a7 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -521,7 +521,6 @@ void QDeclarativeListViewPrivate::clear()
trackedItem = 0;
minExtentDirty = true;
maxExtentDirty = true;
- setPosition(0);
itemCount = 0;
}
@@ -708,6 +707,7 @@ void QDeclarativeListViewPrivate::layout()
layoutScheduled = false;
if (!isValid()) {
clear();
+ setPosition(0);
return;
}
updateSections();
@@ -1416,6 +1416,7 @@ void QDeclarativeListView::setModel(const QVariant &model)
disconnect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
}
d->clear();
+ d->setPosition(0);
d->modelVariant = model;
QObject *object = qvariant_cast<QObject*>(model);
QDeclarativeVisualModel *vim = 0;
@@ -1770,6 +1771,7 @@ void QDeclarativeListView::setOrientation(QDeclarativeListView::Orientation orie
setFlickDirection(HorizontalFlick);
}
d->clear();
+ d->setPosition(0);
refill();
emit orientationChanged();
d->updateCurrent(d->currentIndex);
@@ -2791,6 +2793,7 @@ void QDeclarativeListView::modelReset()
{
Q_D(QDeclarativeListView);
d->clear();
+ d->setPosition(0);
refill();
d->moveReason = QDeclarativeListViewPrivate::SetIndex;
d->updateCurrent(d->currentIndex);
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners.cpp b/src/declarative/graphicsitems/qdeclarativepositioners.cpp
index f436471..21c33e2 100644
--- a/src/declarative/graphicsitems/qdeclarativepositioners.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepositioners.cpp
@@ -656,10 +656,8 @@ Grid {
*/
QDeclarativeGrid::QDeclarativeGrid(QDeclarativeItem *parent) :
- QDeclarativeBasePositioner(Both, parent)
+ QDeclarativeBasePositioner(Both, parent), m_rows(-1), m_columns(-1), m_flow(LeftToRight)
{
- _columns=-1;
- _rows=-1;
}
/*!
@@ -682,55 +680,101 @@ QDeclarativeGrid::QDeclarativeGrid(QDeclarativeItem *parent) :
void QDeclarativeGrid::setColumns(const int columns)
{
- if (columns == _columns)
+ if (columns == m_columns)
return;
- _columns = columns;
+ m_columns = columns;
prePositioning();
emit columnsChanged();
}
void QDeclarativeGrid::setRows(const int rows)
{
- if (rows == _rows)
+ if (rows == m_rows)
return;
- _rows = rows;
+ m_rows = rows;
prePositioning();
emit rowsChanged();
}
+/*!
+ \qmlproperty enumeration Flow::flow
+ This property holds the flow of the layout.
+
+ Possible values are \c LeftToRight (default) and \c TopToBottom.
+
+ If \a flow is \c LeftToRight, the items are positioned next to
+ to each other from left to right, then wrapped to the next line.
+ If \a flow is \c TopToBottom, the items are positioned next to each
+ other from top to bottom, then wrapped to the next column.
+*/
+QDeclarativeGrid::Flow QDeclarativeGrid::flow() const
+{
+ return m_flow;
+}
+
+void QDeclarativeGrid::setFlow(Flow flow)
+{
+ if (m_flow != flow) {
+ m_flow = flow;
+ prePositioning();
+ emit flowChanged();
+ }
+}
+
void QDeclarativeGrid::doPositioning(QSizeF *contentSize)
{
- int c = _columns;
- int r = _rows;
+ int c = m_columns;
+ int r = m_rows;
int numVisible = positionedItems.count();
- if (_columns <= 0 && _rows <= 0){
+ if (m_columns <= 0 && m_rows <= 0){
c = 4;
r = (numVisible+3)/4;
- } else if (_rows <= 0){
- r = (numVisible+(_columns-1))/_columns;
- } else if (_columns <= 0){
- c = (numVisible+(_rows-1))/_rows;
+ } else if (m_rows <= 0){
+ r = (numVisible+(m_columns-1))/m_columns;
+ } else if (m_columns <= 0){
+ c = (numVisible+(m_rows-1))/m_rows;
}
QList<int> maxColWidth;
QList<int> maxRowHeight;
int childIndex =0;
- for (int i=0; i<r; i++){
- for (int j=0; j<c; j++){
- if (j==0)
- maxRowHeight << 0;
- if (i==0)
- maxColWidth << 0;
-
- if (childIndex == positionedItems.count())
- continue;
- const PositionedItem &child = positionedItems.at(childIndex++);
- if (!child.item || isInvisible(child.item))
- continue;
- if (child.item->width() > maxColWidth[j])
- maxColWidth[j] = child.item->width();
- if (child.item->height() > maxRowHeight[i])
- maxRowHeight[i] = child.item->height();
+ if (m_flow == LeftToRight) {
+ for (int i=0; i < r; i++){
+ for (int j=0; j < c; j++){
+ if (j==0)
+ maxRowHeight << 0;
+ if (i==0)
+ maxColWidth << 0;
+
+ if (childIndex == positionedItems.count())
+ continue;
+ const PositionedItem &child = positionedItems.at(childIndex++);
+ if (!child.item || isInvisible(child.item))
+ continue;
+ if (child.item->width() > maxColWidth[j])
+ maxColWidth[j] = child.item->width();
+ if (child.item->height() > maxRowHeight[i])
+ maxRowHeight[i] = child.item->height();
+ }
+ }
+ } else {
+ for (int j=0; j < c; j++){
+ for (int i=0; i < r; i++){
+ if (j==0)
+ maxRowHeight << 0;
+ if (i==0)
+ maxColWidth << 0;
+
+ if (childIndex == positionedItems.count())
+ continue;
+ const PositionedItem &child = positionedItems.at(childIndex++);
+ if (!child.item || isInvisible(child.item))
+ continue;
+ if (child.item->width() > maxColWidth[j])
+ maxColWidth[j] = child.item->width();
+ if (child.item->height() > maxRowHeight[i])
+ maxRowHeight[i] = child.item->height();
+ }
}
}
@@ -747,18 +791,34 @@ void QDeclarativeGrid::doPositioning(QSizeF *contentSize)
positionY(yoffset, child);
}
- contentSize->setWidth(qMax(contentSize->width(), xoffset + child.item->width()));
- contentSize->setHeight(yoffset + maxRowHeight[curRow]);
+ if (m_flow == LeftToRight) {
+ contentSize->setWidth(qMax(contentSize->width(), xoffset + child.item->width()));
+ contentSize->setHeight(yoffset + maxRowHeight[curRow]);
+
+ xoffset+=maxColWidth[curCol]+spacing();
+ curCol++;
+ curCol%=c;
+ if (!curCol){
+ yoffset+=maxRowHeight[curRow]+spacing();
+ xoffset=0;
+ curRow++;
+ if (curRow>=r)
+ break;
+ }
+ } else {
+ contentSize->setHeight(qMax(contentSize->height(), yoffset + child.item->height()));
+ contentSize->setWidth(xoffset + maxColWidth[curCol]);
- xoffset+=maxColWidth[curCol]+spacing();
- curCol++;
- curCol%=c;
- if (!curCol){
yoffset+=maxRowHeight[curRow]+spacing();
- xoffset=0;
curRow++;
- if (curRow>=r)
- break;
+ curRow%=r;
+ if (!curRow){
+ xoffset+=maxColWidth[curCol]+spacing();
+ yoffset=0;
+ curCol++;
+ if (curCol>=c)
+ break;
+ }
}
}
}
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners_p.h b/src/declarative/graphicsitems/qdeclarativepositioners_p.h
index c4414d1..24b65fa 100644
--- a/src/declarative/graphicsitems/qdeclarativepositioners_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepositioners_p.h
@@ -138,25 +138,34 @@ class Q_DECLARATIVE_EXPORT QDeclarativeGrid : public QDeclarativeBasePositioner
Q_OBJECT
Q_PROPERTY(int rows READ rows WRITE setRows NOTIFY rowChanged)
Q_PROPERTY(int columns READ columns WRITE setColumns NOTIFY columnsChanged)
+ Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
+
public:
QDeclarativeGrid(QDeclarativeItem *parent=0);
- int rows() const {return _rows;}
+ int rows() const {return m_rows;}
void setRows(const int rows);
- int columns() const {return _columns;}
+ int columns() const {return m_columns;}
void setColumns(const int columns);
+ Q_ENUMS(Flow)
+ enum Flow { LeftToRight, TopToBottom };
+ Flow flow() const;
+ void setFlow(Flow);
+
Q_SIGNALS:
void rowsChanged();
void columnsChanged();
+ void flowChanged();
protected:
virtual void doPositioning(QSizeF *contentSize);
private:
- int _rows;
- int _columns;
+ int m_rows;
+ int m_columns;
+ Flow m_flow;
Q_DISABLE_COPY(QDeclarativeGrid)
};
diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index b65212b..a95c930 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -43,7 +43,9 @@
#include "private/qdeclarativetext_p_p.h"
#include <qdeclarativestyledtext_p.h>
#include <qdeclarativeinfo.h>
+#include <qdeclarativepixmapcache_p.h>
+#include <QSet>
#include <QTextLayout>
#include <QTextLine>
#include <QTextDocument>
@@ -55,6 +57,59 @@
QT_BEGIN_NAMESPACE
+class QTextDocumentWithImageResources : public QTextDocument {
+ Q_OBJECT
+
+public:
+ QTextDocumentWithImageResources(QDeclarativeText *parent) :
+ QTextDocument(parent),
+ outstanding(0)
+ {
+ }
+
+ int resourcesLoading() const { return outstanding; }
+
+protected:
+ QVariant loadResource(int type, const QUrl &name)
+ {
+ QUrl url = qmlContext(parent())->resolvedUrl(name);
+
+ if (type == QTextDocument::ImageResource) {
+ QPixmap pm;
+ QString errorString;
+ QDeclarativePixmapReply::Status status = QDeclarativePixmapCache::get(url, &pm, &errorString, 0, false, 0, 0);
+ if (status == QDeclarativePixmapReply::Ready)
+ return pm;
+ if (status == QDeclarativePixmapReply::Error) {
+ if (!errors.contains(url)) {
+ errors.insert(url);
+ qmlInfo(parent()) << errorString;
+ }
+ } else {
+ QDeclarativePixmapReply *reply = QDeclarativePixmapCache::request(qmlEngine(parent()), url);
+ connect(reply, SIGNAL(finished()), this, SLOT(requestFinished()));
+ outstanding++;
+ }
+ }
+
+ return QTextDocument::loadResource(type,url); // The *resolved* URL
+ }
+
+private slots:
+ void requestFinished()
+ {
+ outstanding--;
+ if (outstanding == 0)
+ static_cast<QDeclarativeText*>(parent())->reloadWithResources();
+ }
+
+private:
+ int outstanding;
+ static QSet<QUrl> errors;
+};
+
+QSet<QUrl> QTextDocumentWithImageResources::errors;
+
/*!
\qmlclass Text QDeclarativeText
\since 4.7
@@ -77,6 +132,9 @@ QT_BEGIN_NAMESPACE
The \c elide property can alternatively be used to fit a single line of
plain text to a set width.
+ Note that the \l{Supported HTML Subset} is limited, and that if IMG tags
+ load remote images, the text reloads (see resourcesLoading).
+
Text provides read-only text. For editable text, see \l TextEdit.
*/
@@ -259,11 +317,10 @@ void QDeclarativeText::setText(const QString &n)
d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(n));
if (d->richText) {
- if (!d->doc) {
- d->doc = new QTextDocument(this);
- d->doc->setDocumentMargin(0);
+ if (isComponentComplete()) {
+ d->ensureDoc();
+ d->doc->setHtml(n);
}
- d->doc->setHtml(n);
}
d->text = n;
@@ -550,11 +607,10 @@ void QDeclarativeText::setTextFormat(TextFormat format)
d->updateLayout();
d->markImgDirty();
} else if (!wasRich && d->richText) {
- if (!d->doc) {
- d->doc = new QTextDocument(this);
- d->doc->setDocumentMargin(0);
+ if (isComponentComplete()) {
+ d->ensureDoc();
+ d->doc->setHtml(d->text);
}
- d->doc->setHtml(d->text);
d->updateLayout();
d->markImgDirty();
}
@@ -677,7 +733,7 @@ void QDeclarativeTextPrivate::updateSize()
QTextOption option((Qt::Alignment)int(hAlign | vAlign));
option.setWrapMode(QTextOption::WrapMode(wrapMode));
doc->setDefaultTextOption(option);
- if (wrapMode != QDeclarativeText::NoWrap && !q->heightValid() && q->widthValid())
+ if (wrapMode != QDeclarativeText::NoWrap && q->widthValid())
doc->setTextWidth(q->width());
else
doc->setTextWidth(doc->idealWidth()); // ### Text does not align if width is not set (QTextDoc bug)
@@ -898,6 +954,34 @@ void QDeclarativeTextPrivate::checkImgCache()
imgDirty = false;
}
+void QDeclarativeTextPrivate::ensureDoc()
+{
+ if (!doc) {
+ Q_Q(QDeclarativeText);
+ doc = new QTextDocumentWithImageResources(q);
+ doc->setDocumentMargin(0);
+ }
+}
+
+void QDeclarativeText::reloadWithResources()
+{
+ Q_D(QDeclarativeText);
+ if (!d->richText)
+ return;
+ d->doc->setHtml(d->text);
+ d->updateLayout();
+ d->markImgDirty();
+}
+
+/*!
+ Returns the number of resources (images) that are being loaded asynchronously.
+*/
+int QDeclarativeText::resourcesLoading() const
+{
+ Q_D(const QDeclarativeText);
+ return d->doc ? d->doc->resourcesLoading() : 0;
+}
+
void QDeclarativeText::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
{
Q_D(QDeclarativeText);
@@ -1011,6 +1095,10 @@ void QDeclarativeText::componentComplete()
Q_D(QDeclarativeText);
QDeclarativeItem::componentComplete();
if (d->dirty) {
+ if (d->richText) {
+ d->ensureDoc();
+ d->doc->setHtml(d->text);
+ }
d->updateLayout();
d->dirty = false;
}
@@ -1061,4 +1149,7 @@ void QDeclarativeText::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
if (!event->isAccepted())
QDeclarativeItem::mouseReleaseEvent(event);
}
+
QT_END_NAMESPACE
+
+#include "qdeclarativetext.moc"
diff --git a/src/declarative/graphicsitems/qdeclarativetext_p.h b/src/declarative/graphicsitems/qdeclarativetext_p.h
index 871c833..4fd5e3a 100644
--- a/src/declarative/graphicsitems/qdeclarativetext_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetext_p.h
@@ -138,6 +138,8 @@ public:
virtual void componentComplete();
+ int resourcesLoading() const; // mainly for testing
+
Q_SIGNALS:
void textChanged(const QString &text);
void linkActivated(const QString &link);
@@ -160,6 +162,9 @@ protected:
private:
Q_DISABLE_COPY(QDeclarativeText)
Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeText)
+
+ friend class QTextDocumentWithImageResources;
+ void reloadWithResources();
};
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativetext_p_p.h b/src/declarative/graphicsitems/qdeclarativetext_p_p.h
index cc5a9f2..332f99e 100644
--- a/src/declarative/graphicsitems/qdeclarativetext_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetext_p_p.h
@@ -63,7 +63,7 @@
QT_BEGIN_NAMESPACE
class QTextLayout;
-class QTextDocument;
+class QTextDocumentWithImageResources;
class QDeclarativeTextPrivate : public QDeclarativeItemPrivate
{
@@ -84,6 +84,7 @@ public:
~QDeclarativeTextPrivate();
+ void ensureDoc();
void updateSize();
void updateLayout();
void markImgDirty() {
@@ -118,7 +119,7 @@ public:
bool richText:1;
bool singleline:1;
bool cache:1;
- QTextDocument *doc;
+ QTextDocumentWithImageResources *doc;
QTextLayout layout;
QSize cachedLayoutSize;
QDeclarativeText::TextFormat format;
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
index 03e4703..751284d 100644
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
+++ b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
@@ -50,7 +50,7 @@
#include <qdeclarativeopenmetaobject_p.h>
#include <qdeclarativelistaccessor_p.h>
#include <qdeclarativeinfo.h>
-#include <qdeclarativedeclarativedata_p.h>
+#include <qdeclarativedata_p.h>
#include <qdeclarativepropertycache_p.h>
#include <qdeclarativeguard_p.h>
#include <qdeclarativeglobal_p.h>
@@ -353,6 +353,7 @@ public:
friend class QDeclarativeVisualDataModelData;
bool m_metaDataCreated;
bool m_metaDataCacheable;
+ bool m_delegateValidated;
QDeclarativeVisualDataModelData *data(QObject *item);
@@ -560,7 +561,7 @@ QDeclarativeVisualDataModelParts::QDeclarativeVisualDataModelParts(QDeclarativeV
QDeclarativeVisualDataModelPrivate::QDeclarativeVisualDataModelPrivate(QDeclarativeContext *ctxt)
: m_listModelInterface(0), m_abstractItemModel(0), m_visualItemModel(0), m_delegate(0)
, m_context(ctxt), m_parts(0), m_delegateDataType(0), m_metaDataCreated(false)
-, m_metaDataCacheable(false), m_listAccessor(0)
+, m_metaDataCacheable(false), m_delegateValidated(false), m_listAccessor(0)
{
}
@@ -768,6 +769,7 @@ void QDeclarativeVisualDataModel::setDelegate(QDeclarativeComponent *delegate)
Q_D(QDeclarativeVisualDataModel);
bool wasValid = d->m_delegate != 0;
d->m_delegate = delegate;
+ d->m_delegateValidated = false;
if (!wasValid && d->modelCount() && d->m_delegate) {
emit itemsInserted(0, d->modelCount());
emit countChanged();
@@ -987,6 +989,7 @@ QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, const QByteArray
if (d->modelCount() <= 0 || !d->m_delegate)
return 0;
QObject *nobj = d->m_cache.getItem(index);
+ bool needComplete = false;
if (!nobj) {
QDeclarativeContext *ccontext = d->m_context;
if (!ccontext) ccontext = qmlContext(this);
@@ -997,6 +1000,8 @@ QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, const QByteArray
nobj = d->m_delegate->beginCreate(ctxt);
if (complete)
d->m_delegate->completeCreate();
+ else
+ needComplete = true;
if (nobj) {
QDeclarative_setParent_noEvent(ctxt, nobj);
QDeclarative_setParent_noEvent(data, nobj);
@@ -1020,8 +1025,13 @@ QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, const QByteArray
}
}
if (!item) {
+ if (needComplete)
+ d->m_delegate->completeCreate();
d->m_cache.releaseItem(nobj);
- qmlInfo(d->m_delegate) << QDeclarativeVisualDataModel::tr("Delegate component must be Item type.");
+ if (!d->m_delegateValidated) {
+ qmlInfo(d->m_delegate) << QDeclarativeVisualDataModel::tr("Delegate component must be Item type.");
+ d->m_delegateValidated = true;
+ }
}
return item;
@@ -1058,7 +1068,7 @@ QString QDeclarativeVisualDataModel::stringValue(int index, const QString &name)
tempData = true;
}
- QDeclarativeDeclarativeData *ddata = QDeclarativeDeclarativeData::get(data);
+ QDeclarativeData *ddata = QDeclarativeData::get(data);
if (ddata && ddata->propertyCache) {
QDeclarativePropertyCache::Data *prop = ddata->propertyCache->property(name);
if (prop) {