on xenial help sign in
Fix syncing of stored launcher items
commit8a832cb241f5a3f5687df86a1073bc43fd3cdce8 authorMichael Terry <michael.terry@canonical.com> dateWed 7 May 2014, 14:58 (12 years ago) parent9fdb463
6 files changed+82−24
plugins/Unity/Launcher/backend/launcherbackend.cpp+16−2 plugins/Unity/Launcher/backend/launcherbackend.h+7−1 plugins/Unity/Launcher/launcheritem.cpp+14−9 plugins/Unity/Launcher/launcheritem.h+2−1 plugins/Unity/Launcher/launchermodel.cpp+41−11 plugins/Unity/Launcher/launchermodel.h+2
plugins/Unity/Launcher/backend/launcherbackend.cpp+16−2
@@ -38,12 +38,15 @@ public:
3838 bool countVisible;
3939};
4040
41−LauncherBackend::LauncherBackend(QObject *parent):
41+LauncherBackend::LauncherBackend(bool greeterMode, QObject *parent):
4242 QDBusVirtualObject(parent),
43+ m_greeterMode(greeterMode),
4344 m_accounts(nullptr)
4445{
4546#ifndef LAUNCHER_TESTING
4647 m_accounts = new AccountsServiceDBusAdaptor(this);
48+ connect(m_accounts, SIGNAL(propertiesChanged(QString, QString, QStringList)),
49+ this, SLOT(accountsListChanged(QString, QString, QStringList)));
4750#endif
4851 m_user = qgetenv("USER");
4952 syncFromAccounts();
@@ -231,7 +234,7 @@ void LauncherBackend::setCountVisible(const QString &appId, bool visible) const
231234
232235void LauncherBackend::setUser(const QString &username)
233236{
234− if (qgetenv("USER") == "lightdm" && m_user != username) {
237+ if (m_greeterMode && m_user != username) {
235238 m_user = username;
236239 syncFromAccounts();
237240 }
@@ -244,6 +247,15 @@ void LauncherBackend::triggerQuickListAction(const QString &appId, const QString
244247 Q_UNUSED(quickListId)
245248}
246249
250+void LauncherBackend::accountsListChanged(const QString &user, const QString &interface, const QStringList &changed)
251+{
252+ if (m_greeterMode && user == m_user &&
253+ interface == "com.canonical.unity.AccountsService" &&
254+ changed.contains("launcher-items")) {
255+ syncFromAccounts();
256+ }
257+}
258+
247259void LauncherBackend::syncFromAccounts()
248260{
249261 QList<QVariantMap> apps;
@@ -285,6 +297,8 @@ void LauncherBackend::syncFromAccounts()
285297 loadFromVariant(app.toMap());
286298 }
287299 }
300+
301+ Q_EMIT refreshApplications();
288302}
289303
290304void LauncherBackend::syncToAccounts()
plugins/Unity/Launcher/backend/launcherbackend.h+7−1
@@ -42,7 +42,7 @@ class LauncherBackend : public QDBusVirtualObject
4242 friend LauncherBackendTest;
4343
4444public:
45− LauncherBackend(QObject *parent = 0);
45+ LauncherBackend(bool greeterMode = false, QObject *parent = 0);
4646 virtual ~LauncherBackend();
4747
4848 /**
@@ -162,6 +162,7 @@ public:
162162 virtual QString introspect (const QString &path) const;
163163
164164Q_SIGNALS:
165+ void refreshApplications() const;
165166 void quickListChanged(const QString &appId, const QList<QuickListEntry> &quickList) const;
166167 void progressChanged(const QString &appId, int progress) const;
167168 void countChanged(const QString &appId, int count) const;
@@ -178,6 +179,8 @@ private:
178179 void syncFromAccounts();
179180 void syncToAccounts();
180181
182+ bool m_greeterMode;
183+
181184 QList<QString> m_storedApps;
182185 mutable QHash<QString, LauncherBackendItem*> m_itemCache;
183186
@@ -186,6 +189,9 @@ private:
186189
187190 void emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const;
188191
192+private Q_SLOTS:
193+ void accountsListChanged(const QString &user, const QString &interface, const QStringList &changed);
194+
189195protected: /* Protected to allow testing */
190196 LauncherBackendItem* getItem(const QString& appId) const;
191197
plugins/Unity/Launcher/launcheritem.cpp+14−9
@@ -22,12 +22,13 @@
2222
2323#include <libintl.h>
2424
25−LauncherItem::LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent) :
25+LauncherItem::LauncherItem(const QString &appId, const QString &name, const QString &icon, bool pinnable, QObject *parent) :
2626 LauncherItemInterface(parent),
2727 m_appId(appId),
2828 m_name(name),
2929 m_icon(icon),
3030 m_pinned(false),
31+ m_pinnable(pinnable),
3132 m_running(false),
3233 m_recent(false),
3334 m_progress(-1),
@@ -38,10 +39,12 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
3839 QuickListEntry nameAction;
3940 nameAction.setText(m_name);
4041 m_quickList->appendAction(nameAction);
41− QuickListEntry pinningAction;
42− pinningAction.setActionId("pin_item");
43− pinningAction.setText(gettext("Lock to Launcher"));
44− m_quickList->appendAction(pinningAction);
42+ if (m_pinnable) {
43+ QuickListEntry pinningAction;
44+ pinningAction.setActionId("pin_item");
45+ pinningAction.setText(gettext("Lock to Launcher"));
46+ m_quickList->appendAction(pinningAction);
47+ }
4548}
4649
4750QString LauncherItem::appId() const
@@ -68,10 +71,12 @@ void LauncherItem::setPinned(bool pinned)
6871{
6972 if (m_pinned != pinned) {
7073 m_pinned = pinned;
71− QuickListEntry entry;
72− entry.setActionId("pin_item");
73− entry.setText(pinned ? gettext("Unlock from Launcher") : gettext("Lock to Launcher"));
74− m_quickList->updateAction(entry);
74+ if (m_pinnable) {
75+ QuickListEntry entry;
76+ entry.setActionId("pin_item");
77+ entry.setText(pinned ? gettext("Unlock from Launcher") : gettext("Lock to Launcher"));
78+ m_quickList->updateAction(entry);
79+ }
7580 Q_EMIT pinnedChanged(pinned);
7681 }
7782}
plugins/Unity/Launcher/launcheritem.h+2−1
@@ -32,7 +32,7 @@ class LauncherItem: public LauncherItemInterface
3232{
3333 Q_OBJECT
3434public:
35− LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent = 0);
35+ LauncherItem(const QString &appId, const QString &name, const QString &icon, bool pinnable, QObject *parent = 0);
3636
3737 QString appId() const;
3838 QString name() const;
@@ -67,6 +67,7 @@ private:
6767 QString m_name;
6868 QString m_icon;
6969 bool m_pinned;
70+ bool m_pinnable;
7071 bool m_running;
7172 bool m_recent;
7273 int m_progress;
plugins/Unity/Launcher/launchermodel.cpp+41−11
@@ -27,20 +27,15 @@ using namespace unity::shell::application;
2727
2828LauncherModel::LauncherModel(QObject *parent):
2929 LauncherModelInterface(parent),
30− m_backend(new LauncherBackend(this)),
30+ m_greeterMode(qgetenv("XDG_SESSION_CLASS") == "greeter"),
31+ m_backend(new LauncherBackend(m_greeterMode, this)),
3132 m_appManager(0)
3233{
3334 connect(m_backend, SIGNAL(countChanged(QString,int)), SLOT(countChanged(QString,int)));
3435 connect(m_backend, SIGNAL(progressChanged(QString,int)), SLOT(progressChanged(QString,int)));
36+ connect(m_backend, SIGNAL(refreshApplications()), SLOT(refreshStoredApplications()));
3537
36− Q_FOREACH (const QString &entry, m_backend->storedApplications()) {
37− LauncherItem *item = new LauncherItem(entry,
38− m_backend->displayName(entry),
39− m_backend->icon(entry),
40− this);
41− item->setPinned(true);
42− m_list.append(item);
43− }
38+ refreshStoredApplications();
4439}
4540
4641LauncherModel::~LauncherModel()
@@ -139,7 +134,8 @@ void LauncherModel::pin(const QString &appId, int index)
139134 beginInsertRows(QModelIndex(), index, index);
140135 LauncherItem *item = new LauncherItem(appId,
141136 m_backend->displayName(appId),
142− m_backend->icon(appId));
137+ m_backend->icon(appId),
138+ !m_greeterMode);
143139 item->setPinned(true);
144140 m_list.insert(index, item);
145141 endInsertRows();
@@ -199,6 +195,40 @@ void LauncherModel::setUser(const QString &username)
199195 m_backend->setUser(username);
200196}
201197
198+void LauncherModel::refreshStoredApplications()
199+{
200+ // First remove any existing ones
201+ QList<int> storedAppIndices;
202+ for (int i = 0; i < m_list.count(); ++i) {
203+ if (!m_list.at(i)->recent()) {
204+ storedAppIndices << i;
205+ }
206+ }
207+ int run = 0;
208+ while (storedAppIndices.count() > 0) {
209+ beginRemoveRows(QModelIndex(), storedAppIndices.first() - run, storedAppIndices.first() - run);
210+ m_list.takeAt(storedAppIndices.first() - run)->deleteLater();
211+ endRemoveRows();
212+ storedAppIndices.takeFirst();
213+ ++run;
214+ }
215+
216+ // Now insert all stored apps at beginning of list
217+ QStringList storedApplications = m_backend->storedApplications();
218+ beginInsertRows(QModelIndex(), 0, storedApplications.size() - 1);
219+ run = 0;
220+ Q_FOREACH (const QString &entry, storedApplications) {
221+ LauncherItem *item = new LauncherItem(entry,
222+ m_backend->displayName(entry),
223+ m_backend->icon(entry),
224+ !m_greeterMode,
225+ this);
226+ item->setPinned(true);
227+ m_list.insert(run++, item);
228+ }
229+ endInsertRows();
230+}
231+
202232ApplicationManagerInterface *LauncherModel::applicationManager() const
203233{
204234 return m_appManager;
@@ -302,7 +332,7 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
302332 if (found) {
303333 // Shall we paint some running/recent app highlight? If yes, do it here.
304334 } else {
305− LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString());
335+ LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), !m_greeterMode);
306336 item->setRecent(true);
307337 item->setFocused(app->focused());
308338
plugins/Unity/Launcher/launchermodel.h+2
@@ -62,6 +62,7 @@ private:
6262private Q_SLOTS:
6363 void progressChanged(const QString &appId, int progress);
6464 void countChanged(const QString &appId, int count);
65+ void refreshStoredApplications();
6566
6667 void applicationAdded(const QModelIndex &parent, int row);
6768 void applicationRemoved(const QModelIndex &parent, int row);
@@ -69,6 +70,7 @@ private Q_SLOTS:
6970
7071private:
7172 QList<LauncherItem*> m_list;
73+ bool m_greeterMode;
7274 LauncherBackend *m_backend;
7375 ApplicationManagerInterface *m_appManager;
7476};