on xenial help sign in
Enable definition of scope back references in overridden results.

Approved by Paweł Stołowski, Michał Sawicz.

commita2059d14e44cb225983a958e5b4b86cd1297fe97 authorMichal Hruby <michal.mhr@gmail.com> dateWed 16 Oct 2013, 01:13 (13 years ago) parentb6b64c9092148e
6 files changed+112−18
Dash/Apps/FrequentlyUsedAppsModel.qml+16−16 plugins/Unity/scope.cpp+8−1 plugins/Unity/variantutils.cpp+31 plugins/Unity/variantutils.h+3−1 tests/plugins/Unity/resultstest.cpp+52 tests/plugins/Unity/resultstest.h+2
Dash/Apps/FrequentlyUsedAppsModel.qml+16−16
@@ -18,54 +18,54 @@ import QtQuick 2.0
1818
1919ListModel {
2020 ListElement {
21− uri: "application:///usr/share/applications/dialer-app.desktop"
21+ uri: "application://dialer-app.desktop"
2222 icon: "../../graphics/applicationIcons/phone-app.png"
2323 category: 0
2424 mimetype: "application/x-desktop"
2525 title: "Dialer"
2626 comment: ""
2727 dndUri: "file:///usr/share/applications/dialer-app.desktop"
28− metadata: ""
28+ metadata: "subscope:applications.scope/applications-non-click.scope"
2929 }
3030 ListElement {
31− uri: "application:///usr/share/applications/messaging-app.desktop"
31+ uri: "application://messaging-app.desktop"
3232 icon: "../../graphics/applicationIcons/messages-app.png"
3333 category: 0
3434 mimetype: "application/x-desktop"
3535 title: "Messaging"
3636 comment: ""
3737 dndUri: "file:///usr/share/applications/messaging-app.desktop"
38− metadata: ""
38+ metadata: "subscope:applications.scope/applications-non-click.scope"
3939 }
4040 ListElement {
41− uri: "application:///usr/share/applications/address-book-app.desktop"
41+ uri: "application://address-book-app.desktop"
4242 icon: "../../graphics/applicationIcons/contacts-app.png"
4343 category: 0
4444 mimetype: "application/x-desktop"
4545 title: "Contacts"
4646 comment: ""
4747 dndUri: "file:///usr/share/applications/address-book-app.desktop"
48− metadata: ""
48+ metadata: "subscope:applications.scope/applications-non-click.scope"
4949 }
5050 ListElement {
51− uri: "application:///usr/share/applications/camera-app.desktop"
51+ uri: "application://camera-app.desktop"
5252 icon: "../../graphics/applicationIcons/camera.png"
5353 category: 0
5454 mimetype: "application/x-desktop"
5555 title: "Camera"
5656 comment: ""
5757 dndUri: "file:///usr/share/applications/camera-app.desktop"
58− metadata: ""
58+ metadata: "subscope:applications.scope/applications-non-click.scope"
5959 }
6060 ListElement {
61− uri: "application:///usr/share/applications/gallery-app.desktop"
61+ uri: "application://gallery-app.desktop"
6262 icon: "../../graphics/applicationIcons/gallery.png"
6363 category: 0
6464 mimetype: "application/x-desktop"
6565 title: "Gallery"
6666 comment: ""
6767 dndUri: "file:///usr/share/applications/gallery.desktop"
68− metadata: ""
68+ metadata: "subscope:applications.scope/applications-non-click.scope"
6969 }
7070 ListElement {
7171 uri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
@@ -75,17 +75,17 @@ ListModel {
7575 title: "Facebook"
7676 comment: ""
7777 dndUri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
78− metadata: ""
78+ metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.developer.webapps.webapp-facebook"
7979 }
8080 ListElement {
81− uri: "application:///usr/share/applications/webbrowser-app.desktop"
81+ uri: "application://webbrowser-app.desktop"
8282 icon: "../../graphics/applicationIcons/browser.png"
8383 category: 0
8484 mimetype: "application/x-desktop"
8585 title: "Browser"
8686 comment: ""
8787 dndUri: "file:///usr/share/applications/webbrowser-app.desktop"
88− metadata: ""
88+ metadata: "subscope:applications.scope/applications-non-click.scope"
8989 }
9090 ListElement {
9191 uri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
@@ -95,16 +95,16 @@ ListModel {
9595 title: "GMail"
9696 comment: ""
9797 dndUri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
98− metadata: ""
98+ metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.developer.webapps.webapp-gmail"
9999 }
100100 ListElement {
101− uri: "application:///usr/share/applications/ubuntu-system-settings.desktop"
101+ uri: "application://ubuntu-system-settings.desktop"
102102 icon: "../../graphics/applicationIcons/system-settings.png"
103103 category: 0
104104 mimetype: "application/x-desktop"
105105 title: "System Settings"
106106 comment: ""
107107 dndUri: "file:///usr/share/applications/ubuntu-system-settings.desktop"
108− metadata: ""
108+ metadata: "subscope:applications.scope/applications-non-click.scope"
109109 }
110110}
plugins/Unity/scope.cpp+8−1
@@ -28,6 +28,7 @@
2828
2929// Qt
3030#include <QUrl>
31+#include <QUrlQuery>
3132#include <QDebug>
3233#include <QtGui/QDesktopServices>
3334#include <QQmlEngine>
@@ -203,7 +204,13 @@ void Scope::preview(const QVariant &uri, const QVariant &icon_hint, const QVaria
203204 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
204205 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
205206{
206− auto res = createLocalResult(uri, icon_hint, category, result_type, mimetype, title, comment, dnd_uri, metadata);
207+ QVariant real_metadata(metadata);
208+ // handle overridden results, since QML doesn't support defining maps
209+ if (metadata.type() == QVariant::String) {
210+ real_metadata = QVariant::fromValue(subscopeUriToMetadataHash(metadata.toString()));
211+ }
212+
213+ auto res = createLocalResult(uri, icon_hint, category, result_type, mimetype, title, comment, dnd_uri, real_metadata);
207214 m_previewCancellable.Renew();
208215
209216 // canned queries don't have previews, must be activated
plugins/Unity/variantutils.cpp+31
@@ -17,6 +17,10 @@
1717 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1818 */
1919
20+#include <QUrl>
21+#include <QUrlQuery>
22+#include <QStringList>
23+
2024#include <deelistmodel.h>
2125#include "variantutils.h"
2226
@@ -49,3 +53,30 @@ QVariantHash convertToQVariantHash(const unity::glib::HintsMap& var)
4953 }
5054 return hash;
5155}
56+
57+/* This will translate uris in the form of:
58+ * "subscope:master.scope/sub.scope?foo=bar"
59+ * into a QVariantHash that can be passed as a metadata field to scope.
60+ */
61+QVariantHash subscopeUriToMetadataHash(const QString &metadata_string)
62+{
63+ QUrl metadata_url(metadata_string);
64+ if (metadata_url.scheme() == QLatin1String("subscope")) {
65+ QString subscope_uri(metadata_url.toString(QUrl::RemoveScheme | QUrl::RemoveQuery));
66+ QVariantHash new_metadata;
67+ QUrlQuery query(metadata_url.query());
68+ QList<QPair<QString,QString>> queryItems(query.queryItems());
69+ for (auto it = queryItems.begin(); it != queryItems.end(); ++it) {
70+ new_metadata[it->first] = QVariant::fromValue(it->second);
71+ }
72+ QStringList parts(subscope_uri.split(QChar('/')));
73+ for (int i = parts.size() - 1; i >= 0; i--) {
74+ QVariantHash inner;
75+ inner["scope-id"] = QVariant::fromValue(parts[i]);
76+ inner["content"] = QVariant::fromValue(new_metadata);
77+ new_metadata = inner;
78+ }
79+ return new_metadata;
80+ }
81+ return QVariantHash();
82+}
plugins/Unity/variantutils.h+3−1
@@ -28,6 +28,8 @@
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);
31+QVariantHash convertToQVariantHash(const unity::glib::HintsMap &var);
32+/* used in tests, so we have to export it */
33+Q_DECL_EXPORT QVariantHash subscopeUriToMetadataHash(const QString &metadata_string);
3234
3335#endif
tests/plugins/Unity/resultstest.cpp+52
@@ -23,6 +23,7 @@
2323
2424#include "resultstest.h"
2525#include "categoryresults.h"
26+#include "variantutils.h"
2627
2728static DeeModel* createBackendModel()
2829{
@@ -193,4 +194,55 @@ void ResultsTest::testSpecialIcons()
193194 QCOMPARE(transformedIcon, result);
194195}
195196
197+void ResultsTest::testMetadataOverride_data()
198+{
199+ QTest::addColumn<QString>("uri");
200+ QTest::addColumn<QVariantHash>("result");
201+
202+ QVariantHash expected_result;
203+ QVariantHash inner_hash;
204+
205+ expected_result = QVariantHash();
206+ expected_result["scope-id"] = QVariant::fromValue(QString("applications.scope"));
207+ expected_result["content"] = QVariant::fromValue(QVariantHash());
208+
209+ QTest::newRow("single scope") << "subscope:applications.scope" << expected_result;
210+
211+ expected_result = QVariantHash();
212+ expected_result["scope-id"] = QVariant::fromValue(QString("applications.scope"));
213+ inner_hash = QVariantHash();
214+ inner_hash["foo"] = QVariant::fromValue(QString("bar"));
215+ inner_hash["qoo"] = QVariant::fromValue(QString("baz"));
216+ expected_result["content"] = QVariant::fromValue(inner_hash);
217+
218+ QTest::newRow("single scope with data") << "subscope:applications.scope?foo=bar&qoo=baz" << expected_result;
219+
220+ expected_result = QVariantHash();
221+ inner_hash = QVariantHash();
222+ inner_hash["scope-id"] = QVariant::fromValue(QString("applications-local.scope"));
223+ inner_hash["content"] = QVariant::fromValue(QVariantHash());
224+ expected_result["scope-id"] = QVariant::fromValue(QString("applications.scope"));
225+ expected_result["content"] = QVariant::fromValue(inner_hash);
226+ QTest::newRow("master scope") << "subscope:applications.scope/applications-local.scope" << expected_result;
227+
228+ expected_result = QVariantHash();
229+ expected_result["foo"] = QVariant::fromValue(QString("baz"));
230+ expected_result["qoo"] = QVariant::fromValue(QString("baz"));
231+ inner_hash = QVariantHash();
232+ inner_hash["scope-id"] = QVariant::fromValue(QString("applications-local.scope"));
233+ inner_hash["content"] = QVariant::fromValue(expected_result);
234+ expected_result = QVariantHash();
235+ expected_result["scope-id"] = QVariant::fromValue(QString("applications.scope"));
236+ expected_result["content"] = QVariant::fromValue(inner_hash);
237+ QTest::newRow("nested with data") << "subscope:applications.scope/applications-local.scope?foo=baz&qoo=baz" << expected_result;
238+}
239+
240+void ResultsTest::testMetadataOverride()
241+{
242+ QFETCH(QString, uri);
243+ QFETCH(QVariantHash, result);
244+
245+ QCOMPARE(subscopeUriToMetadataHash(uri), result);
246+}
247+
196248QTEST_MAIN(ResultsTest)
tests/plugins/Unity/resultstest.h+2
@@ -32,6 +32,8 @@ class ResultsTest : public QObject
3232 void testIconColumn();
3333 void testSpecialIcons_data();
3434 void testSpecialIcons();
35+ void testMetadataOverride_data();
36+ void testMetadataOverride();
3537};
3638
3739#endif