From 990e4215926c5fd2327e379f6ef872b8274a7f67 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 7 May 2009 11:32:17 +1000 Subject: Fix QmlXmlListModel on property changes, on empty results. Tags in flickr demo. --- demos/declarative/flickr/content/ImageDetails.qml | 5 +++ demos/declarative/flickr/flickr.qml | 13 ++++--- src/declarative/extra/qmlxmllistmodel.cpp | 42 ++++++++++++++++++----- src/declarative/extra/qmlxmllistmodel.h | 2 +- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/demos/declarative/flickr/content/ImageDetails.qml b/demos/declarative/flickr/content/ImageDetails.qml index 7b16831..d721983 100644 --- a/demos/declarative/flickr/content/ImageDetails.qml +++ b/demos/declarative/flickr/content/ImageDetails.qml @@ -6,6 +6,7 @@ Flipable { property var fullScreenArea: BigImage property string photoTitle: "" property string photoDescription: "" + property string photoTags: "" property int photoWidth property int photoHeight property string photoType @@ -58,6 +59,10 @@ Flipable { text: "Author: " + Container.photoAuthor } Text { id: Date; color: "white"; width: 300; x: 220; anchors.top: Author.bottom text: "Published: " + Container.photoDate } + Text { id: TagsLabel; color: "white"; x: 220; anchors.top: Date.bottom; + text: Container.photoTags == "" ? "" : "Tags: " } + Text { id: Tags; color: "white"; width: parent.width-x-20; anchors.left: TagsLabel.right; anchors.top: Date.bottom; elide: "ElideRight" + text: Container.photoTags == "" ? "" : Container.photoTags } ScrollBar { id: ScrollBar; x: 720; y: Flickable.y; width: 7; height: Flickable.height; opacity: 0; flickableArea: Flickable; clip: true } diff --git a/demos/declarative/flickr/flickr.qml b/demos/declarative/flickr/flickr.qml index 0ff539d..676e51b 100644 --- a/demos/declarative/flickr/flickr.qml +++ b/demos/declarative/flickr/flickr.qml @@ -8,7 +8,8 @@ Item { resources: [ XmlListModel { id: FeedModel - source: "http://api.flickr.com/services/feeds/photos_public.gne?format=rss2" + property string tags : "" + source: "http://api.flickr.com/services/feeds/photos_public.gne?"+(tags ? "tags="+tags+"&" : "")+"format=rss2" query: "doc($src)/rss/channel/item" namespaceDeclarations: "declare namespace media=\"http://search.yahoo.com/mrss/\";" @@ -16,6 +17,7 @@ Item { Role { name: "imagePath"; query: "media:thumbnail/@url/string()" } Role { name: "url"; query: "media:content/@url/string()" } Role { name: "description"; query: "description/string()"; isCData: true } + Role { name: "tags"; query: "media:category/string()" } Role { name: "photoWidth"; query: "media:content/@width/string()" } Role { name: "photoHeight"; query: "media:content/@height/string()" } Role { name: "photoType"; query: "media:content/@type/string()" } @@ -44,6 +46,7 @@ Item { ImageDetails.flickableArea.yPosition = 0; ImageDetails.fullScreenArea.source = ""; ImageDetails.photoDescription = description; + ImageDetails.photoTags = tags; ImageDetails.photoWidth = photoWidth; ImageDetails.photoHeight = photoHeight; ImageDetails.photoType = photoType; @@ -134,7 +137,7 @@ Item { } PathAttribute { name: "scale"; value: 1 } - PathAttribute { name: "angle"; value: 45 } + PathAttribute { name: "angle"; value: -45 } } } @@ -151,7 +154,7 @@ Item { text: "Update" anchors.right: CloseButton.left; anchors.rightMargin: 5 anchors.top: CloseButton.top - onClicked: { FeedModel.fetch(); } + onClicked: { FeedModel.reload(); } } states: [ @@ -172,7 +175,9 @@ Item { } Text { - id: CategoryText; anchors.horizontalCenter: parent.horizontalCenter; y: 15; text: "Flickr - Uploads from everyone" + id: CategoryText; anchors.horizontalCenter: parent.horizontalCenter; y: 15; + text: "Flickr - " + + (FeedModel.tags=="" ? "Uploads from everyone" : "Recent Uploads tagged " + FeedModel.tags) font.size: 16; font.bold: true; color: "white"; style: "Raised"; styleColor: "black" } } diff --git a/src/declarative/extra/qmlxmllistmodel.cpp b/src/declarative/extra/qmlxmllistmodel.cpp index af72ecc..bba817d 100644 --- a/src/declarative/extra/qmlxmllistmodel.cpp +++ b/src/declarative/extra/qmlxmllistmodel.cpp @@ -90,8 +90,9 @@ class QmlXmlListModelPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QmlXmlListModel) public: - QmlXmlListModelPrivate() : size(-1), highestRole(Qt::UserRole), reply(0), roleObjects(this) {} + QmlXmlListModelPrivate() : isClassComplete(false), size(-1), highestRole(Qt::UserRole), reply(0), roleObjects(this) {} + bool isClassComplete; QString src; QString query; QString namespaces; @@ -204,7 +205,10 @@ QString QmlXmlListModel::source() const void QmlXmlListModel::setSource(const QString &src) { Q_D(QmlXmlListModel); - d->src = src; + if (d->src != src) { + d->src = src; + reload(); + } } QString QmlXmlListModel::query() const @@ -216,7 +220,10 @@ QString QmlXmlListModel::query() const void QmlXmlListModel::setQuery(const QString &query) { Q_D(QmlXmlListModel); - d->query = query; + if (d->query != query) { + d->query = query; + reload(); + } } QString QmlXmlListModel::namespaceDeclarations() const @@ -228,29 +235,44 @@ QString QmlXmlListModel::namespaceDeclarations() const void QmlXmlListModel::setNamespaceDeclarations(const QString &declarations) { Q_D(QmlXmlListModel); - d->namespaces = declarations; + if (d->namespaces != declarations) { + d->namespaces = declarations; + reload(); + } } void QmlXmlListModel::classComplete() { - fetch(); + Q_D(QmlXmlListModel); + d->isClassComplete = true; + reload(); } -void QmlXmlListModel::fetch() +void QmlXmlListModel::reload() { Q_D(QmlXmlListModel); + if (!d->isClassComplete) + return; + //clear existing data d->size = 0; int count = d->data.count(); d->data.clear(); - emit itemsRemoved(0, count); + if (count > 0) + emit itemsRemoved(0, count); if (d->src.isEmpty()) { - qWarning() << "Can't fetch empty src string"; + qWarning() << "Can't load empty src string"; return; } + if (d->reply) { + d->reply->abort(); + d->reply->deleteLater(); + d->reply = 0; + } + QNetworkRequest req((QUrl(d->src))); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); d->reply = qmlContext(this)->engine()->networkAccessManager()->get(req); @@ -316,7 +338,9 @@ void QmlXmlListModel::doQuery(QByteArray &rawData) d->xml = xml; d->size = count; - emit itemsInserted(0, count); + + if (count > 0) + emit itemsInserted(0, count); } void QmlXmlListModel::doSubquery(int index) const diff --git a/src/declarative/extra/qmlxmllistmodel.h b/src/declarative/extra/qmlxmllistmodel.h index acc54a9..2e932cb 100644 --- a/src/declarative/extra/qmlxmllistmodel.h +++ b/src/declarative/extra/qmlxmllistmodel.h @@ -118,7 +118,7 @@ public: virtual void classComplete(); public Q_SLOTS: - void fetch(); + void reload(); protected: void doQuery(QByteArray &rawData); -- cgit v0.12