@@ -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}
@@ -87,8 +105,6 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
87105 return app->state();
88106 case RoleFocused:
89107 return app->focused();
90− case RoleScreenshot:
91− return app->screenshot();
92108 case RoleSurface:
93109 return QVariant::fromValue(app->surface());
94110 case RoleFullscreen:
@@ -143,6 +159,16 @@ void ApplicationManager::add(ApplicationInfo *application) {
143159 if (!appIndex.isValid()) return;
144160 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
145161 });
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);
166+ });
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);
171+ });
146172}
147173
148174void ApplicationManager::remove(ApplicationInfo *application) {
@@ -155,7 +181,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
155181 Q_EMIT countChanged();
156182 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
157183 }
158− disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
184+ disconnect(application, 0, this, 0);
159185}
160186
161187void ApplicationManager::move(int from, int to) {
@@ -198,6 +224,21 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
198224 const QStringList &arguments)
199225{
200226 Q_UNUSED(arguments)
227+ ApplicationInfo *application = add(appId);
228+ if (!application)
229+ return 0;
230+
231+ if (flags.testFlag(ApplicationManager::ForceMainStage)
232+ && application->stage() == ApplicationInfo::SideStage) {
233+ application->setStage(ApplicationInfo::MainStage);
234+ }
235+ application->setState(ApplicationInfo::Running);
236+
237+ return application;
238+}
239+
240+ApplicationInfo* ApplicationManager::add(QString appId)
241+{
201242 ApplicationInfo *application = 0;
202243
203244 for (ApplicationInfo *availableApp : m_availableApplications) {
@@ -207,15 +248,8 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
207248 }
208249 }
209250
210− if (!application)
211− return 0;
212−
213− if (flags.testFlag(ApplicationManager::ForceMainStage)
214− && application->stage() == ApplicationInfo::SideStage) {
215− application->setStage(ApplicationInfo::MainStage);
216− }
217− add(application);
218− application->setState(ApplicationInfo::Running);
251+ if (application)
252+ add(application);
219253
220254 return application;
221255}
@@ -238,27 +272,6 @@ bool ApplicationManager::stopApplication(const QString &appId)
238272 return true;
239273}
240274
241−bool ApplicationManager::updateScreenshot(const QString &appId)
242−{
243− int idx = -1;
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) {
248− idx = i;
249− break;
250− }
251− }
252−
253− if (idx == -1) {
254− return false;
255− }
256−
257− QModelIndex appIndex = index(idx);
258− Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
259− return true;
260−}
261−
262275QString ApplicationManager::focusedApplicationId() const {
263276 for (ApplicationInfo *app : m_runningApplications) {
264277 if (app->focused()) {
@@ -293,32 +306,18 @@ bool ApplicationManager::focusApplication(const QString &appId)
293306 if (application == nullptr)
294307 return false;
295308
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− }
309+ // unfocus currently focused app
310+ for (ApplicationInfo *app : m_runningApplications) {
311+ if (app->focused()) {
312+ app->setFocused(false);
313+ app->setState(ApplicationInfo::Suspended);
315314 }
316−
317− // focus this app
318− application->setFocused(true);
319− application->setState(ApplicationInfo::Running);
320315 }
321316
317+ // focus this app
318+ application->setFocused(true);
319+ application->setState(ApplicationInfo::Running);
320+
322321 // move app to top of stack
323322 move(m_runningApplications.indexOf(application), 0);
324323 Q_EMIT focusedApplicationIdChanged();
@@ -341,12 +340,6 @@ void ApplicationManager::unfocusCurrentApplication()
341340 Q_EMIT focusedApplicationIdChanged();
342341}
343342
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−
350343void ApplicationManager::buildListOfAvailableApplications()
351344{
352345 ApplicationInfo *application;
@@ -354,128 +347,120 @@ void ApplicationManager::buildListOfAvailableApplications()
354347 application = new ApplicationInfo(this);
355348 application->setAppId("unity8-dash");
356349 application->setName("Unity 8 Mock Dash");
357− application->setIcon(QUrl("unity8-dash"));
350+ application->setScreenshotId("unity8-dash");
358351 application->setStage(ApplicationInfo::MainStage);
359− generateQmlStrings(application);
360352 m_availableApplications.append(application);
361353
362354 application = new ApplicationInfo(this);
363355 application->setAppId("dialer-app");
364356 application->setName("Dialer");
365− application->setIcon(QUrl("dialer"));
357+ application->setScreenshotId("dialer");
358+ application->setIconId("dialer-app");
366359 application->setStage(ApplicationInfo::SideStage);
367− generateQmlStrings(application);
368360 m_availableApplications.append(application);
369361
370362 application = new ApplicationInfo(this);
371363 application->setAppId("camera-app");
372364 application->setName("Camera");
373− application->setIcon(QUrl("camera"));
365+ application->setScreenshotId("camera");
366+ application->setIconId("camera");
374367 application->setFullscreen(true);
375− generateQmlStrings(application);
376368 m_availableApplications.append(application);
377369
378370 application = new ApplicationInfo(this);
379371 application->setAppId("gallery-app");
380372 application->setName("Gallery");
381− application->setIcon(QUrl("gallery"));
382− generateQmlStrings(application);
373+ application->setScreenshotId("gallery");
374+ application->setIconId("gallery");
375+ application->setFullscreen(true);
383376 m_availableApplications.append(application);
384377
385378 application = new ApplicationInfo(this);
386379 application->setAppId("facebook-webapp");
387380 application->setName("Facebook");
388− application->setIcon(QUrl("facebook"));
381+ application->setScreenshotId("facebook");
382+ application->setIconId("facebook");
389383 application->setStage(ApplicationInfo::SideStage);
390− generateQmlStrings(application);
391384 m_availableApplications.append(application);
392385
393386 application = new ApplicationInfo(this);
394387 application->setAppId("webbrowser-app");
395388 application->setFullscreen(true);
396389 application->setName("Browser");
397− application->setIcon(QUrl("browser"));
398− generateQmlStrings(application);
390+ application->setScreenshotId("browser");
391+ application->setIconId("browser");
399392 m_availableApplications.append(application);
400393
401394 application = new ApplicationInfo(this);
402395 application->setAppId("twitter-webapp");
403396 application->setName("Twitter");
404− application->setIcon(QUrl("twitter"));
397+ application->setScreenshotId("twitter");
398+ application->setIconId("twitter");
405399 application->setStage(ApplicationInfo::SideStage);
406− generateQmlStrings(application);
400+ m_availableApplications.append(application);
401+
402+ application = new ApplicationInfo(this);
403+ application->setAppId("map");
404+ application->setName("Map");
405+ application->setIconId("map");
406+ application->setScreenshotId("map");
407407 m_availableApplications.append(application);
408408
409409 application = new ApplicationInfo(this);
410410 application->setAppId("gmail-webapp");
411411 application->setName("GMail");
412− application->setIcon(QUrl("gmail"));
412+ application->setIconId("gmail");
413413 m_availableApplications.append(application);
414414
415415 application = new ApplicationInfo(this);
416416 application->setAppId("ubuntu-weather-app");
417417 application->setName("Weather");
418− application->setIcon(QUrl("weather"));
418+ application->setIconId("weather");
419419 application->setStage(ApplicationInfo::SideStage);
420− generateQmlStrings(application);
421420 m_availableApplications.append(application);
422421
423422 application = new ApplicationInfo(this);
424423 application->setAppId("notes-app");
425424 application->setName("Notepad");
426− application->setIcon(QUrl("notepad"));
425+ application->setIconId("notepad");
427426 application->setStage(ApplicationInfo::SideStage);
428427 m_availableApplications.append(application);
429428
430429 application = new ApplicationInfo(this);
431430 application->setAppId("calendar-app");
432431 application->setName("Calendar");
433− application->setIcon(QUrl("calendar"));
432+ application->setIconId("calendar");
434433 application->setStage(ApplicationInfo::SideStage);
435434 m_availableApplications.append(application);
436435
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−
444436 application = new ApplicationInfo(this);
445437 application->setAppId("evernote");
446438 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);
439+ application->setIconId("evernote");
455440 m_availableApplications.append(application);
456441
457442 application = new ApplicationInfo(this);
458443 application->setAppId("pinterest");
459444 application->setName("Pinterest");
460− application->setIcon(QUrl("pinterest"));
445+ application->setIconId("pinterest");
461446 m_availableApplications.append(application);
462447
463448 application = new ApplicationInfo(this);
464449 application->setAppId("soundcloud");
465450 application->setName("SoundCloud");
466− application->setIcon(QUrl("soundcloud"));
451+ application->setIconId("soundcloud");
467452 m_availableApplications.append(application);
468453
469454 application = new ApplicationInfo(this);
470455 application->setAppId("wikipedia");
471456 application->setName("Wikipedia");
472− application->setIcon(QUrl("wikipedia"));
457+ application->setIconId("wikipedia");
473458 m_availableApplications.append(application);
474459
475460 application = new ApplicationInfo(this);
476461 application->setAppId("youtube");
477462 application->setName("YouTube");
478− application->setIcon(QUrl("youtube"));
463+ application->setIconId("youtube");
479464 m_availableApplications.append(application);
480465}
481466