on xenial help sign in
merge trunk
commit80a7d99c9d111b2d405d34b0bc423bf92f02e59f authorMichał Sawicz <michal.sawicz@canonical.com> dateWed 10 Jul 2013, 01:59 (13 years ago) parent549dee11165c23
27 files changed+609−202
Dash/Apps/ApplicationsFilterGrid.qml+3−3 Dash/DashApps.qml+10−8 Dash/DashHome.qml+20−31 Dash/DashVideos.qml+2−2 Dash/Music/CarouselDelegateMusic.qml+1−1 Dash/Music/MusicFilterGrid.qml+3−3 Dash/Video/CarouselDelegateVideo.qml+1−1 Dash/Video/VideosFilterGrid.qml+4−4 Launcher/ShortcutsContainer.qml−39 debian/changelog+13 plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+13 plugins/Unity/CMakeLists.txt+2 plugins/Unity/genericpreview.cpp+5 plugins/Unity/genericpreview.h+6 plugins/Unity/plugin.cpp+2 plugins/Unity/preview.cpp+4 plugins/Unity/previewaction.h+1−1 plugins/Unity/socialpreview.cpp+83 plugins/Unity/socialpreview.h+63 plugins/Unity/socialpreviewcomment.cpp+63 plugins/Unity/socialpreviewcomment.h+57 po/es.po+7−31 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+55 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+57 tests/plugins/Unity/previewbindingstest.cpp+113−58 tests/plugins/Unity/previewbindingstest.h+1 tests/qmltests/Dash/tst_FilterGrids.qml+20−20
Dash/Apps/ApplicationsFilterGrid.qml+3−3
@@ -36,7 +36,7 @@ FilterGrid {
3636 objectName: "delegate" + index
3737 Application {
3838 id: application
39− desktopFile: model.column_7 ? stripProtocol(model.column_7) : model.desktopFile // FIXME: this is temporary
39+ desktopFile: model.dndUri ? stripProtocol(model.dndUri) : model.desktopFile // FIXME: this is temporary
4040
4141 function stripProtocol(uri) {
4242 var chunks = uri.split('file://')
@@ -44,11 +44,11 @@ FilterGrid {
4444 }
4545 }
4646
47− property string icon: model.column_1 ? model.column_1 : "../../graphics/applicationIcons/" + application.icon + ".png" // FIXME: this is temporary
47+ property string icon: model.icon ? model.icon : "../../graphics/applicationIcons/" + application.icon + ".png" // FIXME: this is temporary
4848
4949 width: filterGrid.cellWidth
5050 height: filterGrid.cellHeight
51− text: model.column_5 ? model.column_5 : application.name // FIXME: this is temporary
51+ text: model.title ? model.title : application.name // FIXME: this is temporary
5252 imageWidth: units.gu(8)
5353 imageHeight: units.gu(7.5)
5454 source: IconUtil.from_gicon(icon)
Dash/DashApps.qml+10−8
@@ -81,17 +81,19 @@ ScopeView {
8181 AppsAvailableForDownloadModel { id: appsAvailableForDownloadModel }
8282
8383 // FIXME this should not be needed, the backend should handle all that itself
84− SortFilterProxyModel {
85− id: installedFilter
86− dynamicSortFilter: true
87− filterRole: 2 // this is the category id for each result
88− filterRegExp: /^3$/ // only proxy items that are category 3 - Installed
89− model: dashContent.scopes.get("applications.scope").results
84+ property var installedModel: null
85+
86+ Repeater {
87+ model: scopeView.scope.categories
88+
89+ delegate: Item {
90+ Component.onCompleted: if (index == 3) scopeView.installedModel = Qt.binding(function() { return model.results; });
91+ }
9092 }
9193
9294 property var categoryModels: {
9395 "FrequentlyUsedAppsModel": frequentlyUsedAppsModel,
94− "InstalledApplicationsModel": installedFilter,
96+ "InstalledApplicationsModel": installedModel,
9597 "AppsAvailableForDownloadModel": appsAvailableForDownloadModel,
9698 }
9799
@@ -134,7 +136,7 @@ ScopeView {
134136 shell.activateApplication(data);
135137 }
136138
137− item.model = categoryModels[modelName]
139+ item.model = Qt.binding(function() { return categoryModels[modelName]; });
138140 item.clicked.connect(activateApplication);
139141
140142 }
Dash/DashHome.qml+20−31
@@ -52,42 +52,33 @@ ScopeView {
5252 FrequentlyUsedAppsModel { id: appsModel }
5353
5454 // FIXME this should be handled by the backends by populating the global search model
55− SortFilterProxyModel {
56− id: favouritesFilter
57− dynamicSortFilter: true
58− filterRole: 2
59− filterRegExp: /^0$/
60− }
55+ property var musicModel: null
56+ property var videosModel: null
6157
62− SortFilterProxyModel {
63− id: recentFilter
64− dynamicSortFilter: true
65− filterRole: 2
66− filterRegExp: /^2$/
67− }
58+ Repeater {
59+ id: musicRepeater
6860
69− SortFilterProxyModel {
70− id: musicFilter
71− dynamicSortFilter: true
72− filterRole: 2
73− filterRegExp: /^1$/
61+ delegate: Item {
62+ Component.onCompleted: if (index == 1) musicModel = Qt.binding(function() { return model.results; });
63+ }
7464 }
7565
76− SortFilterProxyModel {
77− id: videosFilter
78− dynamicSortFilter: true
79− filterRole: 2
80− filterRegExp: /^3$/
66+ Repeater {
67+ id: videosRepeater
68+
69+ delegate: Item {
70+ Component.onCompleted: if (index == 3) videosModel = Qt.binding(function() { return model.results; });
71+ }
8172 }
8273
8374 Component.onCompleted: {
8475 var scope = dashContent.scopes.get("mockmusicmaster.scope")
8576 if (scope) {
86− musicFilter.model = dashContent.scopes.get("mockmusicmaster.scope").results
77+ musicRepeater.model = dashContent.scopes.get("mockmusicmaster.scope").categories
8778 }
8879 scope = dashContent.scopes.get("mockvideosmaster.scope")
8980 if (scope) {
90− videosFilter.model = dashContent.scopes.get("mockvideosmaster.scope").results
81+ videosRepeater.model = dashContent.scopes.get("mockvideosmaster.scope").categories
9182 }
9283 }
9384
@@ -95,19 +86,17 @@ ScopeView {
9586 target: dashContent
9687 onScopeLoaded: switch (scopeId) {
9788 case "mockmusicmaster.scope":
98− musicFilter.model = dashContent.scopes.get("mockmusicmaster.scope").results
89+ musicRepeater.model = dashContent.scopes.get("mockmusicmaster.scope").categories
9990 break;
10091 case "mockvideosmaster.scope":
101− videosFilter.model = dashContent.scopes.get("mockvideosmaster.scope").results
92+ videosRepeater.model = dashContent.scopes.get("mockvideosmaster.scope").categories
10293 break;
10394 }
10495 }
10596
10697 property var categoryModels: {"AppsModel": appsModel,
107− "FavouriteModel": favouritesFilter,
108− "RecentModel": recentFilter,
109− "MusicModel": musicFilter,
110− "VideosModel": videosFilter,
98+ "MusicModel": musicModel,
99+ "VideosModel": videosModel,
111100 }
112101
113102 ScopeListView {
@@ -127,7 +116,7 @@ ScopeView {
127116 anchors { top: parent.top; left: parent.left; right: parent.right }
128117 source: component
129118 onLoaded: {
130− item.model = categoryModels[modelName]
119+ item.model = Qt.binding(function() { return categoryModels[modelName]; });
131120
132121 //FIXME: workaround for lack of previews for videos in Home scope.
133122 //Need to connect to the clicked() signal here and act upon it here instead.
Dash/DashVideos.qml+2−2
@@ -120,8 +120,8 @@ ScopeView {
120120 // VideosCarousel and VideosFilterGrid have different
121121 // clicked signals, accomodate for that
122122 if (categoryId == 1) {
123− var fileUri = delegateItem.model.column_0.replace(/^[^:]+:/, "")
124− dataItem = {fileUri: fileUri, nfoUri: delegateItem.model.column_6}
123+ var fileUri = delegateItem.model.uri.replace(/^[^:]+:/, "")
124+ dataItem = {fileUri: fileUri, nfoUri: delegateItem.model.comment}
125125 } else {
126126 dataItem = data;
127127 }
Dash/Music/CarouselDelegateMusic.qml+1−1
@@ -28,7 +28,7 @@ BaseCarouselDelegate {
2828 image: Image {
2929 asynchronous: true
3030 sourceSize { width: item.width; height: item.height }
31− source: model ? model.column_1 : ""
31+ source: model ? model.icon : ""
3232 }
3333 }
3434
Dash/Music/MusicFilterGrid.qml+3−3
@@ -38,9 +38,9 @@ FilterGrid {
3838 height: filterGrid.cellHeight
3939 iconWidth: filterGrid.iconWidth
4040 iconHeight: filterGrid.iconHeight
41− artist: model.column_5
42− album: model.column_6
43− source: model.column_1
41+ artist: model.title
42+ album: model.comment
43+ source: model.icon
4444 onClicked: {
4545 filterGrid.clicked(index);
4646 }
Dash/Video/CarouselDelegateVideo.qml+1−1
@@ -28,7 +28,7 @@ BaseCarouselDelegate {
2828 image: Image {
2929 asynchronous: true
3030 sourceSize { width: item.width; height: item.height }
31− source: model ? model.column_1 : ""
31+ source: model ? model.icon : ""
3232 }
3333 }
3434
Dash/Video/VideosFilterGrid.qml+4−4
@@ -37,14 +37,14 @@ FilterGrid {
3737 objectName: "delegate" + index
3838 width: filtergrid.cellWidth
3939 height: filtergrid.cellHeight
40− text: model.column_5
40+ text: model.title
4141 imageWidth: filtergrid.iconWidth
4242 imageHeight: filtergrid.iconHeight
43− source: model.column_1
43+ source: model.icon
4444 fillMode: Image.PreserveAspectCrop
4545 onClicked: {
46− var fileUri = model.column_0.replace(/^[^:]+:/, "")
47− var data = {fileUri: fileUri, nfoUri: model.column_6}
46+ var fileUri = model.uri.replace(/^[^:]+:/, "")
47+ var data = {fileUri: fileUri, nfoUri: model.comment}
4848 filtergrid.clicked(index, data, tile.y);
4949 }
5050 }
Launcher/ShortcutsContainer.qmldeleted−39
@@ -1,39 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−Column {
20− id: shortcutsContainer
21−
22− property int foldedAngle: 0
23− property int initialFoldedOffset: 0
24− property int foldedOffset: 0
25− property int initialIndex: 0
26−
27− property bool animating: angleAnimation.running || offsetAnimation.running
28−
29− property ListModel model
30− property var delegate
31−
32− Behavior on foldedAngle { NumberAnimation { id: angleAnimation; duration: 200; } }
33− Behavior on foldedOffset { NumberAnimation { id: offsetAnimation; duration: 200; } }
34−
35− Repeater {
36− model: shortcutsContainer.model
37− delegate: shortcutsContainer.delegate
38− }
39−}
debian/changelog+13
@@ -1,3 +1,16 @@
1+unity8 (7.81.3+13.10.20130709ubuntu.unity.next-0ubuntu1) saucy; urgency=low
2+
3+ [ Michal Hruby ]
4+ * Implement CategoryResults based on DeeFilterModel.
5+
6+ [ Nick Dedekind ]
7+ * Added plugin cmake procedure for qmltypes files.
8+
9+ [ Ubuntu daily release ]
10+ * Automatic snapshot from revision 86 (ubuntu-unity/next)
11+
12+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 09 Jul 2013 02:58:58 +0000
13+
114unity8 (7.81.3+13.10.20130708ubuntu.unity.next-0ubuntu1) saucy; urgency=low
215
316 [ Michael Terry ]
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+13
@@ -347,6 +347,19 @@ void ListViewWithPageHeader::showHeader()
347347
348348 auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
349349 if (to != contentY()) {
350+ const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
351+ if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
352+ // We are not clipping since we are just at the top of the viewport
353+ // but because of the showHeader animation we will need to, so
354+ // enable the clipping without logically moving the items
355+ m_headerItemShownHeight = m_headerItem->y() + m_headerItem->height() - contentY();
356+ if (!m_visibleItems.isEmpty()) {
357+ updateClipItem();
358+ ListItem *firstItem = m_visibleItems.first();
359+ firstItem->setY(firstItem->y() - m_headerItemShownHeight);
360+ layout();
361+ }
362+ }
350363 m_headerShowAnimation->setTo(to);
351364 m_headerShowAnimation->start();
352365 }
plugins/Unity/CMakeLists.txt+2
@@ -31,6 +31,8 @@ set(QMLPLUGIN_SRC
3131 preview.cpp
3232 previewaction.cpp
3333 previewinfohint.cpp
34+ socialpreview.cpp
35+ socialpreviewcomment.cpp
3436 variantutils.cpp
3537 )
3638
plugins/Unity/genericpreview.cpp+5
@@ -24,3 +24,8 @@ GenericPreview::GenericPreview(QObject *parent):
2424 Preview(parent)
2525{
2626}
27+
28+void GenericPreview::setUnityPreview(unity::dash::Preview::Ptr /* unityPreview */)
29+{
30+ Q_EMIT previewChanged();
31+}
plugins/Unity/genericpreview.h+6
@@ -33,6 +33,12 @@ class GenericPreview : public Preview
3333
3434public:
3535 explicit GenericPreview(QObject *parent = 0);
36+
37+Q_SIGNALS:
38+ void previewChanged();
39+
40+protected:
41+ void setUnityPreview(unity::dash::Preview::Ptr unityPreview) override;
3642};
3743
3844Q_DECLARE_METATYPE(GenericPreview *)
plugins/Unity/plugin.cpp+2
@@ -27,6 +27,7 @@
2727#include "preview.h"
2828#include "previewaction.h"
2929#include "previewinfohint.h"
30+#include "socialpreviewcomment.h"
3031#include "scope.h"
3132#include "scopes.h"
3233#include "categories.h"
@@ -46,6 +47,7 @@ void UnityPlugin::registerTypes(const char *uri)
4647 qmlRegisterUncreatableType<Preview>(uri, 0, 1, "Preview", "Can't create Preview object in QML.");
4748 qmlRegisterUncreatableType<PreviewAction>(uri, 0, 1, "PreviewAction", "Can't create PreviewAction object in QML.");
4849 qmlRegisterUncreatableType<PreviewInfoHint>(uri, 0, 1, "PreviewInfoHint", "Can't create PreviewInfoHint object in QML.");
50+ qmlRegisterUncreatableType<SocialPreviewComment>(uri, 0, 1, "SocialPreviewComment", "Can't create SocialPreviewComment object in QML.");
4951 qmlRegisterType<Scope>(uri, 0, 1, "Scope");
5052 qmlRegisterType<Scopes>(uri, 0, 1, "Scopes");
5153 qmlRegisterType<Categories>(uri, 0, 1, "Categories");
plugins/Unity/preview.cpp+4
@@ -25,6 +25,7 @@
2525#include "applicationpreview.h"
2626#include "moviepreview.h"
2727#include "musicpreview.h"
28+#include "socialpreview.h"
2829#include "variantutils.h"
2930
3031// Qt
@@ -35,6 +36,7 @@
3536#include <UnityCore/ApplicationPreview.h>
3637#include <UnityCore/MoviePreview.h>
3738#include <UnityCore/MusicPreview.h>
39+#include <UnityCore/SocialPreview.h>
3840
3941Preview::Preview(QObject *parent):
4042 QObject(parent),
@@ -124,6 +126,8 @@ Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
124126 preview = new MoviePreview();
125127 } else if (dynamic_cast<unity::dash::ApplicationPreview *>(unityPreview.get()) != nullptr) {
126128 preview = new ApplicationPreview();
129+ } else if (dynamic_cast<unity::dash::SocialPreview *>(unityPreview.get()) != nullptr) {
130+ preview = new SocialPreview();
127131 } else {
128132 qWarning() << "Unknown preview type: " << typeid(*unityPreview).name();
129133 preview = new GenericPreview();
plugins/Unity/previewaction.h+1−1
@@ -36,7 +36,7 @@ enum LayoutHint // keep in sync with unty::dash::LayoutHint
3636 Bottom
3737};
3838
39−class PreviewAction : public QObject
39+class Q_DECL_EXPORT PreviewAction : public QObject
4040{
4141 Q_OBJECT
4242
plugins/Unity/socialpreview.cppnew file+83
@@ -0,0 +1,83 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#include "socialpreview.h"
21+#include "socialpreviewcomment.h"
22+
23+#include <QDebug>
24+
25+SocialPreview::SocialPreview(QObject *parent):
26+ Preview(parent),
27+ m_unitySocialPreview(nullptr)
28+{
29+}
30+
31+QString SocialPreview::sender() const
32+{
33+ if (m_unitySocialPreview) {
34+ return QString::fromStdString(m_unitySocialPreview->sender());
35+ } else {
36+ qWarning() << "Preview not set";
37+ }
38+ return QString();
39+}
40+
41+QString SocialPreview::content() const
42+{
43+ if (m_unitySocialPreview) {
44+ return QString::fromStdString(m_unitySocialPreview->content());
45+ } else {
46+ qWarning() << "Preview not set";
47+ }
48+ return QString();
49+}
50+
51+QString SocialPreview::avatar() const
52+{
53+ if (m_unitySocialPreview) {
54+ return QString::fromUtf8(g_icon_to_string(m_unitySocialPreview->avatar()));
55+ } else {
56+ qWarning() << "Preview not set";
57+ }
58+ return QString();
59+}
60+
61+QVariant SocialPreview::comments()
62+{
63+ return QVariant::fromValue(m_comments);
64+}
65+
66+void SocialPreview::setUnityPreview(unity::dash::Preview::Ptr unityPreview)
67+{
68+ m_unitySocialPreview = std::dynamic_pointer_cast<unity::dash::SocialPreview>(unityPreview);
69+ qDeleteAll(m_comments);
70+ m_comments.clear();
71+
72+ if (m_unitySocialPreview) {
73+ for (auto unityComment: m_unitySocialPreview->GetComments()) {
74+ auto comment = new SocialPreviewComment(this);
75+ comment->setUnityComment(unityComment);
76+ m_comments.append(comment);
77+
78+ Q_EMIT previewChanged();
79+ }
80+ } else {
81+ qWarning() << "Incorrect preview type";
82+ }
83+}
plugins/Unity/socialpreview.hnew file+63
@@ -0,0 +1,63 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#ifndef SOCIALPREVIEW_H
21+#define SOCIALPREVIEW_H
22+
23+// local
24+#include "preview.h"
25+
26+// Qt
27+#include <QObject>
28+#include <QList>
29+#include <QMetaType>
30+
31+// libunity-core
32+#include <UnityCore/SocialPreview.h>
33+
34+class Q_DECL_EXPORT SocialPreview: public Preview
35+{
36+ Q_OBJECT
37+
38+ Q_PROPERTY(QString sender READ sender NOTIFY previewChanged)
39+ Q_PROPERTY(QString content READ content NOTIFY previewChanged)
40+ Q_PROPERTY(QString avatar READ avatar NOTIFY previewChanged)
41+
42+public:
43+ explicit SocialPreview(QObject *parent = 0);
44+
45+ QString sender() const;
46+ QString content() const;
47+ QString avatar() const;
48+ QVariant comments();
49+
50+Q_SIGNALS:
51+ void previewChanged();
52+
53+protected:
54+ void setUnityPreview(unity::dash::Preview::Ptr unityPreview) override;
55+
56+private:
57+ unity::dash::SocialPreview::Ptr m_unitySocialPreview;
58+ QList<QObject *> m_comments;
59+};
60+
61+Q_DECLARE_METATYPE(SocialPreview *)
62+
63+#endif
plugins/Unity/socialpreviewcomment.cppnew file+63
@@ -0,0 +1,63 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+// local
21+#include "socialpreviewcomment.h"
22+
23+SocialPreviewComment::SocialPreviewComment(QObject *parent) :
24+ QObject(parent)
25+{
26+}
27+
28+void SocialPreviewComment::setUnityComment(unity::dash::SocialPreview::CommentPtr unityComment)
29+{
30+ m_unityComment = unityComment;
31+}
32+
33+QString SocialPreviewComment::id() const
34+{
35+ if (m_unityComment) {
36+ return QString::fromStdString(m_unityComment->id);
37+ }
38+ return QString();
39+}
40+
41+QString SocialPreviewComment::displayName() const
42+{
43+ if (m_unityComment) {
44+ return QString::fromStdString(m_unityComment->display_name);
45+ }
46+ return QString();
47+}
48+
49+QString SocialPreviewComment::content() const
50+{
51+ if (m_unityComment) {
52+ return QString::fromStdString(m_unityComment->content);
53+ }
54+ return QString();
55+}
56+
57+QString SocialPreviewComment::time() const
58+{
59+ if (m_unityComment) {
60+ return QString::fromStdString(m_unityComment->time);
61+ }
62+ return QString();
63+}
plugins/Unity/socialpreviewcomment.hnew file+57
@@ -0,0 +1,57 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#ifndef SOCIALPREVIEWCOMMENT_H
21+#define SOCIALPREVIEWCOMMENT_H
22+
23+// Qt
24+#include <QObject>
25+#include <QMetaType>
26+
27+// libunity-core
28+#include <UnityCore/SocialPreview.h>
29+
30+class Q_DECL_EXPORT SocialPreviewComment : public QObject
31+{
32+ Q_OBJECT
33+
34+ Q_PROPERTY(QString id READ id NOTIFY socialPreviewCommentChanged)
35+ Q_PROPERTY(QString displayName READ displayName NOTIFY socialPreviewCommentChanged)
36+ Q_PROPERTY(QString content READ content NOTIFY socialPreviewCommentChanged)
37+ Q_PROPERTY(QString time READ time NOTIFY socialPreviewCommentChanged)
38+
39+public:
40+ explicit SocialPreviewComment(QObject *parent = 0);
41+ void setUnityComment(unity::dash::SocialPreview::CommentPtr unityComment);
42+
43+ QString id() const;
44+ QString displayName() const;
45+ QString content() const;
46+ QString time() const;
47+
48+Q_SIGNALS:
49+ void socialPreviewCommentChanged();
50+
51+private:
52+ unity::dash::SocialPreview::CommentPtr m_unityComment;
53+};
54+
55+Q_DECLARE_METATYPE(SocialPreviewComment *)
56+
57+#endif
po/es.po+7−31
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-06-26 22:58+0200\n"
11−"PO-Revision-Date: 2013-06-16 23:44+0000\n"
11+"PO-Revision-Date: 2013-07-08 07:25+0000\n"
1212"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-06-27 16:16+0000\n"
18−"X-Generator: Launchpad (build 16681)\n"
17+"X-Launchpad-Export-Date: 2013-07-09 06:13+0000\n"
18+"X-Generator: Launchpad (build 16696)\n"
1919
2020#: Applications/applications.js:23
2121msgid "Phone"
@@ -167,16 +167,16 @@ msgstr "Autor:"
167167
168168#: Greeter/Lockscreen.qml:133
169169msgid "Emergency call"
170−msgstr ""
170+msgstr "Llamada de emergencia"
171171
172172#: Greeter/PassphraseLockscreen.qml:59
173173#, qt-format
174174msgid "Hello %1"
175−msgstr ""
175+msgstr "Hola %1"
176176
177177#: Greeter/PassphraseLockscreen.qml:59
178178msgid "Hello"
179−msgstr ""
179+msgstr "Hola"
180180
181181#: Hud/HudParametrizedActionsPage.qml:132
182182msgid "Confirm"
@@ -217,28 +217,4 @@ msgstr "No hay nada que coincida con su búsqueda."
217217#: Shell.qml:383
218218#, qt-format
219219msgid "Please enter %1"
220−msgstr ""
221−
222−#~ msgid "People"
223−#~ msgstr "Gente"
224−
225−#~ msgid "Home screen"
226−#~ msgstr "Pantalla de inicio"
227−
228−#~ msgid "Favourite People"
229−#~ msgstr "Gente favorita"
230−
231−#~ msgid "People Recently in Touch"
232−#~ msgstr "Gente contactada recientemente"
233−
234−#~ msgid "Recently in touch"
235−#~ msgstr "Contactados recientemente"
236−
237−#~ msgid "Favourites"
238−#~ msgstr "Favoritos"
239−
240−#~ msgid "A-Z"
241−#~ msgstr "A-Z"
242−
243−#~ msgid "New Contacts"
244−#~ msgstr "Contactos nuevos"
220+msgstr "Introduzca %1"
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+55
@@ -1248,6 +1248,61 @@ private Q_SLOTS:
12481248 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
12491249 }
12501250
1251+ void testShowHeaderHalfShown()
1252+ {
1253+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1254+ QSKIP("This test is extremely unstable in 5.0.x");
1255+#endif
1256+ changeContentY(20);
1257+
1258+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1259+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1260+ verifyItem(0, 30., 150., false);
1261+ verifyItem(1, 180, 200., false);
1262+ verifyItem(2, 380, 350., false);
1263+ verifyItem(3, 730, 350., true);
1264+ QCOMPARE(lvwph->m_minYExtent, 0.);
1265+ QCOMPARE(lvwph->m_clipItem->y(), 20.);
1266+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1267+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1268+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1269+ QCOMPARE(lvwph->contentY(), 20.);
1270+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1271+
1272+ lvwph->showHeader();
1273+
1274+ QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1275+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1276+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1277+ verifyItem(0, -20., 150., false);
1278+ verifyItem(1, 130, 200., false);
1279+ verifyItem(2, 330, 350., false);
1280+ verifyItem(3, 680, 350., true);
1281+ QCOMPARE(lvwph->m_minYExtent, 20.);
1282+ QCOMPARE(lvwph->m_clipItem->y(), 50.);
1283+ QCOMPARE(lvwph->m_clipItem->clip(), true);
1284+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1285+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1286+ QCOMPARE(lvwph->contentY(), 0.);
1287+ QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1288+
1289+ scrollToTop();
1290+
1291+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1292+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1293+ verifyItem(0, 50., 150., false);
1294+ verifyItem(1, 200., 200., false);
1295+ verifyItem(2, 400., 350., false);
1296+ verifyItem(3, 750, 350., true);
1297+ QCOMPARE(lvwph->m_minYExtent, 20.);
1298+ QCOMPARE(lvwph->m_clipItem->y(), -20.);
1299+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1300+ QCOMPARE(lvwph->m_headerItem->y(), -20.);
1301+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1302+ QCOMPARE(lvwph->contentY(), -20.);
1303+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1304+ }
1305+
12511306 void testShowHeaderAtBottom()
12521307 {
12531308 scrollToBottom();
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp+57
@@ -1407,6 +1407,63 @@ private Q_SLOTS:
14071407 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
14081408 }
14091409
1410+ void testShowHeaderHalfShown()
1411+ {
1412+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1413+ QSKIP("This test is extremely unstable in 5.0.x");
1414+#endif
1415+ changeContentY(20);
1416+
1417+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1418+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1419+ verifyItem(0, 30., 190., false, "Agressive", false);
1420+ verifyItem(1, 220, 240., false, "Regular", false);
1421+ verifyItem(2, 460, 390., false, "Mild", false);
1422+ QCOMPARE(lvwph->m_minYExtent, 0.);
1423+ QCOMPARE(lvwph->m_clipItem->y(), 20.);
1424+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1425+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1426+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1427+ QCOMPARE(lvwph->contentY(), 20.);
1428+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1429+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1430+
1431+ lvwph->showHeader();
1432+
1433+ QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1434+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1435+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1436+ verifyItem(0, -20., 190., false, "Agressive", true);
1437+ verifyItem(1, 170, 240., false, "Regular", false);
1438+ verifyItem(2, 410, 390., false, "Mild", false);
1439+ QCOMPARE(lvwph->m_minYExtent, 20.);
1440+ QCOMPARE(lvwph->m_clipItem->y(), 50.);
1441+ QCOMPARE(lvwph->m_clipItem->clip(), true);
1442+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1443+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1444+ QCOMPARE(lvwph->contentY(), 0.);
1445+ QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1446+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1447+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
1448+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1449+
1450+ scrollToTop();
1451+
1452+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1453+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1454+ verifyItem(0, 50., 190., false, "Agressive", false);
1455+ verifyItem(1, 240., 240., false, "Regular", false);
1456+ verifyItem(2, 480., 390., false, "Mild", false);
1457+ QCOMPARE(lvwph->m_minYExtent, 20.);
1458+ QCOMPARE(lvwph->m_clipItem->y(), -20.);
1459+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1460+ QCOMPARE(lvwph->m_headerItem->y(), -20.);
1461+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1462+ QCOMPARE(lvwph->contentY(), -20.);
1463+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1464+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1465+ }
1466+
14101467 void testShowHeaderCloseToTheTop()
14111468 {
14121469 changeContentY(375);
tests/plugins/Unity/previewbindingstest.cpp+113−58
@@ -25,6 +25,12 @@
2525#include "applicationpreview.h"
2626#include "moviepreview.h"
2727#include "musicpreview.h"
28+#include "socialpreview.h"
29+#include "socialpreviewcomment.h"
30+#include "previewaction.h"
31+
32+#include <glib.h>
33+#include <glib-object.h>
2834
2935void PreviewBindingsTest::initTestCase()
3036{
@@ -32,81 +38,130 @@ void PreviewBindingsTest::initTestCase()
3238
3339void PreviewBindingsTest::testGenericPreview()
3440{
35− auto raw_preview = (GObject *)unity_protocol_generic_preview_new();
36− unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(raw_preview), "Metallica");
37− unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(raw_preview), "Ride The Lightning");
38− unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(raw_preview), "Lorem ipsum dolor sit amet");
39− unity::glib::Object<GObject> gen_prv(raw_preview);
40−
41− auto core_prv = unity::dash::Preview::PreviewForProtocolObject(gen_prv);
42− auto prv = Preview::newFromUnityPreview(core_prv);
41+ auto rawPreview = (GObject *)unity_protocol_generic_preview_new();
42+ unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(rawPreview), "Metallica");
43+ unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(rawPreview), "Ride The Lightning");
44+ unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(rawPreview), "Lorem ipsum dolor sit amet");
45+ GFile *iconFile = g_file_new_for_path("/foo.png");
46+ GIcon *icon = g_file_icon_new(iconFile);
47+ unity_protocol_preview_add_action(UNITY_PROTOCOL_PREVIEW(rawPreview), "1", "Action1", icon,
48+ UNITY_PROTOCOL_LAYOUT_HINT_LEFT);
49+ unity::glib::Object<GObject> genPrv(rawPreview);
50+
51+ auto corePrv = unity::dash::Preview::PreviewForProtocolObject(genPrv);
52+ auto prv = Preview::newFromUnityPreview(corePrv);
4353
4454 QCOMPARE(prv != nullptr, true);
4555 QCOMPARE(prv->title(), QString("Metallica"));
4656 QCOMPARE(prv->subtitle(), QString("Ride The Lightning"));
4757 QCOMPARE(prv->description(), QString("Lorem ipsum dolor sit amet"));
58+
59+ auto actions = prv->actions().value<QList<QObject *>>();
60+ QCOMPARE(actions.size(), 1);
61+ auto act = dynamic_cast<PreviewAction *>(actions[0]);
62+ QVERIFY(act != nullptr);
63+ QCOMPARE(act->id(), QString("1"));
64+ QCOMPARE(act->displayName(), QString("Action1"));
65+ QCOMPARE(act->iconHint(), QString("/foo.png"));
66+
67+ g_object_unref(icon);
68+ g_object_unref(iconFile);
4869}
4970
5071void PreviewBindingsTest::testApplicationPreview()
5172{
52− auto raw_preview = (GObject *)unity_protocol_application_preview_new();
53− unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(raw_preview), "Firefox");
54− unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(raw_preview), "Web Browser");
55− unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(raw_preview), "Lorem ipsum dolor sit amet");
56− unity_protocol_application_preview_set_license(UNITY_PROTOCOL_APPLICATION_PREVIEW(raw_preview), "GPL");
57− unity_protocol_application_preview_set_rating(UNITY_PROTOCOL_APPLICATION_PREVIEW(raw_preview), 0.5f);
58− unity_protocol_application_preview_set_num_ratings(UNITY_PROTOCOL_APPLICATION_PREVIEW(raw_preview), 4);
59− unity::glib::Object<GObject> gen_prv(raw_preview);
60−
61− auto core_prv = unity::dash::Preview::PreviewForProtocolObject(gen_prv);
62− auto prv = Preview::newFromUnityPreview(core_prv);
63− auto app_prv = dynamic_cast<ApplicationPreview*>(prv);
64−
65− QCOMPARE(app_prv != nullptr, true);
66− QCOMPARE(app_prv->title(), QString("Firefox"));
67− QCOMPARE(app_prv->subtitle(), QString("Web Browser"));
68− QCOMPARE(app_prv->description(), QString("Lorem ipsum dolor sit amet"));
69− QCOMPARE(app_prv->license(), QString("GPL"));
70− QCOMPARE(app_prv->rating(), 0.5f);
71− QCOMPARE(app_prv->numRatings(), unsigned (4));
73+ auto rawPreview = (GObject *)unity_protocol_application_preview_new();
74+ unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(rawPreview), "Firefox");
75+ unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(rawPreview), "Web Browser");
76+ unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(rawPreview), "Lorem ipsum dolor sit amet");
77+ unity_protocol_application_preview_set_license(UNITY_PROTOCOL_APPLICATION_PREVIEW(rawPreview), "GPL");
78+ unity_protocol_application_preview_set_rating(UNITY_PROTOCOL_APPLICATION_PREVIEW(rawPreview), 0.5f);
79+ unity_protocol_application_preview_set_num_ratings(UNITY_PROTOCOL_APPLICATION_PREVIEW(rawPreview), 4);
80+ unity::glib::Object<GObject> genPrv(rawPreview);
81+
82+ auto corePrv = unity::dash::Preview::PreviewForProtocolObject(genPrv);
83+ auto prv = Preview::newFromUnityPreview(corePrv);
84+ auto appPrv = dynamic_cast<ApplicationPreview*>(prv);
85+
86+ QCOMPARE(appPrv != nullptr, true);
87+ QCOMPARE(appPrv->title(), QString("Firefox"));
88+ QCOMPARE(appPrv->subtitle(), QString("Web Browser"));
89+ QCOMPARE(appPrv->description(), QString("Lorem ipsum dolor sit amet"));
90+ QCOMPARE(appPrv->license(), QString("GPL"));
91+ QCOMPARE(appPrv->rating(), 0.5f);
92+ QCOMPARE(appPrv->numRatings(), unsigned (4));
7293}
7394
7495void PreviewBindingsTest::testMoviePreview()
7596{
76− auto raw_preview = (GObject *)unity_protocol_movie_preview_new();
77− unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(raw_preview), "Blade Runner");
78− unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(raw_preview), "Ridley Scott");
79− unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(raw_preview), "Lorem ipsum dolor sit amet");
80− unity_protocol_movie_preview_set_year(UNITY_PROTOCOL_MOVIE_PREVIEW(raw_preview), "1982");
81− unity::glib::Object<GObject> gen_prv(raw_preview);
82−
83− auto core_prv = unity::dash::Preview::PreviewForProtocolObject(gen_prv);
84− auto prv = Preview::newFromUnityPreview(core_prv);
85− auto movie_prv = dynamic_cast<MoviePreview*>(prv);
86−
87− QCOMPARE(movie_prv != nullptr, true);
88− QCOMPARE(movie_prv->title(), QString("Blade Runner"));
89− QCOMPARE(movie_prv->subtitle(), QString("Ridley Scott"));
90− QCOMPARE(movie_prv->description(), QString("Lorem ipsum dolor sit amet"));
91− QCOMPARE(movie_prv->year(), QString("1982"));
97+ auto rawPreview = (GObject *)unity_protocol_movie_preview_new();
98+ unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(rawPreview), "Blade Runner");
99+ unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(rawPreview), "Ridley Scott");
100+ unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(rawPreview), "Lorem ipsum dolor sit amet");
101+ unity_protocol_movie_preview_set_year(UNITY_PROTOCOL_MOVIE_PREVIEW(rawPreview), "1982");
102+ unity::glib::Object<GObject> genPrv(rawPreview);
103+
104+ auto corePrv = unity::dash::Preview::PreviewForProtocolObject(genPrv);
105+ auto prv = Preview::newFromUnityPreview(corePrv);
106+ auto moviePrv = dynamic_cast<MoviePreview*>(prv);
107+
108+ QCOMPARE(moviePrv != nullptr, true);
109+ QCOMPARE(moviePrv->title(), QString("Blade Runner"));
110+ QCOMPARE(moviePrv->subtitle(), QString("Ridley Scott"));
111+ QCOMPARE(moviePrv->description(), QString("Lorem ipsum dolor sit amet"));
112+ QCOMPARE(moviePrv->year(), QString("1982"));
92113}
93114
94115void PreviewBindingsTest::testMusicPreview()
95116{
96− auto raw_preview = (GObject *)unity_protocol_music_preview_new();
97− unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(raw_preview), "Metallica");
98− unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(raw_preview), "Death Magnetic");
99− unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(raw_preview), "Lorem ipsum dolor sit amet");
100− unity::glib::Object<GObject> gen_prv(raw_preview);
101−
102− auto core_prv = unity::dash::Preview::PreviewForProtocolObject(gen_prv);
103− auto prv = Preview::newFromUnityPreview(core_prv);
104− auto music_prv = dynamic_cast<MusicPreview*>(prv);
105−
106− QCOMPARE(music_prv != nullptr, true);
107− QCOMPARE(music_prv->title(), QString("Metallica"));
108− QCOMPARE(music_prv->subtitle(), QString("Death Magnetic"));
109− QCOMPARE(music_prv->description(), QString("Lorem ipsum dolor sit amet"));
117+ auto rawPreview = (GObject *)unity_protocol_music_preview_new();
118+ unity_protocol_preview_set_title(UNITY_PROTOCOL_PREVIEW(rawPreview), "Metallica");
119+ unity_protocol_preview_set_subtitle(UNITY_PROTOCOL_PREVIEW(rawPreview), "Death Magnetic");
120+ unity_protocol_preview_set_description(UNITY_PROTOCOL_PREVIEW(rawPreview), "Lorem ipsum dolor sit amet");
121+ unity::glib::Object<GObject> genPrv(rawPreview);
122+
123+ auto corePrv = unity::dash::Preview::PreviewForProtocolObject(genPrv);
124+ auto prv = Preview::newFromUnityPreview(corePrv);
125+ auto musicPrv = dynamic_cast<MusicPreview*>(prv);
126+
127+ QCOMPARE(musicPrv != nullptr, true);
128+ QCOMPARE(musicPrv->title(), QString("Metallica"));
129+ QCOMPARE(musicPrv->subtitle(), QString("Death Magnetic"));
130+ QCOMPARE(musicPrv->description(), QString("Lorem ipsum dolor sit amet"));
131+}
132+
133+void PreviewBindingsTest::testSocialPreview()
134+{
135+ GFile *iconFile = g_file_new_for_path("/foo.png");
136+ GIcon *icon = g_file_icon_new(iconFile);
137+
138+ auto rawPreview = (GObject *)unity_protocol_social_preview_new();
139+ unity_protocol_social_preview_set_sender(UNITY_PROTOCOL_SOCIAL_PREVIEW(rawPreview), "John");
140+ unity_protocol_social_preview_set_avatar(UNITY_PROTOCOL_SOCIAL_PREVIEW(rawPreview), icon);
141+ unity_protocol_social_preview_set_content(UNITY_PROTOCOL_SOCIAL_PREVIEW(rawPreview), "Lorem ipsum dolor sit amet");
142+ unity_protocol_social_preview_add_comment(UNITY_PROTOCOL_SOCIAL_PREVIEW(rawPreview), "1", "comment1", "Ubuntu", "2013-07-04 14:10");
143+ unity::glib::Object<GObject> genPrv(rawPreview);
144+
145+ auto corePrv = unity::dash::Preview::PreviewForProtocolObject(genPrv);
146+ auto prv = Preview::newFromUnityPreview(corePrv);
147+ auto socialPrv = dynamic_cast<SocialPreview*>(prv);
148+
149+ QCOMPARE(socialPrv != nullptr, true);
150+ QCOMPARE(socialPrv->sender(), QString("John"));
151+ QCOMPARE(socialPrv->content(), QString("Lorem ipsum dolor sit amet"));
152+ QCOMPARE(socialPrv->avatar(), QString("/foo.png"));
153+
154+ auto comments = socialPrv->comments().value<QList<QObject *>>();
155+ QCOMPARE(comments.size(), 1);
156+ auto cmt = dynamic_cast<SocialPreviewComment *>(comments[0]);
157+ QVERIFY(cmt != nullptr);
158+ QCOMPARE(cmt->id(), QString("1"));
159+ QCOMPARE(cmt->displayName(), QString("comment1"));
160+ QCOMPARE(cmt->content(), QString("Ubuntu"));
161+ QCOMPARE(cmt->time(), QString("2013-07-04 14:10"));
162+
163+ g_object_unref(icon);
164+ g_object_unref(iconFile);
110165}
111166
112167QTEST_MAIN(PreviewBindingsTest)
tests/plugins/Unity/previewbindingstest.h+1
@@ -29,6 +29,7 @@ class PreviewBindingsTest : public QObject
2929 void testApplicationPreview();
3030 void testMoviePreview();
3131 void testMusicPreview();
32+ void testSocialPreview();
3233};
3334
3435#endif
tests/qmltests/Dash/tst_FilterGrids.qml+20−20
@@ -53,26 +53,26 @@ Rectangle {
5353
5454 ListModel {
5555 id: fakeModel
56− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item0"; column_5: ""; column_6: "dummy.desktop" }
57− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item1"; column_5: ""; column_6: "dummy.desktop" }
58− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item2"; column_5: ""; column_6: "dummy.desktop" }
59− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item3"; column_5: ""; column_6: "dummy.desktop" }
60− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item4"; column_5: ""; column_6: "dummy.desktop" }
61− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item5"; column_5: ""; column_6: "dummy.desktop" }
62− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item6"; column_5: ""; column_6: "dummy.desktop" }
63− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item7"; column_5: ""; column_6: "dummy.desktop" }
64− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item8"; column_5: ""; column_6: "dummy.desktop" }
65− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item9"; column_5: ""; column_6: "dummy.desktop" }
66− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item10"; column_5: ""; column_6: "dummy.desktop" }
67− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item11"; column_5: ""; column_6: "dummy.desktop" }
68− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item12"; column_5: ""; column_6: "dummy.desktop" }
69− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item13"; column_5: ""; column_6: "dummy.desktop" }
70− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item14"; column_5: ""; column_6: "dummy.desktop" }
71− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item15"; column_5: ""; column_6: "dummy.desktop" }
72− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item16"; column_5: ""; column_6: "dummy.desktop" }
73− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item17"; column_5: ""; column_6: "dummy.desktop" }
74− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item18"; column_5: ""; column_6: "dummy.desktop" }
75− ListElement { column_0: "Column0"; column_1: "../../graphics/clock.png"; column_4: "Item19"; column_5: ""; column_6: "dummy.desktop" }
56+ ListElement { icon: "../../graphics/clock.png"; title: "Item0"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
57+ ListElement { icon: "../../graphics/clock.png"; title: "Item1"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
58+ ListElement { icon: "../../graphics/clock.png"; title: "Item2"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
59+ ListElement { icon: "../../graphics/clock.png"; title: "Item3"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
60+ ListElement { icon: "../../graphics/clock.png"; title: "Item4"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
61+ ListElement { icon: "../../graphics/clock.png"; title: "Item5"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
62+ ListElement { icon: "../../graphics/clock.png"; title: "Item6"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
63+ ListElement { icon: "../../graphics/clock.png"; title: "Item7"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
64+ ListElement { icon: "../../graphics/clock.png"; title: "Item8"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
65+ ListElement { icon: "../../graphics/clock.png"; title: "Item9"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
66+ ListElement { icon: "../../graphics/clock.png"; title: "Item10"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
67+ ListElement { icon: "../../graphics/clock.png"; title: "Item11"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
68+ ListElement { icon: "../../graphics/clock.png"; title: "Item12"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
69+ ListElement { icon: "../../graphics/clock.png"; title: "Item13"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
70+ ListElement { icon: "../../graphics/clock.png"; title: "Item14"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
71+ ListElement { icon: "../../graphics/clock.png"; title: "Item15"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
72+ ListElement { icon: "../../graphics/clock.png"; title: "Item16"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
73+ ListElement { icon: "../../graphics/clock.png"; title: "Item17"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
74+ ListElement { icon: "../../graphics/clock.png"; title: "Item18"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
75+ ListElement { icon: "../../graphics/clock.png"; title: "Item19"; comment: ""; uri: "dummy.desktop"; dndUri: "dummy.desktop" }
7676 }
7777
7878 Rectangle {