@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,6 +16,7 @@
1616
1717#include "ApplicationManager.h"
1818#include "ApplicationInfo.h"
19+#include "MirSurfaceItem.h"
1920
2021#include <paths.h>
2122
@@ -36,6 +37,9 @@ ApplicationManager::ApplicationManager(QObject *parent)
3637 , m_sideStage(0)
3738 , m_rightMargin(0)
3839{
40+ m_roleNames.insert(RoleSurface, "surface");
41+ m_roleNames.insert(RoleFullscreen, "fullscreen");
42+
3943 buildListOfAvailableApplications();
4044}
4145
@@ -69,6 +73,10 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
6973 return app->focused();
7074 case RoleScreenshot:
7175 return app->screenshot();
76+ case RoleSurface:
77+ return QVariant::fromValue(app->surface());
78+ case RoleFullscreen:
79+ return app->fullscreen();
7280 default:
7381 return QVariant();
7482 }
@@ -89,6 +97,17 @@ ApplicationInfo *ApplicationManager::findApplication(const QString &appId) const
8997 return nullptr;
9098}
9199
100+QModelIndex ApplicationManager::findIndex(ApplicationInfo* application)
101+{
102+ for (int i = 0; i < m_runningApplications.size(); ++i) {
103+ if (m_runningApplications.at(i) == application) {
104+ return index(i);
105+ }
106+ }
107+
108+ return QModelIndex();
109+}
110+
92111void ApplicationManager::add(ApplicationInfo *application) {
93112 if (!application) {
94113 return;
@@ -100,6 +119,12 @@ void ApplicationManager::add(ApplicationInfo *application) {
100119 Q_EMIT applicationAdded(application->appId());
101120 Q_EMIT countChanged();
102121 Q_EMIT focusRequested(application->appId());
122+
123+ connect(application, &ApplicationInfo::surfaceChanged, this, [application, this]() {
124+ QModelIndex appIndex = findIndex(application);
125+ if (!appIndex.isValid()) return;
126+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
127+ });
103128}
104129
105130void ApplicationManager::remove(ApplicationInfo *application) {
@@ -111,6 +136,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
111136 Q_EMIT applicationRemoved(application->appId());
112137 Q_EMIT countChanged();
113138 }
139+ disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
114140}
115141
116142void ApplicationManager::move(int from, int to) {
@@ -180,6 +206,7 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
180206 application->setStage(ApplicationInfo::MainStage);
181207 }
182208 add(application);
209+ application->setState(ApplicationInfo::Running);
183210
184211 return application;
185212}
@@ -193,6 +220,7 @@ bool ApplicationManager::stopApplication(const QString &appId)
193220 if (application->appId() == focusedApplicationId()) {
194221 unfocusCurrentApplication();
195222 }
223+ application->setState(ApplicationInfo::Stopped);
196224 remove(application);
197225 return true;
198226}
@@ -213,7 +241,6 @@ bool ApplicationManager::updateScreenshot(const QString &appId)
213241 return false;
214242 }
215243
216− application->setScreenshot(QString("image://application/%1/%2").arg(appId).arg(QDateTime::currentMSecsSinceEpoch()));
217244 QModelIndex appIndex = index(idx);
218245 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
219246 return true;
@@ -352,6 +379,9 @@ void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
352379 "}").arg(qmlDirectory())
353380 .arg(application->icon().toString());
354381 application->setImageQml(imageQml);
382+
383+ application->setScreenshot(QString("file://%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory())
384+ .arg(application->icon().toString()));
355385}
356386
357387void ApplicationManager::buildListOfAvailableApplications()
@@ -363,7 +393,6 @@ void ApplicationManager::buildListOfAvailableApplications()
363393 application->setName("Dialer");
364394 application->setIcon(QUrl("dialer"));
365395 application->setStage(ApplicationInfo::SideStage);
366− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
367396 generateQmlStrings(application);
368397 m_availableApplications.append(application);
369398
@@ -372,7 +401,6 @@ void ApplicationManager::buildListOfAvailableApplications()
372401 application->setName("Camera");
373402 application->setIcon(QUrl("camera"));
374403 application->setFullscreen(true);
375− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
376404 generateQmlStrings(application);
377405 m_availableApplications.append(application);
378406
@@ -380,7 +408,6 @@ void ApplicationManager::buildListOfAvailableApplications()
380408 application->setAppId("gallery-app");
381409 application->setName("Gallery");
382410 application->setIcon(QUrl("gallery"));
383− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
384411 generateQmlStrings(application);
385412 m_availableApplications.append(application);
386413
@@ -389,7 +416,6 @@ void ApplicationManager::buildListOfAvailableApplications()
389416 application->setName("Facebook");
390417 application->setIcon(QUrl("facebook"));
391418 application->setStage(ApplicationInfo::SideStage);
392− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
393419 generateQmlStrings(application);
394420 m_availableApplications.append(application);
395421
@@ -398,7 +424,6 @@ void ApplicationManager::buildListOfAvailableApplications()
398424 application->setFullscreen(true);
399425 application->setName("Browser");
400426 application->setIcon(QUrl("browser"));
401− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
402427 generateQmlStrings(application);
403428 m_availableApplications.append(application);
404429
@@ -407,7 +432,6 @@ void ApplicationManager::buildListOfAvailableApplications()
407432 application->setName("Twitter");
408433 application->setIcon(QUrl("twitter"));
409434 application->setStage(ApplicationInfo::SideStage);
410− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
411435 generateQmlStrings(application);
412436 m_availableApplications.append(application);
413437
@@ -415,7 +439,6 @@ void ApplicationManager::buildListOfAvailableApplications()
415439 application->setAppId("gmail-webapp");
416440 application->setName("GMail");
417441 application->setIcon(QUrl("gmail"));
418− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
419442 m_availableApplications.append(application);
420443
421444 application = new ApplicationInfo(this);
@@ -423,7 +446,6 @@ void ApplicationManager::buildListOfAvailableApplications()
423446 application->setName("Weather");
424447 application->setIcon(QUrl("weather"));
425448 application->setStage(ApplicationInfo::SideStage);
426− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
427449 generateQmlStrings(application);
428450 m_availableApplications.append(application);
429451
@@ -432,7 +454,6 @@ void ApplicationManager::buildListOfAvailableApplications()
432454 application->setName("Notepad");
433455 application->setIcon(QUrl("notepad"));
434456 application->setStage(ApplicationInfo::SideStage);
435− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
436457 m_availableApplications.append(application);
437458
438459 application = new ApplicationInfo(this);
@@ -440,7 +461,6 @@ void ApplicationManager::buildListOfAvailableApplications()
440461 application->setName("Calendar");
441462 application->setIcon(QUrl("calendar"));
442463 application->setStage(ApplicationInfo::SideStage);
443− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
444464 m_availableApplications.append(application);
445465
446466 application = new ApplicationInfo(this);
@@ -448,21 +468,18 @@ void ApplicationManager::buildListOfAvailableApplications()
448468 application->setName("Media Player");
449469 application->setIcon(QUrl("mediaplayer-app"));
450470 application->setFullscreen(true);
451− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
452471 m_availableApplications.append(application);
453472
454473 application = new ApplicationInfo(this);
455474 application->setAppId("evernote");
456475 application->setName("Evernote");
457476 application->setIcon(QUrl("evernote"));
458− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
459477 m_availableApplications.append(application);
460478
461479 application = new ApplicationInfo(this);
462480 application->setAppId("map");
463481 application->setName("Map");
464482 application->setIcon(QUrl("map"));
465− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
466483 generateQmlStrings(application);
467484 m_availableApplications.append(application);
468485
@@ -470,28 +487,24 @@ void ApplicationManager::buildListOfAvailableApplications()
470487 application->setAppId("pinterest");
471488 application->setName("Pinterest");
472489 application->setIcon(QUrl("pinterest"));
473− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
474490 m_availableApplications.append(application);
475491
476492 application = new ApplicationInfo(this);
477493 application->setAppId("soundcloud");
478494 application->setName("SoundCloud");
479495 application->setIcon(QUrl("soundcloud"));
480− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
481496 m_availableApplications.append(application);
482497
483498 application = new ApplicationInfo(this);
484499 application->setAppId("wikipedia");
485500 application->setName("Wikipedia");
486501 application->setIcon(QUrl("wikipedia"));
487− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
488502 m_availableApplications.append(application);
489503
490504 application = new ApplicationInfo(this);
491505 application->setAppId("youtube");
492506 application->setName("YouTube");
493507 application->setIcon(QUrl("youtube"));
494− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
495508 m_availableApplications.append(application);
496509}
497510