@@ -55,14 +55,32 @@ ApplicationManager::ApplicationManager(QObject *parent)
56 buildListOfAvailableApplications();
56 buildListOfAvailableApplications();
58− startApplication("unity8-dash");
58+ // polling to find out when the toplevel window has been created as there's
59− focusApplication("unity8-dash");
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);
62ApplicationManager::~ApplicationManager()
66ApplicationManager::~ApplicationManager()
70+void ApplicationManager::onWindowCreatedTimerTimeout()
72+ if (QGuiApplication::topLevelWindows().count() > 0) {
73+ m_windowCreatedTimer.stop();
78+void ApplicationManager::onWindowCreated()
80+ startApplication("unity8-dash");
81+ focusApplication("unity8-dash");
66int ApplicationManager::rowCount(const QModelIndex& parent) const {
84int ApplicationManager::rowCount(const QModelIndex& parent) const {
67 return !parent.isValid() ? m_runningApplications.size() : 0;
85 return !parent.isValid() ? m_runningApplications.size() : 0;
@@ -143,6 +161,16 @@ void ApplicationManager::add(ApplicationInfo *application) {
143 if (!appIndex.isValid()) return;
161 if (!appIndex.isValid()) return;
144 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
162 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
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);
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);
148void ApplicationManager::remove(ApplicationInfo *application) {
176void ApplicationManager::remove(ApplicationInfo *application) {
@@ -155,7 +183,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
155 Q_EMIT countChanged();
183 Q_EMIT countChanged();
156 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
184 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
158− disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
186+ disconnect(application, 0, this, 0);
161void ApplicationManager::move(int from, int to) {
189void ApplicationManager::move(int from, int to) {
@@ -293,32 +321,18 @@ bool ApplicationManager::focusApplication(const QString &appId)
293 if (application == nullptr)
321 if (application == nullptr)
294 return false;
322 return false;
296− if (application->stage() == ApplicationInfo::MainStage) {
297− // unfocus currently focused mainstage app
324+ // unfocus currently focused app
298− for (ApplicationInfo *app : m_runningApplications) {
299− if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
300− app->setFocused(false);
301− app->setState(ApplicationInfo::Suspended);
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) {
325+ for (ApplicationInfo *app : m_runningApplications) {
311− if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
326+ if (app->focused()) {
312− app->setFocused(false);
327+ app->setFocused(false);
313− app->setState(ApplicationInfo::Suspended);
328+ app->setState(ApplicationInfo::Suspended);
318− application->setFocused(true);
319− application->setState(ApplicationInfo::Running);
333+ application->setFocused(true);
334+ application->setState(ApplicationInfo::Running);
322 // move app to top of stack
336 // move app to top of stack
323 move(m_runningApplications.indexOf(application), 0);
337 move(m_runningApplications.indexOf(application), 0);
324 Q_EMIT focusedApplicationIdChanged();
338 Q_EMIT focusedApplicationIdChanged();
@@ -341,12 +355,6 @@ void ApplicationManager::unfocusCurrentApplication()
341 Q_EMIT focusedApplicationIdChanged();
355 Q_EMIT focusedApplicationIdChanged();
344−void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
346− application->setScreenshot(QString("file://%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory())
347− .arg(application->icon().toString()));
350void ApplicationManager::buildListOfAvailableApplications()
358void ApplicationManager::buildListOfAvailableApplications()
352 ApplicationInfo *application;
360 ApplicationInfo *application;
@@ -354,128 +362,119 @@ void ApplicationManager::buildListOfAvailableApplications()
354 application = new ApplicationInfo(this);
362 application = new ApplicationInfo(this);
355 application->setAppId("unity8-dash");
363 application->setAppId("unity8-dash");
356 application->setName("Unity 8 Mock Dash");
364 application->setName("Unity 8 Mock Dash");
357− application->setIcon(QUrl("unity8-dash"));
365+ application->setScreenshotId("unity8-dash");
358 application->setStage(ApplicationInfo::MainStage);
366 application->setStage(ApplicationInfo::MainStage);
359− generateQmlStrings(application);
360 m_availableApplications.append(application);
367 m_availableApplications.append(application);
362 application = new ApplicationInfo(this);
369 application = new ApplicationInfo(this);
363 application->setAppId("dialer-app");
370 application->setAppId("dialer-app");
364 application->setName("Dialer");
371 application->setName("Dialer");
365− application->setIcon(QUrl("dialer"));
372+ application->setScreenshotId("dialer");
373+ application->setIconId("dialer-app");
366 application->setStage(ApplicationInfo::SideStage);
374 application->setStage(ApplicationInfo::SideStage);
367− generateQmlStrings(application);
368 m_availableApplications.append(application);
375 m_availableApplications.append(application);
370 application = new ApplicationInfo(this);
377 application = new ApplicationInfo(this);
371 application->setAppId("camera-app");
378 application->setAppId("camera-app");
372 application->setName("Camera");
379 application->setName("Camera");
373− application->setIcon(QUrl("camera"));
380+ application->setScreenshotId("camera");
381+ application->setIconId("camera");
374 application->setFullscreen(true);
382 application->setFullscreen(true);
375− generateQmlStrings(application);
376 m_availableApplications.append(application);
383 m_availableApplications.append(application);
378 application = new ApplicationInfo(this);
385 application = new ApplicationInfo(this);
379 application->setAppId("gallery-app");
386 application->setAppId("gallery-app");
380 application->setName("Gallery");
387 application->setName("Gallery");
381− application->setIcon(QUrl("gallery"));
388+ application->setScreenshotId("gallery");
382− generateQmlStrings(application);
389+ application->setIconId("gallery");
383 m_availableApplications.append(application);
390 m_availableApplications.append(application);
385 application = new ApplicationInfo(this);
392 application = new ApplicationInfo(this);
386 application->setAppId("facebook-webapp");
393 application->setAppId("facebook-webapp");
387 application->setName("Facebook");
394 application->setName("Facebook");
388− application->setIcon(QUrl("facebook"));
395+ application->setScreenshotId("facebook");
396+ application->setIconId("facebook");
389 application->setStage(ApplicationInfo::SideStage);
397 application->setStage(ApplicationInfo::SideStage);
390− generateQmlStrings(application);
391 m_availableApplications.append(application);
398 m_availableApplications.append(application);
393 application = new ApplicationInfo(this);
400 application = new ApplicationInfo(this);
394 application->setAppId("webbrowser-app");
401 application->setAppId("webbrowser-app");
395 application->setFullscreen(true);
402 application->setFullscreen(true);
396 application->setName("Browser");
403 application->setName("Browser");
397− application->setIcon(QUrl("browser"));
404+ application->setScreenshotId("browser");
398− generateQmlStrings(application);
405+ application->setIconId("browser");
399 m_availableApplications.append(application);
406 m_availableApplications.append(application);
401 application = new ApplicationInfo(this);
408 application = new ApplicationInfo(this);
402 application->setAppId("twitter-webapp");
409 application->setAppId("twitter-webapp");
403 application->setName("Twitter");
410 application->setName("Twitter");
404− application->setIcon(QUrl("twitter"));
411+ application->setScreenshotId("twitter");
412+ application->setIconId("twitter");
405 application->setStage(ApplicationInfo::SideStage);
413 application->setStage(ApplicationInfo::SideStage);
414+ m_availableApplications.append(application);
416+ application = new ApplicationInfo(this);
417+ application->setAppId("map");
418+ application->setName("Map");
406− generateQmlStrings(application);
419+ application->setIconId("map");
420+ application->setScreenshotId("map");
407 m_availableApplications.append(application);
421 m_availableApplications.append(application);
409 application = new ApplicationInfo(this);
423 application = new ApplicationInfo(this);
410 application->setAppId("gmail-webapp");
424 application->setAppId("gmail-webapp");
411 application->setName("GMail");
425 application->setName("GMail");
412− application->setIcon(QUrl("gmail"));
426+ application->setIconId("gmail");
413 m_availableApplications.append(application);
427 m_availableApplications.append(application);
415 application = new ApplicationInfo(this);
429 application = new ApplicationInfo(this);
416 application->setAppId("ubuntu-weather-app");
430 application->setAppId("ubuntu-weather-app");
417 application->setName("Weather");
431 application->setName("Weather");
418− application->setIcon(QUrl("weather"));
432+ application->setIconId("weather");
419 application->setStage(ApplicationInfo::SideStage);
433 application->setStage(ApplicationInfo::SideStage);
420− generateQmlStrings(application);
421 m_availableApplications.append(application);
434 m_availableApplications.append(application);
423 application = new ApplicationInfo(this);
436 application = new ApplicationInfo(this);
424 application->setAppId("notes-app");
437 application->setAppId("notes-app");
425 application->setName("Notepad");
438 application->setName("Notepad");
426− application->setIcon(QUrl("notepad"));
439+ application->setIconId("notepad");
427 application->setStage(ApplicationInfo::SideStage);
440 application->setStage(ApplicationInfo::SideStage);
428 m_availableApplications.append(application);
441 m_availableApplications.append(application);
430 application = new ApplicationInfo(this);
443 application = new ApplicationInfo(this);
431 application->setAppId("calendar-app");
444 application->setAppId("calendar-app");
432 application->setName("Calendar");
445 application->setName("Calendar");
433− application->setIcon(QUrl("calendar"));
446+ application->setIconId("calendar");
434 application->setStage(ApplicationInfo::SideStage);
447 application->setStage(ApplicationInfo::SideStage);
435 m_availableApplications.append(application);
448 m_availableApplications.append(application);
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);
444 application = new ApplicationInfo(this);
450 application = new ApplicationInfo(this);
445 application->setAppId("evernote");
451 application->setAppId("evernote");
446 application->setName("Evernote");
452 application->setName("Evernote");
447− application->setIcon(QUrl("evernote"));
453+ application->setIconId("evernote");
448− m_availableApplications.append(application);
450− application = new ApplicationInfo(this);
451− application->setAppId("map");
452− application->setName("Map");
453− application->setIcon(QUrl("map"));
454− generateQmlStrings(application);
455 m_availableApplications.append(application);
454 m_availableApplications.append(application);
457 application = new ApplicationInfo(this);
456 application = new ApplicationInfo(this);
458 application->setAppId("pinterest");
457 application->setAppId("pinterest");
459 application->setName("Pinterest");
458 application->setName("Pinterest");
460− application->setIcon(QUrl("pinterest"));
459+ application->setIconId("pinterest");
461 m_availableApplications.append(application);
460 m_availableApplications.append(application);
463 application = new ApplicationInfo(this);
462 application = new ApplicationInfo(this);
464 application->setAppId("soundcloud");
463 application->setAppId("soundcloud");
465 application->setName("SoundCloud");
464 application->setName("SoundCloud");
466− application->setIcon(QUrl("soundcloud"));
465+ application->setIconId("soundcloud");
467 m_availableApplications.append(application);
466 m_availableApplications.append(application);
469 application = new ApplicationInfo(this);
468 application = new ApplicationInfo(this);
470 application->setAppId("wikipedia");
469 application->setAppId("wikipedia");
471 application->setName("Wikipedia");
470 application->setName("Wikipedia");
472− application->setIcon(QUrl("wikipedia"));
471+ application->setIconId("wikipedia");
473 m_availableApplications.append(application);
472 m_availableApplications.append(application);
475 application = new ApplicationInfo(this);
474 application = new ApplicationInfo(this);
476 application->setAppId("youtube");
475 application->setAppId("youtube");
477 application->setName("YouTube");
476 application->setName("YouTube");
478− application->setIcon(QUrl("youtube"));
477+ application->setIconId("youtube");
479 m_availableApplications.append(application);
478 m_availableApplications.append(application);