@@ -55,14 +55,32 @@ ApplicationManager::ApplicationManager(QObject *parent)
5555
5656 buildListOfAvailableApplications();
5757
58− startApplication("unity8-dash");
59− focusApplication("unity8-dash");
58+ // polling to find out when the toplevel window has been created as there's
59+ // no signal telling us that
60+ connect(&m_windowCreatedTimer, &QTimer::timeout,
61+ this, &ApplicationManager::onWindowCreatedTimerTimeout);
62+ m_windowCreatedTimer.setSingleShot(false);
63+ m_windowCreatedTimer.start(200);
6064}
6165
6266ApplicationManager::~ApplicationManager()
6367{
6468}
6569
70+void ApplicationManager::onWindowCreatedTimerTimeout()
71+{
72+ if (QGuiApplication::topLevelWindows().count() > 0) {
73+ m_windowCreatedTimer.stop();
74+ onWindowCreated();
75+ }
76+}
77+
78+void ApplicationManager::onWindowCreated()
79+{
80+ startApplication("unity8-dash");
81+ focusApplication("unity8-dash");
82+}
83+
6684int ApplicationManager::rowCount(const QModelIndex& parent) const {
6785 return !parent.isValid() ? m_runningApplications.size() : 0;
6886}
@@ -143,6 +161,16 @@ void ApplicationManager::add(ApplicationInfo *application) {
143161 if (!appIndex.isValid()) return;
144162 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
145163 });
164+ connect(application, &ApplicationInfo::focusedChanged, this, [application, this]() {
165+ QModelIndex appIndex = findIndex(application);
166+ if (!appIndex.isValid()) return;
167+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleFocused);
168+ });
169+ connect(application, &ApplicationInfo::stateChanged, this, [application, this]() {
170+ QModelIndex appIndex = findIndex(application);
171+ if (!appIndex.isValid()) return;
172+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleState);
173+ });
146174}
147175
148176void ApplicationManager::remove(ApplicationInfo *application) {
@@ -155,7 +183,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
155183 Q_EMIT countChanged();
156184 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
157185 }
158− disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
186+ disconnect(application, 0, this, 0);
159187}
160188
161189void ApplicationManager::move(int from, int to) {
@@ -293,32 +321,18 @@ bool ApplicationManager::focusApplication(const QString &appId)
293321 if (application == nullptr)
294322 return false;
295323
296− if (application->stage() == ApplicationInfo::MainStage) {
297− // unfocus currently focused mainstage app
298− for (ApplicationInfo *app : m_runningApplications) {
299− if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
300− app->setFocused(false);
301− app->setState(ApplicationInfo::Suspended);
302− }
303− }
304−
305− // focus this app
306− application->setFocused(true);
307− application->setState(ApplicationInfo::Running);
308− } else if (application->stage() == ApplicationInfo::SideStage) {
309− // unfocus currently focused sidestage app
310− for (ApplicationInfo *app : m_runningApplications) {
311− if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
312− app->setFocused(false);
313− app->setState(ApplicationInfo::Suspended);
314− }
324+ // unfocus currently focused app
325+ for (ApplicationInfo *app : m_runningApplications) {
326+ if (app->focused()) {
327+ app->setFocused(false);
328+ app->setState(ApplicationInfo::Suspended);
315329 }
316−
317− // focus this app
318− application->setFocused(true);
319− application->setState(ApplicationInfo::Running);
320330 }
321331
332+ // focus this app
333+ application->setFocused(true);
334+ application->setState(ApplicationInfo::Running);
335+
322336 // move app to top of stack
323337 move(m_runningApplications.indexOf(application), 0);
324338 Q_EMIT focusedApplicationIdChanged();
@@ -341,12 +355,6 @@ void ApplicationManager::unfocusCurrentApplication()
341355 Q_EMIT focusedApplicationIdChanged();
342356}
343357
344−void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
345−{
346− application->setScreenshot(QString("file://%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory())
347− .arg(application->icon().toString()));
348−}
349−
350358void ApplicationManager::buildListOfAvailableApplications()
351359{
352360 ApplicationInfo *application;
@@ -354,128 +362,119 @@ void ApplicationManager::buildListOfAvailableApplications()
354362 application = new ApplicationInfo(this);
355363 application->setAppId("unity8-dash");
356364 application->setName("Unity 8 Mock Dash");
357− application->setIcon(QUrl("unity8-dash"));
365+ application->setScreenshotId("unity8-dash");
358366 application->setStage(ApplicationInfo::MainStage);
359− generateQmlStrings(application);
360367 m_availableApplications.append(application);
361368
362369 application = new ApplicationInfo(this);
363370 application->setAppId("dialer-app");
364371 application->setName("Dialer");
365− application->setIcon(QUrl("dialer"));
372+ application->setScreenshotId("dialer");
373+ application->setIconId("dialer-app");
366374 application->setStage(ApplicationInfo::SideStage);
367− generateQmlStrings(application);
368375 m_availableApplications.append(application);
369376
370377 application = new ApplicationInfo(this);
371378 application->setAppId("camera-app");
372379 application->setName("Camera");
373− application->setIcon(QUrl("camera"));
380+ application->setScreenshotId("camera");
381+ application->setIconId("camera");
374382 application->setFullscreen(true);
375− generateQmlStrings(application);
376383 m_availableApplications.append(application);
377384
378385 application = new ApplicationInfo(this);
379386 application->setAppId("gallery-app");
380387 application->setName("Gallery");
381− application->setIcon(QUrl("gallery"));
382− generateQmlStrings(application);
388+ application->setScreenshotId("gallery");
389+ application->setIconId("gallery");
383390 m_availableApplications.append(application);
384391
385392 application = new ApplicationInfo(this);
386393 application->setAppId("facebook-webapp");
387394 application->setName("Facebook");
388− application->setIcon(QUrl("facebook"));
395+ application->setScreenshotId("facebook");
396+ application->setIconId("facebook");
389397 application->setStage(ApplicationInfo::SideStage);
390− generateQmlStrings(application);
391398 m_availableApplications.append(application);
392399
393400 application = new ApplicationInfo(this);
394401 application->setAppId("webbrowser-app");
395402 application->setFullscreen(true);
396403 application->setName("Browser");
397− application->setIcon(QUrl("browser"));
398− generateQmlStrings(application);
404+ application->setScreenshotId("browser");
405+ application->setIconId("browser");
399406 m_availableApplications.append(application);
400407
401408 application = new ApplicationInfo(this);
402409 application->setAppId("twitter-webapp");
403410 application->setName("Twitter");
404− application->setIcon(QUrl("twitter"));
411+ application->setScreenshotId("twitter");
412+ application->setIconId("twitter");
405413 application->setStage(ApplicationInfo::SideStage);
406− generateQmlStrings(application);
414+ m_availableApplications.append(application);
415+
416+ application = new ApplicationInfo(this);
417+ application->setAppId("map");
418+ application->setName("Map");
419+ application->setIconId("map");
420+ application->setScreenshotId("map");
407421 m_availableApplications.append(application);
408422
409423 application = new ApplicationInfo(this);
410424 application->setAppId("gmail-webapp");
411425 application->setName("GMail");
412− application->setIcon(QUrl("gmail"));
426+ application->setIconId("gmail");
413427 m_availableApplications.append(application);
414428
415429 application = new ApplicationInfo(this);
416430 application->setAppId("ubuntu-weather-app");
417431 application->setName("Weather");
418− application->setIcon(QUrl("weather"));
432+ application->setIconId("weather");
419433 application->setStage(ApplicationInfo::SideStage);
420− generateQmlStrings(application);
421434 m_availableApplications.append(application);
422435
423436 application = new ApplicationInfo(this);
424437 application->setAppId("notes-app");
425438 application->setName("Notepad");
426− application->setIcon(QUrl("notepad"));
439+ application->setIconId("notepad");
427440 application->setStage(ApplicationInfo::SideStage);
428441 m_availableApplications.append(application);
429442
430443 application = new ApplicationInfo(this);
431444 application->setAppId("calendar-app");
432445 application->setName("Calendar");
433− application->setIcon(QUrl("calendar"));
446+ application->setIconId("calendar");
434447 application->setStage(ApplicationInfo::SideStage);
435448 m_availableApplications.append(application);
436449
437− application = new ApplicationInfo(this);
438− application->setAppId("mediaplayer-app");
439− application->setName("Media Player");
440− application->setIcon(QUrl("mediaplayer-app"));
441− application->setFullscreen(true);
442− m_availableApplications.append(application);
443−
444450 application = new ApplicationInfo(this);
445451 application->setAppId("evernote");
446452 application->setName("Evernote");
447− application->setIcon(QUrl("evernote"));
448− m_availableApplications.append(application);
449−
450− application = new ApplicationInfo(this);
451− application->setAppId("map");
452− application->setName("Map");
453− application->setIcon(QUrl("map"));
454− generateQmlStrings(application);
453+ application->setIconId("evernote");
455454 m_availableApplications.append(application);
456455
457456 application = new ApplicationInfo(this);
458457 application->setAppId("pinterest");
459458 application->setName("Pinterest");
460− application->setIcon(QUrl("pinterest"));
459+ application->setIconId("pinterest");
461460 m_availableApplications.append(application);
462461
463462 application = new ApplicationInfo(this);
464463 application->setAppId("soundcloud");
465464 application->setName("SoundCloud");
466− application->setIcon(QUrl("soundcloud"));
465+ application->setIconId("soundcloud");
467466 m_availableApplications.append(application);
468467
469468 application = new ApplicationInfo(this);
470469 application->setAppId("wikipedia");
471470 application->setName("Wikipedia");
472− application->setIcon(QUrl("wikipedia"));
471+ application->setIconId("wikipedia");
473472 m_availableApplications.append(application);
474473
475474 application = new ApplicationInfo(this);
476475 application->setAppId("youtube");
477476 application->setName("YouTube");
478− application->setIcon(QUrl("youtube"));
477+ application->setIconId("youtube");
479478 m_availableApplications.append(application);
480479}
481480