@@ -54,14 +54,32 @@ ApplicationManager::ApplicationManager(QObject *parent)
5454
5555 buildListOfAvailableApplications();
5656
57− startApplication("unity8-dash");
58− focusApplication("unity8-dash");
57+ // polling to find out when the toplevel window has been created as there's
58+ // no signal telling us that
59+ connect(&m_windowCreatedTimer, &QTimer::timeout,
60+ this, &ApplicationManager::onWindowCreatedTimerTimeout);
61+ m_windowCreatedTimer.setSingleShot(false);
62+ m_windowCreatedTimer.start(200);
5963}
6064
6165ApplicationManager::~ApplicationManager()
6266{
6367}
6468
69+void ApplicationManager::onWindowCreatedTimerTimeout()
70+{
71+ if (QGuiApplication::topLevelWindows().count() > 0) {
72+ m_windowCreatedTimer.stop();
73+ onWindowCreated();
74+ }
75+}
76+
77+void ApplicationManager::onWindowCreated()
78+{
79+ startApplication("unity8-dash");
80+ focusApplication("unity8-dash");
81+}
82+
6583int ApplicationManager::rowCount(const QModelIndex& parent) const {
6684 return !parent.isValid() ? m_runningApplications.size() : 0;
6785}
@@ -140,6 +158,16 @@ void ApplicationManager::add(ApplicationInfo *application) {
140158 if (!appIndex.isValid()) return;
141159 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
142160 });
161+ connect(application, &ApplicationInfo::focusedChanged, this, [application, this]() {
162+ QModelIndex appIndex = findIndex(application);
163+ if (!appIndex.isValid()) return;
164+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleFocused);
165+ });
166+ connect(application, &ApplicationInfo::stateChanged, this, [application, this]() {
167+ QModelIndex appIndex = findIndex(application);
168+ if (!appIndex.isValid()) return;
169+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleState);
170+ });
143171}
144172
145173void ApplicationManager::remove(ApplicationInfo *application) {
@@ -152,7 +180,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
152180 Q_EMIT countChanged();
153181 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
154182 }
155− disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
183+ disconnect(application, 0, this, 0);
156184}
157185
158186void ApplicationManager::move(int from, int to) {
@@ -290,32 +318,18 @@ bool ApplicationManager::focusApplication(const QString &appId)
290318 if (application == nullptr)
291319 return false;
292320
293− if (application->stage() == ApplicationInfo::MainStage) {
294− // unfocus currently focused mainstage app
295− for (ApplicationInfo *app : m_runningApplications) {
296− if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
297− app->setFocused(false);
298− app->setState(ApplicationInfo::Suspended);
299− }
300− }
301−
302− // focus this app
303− application->setFocused(true);
304− application->setState(ApplicationInfo::Running);
305− } else if (application->stage() == ApplicationInfo::SideStage) {
306− // unfocus currently focused sidestage app
307− for (ApplicationInfo *app : m_runningApplications) {
308− if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
309− app->setFocused(false);
310− app->setState(ApplicationInfo::Suspended);
311− }
321+ // unfocus currently focused app
322+ for (ApplicationInfo *app : m_runningApplications) {
323+ if (app->focused()) {
324+ app->setFocused(false);
325+ app->setState(ApplicationInfo::Suspended);
312326 }
313−
314− // focus this app
315− application->setFocused(true);
316− application->setState(ApplicationInfo::Running);
317327 }
318328
329+ // focus this app
330+ application->setFocused(true);
331+ application->setState(ApplicationInfo::Running);
332+
319333 // move app to top of stack
320334 move(m_runningApplications.indexOf(application), 0);
321335 Q_EMIT focusedApplicationIdChanged();
@@ -338,12 +352,6 @@ void ApplicationManager::unfocusCurrentApplication()
338352 Q_EMIT focusedApplicationIdChanged();
339353}
340354
341−void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
342−{
343− application->setScreenshot(QString("file://%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory())
344− .arg(application->icon().toString()));
345−}
346−
347355void ApplicationManager::buildListOfAvailableApplications()
348356{
349357 ApplicationInfo *application;
@@ -351,128 +359,119 @@ void ApplicationManager::buildListOfAvailableApplications()
351359 application = new ApplicationInfo(this);
352360 application->setAppId("unity8-dash");
353361 application->setName("Unity 8 Mock Dash");
354− application->setIcon(QUrl("unity8-dash"));
362+ application->setScreenshotId("unity8-dash");
355363 application->setStage(ApplicationInfo::MainStage);
356− generateQmlStrings(application);
357364 m_availableApplications.append(application);
358365
359366 application = new ApplicationInfo(this);
360367 application->setAppId("dialer-app");
361368 application->setName("Dialer");
362− application->setIcon(QUrl("dialer"));
369+ application->setScreenshotId("dialer");
370+ application->setIconId("dialer-app");
363371 application->setStage(ApplicationInfo::SideStage);
364− generateQmlStrings(application);
365372 m_availableApplications.append(application);
366373
367374 application = new ApplicationInfo(this);
368375 application->setAppId("camera-app");
369376 application->setName("Camera");
370− application->setIcon(QUrl("camera"));
377+ application->setScreenshotId("camera");
378+ application->setIconId("camera");
371379 application->setFullscreen(true);
372− generateQmlStrings(application);
373380 m_availableApplications.append(application);
374381
375382 application = new ApplicationInfo(this);
376383 application->setAppId("gallery-app");
377384 application->setName("Gallery");
378− application->setIcon(QUrl("gallery"));
379− generateQmlStrings(application);
385+ application->setScreenshotId("gallery");
386+ application->setIconId("gallery");
380387 m_availableApplications.append(application);
381388
382389 application = new ApplicationInfo(this);
383390 application->setAppId("facebook-webapp");
384391 application->setName("Facebook");
385− application->setIcon(QUrl("facebook"));
392+ application->setScreenshotId("facebook");
393+ application->setIconId("facebook");
386394 application->setStage(ApplicationInfo::SideStage);
387− generateQmlStrings(application);
388395 m_availableApplications.append(application);
389396
390397 application = new ApplicationInfo(this);
391398 application->setAppId("webbrowser-app");
392399 application->setFullscreen(true);
393400 application->setName("Browser");
394− application->setIcon(QUrl("browser"));
395− generateQmlStrings(application);
401+ application->setScreenshotId("browser");
402+ application->setIconId("browser");
396403 m_availableApplications.append(application);
397404
398405 application = new ApplicationInfo(this);
399406 application->setAppId("twitter-webapp");
400407 application->setName("Twitter");
401− application->setIcon(QUrl("twitter"));
408+ application->setScreenshotId("twitter");
409+ application->setIconId("twitter");
402410 application->setStage(ApplicationInfo::SideStage);
403− generateQmlStrings(application);
411+ m_availableApplications.append(application);
412+
413+ application = new ApplicationInfo(this);
414+ application->setAppId("map");
415+ application->setName("Map");
416+ application->setIconId("map");
417+ application->setScreenshotId("map");
404418 m_availableApplications.append(application);
405419
406420 application = new ApplicationInfo(this);
407421 application->setAppId("gmail-webapp");
408422 application->setName("GMail");
409− application->setIcon(QUrl("gmail"));
423+ application->setIconId("gmail");
410424 m_availableApplications.append(application);
411425
412426 application = new ApplicationInfo(this);
413427 application->setAppId("ubuntu-weather-app");
414428 application->setName("Weather");
415− application->setIcon(QUrl("weather"));
429+ application->setIconId("weather");
416430 application->setStage(ApplicationInfo::SideStage);
417− generateQmlStrings(application);
418431 m_availableApplications.append(application);
419432
420433 application = new ApplicationInfo(this);
421434 application->setAppId("notes-app");
422435 application->setName("Notepad");
423− application->setIcon(QUrl("notepad"));
436+ application->setIconId("notepad");
424437 application->setStage(ApplicationInfo::SideStage);
425438 m_availableApplications.append(application);
426439
427440 application = new ApplicationInfo(this);
428441 application->setAppId("calendar-app");
429442 application->setName("Calendar");
430− application->setIcon(QUrl("calendar"));
443+ application->setIconId("calendar");
431444 application->setStage(ApplicationInfo::SideStage);
432445 m_availableApplications.append(application);
433446
434− application = new ApplicationInfo(this);
435− application->setAppId("mediaplayer-app");
436− application->setName("Media Player");
437− application->setIcon(QUrl("mediaplayer-app"));
438− application->setFullscreen(true);
439− m_availableApplications.append(application);
440−
441447 application = new ApplicationInfo(this);
442448 application->setAppId("evernote");
443449 application->setName("Evernote");
444− application->setIcon(QUrl("evernote"));
445− m_availableApplications.append(application);
446−
447− application = new ApplicationInfo(this);
448− application->setAppId("map");
449− application->setName("Map");
450− application->setIcon(QUrl("map"));
451− generateQmlStrings(application);
450+ application->setIconId("evernote");
452451 m_availableApplications.append(application);
453452
454453 application = new ApplicationInfo(this);
455454 application->setAppId("pinterest");
456455 application->setName("Pinterest");
457− application->setIcon(QUrl("pinterest"));
456+ application->setIconId("pinterest");
458457 m_availableApplications.append(application);
459458
460459 application = new ApplicationInfo(this);
461460 application->setAppId("soundcloud");
462461 application->setName("SoundCloud");
463− application->setIcon(QUrl("soundcloud"));
462+ application->setIconId("soundcloud");
464463 m_availableApplications.append(application);
465464
466465 application = new ApplicationInfo(this);
467466 application->setAppId("wikipedia");
468467 application->setName("Wikipedia");
469− application->setIcon(QUrl("wikipedia"));
468+ application->setIconId("wikipedia");
470469 m_availableApplications.append(application);
471470
472471 application = new ApplicationInfo(this);
473472 application->setAppId("youtube");
474473 application->setName("YouTube");
475− application->setIcon(QUrl("youtube"));
474+ application->setIconId("youtube");
476475 m_availableApplications.append(application);
477476}
478477