@@ -49,14 +49,32 @@ ApplicationManager::ApplicationManager(QObject *parent)
4949
5050 buildListOfAvailableApplications();
5151
52− startApplication("unity8-dash");
53− focusApplication("unity8-dash");
52+ // polling to find out when the toplevel window has been created as there's
53+ // no signal telling us that
54+ connect(&m_windowCreatedTimer, &QTimer::timeout,
55+ this, &ApplicationManager::onWindowCreatedTimerTimeout);
56+ m_windowCreatedTimer.setSingleShot(false);
57+ m_windowCreatedTimer.start(200);
5458}
5559
5660ApplicationManager::~ApplicationManager()
5761{
5862}
5963
64+void ApplicationManager::onWindowCreatedTimerTimeout()
65+{
66+ if (QGuiApplication::topLevelWindows().count() > 0) {
67+ m_windowCreatedTimer.stop();
68+ onWindowCreated();
69+ }
70+}
71+
72+void ApplicationManager::onWindowCreated()
73+{
74+ startApplication("unity8-dash");
75+ focusApplication("unity8-dash");
76+}
77+
6078int ApplicationManager::rowCount(const QModelIndex& parent) const {
6179 return !parent.isValid() ? m_runningApplications.size() : 0;
6280}
@@ -81,8 +99,6 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
8199 return app->state();
82100 case RoleFocused:
83101 return app->focused();
84− case RoleScreenshot:
85− return app->screenshot();
86102 case RoleSession:
87103 return QVariant::fromValue(app->session());
88104 case RoleFullscreen:
@@ -135,6 +151,16 @@ void ApplicationManager::add(ApplicationInfo *application) {
135151 if (!appIndex.isValid()) return;
136152 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSession);
137153 });
154+ connect(application, &ApplicationInfo::focusedChanged, this, [application, this]() {
155+ QModelIndex appIndex = findIndex(application);
156+ if (!appIndex.isValid()) return;
157+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleFocused);
158+ });
159+ connect(application, &ApplicationInfo::stateChanged, this, [application, this]() {
160+ QModelIndex appIndex = findIndex(application);
161+ if (!appIndex.isValid()) return;
162+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleState);
163+ });
138164}
139165
140166void ApplicationManager::remove(ApplicationInfo *application) {
@@ -147,7 +173,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
147173 Q_EMIT countChanged();
148174 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
149175 }
150− disconnect(application, &ApplicationInfo::sessionChanged, this, 0);
176+ application->disconnect(this);
151177}
152178
153179void ApplicationManager::move(int from, int to) {
@@ -190,6 +216,21 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
190216 const QStringList &arguments)
191217{
192218 Q_UNUSED(arguments)
219+ ApplicationInfo *application = add(appId);
220+ if (!application)
221+ return 0;
222+
223+ if (flags.testFlag(ApplicationManager::ForceMainStage)
224+ && application->stage() == ApplicationInfo::SideStage) {
225+ application->setStage(ApplicationInfo::MainStage);
226+ }
227+ application->setState(ApplicationInfo::Running);
228+
229+ return application;
230+}
231+
232+ApplicationInfo* ApplicationManager::add(QString appId)
233+{
193234 ApplicationInfo *application = 0;
194235
195236 for (ApplicationInfo *availableApp : m_availableApplications) {
@@ -199,15 +240,8 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
199240 }
200241 }
201242
202− if (!application)
203− return 0;
204−
205− if (flags.testFlag(ApplicationManager::ForceMainStage)
206− && application->stage() == ApplicationInfo::SideStage) {
207− application->setStage(ApplicationInfo::MainStage);
208− }
209− add(application);
210− application->setState(ApplicationInfo::Running);
243+ if (application)
244+ add(application);
211245
212246 return application;
213247}
@@ -230,27 +264,6 @@ bool ApplicationManager::stopApplication(const QString &appId)
230264 return true;
231265}
232266
233−bool ApplicationManager::updateScreenshot(const QString &appId)
234−{
235− int idx = -1;
236− ApplicationInfo *application = nullptr;
237− for (int i = 0; i < m_availableApplications.count(); ++i) {
238− application = m_availableApplications.at(i);
239− if (application->appId() == appId) {
240− idx = i;
241− break;
242− }
243− }
244−
245− if (idx == -1) {
246− return false;
247− }
248−
249− QModelIndex appIndex = index(idx);
250− Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
251− return true;
252−}
253−
254267QString ApplicationManager::focusedApplicationId() const {
255268 for (ApplicationInfo *app : m_runningApplications) {
256269 if (app->focused()) {
@@ -285,32 +298,18 @@ bool ApplicationManager::focusApplication(const QString &appId)
285298 if (application == nullptr)
286299 return false;
287300
288− if (application->stage() == ApplicationInfo::MainStage) {
289− // unfocus currently focused mainstage app
290− for (ApplicationInfo *app : m_runningApplications) {
291− if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
292− app->setFocused(false);
293− app->setState(ApplicationInfo::Suspended);
294− }
295− }
296−
297− // focus this app
298− application->setFocused(true);
299− application->setState(ApplicationInfo::Running);
300− } else if (application->stage() == ApplicationInfo::SideStage) {
301− // unfocus currently focused sidestage app
302− for (ApplicationInfo *app : m_runningApplications) {
303− if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
304− app->setFocused(false);
305− app->setState(ApplicationInfo::Suspended);
306− }
301+ // unfocus currently focused app
302+ for (ApplicationInfo *app : m_runningApplications) {
303+ if (app->focused()) {
304+ app->setFocused(false);
305+ app->setState(ApplicationInfo::Suspended);
307306 }
308−
309− // focus this app
310− application->setFocused(true);
311− application->setState(ApplicationInfo::Running);
312307 }
313308
309+ // focus this app
310+ application->setFocused(true);
311+ application->setState(ApplicationInfo::Running);
312+
314313 // move app to top of stack
315314 move(m_runningApplications.indexOf(application), 0);
316315 Q_EMIT focusedApplicationIdChanged();
@@ -333,126 +332,114 @@ void ApplicationManager::unfocusCurrentApplication()
333332 Q_EMIT focusedApplicationIdChanged();
334333}
335334
336−void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
337−{
338− application->setScreenshot(QString("file://%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory())
339− .arg(application->icon().toString()));
340−}
341−
342335void ApplicationManager::buildListOfAvailableApplications()
343336{
344337 ApplicationInfo *application;
345338
346− application = new ApplicationInfo("unity8-dash", this);
339+ application = new ApplicationInfo(("unity8-dash", this);
347340 application->setName("Unity 8 Mock Dash");
348− application->setIcon(QUrl("unity8-dash"));
341+ application->setScreenshotId("unity8-dash");
349342 application->setStage(ApplicationInfo::MainStage);
350− generateQmlStrings(application);
351343 m_availableApplications.append(application);
352344
353345 application = new ApplicationInfo("dialer-app", this);
354346 application->setName("Dialer");
355− application->setIcon(QUrl("dialer"));
347+ application->setScreenshotId("dialer");
348+ application->setIconId("dialer-app");
356349 application->setStage(ApplicationInfo::SideStage);
357− generateQmlStrings(application);
358350 m_availableApplications.append(application);
359351
360352 application = new ApplicationInfo("camera-app", this);
361353 application->setName("Camera");
362− application->setIcon(QUrl("camera"));
354+ application->setScreenshotId("camera");
355+ application->setIconId("camera");
363356 application->setFullscreen(true);
364− generateQmlStrings(application);
365357 m_availableApplications.append(application);
366358
367359 application = new ApplicationInfo("gallery-app", this);
368360 application->setName("Gallery");
369− application->setIcon(QUrl("gallery"));
370− generateQmlStrings(application);
361+ application->setScreenshotId("gallery");
362+ application->setIconId("gallery");
363+ application->setFullscreen(true);
371364 m_availableApplications.append(application);
372365
373366 application = new ApplicationInfo("facebook-webapp", this);
374367 application->setName("Facebook");
375− application->setIcon(QUrl("facebook"));
368+ application->setScreenshotId("facebook");
369+ application->setIconId("facebook");
376370 application->setStage(ApplicationInfo::SideStage);
377− generateQmlStrings(application);
378371 m_availableApplications.append(application);
379372
380373 application = new ApplicationInfo("webbrowser-app", this);
381374 application->setFullscreen(true);
382375 application->setName("Browser");
383− application->setIcon(QUrl("browser"));
384− generateQmlStrings(application);
376+ application->setScreenshotId("browser");
377+ application->setIconId("browser");
385378 m_availableApplications.append(application);
386379
387380 application = new ApplicationInfo("twitter-webapp", this);
388381 application->setName("Twitter");
389− application->setIcon(QUrl("twitter"));
382+ application->setScreenshotId("twitter");
383+ application->setIconId("twitter");
390384 application->setStage(ApplicationInfo::SideStage);
391− generateQmlStrings(application);
385+ m_availableApplications.append(application);
386+
387+ application = new ApplicationInfo("map", this);
388+ application->setName("Map");
389+ application->setIconId("map");
390+ application->setScreenshotId("map");
392391 m_availableApplications.append(application);
393392
394393 application = new ApplicationInfo("gmail-webapp", this);
395394 application->setName("GMail");
396− application->setIcon(QUrl("gmail"));
395+ application->setIconId("gmail");
397396 m_availableApplications.append(application);
398397
399398 application = new ApplicationInfo("ubuntu-weather-app", this);
400399 application->setName("Weather");
401− application->setIcon(QUrl("weather"));
400+ application->setIconId("weather");
402401 application->setStage(ApplicationInfo::SideStage);
403− generateQmlStrings(application);
404402 m_availableApplications.append(application);
405403
406404 application = new ApplicationInfo("notes-app", this);
407405 application->setName("Notepad");
408− application->setIcon(QUrl("notepad"));
406+ application->setIconId("notepad");
409407 application->setStage(ApplicationInfo::SideStage);
410408 m_availableApplications.append(application);
411409
412410 application = new ApplicationInfo("calendar-app", this);
413411 application->setName("Calendar");
414− application->setIcon(QUrl("calendar"));
412+ application->setIconId("calendar");
415413 application->setStage(ApplicationInfo::SideStage);
416414 m_availableApplications.append(application);
417415
418− application = new ApplicationInfo("mediaplayer-app", this);
419− application->setName("Media Player");
420− application->setIcon(QUrl("mediaplayer-app"));
421− application->setFullscreen(true);
422− m_availableApplications.append(application);
423−
424416 application = new ApplicationInfo("evernote", this);
425417 application->setName("Evernote");
426− application->setIcon(QUrl("evernote"));
427− m_availableApplications.append(application);
428−
429− application = new ApplicationInfo("map", this);
430− application->setName("Map");
431− application->setIcon(QUrl("map"));
432− generateQmlStrings(application);
418+ application->setIconId("evernote");
433419 m_availableApplications.append(application);
434420
435421 application = new ApplicationInfo("pinterest", this);
436422 application->setName("Pinterest");
437− application->setIcon(QUrl("pinterest"));
423+ application->setIconId("pinterest");
438424 m_availableApplications.append(application);
439425
440426 application = new ApplicationInfo("soundcloud", this);
441427 application->setName("SoundCloud");
442− application->setIcon(QUrl("soundcloud"));
428+ application->setIconId("soundcloud");
443429 m_availableApplications.append(application);
444430
445431 application = new ApplicationInfo("wikipedia", this);
446432 application->setName("Wikipedia");
447− application->setIcon(QUrl("wikipedia"));
433+ application->setIconId("wikipedia");
448434 m_availableApplications.append(application);
449435
450436 application = new ApplicationInfo("youtube", this);
451437 application->setName("YouTube");
452− application->setIcon(QUrl("youtube"));
438+ application->setIconId("youtube");
453439 m_availableApplications.append(application);
454440}
455441
442+
456443QStringList ApplicationManager::availableApplications()
457444{
458445 QStringList appIds;