on xenial help sign in
Save pinned status too, switch data type to be a list of dictionaries rather than a list of strings
commit047528f06ce9698396b85cf81f58a381c8804e10 authorMichael Terry <michael.terry@canonical.com> dateFri 23 Aug 2013, 14:02 (13 years ago) parentb700d05
4 files changed+49−32
plugins/AccountsService/com.canonical.unity.AccountsService.xml+1−1 plugins/AccountsService/plugin.cpp+2 plugins/Unity/Launcher/backend/launcherbackend.cpp+44−30 plugins/Unity/Launcher/backend/launcherbackend.h+2−1
plugins/AccountsService/com.canonical.unity.AccountsService.xml+1−1
@@ -16,7 +16,7 @@
1616 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
1717 </property>
1818
19− <property name="launcher-items" type="as" access="readwrite">
19+ <property name="launcher-items" type="aa{sv}" access="readwrite">
2020 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
2121 </property>
2222
plugins/AccountsService/plugin.cpp+2
@@ -19,6 +19,7 @@
1919#include "plugin.h"
2020#include "AccountsService.h"
2121
22+#include <QDBusMetaType>
2223#include <QtQml/QtQml>
2324
2425static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
@@ -31,5 +32,6 @@ static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
3132void AccountsServicePlugin::registerTypes(const char *uri)
3233{
3334 Q_ASSERT(uri == QLatin1String("AccountsService"));
35+ qDBusRegisterMetaType<QList<QVariantMap>>();
3436 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
3537}
plugins/Unity/Launcher/backend/launcherbackend.cpp+44−30
@@ -22,6 +22,7 @@
2222#include "launcherbackend.h"
2323
2424#include <QDir>
25+#include <QDBusArgument>
2526#include <QFileInfo>
2627
2728LauncherBackend::LauncherBackend(bool useStorage, QObject *parent):
@@ -69,7 +70,7 @@ void LauncherBackend::setStoredApplications(const QStringList &appIds)
6970 clearItems();
7071
7172 for (const QString &appId: appIds) {
72− loadDesktopFile(appId, pinnedItems.contains(desktopFile(appId)));
73+ loadApp(makeAppDetails(appId, pinnedItems.contains(desktopFile(appId))));
7374 }
7475
7576 syncToAccounts();
@@ -165,46 +166,45 @@ void LauncherBackend::triggerQuickListAction(const QString &appId, const QString
165166
166167void LauncherBackend::syncFromAccounts()
167168{
168− auto appIds = QStringList();
169+ QList<QVariantMap> apps;
170+
171+ clearItems();
169172
170173 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;
172176 }
173177
174178 // TODO: load default pinned ones from default config, instead of hardcoding here...
175− if (appIds.isEmpty()) {
176− appIds <<
177− "phone-app.desktop" <<
178− "camera-app.desktop" <<
179− "gallery-app.desktop" <<
180− "facebook-webapp.desktop" <<
181− "webbrowser-app.desktop" <<
182− "twitter-webapp.desktop" <<
183− "gmail-webapp.desktop" <<
184− "ubuntu-weather-app.desktop" <<
185− "notes-app.desktop" <<
186− "calendar-app.desktop";
179+ if (apps.isEmpty()) {
180+ apps <<
181+ makeAppDetails("phone-app.desktop", true) <<
182+ makeAppDetails("camera-app.desktop", true) <<
183+ makeAppDetails("gallery-app.desktop", true) <<
184+ makeAppDetails("facebook-webapp.desktop", true) <<
185+ makeAppDetails("webbrowser-app.desktop", true) <<
186+ makeAppDetails("twitter-webapp.desktop", true) <<
187+ makeAppDetails("gmail-webapp.desktop", true) <<
188+ makeAppDetails("ubuntu-weather-app.desktop", true) <<
189+ makeAppDetails("notes-app.desktop", true) <<
190+ makeAppDetails("calendar-app.desktop", true);
187191 }
188192
189− setStoredApplications(appIds);
190−
191− // Mark all apps as pinned (since we just refreshed the set)
192− for (LauncherBackendItem &app: m_storedApps) {
193− app.pinned = true;
193+ for (const QVariant &app: apps) {
194+ loadApp(app.toMap());
194195 }
195196}
196197
197198void LauncherBackend::syncToAccounts()
198199{
199− auto pinnedItems = QStringList();
200− for (LauncherBackendItem &app: m_storedApps) {
201− if (app.pinned) {
202− pinnedItems.append(app.settings->fileName());
200+ if (m_user != "" && m_accounts != nullptr) {
201+ QList<QVariantMap> items;
202+
203+ for (LauncherBackendItem &app: m_storedApps) {
204+ items << makeAppDetails(app.settings->fileName(), app.pinned);
203205 }
204− }
205206
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));
208208 }
209209}
210210
@@ -214,13 +214,27 @@ QSettings *LauncherBackend::parseDesktopFile(const QString &appId) const
214214 return new QSettings(fullAppId, QSettings::IniFormat);
215215}
216216
217−bool LauncherBackend::loadDesktopFile(const QString &appId, bool isPinned)
217+void LauncherBackend::loadApp(const QVariantMap &details)
218218{
219− auto item = LauncherBackendItem();
219+ auto appId = details.value("id").toString();
220+ auto isPinned = details.value("is-pinned").toBool();
221+
222+ if (appId.isEmpty()) {
223+ return;
224+ }
225+
226+ LauncherBackendItem item;
220227 item.settings = parseDesktopFile(appId);
221228 item.pinned = isPinned;
222229 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;
224238}
225239
226240int LauncherBackend::findItem(const QString &appId) const
plugins/Unity/Launcher/backend/launcherbackend.h+2−1
@@ -142,7 +142,8 @@ Q_SIGNALS:
142142
143143private:
144144 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);
146147 int findItem(const QString &appId) const;
147148 void syncFromAccounts();
148149 void syncToAccounts();