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