@@ -21,16 +21,22 @@
2121#include "launcheritem.h"
2222#include "backend/launcherbackend.h"
2323
24+#include <unity/shell/application/ApplicationInfoInterface.h>
25+
26+#include <QDebug>
27+
28+using namespace unity::shell::application;
29+
2430LauncherModel::LauncherModel(QObject *parent):
2531 LauncherModelInterface(parent),
26− m_backend(new LauncherBackend(true, this))
32+ m_backend(new LauncherBackend(true, this)),
33+ m_appManager(0)
2734{
2835 connect(m_backend, SIGNAL(countChanged(QString,int)), SLOT(countChanged(QString,int)));
2936 connect(m_backend, SIGNAL(progressChanged(QString,int)), SLOT(progressChanged(QString,int)));
3037
3138 Q_FOREACH (const QString &entry, m_backend->storedApplications()) {
3239 LauncherItem *item = new LauncherItem(entry,
33− m_backend->desktopFile(entry),
3440 m_backend->displayName(entry),
3541 m_backend->icon(entry),
3642 this);
@@ -61,9 +67,7 @@ QVariant LauncherModel::data(const QModelIndex &index, int role) const
6167 LauncherItem *item = m_list.at(index.row());
6268 switch(role) {
6369 case RoleAppId:
64− return item->desktopFile();
65− case RoleDesktopFile:
66− return item->desktopFile();
70+ return item->appId();
6771 case RoleName:
6872 return item->name();
6973 case RoleIcon:
@@ -137,7 +141,6 @@ void LauncherModel::pin(const QString &appId, int index)
137141 }
138142 beginInsertRows(QModelIndex(), index, index);
139143 LauncherItem *item = new LauncherItem(appId,
140− m_backend->desktopFile(appId),
141144 m_backend->displayName(appId),
142145 m_backend->icon(appId));
143146 item->setPinned(true);
@@ -193,45 +196,23 @@ void LauncherModel::setUser(const QString &username)
193196 m_backend->setUser(username);
194197}
195198
196−void LauncherModel::applicationFocused(const QString &appId)
199+ApplicationManagerInterface *LauncherModel::applicationManager() const
197200{
198− // Unfocus all apps
199− for(int i = 0; i < m_list.count(); ++i) {
200− LauncherItem *item = m_list.at(i);
201− if (item->focused()) {
202− item->setFocused(false);
203− Q_EMIT dataChanged(this->index(i), this->index(i), QVector<int>() << RoleFocused);
204− }
205− }
206−
207− if (appId.isEmpty()) {
208− return;
209− }
201+ return m_appManager;
202+}
210203
211− // FIXME: drop this once we get real appIds from the AppManager
212− QString helper = appId.split('/').last();
213− if (helper.endsWith(".desktop")) {
214− helper.chop(8);
215− }
204+void LauncherModel::setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager)
205+{
206+ qDebug() << "setting appmanager" << appManager;
216207
217− int index = findApplication(helper);
218− if (index >= 0) {
219− m_list.at(index)->setFocused(true);
220− Q_EMIT dataChanged(this->index(index), this->index(index), QVector<int>() << RoleFocused);
221− } else {
222− // Add app to recent apps
223− QString desktopFile = m_backend->desktopFile(helper);
224− QString appName = m_backend->displayName(helper);
225− QString icon = m_backend->icon(helper);
208+ // Is there already another appmanager set?
209+ if (m_appManager) {
210+ // Disconnect any signals
211+ disconnect(this, SLOT(applicationAdded(QModelIndex,int)));
212+ disconnect(this, SLOT(applicationRemoved(QModelIndex,int)));
213+ disconnect(this, SLOT(focusedAppIdChanged()));
226214
227− LauncherItem *item = new LauncherItem(helper, desktopFile, appName, icon);
228− item->setRecent(true);
229− item->setFocused(true);
230− beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
231− m_list.append(item);
232− endInsertRows();
233−
234− // Clean up old recent apps
215+ // remove any recent/running apps from the launcher
235216 QList<int> recentAppIndices;
236217 for (int i = 0; i < m_list.count(); ++i) {
237218 if (m_list.at(i)->recent()) {
@@ -239,22 +220,33 @@ void LauncherModel::applicationFocused(const QString &appId)
239220 }
240221 }
241222 int run = 0;
242− while (recentAppIndices.count() > 5) {
223+ while (recentAppIndices.count() > 0) {
243224 beginRemoveRows(QModelIndex(), recentAppIndices.first() - run, recentAppIndices.first() - run);
244225 m_list.takeAt(recentAppIndices.first() - run)->deleteLater();
245226 endRemoveRows();
246227 recentAppIndices.takeFirst();
247228 ++run;
248229 }
249− storeAppList();
230+ }
231+
232+ m_appManager = appManager;
233+ connect(m_appManager, SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(applicationAdded(QModelIndex,int)));
234+ connect(m_appManager, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), SLOT(applicationRemoved(QModelIndex,int)));
235+ connect(m_appManager, SIGNAL(focusedApplicationIdChanged()), SLOT(focusedAppIdChanged()));
236+
237+ Q_EMIT applicationManagerChanged();
238+
239+ for (int i = 0; i < appManager->count(); ++i) {
240+ applicationAdded(QModelIndex(), i);
250241 }
251242}
252243
244+
253245void LauncherModel::storeAppList()
254246{
255247 QStringList appIds;
256248 Q_FOREACH(LauncherItem *item, m_list) {
257− if (item->pinned() || item->recent()) {
249+ if (item->pinned()) {
258250 appIds << item->appId();
259251 }
260252 }
@@ -292,3 +284,64 @@ void LauncherModel::countChanged(const QString &appId, int count)
292284 Q_EMIT dataChanged(index(idx), index(idx), QVector<int>() << RoleCount);
293285 }
294286}
287+
288+void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
289+{
290+ Q_UNUSED(parent);
291+
292+ ApplicationInfoInterface *app = m_appManager->get(row);
293+
294+ bool found = false;
295+ Q_FOREACH(LauncherItem *item, m_list) {
296+ if (app->appId() == item->appId()) {
297+ found = true;
298+ break;
299+ }
300+ }
301+ if (found) {
302+ // Shall we paint some running/recent app highlight? If yes, do it here.
303+ } else {
304+ qDebug() << "Adding app icon" << app->icon();
305+ LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString());
306+ item->setRecent(true);
307+ item->setFocused(app->focused());
308+
309+ beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
310+ m_list.append(item);
311+ endInsertRows();
312+ }
313+}
314+
315+void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
316+{
317+ Q_UNUSED(parent)
318+
319+ int appIndex = -1;
320+ for (int i = 0; i < m_list.count(); ++i) {
321+ if (m_list.at(i)->appId() == m_appManager->get(row)->appId()) {
322+ appIndex = i;
323+ break;
324+ }
325+ }
326+
327+ if (appIndex > -1 && !m_list.at(appIndex)->pinned()) {
328+ beginRemoveRows(QModelIndex(), appIndex, appIndex);
329+ m_list.takeAt(appIndex)->deleteLater();
330+ endRemoveRows();
331+ }
332+}
333+
334+void LauncherModel::focusedAppIdChanged()
335+{
336+ QString appId = m_appManager->focusedApplicationId();
337+ for (int i = 0; i < m_list.count(); ++i) {
338+ LauncherItem *item = m_list.at(i);
339+ if (!item->focused() && item->appId() == appId) {
340+ item->setFocused(true);
341+ Q_EMIT dataChanged(index(i), index(i), QVector<int>() << RoleFocused);
342+ } else if (item->focused() && item->appId() != appId) {
343+ item->setFocused(false);
344+ Q_EMIT dataChanged(index(i), index(i), QVector<int>() << RoleFocused);
345+ }
346+ }
347+}