on xenial help sign in
Save pinned status too, switch data type to be a list of dictionaries rather than a list of strings
047528fMichael Terry
plugins/AccountsService/com.canonical.unity.AccountsService.xml+1−1
@@ -16,7 +16,7 @@
16 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
16 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
17 </property>
17 </property>
18
18
19− <property name="launcher-items" type="as" access="readwrite">
19+ <property name="launcher-items" type="aa{sv}" access="readwrite">
20 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
20 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
21 </property>
21 </property>
22
22
plugins/AccountsService/plugin.cpp+2
@@ -19,6 +19,7 @@
19#include "plugin.h"
19#include "plugin.h"
20#include "AccountsService.h"
20#include "AccountsService.h"
21
21
22+#include <QDBusMetaType>
22#include <QtQml/QtQml>
23#include <QtQml/QtQml>
23
24
24static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
25static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
@@ -31,5 +32,6 @@ static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
31void AccountsServicePlugin::registerTypes(const char *uri)
32void AccountsServicePlugin::registerTypes(const char *uri)
32{
33{
33 Q_ASSERT(uri == QLatin1String("AccountsService"));
34 Q_ASSERT(uri == QLatin1String("AccountsService"));
35+ qDBusRegisterMetaType<QList<QVariantMap>>();
34 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
36 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
35}
37}
plugins/Unity/Launcher/backend/launcherbackend.cpp+44−30
@@ -22,6 +22,7 @@
22#include "launcherbackend.h"
22#include "launcherbackend.h"
23
23
24#include <QDir>
24#include <QDir>
25+#include <QDBusArgument>
25#include <QFileInfo>
26#include <QFileInfo>
26
27
27LauncherBackend::LauncherBackend(bool useStorage, QObject *parent):
28LauncherBackend::LauncherBackend(bool useStorage, QObject *parent):
@@ -69,7 +70,7 @@ void LauncherBackend::setStoredApplications(const QStringList &appIds)
69 clearItems();
70 clearItems();
70
71
71 for (const QString &appId: appIds) {
72 for (const QString &appId: appIds) {
72− loadDesktopFile(appId, pinnedItems.contains(desktopFile(appId)));
73+ loadApp(makeAppDetails(appId, pinnedItems.contains(desktopFile(appId))));
73 }
74 }
74
75
75 syncToAccounts();
76 syncToAccounts();
@@ -165,46 +166,45 @@ void LauncherBackend::triggerQuickListAction(const QString &appId, const QString
165
166
166void LauncherBackend::syncFromAccounts()
167void LauncherBackend::syncFromAccounts()
167{
168{
168− auto appIds = QStringList();
169+ QList<QVariantMap> apps;
170+
171+ clearItems();
169
172
170 if (m_user != "" && m_accounts != nullptr) {
173 if (m_user != "" && m_accounts != nullptr) {
171− appIds = m_accounts->getUserProperty(m_user, "launcher-items").toStringList();
174+ auto variant = m_accounts->getUserProperty(m_user, "launcher-items");
175+ variant.value<QDBusArgument>() >> apps;
172 }
176 }
173
177
174 // TODO: load default pinned ones from default config, instead of hardcoding here...
178 // TODO: load default pinned ones from default config, instead of hardcoding here...
175− if (appIds.isEmpty()) {
179+ if (apps.isEmpty()) {
176− appIds <<
180+ apps <<
177− "phone-app.desktop" <<
181+ makeAppDetails("phone-app.desktop", true) <<
178− "camera-app.desktop" <<
182+ makeAppDetails("camera-app.desktop", true) <<
179− "gallery-app.desktop" <<
183+ makeAppDetails("gallery-app.desktop", true) <<
180− "facebook-webapp.desktop" <<
184+ makeAppDetails("facebook-webapp.desktop", true) <<
181− "webbrowser-app.desktop" <<
185+ makeAppDetails("webbrowser-app.desktop", true) <<
182− "twitter-webapp.desktop" <<
186+ makeAppDetails("twitter-webapp.desktop", true) <<
183− "gmail-webapp.desktop" <<
187+ makeAppDetails("gmail-webapp.desktop", true) <<
184− "ubuntu-weather-app.desktop" <<
188+ makeAppDetails("ubuntu-weather-app.desktop", true) <<
185− "notes-app.desktop" <<
189+ makeAppDetails("notes-app.desktop", true) <<
186− "calendar-app.desktop";
190+ makeAppDetails("calendar-app.desktop", true);
187 }
191 }
188
192
189− setStoredApplications(appIds);
193+ for (const QVariant &app: apps) {
190−
194+ loadApp(app.toMap());
191− // Mark all apps as pinned (since we just refreshed the set)
192− for (LauncherBackendItem &app: m_storedApps) {
193− app.pinned = true;
194 }
195 }
195}
196}
196
197
197void LauncherBackend::syncToAccounts()
198void LauncherBackend::syncToAccounts()
198{
199{
199− auto pinnedItems = QStringList();
200+ if (m_user != "" && m_accounts != nullptr) {
201+ QList<QVariantMap> items;
202+
200− for (LauncherBackendItem &app: m_storedApps) {
203+ for (LauncherBackendItem &app: m_storedApps) {
201− if (app.pinned) {
202− pinnedItems.append(app.settings->fileName());
204+ items << makeAppDetails(app.settings->fileName(), app.pinned);
203 }
205 }
204− }
205
206
206− if (m_user != "" && m_accounts != nullptr) {
207− m_accounts->setUserProperty(m_user, "launcher-items", QVariant(pinnedItems));
207+ m_accounts->setUserProperty(m_user, "launcher-items", QVariant::fromValue(items));
208 }
208 }
209}
209}
210
210
@@ -214,13 +214,27 @@ QSettings *LauncherBackend::parseDesktopFile(const QString &appId) const
214 return new QSettings(fullAppId, QSettings::IniFormat);
214 return new QSettings(fullAppId, QSettings::IniFormat);
215}
215}
216
216
217−bool LauncherBackend::loadDesktopFile(const QString &appId, bool isPinned)
217+void LauncherBackend::loadApp(const QVariantMap &details)
218{
218{
219+ auto appId = details.value("id").toString();
220+ auto isPinned = details.value("is-pinned").toBool();
221+
222+ if (appId.isEmpty()) {
223+ return;
224+ }
225+
219− auto item = LauncherBackendItem();
226+ LauncherBackendItem item;
220 item.settings = parseDesktopFile(appId);
227 item.settings = parseDesktopFile(appId);
221 item.pinned = isPinned;
228 item.pinned = isPinned;
222 m_storedApps.append(item);
229 m_storedApps.append(item);
223− return true; // QSettings doesn't really indicate a failure mode right now
230+}
231+
232+QVariantMap LauncherBackend::makeAppDetails(const QString &appId, bool pinned) const
233+{
234+ QVariantMap details;
235+ details.insert("id", appId);
236+ details.insert("is-pinned", pinned);
237+ return details;
224}
238}
225
239
226int LauncherBackend::findItem(const QString &appId) const
240int LauncherBackend::findItem(const QString &appId) const
plugins/Unity/Launcher/backend/launcherbackend.h+2−1
@@ -142,7 +142,8 @@ Q_SIGNALS:
142
142
143private:
143private:
144 QSettings *parseDesktopFile(const QString &appId) const;
144 QSettings *parseDesktopFile(const QString &appId) const;
145− bool loadDesktopFile(const QString &appId, bool isPinned);
145+ QVariantMap makeAppDetails(const QString &appId, bool pinned) const;
146+ void loadApp(const QVariantMap &details);
146 int findItem(const QString &appId) const;
147 int findItem(const QString &appId) const;
147 void syncFromAccounts();
148 void syncFromAccounts();
148 void syncToAccounts();
149 void syncToAccounts();