on xenial help sign in
Cancel previous actions and previews on new activation / preview. Expose previewed data row in Preview object.

Approved by PS Jenkins bot, Michal Hruby, Michał Sawicz.

commitad32a9766de2eaeb98e4184f7fe21f76f1e883f3 authorPawel Stolowski <pawel.stolowski@canonical.com> dateFri 27 Sep 2013, 14:12 (13 years ago) parentf72075f1380a39
12 files changed+227−4
debian/control+1−1 plugins/Unity/CMakeLists.txt+1 plugins/Unity/plugin.cpp+2 plugins/Unity/preview.cpp+17−2 plugins/Unity/preview.h+7 plugins/Unity/result.cpp+82 plugins/Unity/result.h+69 plugins/Unity/scope.cpp+8−1 plugins/Unity/scope.h+3 plugins/Unity/variantutils.cpp+9 plugins/Unity/variantutils.h+1 tests/plugins/Unity/previewbindingstest.cpp+27
debian/control+1−1
@@ -21,7 +21,7 @@ Build-Depends: cmake,
2121 libqt5v8-5-private-dev,
2222 libsigc++-2.0-dev,
2323 libunity-api-dev (>= 7.80.3),
24− libunity-core-6.0-dev (<< 7.80),
24+ libunity-core-6.0-dev (>= 7.1.1),
2525 libunity-dev (>= 7.0.12),
2626 libunity-mir-dev,
2727 libunity-scopes-json-def-phone,
plugins/Unity/CMakeLists.txt+1
@@ -43,6 +43,7 @@ set(QMLPLUGIN_SRC
4343 preview.cpp
4444 previewaction.cpp
4545 previewinfohint.cpp
46+ result.cpp
4647 showallfilteroption.cpp
4748 signalslist.cpp
4849 socialpreview.cpp
plugins/Unity/plugin.cpp+2
@@ -35,6 +35,7 @@
3535#include "categoryresults.h"
3636#include "bottombarvisibilitycommunicatorshell.h"
3737#include "genericoptionsmodel.h"
38+#include "result.h"
3839
3940// libqtdee
4041#include "deelistmodel.h"
@@ -50,6 +51,7 @@ void UnityPlugin::registerTypes(const char *uri)
5051 qmlRegisterUncreatableType<PreviewInfoHint>(uri, 0, 1, "PreviewInfoHint", "Can't create PreviewInfoHint object in QML.");
5152 qmlRegisterUncreatableType<SocialPreviewComment>(uri, 0, 1, "SocialPreviewComment", "Can't create SocialPreviewComment object in QML.");
5253 qmlRegisterUncreatableType<GenericOptionsModel>(uri, 0, 1, "GenericOptionsModel", "Can't create options model in QML.");
54+ qmlRegisterUncreatableType<Result>(uri, 0, 1, "Result", "Can't create result object in QML.");
5355 qmlRegisterType<Scope>(uri, 0, 1, "Scope");
5456 qmlRegisterType<Scopes>(uri, 0, 1, "Scopes");
5557 qmlRegisterType<Categories>(uri, 0, 1, "Categories");
plugins/Unity/preview.cpp+17−2
@@ -39,9 +39,12 @@
3939#include <UnityCore/MusicPreview.h>
4040#include <UnityCore/SocialPreview.h>
4141
42+#include <UnityCore/GLibWrapper.h>
43+
4244Preview::Preview(QObject *parent):
4345 QObject(parent),
44− m_unityPreview(nullptr)
46+ m_unityPreview(nullptr),
47+ m_result(new Result(this))
4548{
4649}
4750
@@ -123,6 +126,11 @@ QString Preview::imageSourceUri() const
123126 return QString::null;
124127}
125128
129+QVariant Preview::result() const
130+{
131+ return QVariant::fromValue(m_result);
132+}
133+
126134Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
127135{
128136 Preview* preview = nullptr;
@@ -151,6 +159,7 @@ Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
151159void Preview::setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview)
152160{
153161 m_unityPreview = unityPreview;
162+ m_result->setPreview(unityPreview);
154163
155164 qDeleteAll(m_infoHints);
156165 m_infoHints.clear();
@@ -181,8 +190,14 @@ void Preview::execute(const QString& actionId, const QHash<QString, QVariant>& h
181190{
182191 if (m_unityPreview) {
183192 auto unityHints = convertToHintsMap(hints);
184− m_unityPreview->PerformAction(actionId.toStdString(), unityHints);
193+ m_actionCancellable.Renew();
194+ m_unityPreview->PerformAction(actionId.toStdString(), unityHints, nullptr, m_actionCancellable);
185195 } else {
186196 qWarning() << "Preview not set";
187197 }
188198}
199+
200+void Preview::cancelAction()
201+{
202+ m_actionCancellable.Cancel();
203+}
plugins/Unity/preview.h+7
@@ -31,7 +31,9 @@
3131#include <UnityCore/Preview.h>
3232
3333// local
34+#include "result.h"
3435#include "previewaction.h"
36+#include <UnityCore/GLibWrapper.h>
3537
3638class Q_DECL_EXPORT Preview : public QObject
3739{
@@ -46,6 +48,7 @@ class Q_DECL_EXPORT Preview : public QObject
4648 Q_PROPERTY(QVariantMap infoMap READ infoHintsHash NOTIFY previewChanged)
4749 Q_PROPERTY(QString image READ image NOTIFY previewChanged)
4850 Q_PROPERTY(QString imageSourceUri READ imageSourceUri NOTIFY previewChanged)
51+ Q_PROPERTY(QVariant result READ result NOTIFY previewChanged)
4952
5053public:
5154 explicit Preview(QObject *parent = 0);
@@ -60,8 +63,10 @@ public:
6063 QVariantMap infoHintsHash() const;
6164 QString image() const;
6265 QString imageSourceUri() const;
66+ QVariant result() const;
6367
6468 Q_INVOKABLE void execute(const QString& actionId, const QHash<QString, QVariant>& hints);
69+ Q_INVOKABLE void cancelAction();
6570
6671Q_SIGNALS:
6772 void previewChanged();
@@ -70,6 +75,7 @@ protected:
7075 virtual void setUnityPreview(unity::dash::Preview::Ptr unityPreview);
7176
7277 unity::dash::Preview::Ptr m_unityPreview;
78+ Result* m_result;
7379
7480private:
7581 void setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview);
@@ -77,6 +83,7 @@ private:
7783 QList<QObject *> m_actions;
7884 QList<QObject *> m_infoHints;
7985 QVariantMap m_infoHintsHash;
86+ unity::glib::Cancellable m_actionCancellable;
8087};
8188
8289Q_DECLARE_METATYPE(Preview *)
plugins/Unity/result.cppnew file+82
@@ -0,0 +1,82 @@
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 "result.h"
21+#include "variantutils.h"
22+
23+Result::Result(QObject *parent) :
24+ QObject(parent)
25+{
26+}
27+
28+Result::Result(unity::dash::Preview::Ptr preview, QObject *parent) :
29+ QObject(parent),
30+ m_preview(preview)
31+{
32+}
33+
34+void Result::setPreview(unity::dash::Preview::Ptr preview)
35+{
36+ m_preview = preview;
37+}
38+
39+QString Result::uri() const
40+{
41+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.uri) : QString::null;
42+}
43+
44+QString Result::iconHint() const
45+{
46+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.icon_hint) : QString::null;
47+}
48+
49+unsigned Result::categoryIndex() const
50+{
51+ return m_preview != nullptr ? m_preview->preview_result.category_index : 0;
52+}
53+
54+unsigned Result::resultType() const
55+{
56+ return m_preview != nullptr ? m_preview->preview_result.result_type : 0;
57+}
58+
59+QString Result::mimeType() const
60+{
61+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.mimetype) : QString::null;
62+}
63+
64+QString Result::title() const
65+{
66+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.name) : QString::null;
67+}
68+
69+QString Result::comment() const
70+{
71+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.comment) : QString::null;
72+}
73+
74+QString Result::dndUri() const
75+{
76+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.dnd_uri) : QString::null;
77+}
78+
79+QVariant Result::metadata() const
80+{
81+ return m_preview != nullptr ? convertToQVariantHash(m_preview->preview_result.hints) : QVariant();
82+}
plugins/Unity/result.hnew file+69
@@ -0,0 +1,69 @@
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 RESULT_H
21+#define RESULT_H
22+
23+// Qt
24+#include <QObject>
25+#include <QVariant>
26+
27+// libunity-core
28+#include <UnityCore/Preview.h>
29+
30+class Q_DECL_EXPORT Result : public QObject
31+{
32+ Q_OBJECT
33+
34+ Q_PROPERTY(QString uri READ uri CONSTANT)
35+ Q_PROPERTY(QString iconHint READ iconHint CONSTANT)
36+ Q_PROPERTY(unsigned categoryIndex READ categoryIndex CONSTANT)
37+ Q_PROPERTY(unsigned resultType READ resultType CONSTANT)
38+ Q_PROPERTY(QString mimeType READ mimeType CONSTANT)
39+ Q_PROPERTY(QString title READ title CONSTANT)
40+ Q_PROPERTY(QString comment READ comment CONSTANT)
41+ Q_PROPERTY(QString dndUri READ dndUri CONSTANT)
42+ Q_PROPERTY(QVariant metadata READ metadata CONSTANT)
43+
44+public:
45+ Result(QObject *parent = nullptr);
46+ Result(unity::dash::Preview::Ptr preview, QObject *parent = nullptr);
47+
48+ void setPreview(unity::dash::Preview::Ptr preview);
49+
50+ QString uri() const;
51+ QString iconHint() const;
52+ unsigned categoryIndex() const;
53+ unsigned resultType() const;
54+ QString mimeType() const;
55+ QString title() const;
56+ QString comment() const;
57+ QString dndUri() const;
58+ QVariant metadata() const;
59+
60+private:
61+ /* Keep reference to the original preview to access result attributes via it, rather than keeping copies of them;
62+ this will save us a bit on copying, especially as UI is mostly interested in just uri.
63+ */
64+ unity::dash::Preview::Ptr m_preview;
65+};
66+
67+Q_DECLARE_METATYPE(Result *)
68+
69+#endif
plugins/Unity/scope.cpp+8−1
@@ -175,14 +175,21 @@ void Scope::preview(const QVariant &uri, const QVariant &icon_hint, const QVaria
175175 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
176176{
177177 auto res = createLocalResult(uri, icon_hint, category, result_type, mimetype, title, comment, dnd_uri, metadata);
178+ m_previewCancellable.Renew();
179+
178180 // canned queries don't have previews, must be activated
179181 if (uri.toString().startsWith("x-unity-no-preview-scopes-query://")) {
180182 m_unityScope->Activate(res);
181183 } else {
182− m_unityScope->Preview(res);
184+ m_unityScope->Preview(res, nullptr, m_previewCancellable);
183185 }
184186}
185187
188+void Scope::cancelActivation()
189+{
190+ m_previewCancellable.Cancel();
191+}
192+
186193void Scope::onActivated(unity::dash::LocalResult const& result, unity::dash::ScopeHandledType type, unity::glib::HintsMap const& hints)
187194{
188195 // note: we will not get called on SHOW_PREVIEW, instead UnityCore will signal preview_ready.
plugins/Unity/scope.h+3
@@ -82,6 +82,8 @@ public:
8282 Q_INVOKABLE void preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
8383 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
8484 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
85+ Q_INVOKABLE void cancelActivation();
86+
8587 void setUnityScope(const unity::dash::Scope::Ptr& scope);
8688 unity::dash::Scope::Ptr unityScope() const;
8789
@@ -131,6 +133,7 @@ private:
131133 QString m_searchQuery;
132134 QString m_noResultsHint;
133135 QString m_formFactor;
136+ unity::glib::Cancellable m_previewCancellable;
134137};
135138
136139Q_DECLARE_METATYPE(Scope*)
plugins/Unity/variantutils.cpp+9
@@ -40,3 +40,12 @@ unity::glib::HintsMap convertToHintsMap(const QVariant &var)
4040 }
4141 return unity::glib::HintsMap();
4242}
43+
44+QVariantHash convertToQVariantHash(const unity::glib::HintsMap& var)
45+{
46+ QVariantHash hash;
47+ for (auto hint: var) {
48+ hash.insert(QString::fromStdString(hint.first), DeeListModel::VariantForData(hint.second));
49+ }
50+ return hash;
51+}
plugins/Unity/variantutils.h+1
@@ -28,5 +28,6 @@
2828
2929unity::glib::HintsMap convertToHintsMap(const QHash<QString, QVariant> &val);
3030unity::glib::HintsMap convertToHintsMap(const QVariant &var);
31+QVariantHash convertToQVariantHash(const unity::glib::HintsMap& var);
3132
3233#endif
tests/plugins/Unity/previewbindingstest.cpp+27
@@ -19,6 +19,7 @@
1919
2020#include <UnityCore/Preview.h>
2121#include <UnityCore/GLibWrapper.h>
22+#include <UnityCore/Variant.h>
2223#include <unity-protocol.h>
2324
2425#include "genericpreview.h"
@@ -48,7 +49,23 @@ void PreviewBindingsTest::testGenericPreview()
4849 UNITY_PROTOCOL_LAYOUT_HINT_LEFT);
4950 unity::glib::Object<GObject> genPrv(rawPreview);
5051
52+ // create local result
53+ unity::glib::HintsMap hints;
54+ hints["a"] = unity::glib::Variant(g_variant_new_string("b"));
55+ unity::dash::LocalResult localResult;
56+ localResult.uri = "http://foo";
57+ localResult.icon_hint = "xyz";
58+ localResult.category_index = 1;
59+ localResult.result_type = 2;
60+ localResult.mimetype = "abc";
61+ localResult.name = "baz";
62+ localResult.comment = "qwerty";
63+ localResult.dnd_uri = "zzz";
64+ localResult.hints = hints;
65+
5166 auto corePrv = unity::dash::Preview::PreviewForProtocolObject(genPrv);
67+ corePrv->preview_result = localResult;
68+
5269 auto prv = Preview::newFromUnityPreview(corePrv);
5370
5471 QCOMPARE(prv != nullptr, true);
@@ -64,6 +81,16 @@ void PreviewBindingsTest::testGenericPreview()
6481 QCOMPARE(act->displayName(), QString("Action1"));
6582 QCOMPARE(act->iconHint(), QString("/foo.png"));
6683
84+ Result* res = prv->result().value<Result*>();
85+ QCOMPARE(res->uri(), QString("http://foo"));
86+ QCOMPARE(res->iconHint(), QString("xyz"));
87+ QCOMPARE(res->categoryIndex(), 1u);
88+ QCOMPARE(res->resultType(), 2u);
89+ QCOMPARE(res->mimeType(), QString("abc"));
90+ QCOMPARE(res->title(), QString("baz"));
91+ QCOMPARE(res->dndUri(), QString("zzz"));
92+ QCOMPARE(res->metadata().toHash()["a"].toString(), QString("b"));
93+
6794 g_object_unref(icon);
6895 g_object_unref(iconFile);
6996}