@@ -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;
@@ -87,8 +105,6 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
87 return app->state();
105 return app->state();
88 case RoleFocused:
106 case RoleFocused:
89 return app->focused();
107 return app->focused();
91− return app->screenshot();
92 case RoleSurface:
108 case RoleSurface:
93 return QVariant::fromValue(app->surface());
109 return QVariant::fromValue(app->surface());
94 case RoleFullscreen:
110 case RoleFullscreen:
@@ -143,6 +159,16 @@ void ApplicationManager::add(ApplicationInfo *application) {
143 if (!appIndex.isValid()) return;
159 if (!appIndex.isValid()) return;
144 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
160 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
162+ connect(application, &ApplicationInfo::focusedChanged, this, [application, this]() {
163+ QModelIndex appIndex = findIndex(application);
164+ if (!appIndex.isValid()) return;
165+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleFocused);
167+ connect(application, &ApplicationInfo::stateChanged, this, [application, this]() {
168+ QModelIndex appIndex = findIndex(application);
169+ if (!appIndex.isValid()) return;
170+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleState);
148void ApplicationManager::remove(ApplicationInfo *application) {
174void ApplicationManager::remove(ApplicationInfo *application) {
@@ -155,7 +181,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
155 Q_EMIT countChanged();
181 Q_EMIT countChanged();
156 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
182 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
158− disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
184+ disconnect(application, 0, this, 0);
161void ApplicationManager::move(int from, int to) {
187void ApplicationManager::move(int from, int to) {
@@ -198,6 +224,21 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
198 const QStringList &arguments)
224 const QStringList &arguments)
200 Q_UNUSED(arguments)
226 Q_UNUSED(arguments)
227+ ApplicationInfo *application = add(appId);
231+ if (flags.testFlag(ApplicationManager::ForceMainStage)
232+ && application->stage() == ApplicationInfo::SideStage) {
233+ application->setStage(ApplicationInfo::MainStage);
235+ application->setState(ApplicationInfo::Running);
240+ApplicationInfo* ApplicationManager::add(QString appId)
201 ApplicationInfo *application = 0;
242 ApplicationInfo *application = 0;
203 for (ApplicationInfo *availableApp : m_availableApplications) {
244 for (ApplicationInfo *availableApp : m_availableApplications) {
@@ -207,15 +248,8 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
210− if (!application)
251+ if (application)
211− return 0;
252+ add(application);
213− if (flags.testFlag(ApplicationManager::ForceMainStage)
214− && application->stage() == ApplicationInfo::SideStage) {
215− application->setStage(ApplicationInfo::MainStage);
218− application->setState(ApplicationInfo::Running);
220 return application;
254 return application;
@@ -238,27 +272,6 @@ bool ApplicationManager::stopApplication(const QString &appId)
238 return true;
272 return true;
241−bool ApplicationManager::updateScreenshot(const QString &appId)
244− ApplicationInfo *application = nullptr;
245− for (int i = 0; i < m_availableApplications.count(); ++i) {
246− application = m_availableApplications.at(i);
247− if (application->appId() == appId) {
257− QModelIndex appIndex = index(idx);
258− Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
262QString ApplicationManager::focusedApplicationId() const {
275QString ApplicationManager::focusedApplicationId() const {
263 for (ApplicationInfo *app : m_runningApplications) {
276 for (ApplicationInfo *app : m_runningApplications) {
264 if (app->focused()) {
277 if (app->focused()) {
@@ -293,32 +306,18 @@ bool ApplicationManager::focusApplication(const QString &appId)
293 if (application == nullptr)
306 if (application == nullptr)
294 return false;
307 return false;
296− if (application->stage() == ApplicationInfo::MainStage) {
309+ // unfocus currently focused app
297− // unfocus currently focused mainstage app
310+ for (ApplicationInfo *app : m_runningApplications) {
298− for (ApplicationInfo *app : m_runningApplications) {
311+ if (app->focused()) {
299− if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
312+ app->setFocused(false);
300− app->setFocused(false);
313+ app->setState(ApplicationInfo::Suspended);
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) {
311− if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
312− app->setFocused(false);
313− app->setState(ApplicationInfo::Suspended);
318− application->setFocused(true);
319− application->setState(ApplicationInfo::Running);
318+ application->setFocused(true);
319+ application->setState(ApplicationInfo::Running);
322 // move app to top of stack
321 // move app to top of stack
323 move(m_runningApplications.indexOf(application), 0);
322 move(m_runningApplications.indexOf(application), 0);
324 Q_EMIT focusedApplicationIdChanged();
323 Q_EMIT focusedApplicationIdChanged();
@@ -341,12 +340,6 @@ void ApplicationManager::unfocusCurrentApplication()
341 Q_EMIT focusedApplicationIdChanged();
340 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()
343void ApplicationManager::buildListOfAvailableApplications()
352 ApplicationInfo *application;
345 ApplicationInfo *application;
@@ -354,128 +347,120 @@ void ApplicationManager::buildListOfAvailableApplications()
354 application = new ApplicationInfo(this);
347 application = new ApplicationInfo(this);
355 application->setAppId("unity8-dash");
348 application->setAppId("unity8-dash");
356 application->setName("Unity 8 Mock Dash");
349 application->setName("Unity 8 Mock Dash");
357− application->setIcon(QUrl("unity8-dash"));
350+ application->setScreenshotId("unity8-dash");
358 application->setStage(ApplicationInfo::MainStage);
351 application->setStage(ApplicationInfo::MainStage);
359− generateQmlStrings(application);
360 m_availableApplications.append(application);
352 m_availableApplications.append(application);
362 application = new ApplicationInfo(this);
354 application = new ApplicationInfo(this);
363 application->setAppId("dialer-app");
355 application->setAppId("dialer-app");
364 application->setName("Dialer");
356 application->setName("Dialer");
365− application->setIcon(QUrl("dialer"));
357+ application->setScreenshotId("dialer");
358+ application->setIconId("dialer-app");
366 application->setStage(ApplicationInfo::SideStage);
359 application->setStage(ApplicationInfo::SideStage);
367− generateQmlStrings(application);
368 m_availableApplications.append(application);
360 m_availableApplications.append(application);
370 application = new ApplicationInfo(this);
362 application = new ApplicationInfo(this);
371 application->setAppId("camera-app");
363 application->setAppId("camera-app");
372 application->setName("Camera");
364 application->setName("Camera");
373− application->setIcon(QUrl("camera"));
365+ application->setScreenshotId("camera");
366+ application->setIconId("camera");
374 application->setFullscreen(true);
367 application->setFullscreen(true);
375− generateQmlStrings(application);
376 m_availableApplications.append(application);
368 m_availableApplications.append(application);
378 application = new ApplicationInfo(this);
370 application = new ApplicationInfo(this);
379 application->setAppId("gallery-app");
371 application->setAppId("gallery-app");
380 application->setName("Gallery");
372 application->setName("Gallery");
381− application->setIcon(QUrl("gallery"));
373+ application->setScreenshotId("gallery");
382− generateQmlStrings(application);
374+ application->setIconId("gallery");
375+ application->setFullscreen(true);
383 m_availableApplications.append(application);
376 m_availableApplications.append(application);
385 application = new ApplicationInfo(this);
378 application = new ApplicationInfo(this);
386 application->setAppId("facebook-webapp");
379 application->setAppId("facebook-webapp");
387 application->setName("Facebook");
380 application->setName("Facebook");
388− application->setIcon(QUrl("facebook"));
381+ application->setScreenshotId("facebook");
382+ application->setIconId("facebook");
389 application->setStage(ApplicationInfo::SideStage);
383 application->setStage(ApplicationInfo::SideStage);
390− generateQmlStrings(application);
391 m_availableApplications.append(application);
384 m_availableApplications.append(application);
393 application = new ApplicationInfo(this);
386 application = new ApplicationInfo(this);
394 application->setAppId("webbrowser-app");
387 application->setAppId("webbrowser-app");
395 application->setFullscreen(true);
388 application->setFullscreen(true);
396 application->setName("Browser");
389 application->setName("Browser");
397− application->setIcon(QUrl("browser"));
390+ application->setScreenshotId("browser");
398− generateQmlStrings(application);
391+ application->setIconId("browser");
399 m_availableApplications.append(application);
392 m_availableApplications.append(application);
401 application = new ApplicationInfo(this);
394 application = new ApplicationInfo(this);
402 application->setAppId("twitter-webapp");
395 application->setAppId("twitter-webapp");
403 application->setName("Twitter");
396 application->setName("Twitter");
404− application->setIcon(QUrl("twitter"));
397+ application->setScreenshotId("twitter");
398+ application->setIconId("twitter");
405 application->setStage(ApplicationInfo::SideStage);
399 application->setStage(ApplicationInfo::SideStage);
406− generateQmlStrings(application);
400+ m_availableApplications.append(application);
402+ application = new ApplicationInfo(this);
403+ application->setAppId("map");
404+ application->setName("Map");
405+ application->setIconId("map");
406+ application->setScreenshotId("map");
407 m_availableApplications.append(application);
407 m_availableApplications.append(application);
409 application = new ApplicationInfo(this);
409 application = new ApplicationInfo(this);
410 application->setAppId("gmail-webapp");
410 application->setAppId("gmail-webapp");
411 application->setName("GMail");
411 application->setName("GMail");
412− application->setIcon(QUrl("gmail"));
412+ application->setIconId("gmail");
413 m_availableApplications.append(application);
413 m_availableApplications.append(application);
415 application = new ApplicationInfo(this);
415 application = new ApplicationInfo(this);
416 application->setAppId("ubuntu-weather-app");
416 application->setAppId("ubuntu-weather-app");
417 application->setName("Weather");
417 application->setName("Weather");
418− application->setIcon(QUrl("weather"));
418+ application->setIconId("weather");
419 application->setStage(ApplicationInfo::SideStage);
419 application->setStage(ApplicationInfo::SideStage);
420− generateQmlStrings(application);
421 m_availableApplications.append(application);
420 m_availableApplications.append(application);
423 application = new ApplicationInfo(this);
422 application = new ApplicationInfo(this);
424 application->setAppId("notes-app");
423 application->setAppId("notes-app");
425 application->setName("Notepad");
424 application->setName("Notepad");
426− application->setIcon(QUrl("notepad"));
425+ application->setIconId("notepad");
427 application->setStage(ApplicationInfo::SideStage);
426 application->setStage(ApplicationInfo::SideStage);
428 m_availableApplications.append(application);
427 m_availableApplications.append(application);
430 application = new ApplicationInfo(this);
429 application = new ApplicationInfo(this);
431 application->setAppId("calendar-app");
430 application->setAppId("calendar-app");
432 application->setName("Calendar");
431 application->setName("Calendar");
433− application->setIcon(QUrl("calendar"));
432+ application->setIconId("calendar");
434 application->setStage(ApplicationInfo::SideStage);
433 application->setStage(ApplicationInfo::SideStage);
435 m_availableApplications.append(application);
434 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);
436 application = new ApplicationInfo(this);
445 application->setAppId("evernote");
437 application->setAppId("evernote");
446 application->setName("Evernote");
438 application->setName("Evernote");
447− application->setIcon(QUrl("evernote"));
439+ 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);
440 m_availableApplications.append(application);
457 application = new ApplicationInfo(this);
442 application = new ApplicationInfo(this);
458 application->setAppId("pinterest");
443 application->setAppId("pinterest");
459 application->setName("Pinterest");
444 application->setName("Pinterest");
460− application->setIcon(QUrl("pinterest"));
445+ application->setIconId("pinterest");
461 m_availableApplications.append(application);
446 m_availableApplications.append(application);
463 application = new ApplicationInfo(this);
448 application = new ApplicationInfo(this);
464 application->setAppId("soundcloud");
449 application->setAppId("soundcloud");
465 application->setName("SoundCloud");
450 application->setName("SoundCloud");
466− application->setIcon(QUrl("soundcloud"));
451+ application->setIconId("soundcloud");
467 m_availableApplications.append(application);
452 m_availableApplications.append(application);
469 application = new ApplicationInfo(this);
454 application = new ApplicationInfo(this);
470 application->setAppId("wikipedia");
455 application->setAppId("wikipedia");
471 application->setName("Wikipedia");
456 application->setName("Wikipedia");
472− application->setIcon(QUrl("wikipedia"));
457+ application->setIconId("wikipedia");
473 m_availableApplications.append(application);
458 m_availableApplications.append(application);
475 application = new ApplicationInfo(this);
460 application = new ApplicationInfo(this);
476 application->setAppId("youtube");
461 application->setAppId("youtube");
477 application->setName("YouTube");
462 application->setName("YouTube");
478− application->setIcon(QUrl("youtube"));
463+ application->setIconId("youtube");
479 m_availableApplications.append(application);
464 m_availableApplications.append(application);