History

Tablet buttons now work in toolbar.

Switching between tablet and toolbar is not as dynamic as I'd like but it's a start.

Anthony J. Thibault committed 9 years ago

Commit 912e8aa1 parent 45039238 files · +211 −47Browse files

Showing the changes to libraries/script-engine/src/TabletScriptingInterface.cpp (1 of 8 files). Show all

Unified · Split

libraries/script-engine/src/TabletScriptingInterface.cpp+89−24
@@ -15,7 +15,8 @@ · 14 unmodified lines
1515 #include <RegisteredMetaTypes.h>
1616 #include "ScriptEngineLogging.h"
1717 #include "DependencyManager.h"
18−#include "OffscreenUi.h"
18+#include <OffscreenUi.h>
19+#include <InfoView.h>
1920 #include "SoundEffect.h"
2021
2122 TabletScriptingInterface::TabletScriptingInterface() {
@@ -156,9 +157,10 @@ QObject* TabletScriptingInterface::getFlags() · 134 unmodified lines
156157 static const char* TABLET_SOURCE_URL = "Tablet.qml";
157158 static const char* WEB_VIEW_SOURCE_URL = "TabletWebView.qml";
158159 static const char* VRMENU_SOURCE_URL = "TabletMenu.qml";
160+static int s_windowNameCounter = 1;
159161
160162 TabletProxy::TabletProxy(QString name) : _name(name) {
161− ;
163+
162164 }
163165
164166 void TabletProxy::setToolbarMode(bool toolbarMode) {
@@ -171,9 +173,27 @@ void TabletProxy::setToolbarMode(bool toolbarMode) { · 6 unmodified lines
171173 if (toolbarMode) {
172174 removeButtonsFromHomeScreen();
173175 addButtonsToToolbar();
176+
177+ // create new desktop window
178+ auto offscreenUi = DependencyManager::get<OffscreenUi>();
179+ offscreenUi->executeOnUiThread([=, this] {
180+ InfoView::registerType();
181+ QString name = _name + QString("%1").arg(s_windowNameCounter++);
182+ offscreenUi->show(QUrl("hifi/tablet/WindowRoot.qml"), name, [&](QQmlContext* context, QObject* newObject) {
183+ QQuickItem* item = dynamic_cast<QQuickItem*>(newObject);
184+ _desktopWindow = item;
185+ QObject::connect(_desktopWindow, SIGNAL(windowClosed), this, SLOT(desktopWindowClosed()));
186+ });
187+ });
174188 } else {
175189 removeButtonsFromToolbar();
176190 addButtonsToHomeScreen();
191+
192+ // destroy desktop window
193+ if (_desktopWindow) {
194+ _desktopWindow->deleteLater();
195+ _desktopWindow = nullptr;
196+ }
177197 }
178198 }
179199
@@ -246,39 +266,63 @@ void TabletProxy::setQmlTabletRoot(QQuickItem* qmlTabletRoot, QObject* qmlOffscr · 66 unmodified lines
246266 }
247267
248268 void TabletProxy::gotoMenuScreen(const QString& submenu) {
249− if (_qmlTabletRoot) {
269+
270+ QObject* root = nullptr;
271+ if (!_toolbarMode && _qmlTabletRoot) {
272+ root = _qmlTabletRoot;
273+ } else if (_toolbarMode && _desktopWindow) {
274+ root = _desktopWindow;
275+ }
276+
277+ if (root) {
250278 if (_state != State::Menu) {
251279 removeButtonsFromHomeScreen();
252− QMetaObject::invokeMethod(_qmlTabletRoot, "setOption", Q_ARG(const QVariant&, QVariant(submenu)));
253− auto loader = _qmlTabletRoot->findChild<QQuickItem*>("loader");
280+ QMetaObject::invokeMethod(root, "setOption", Q_ARG(const QVariant&, QVariant(submenu)));
281+ auto loader = root->findChild<QQuickItem*>("loader");
254282 QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToMenuScreen()), Qt::DirectConnection);
255− QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL)));
283+ QMetaObject::invokeMethod(root, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL)));
256284 _state = State::Menu;
257285 emit screenChanged(QVariant("Menu"), QVariant(VRMENU_SOURCE_URL));
286+ QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true)));
258287 }
259288 }
260289 }
261290
262291 void TabletProxy::loadQMLSource(const QVariant& path) {
263− if (_qmlTabletRoot) {
292+
293+ QObject* root = nullptr;
294+ if (!_toolbarMode && _qmlTabletRoot) {
295+ root = _qmlTabletRoot;
296+ } else if (_toolbarMode && _desktopWindow) {
297+ root = _desktopWindow;
298+ }
299+
300+ if (root) {
264301 if (_state != State::QML) {
265302 removeButtonsFromHomeScreen();
266− QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, path));
303+ QMetaObject::invokeMethod(root, "loadSource", Q_ARG(const QVariant&, path));
267304 _state = State::QML;
268305 emit screenChanged(QVariant("QML"), path);
306+ QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true)));
269307 }
270308 }
271309 }
310+
272311 void TabletProxy::gotoHomeScreen() {
273− if (_qmlTabletRoot) {
274− if (_state != State::Home) {
312+ if (_state != State::Home) {
313+ if (!_toolbarMode && _qmlTabletRoot) {
275314 auto loader = _qmlTabletRoot->findChild<QQuickItem*>("loader");
276315 QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen()), Qt::DirectConnection);
277316 QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(TABLET_SOURCE_URL)));
278317 QMetaObject::invokeMethod(_qmlTabletRoot, "playButtonClickSound");
279− _state = State::Home;
280− emit screenChanged(QVariant("Home"), QVariant(TABLET_SOURCE_URL));
318+ } else if (_toolbarMode && _desktopWindow) {
319+ // close desktop window
320+ if (_desktopWindow) {
321+ QMetaObject::invokeMethod(_desktopWindow, "setShown", Q_ARG(const QVariant&, QVariant(false)));
322+ }
281323 }
324+ _state = State::Home;
325+ emit screenChanged(QVariant("Home"), QVariant(TABLET_SOURCE_URL));
282326 }
283327 }
284328
@@ -287,17 +331,24 @@ void TabletProxy::gotoWebScreen(const QString& url) { · 2 unmodified lines
287331 }
288332
289333 void TabletProxy::gotoWebScreen(const QString& url, const QString& injectedJavaScriptUrl) {
290− if (_qmlTabletRoot) {
291− if (_state == State::Home) {
292− removeButtonsFromHomeScreen();
293− }
294− if (_state != State::Web) {
295− QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(WEB_VIEW_SOURCE_URL)));
296− _state = State::Web;
297− emit screenChanged(QVariant("Web"), QVariant(url));
334+
335+ QObject* root = nullptr;
336+ if (!_toolbarMode && _qmlTabletRoot) {
337+ root = _qmlTabletRoot;
338+ } else if (_toolbarMode && _desktopWindow) {
339+ root = _desktopWindow;
340+ }
341+
342+ if (_state != State::Web) {
343+ if (root) {
344+ QMetaObject::invokeMethod(root, "loadSource", Q_ARG(const QVariant&, QVariant(WEB_VIEW_SOURCE_URL)));
298345 }
299− QMetaObject::invokeMethod(_qmlTabletRoot, "loadWebUrl", Q_ARG(const QVariant&, QVariant(url)),
300− Q_ARG(const QVariant&, QVariant(injectedJavaScriptUrl)));
346+ _state = State::Web;
347+ emit screenChanged(QVariant("Web"), QVariant(url));
348+ }
349+ if (root) {
350+ QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true)));
351+ QMetaObject::invokeMethod(root, "loadWebUrl", Q_ARG(const QVariant&, QVariant(url)), Q_ARG(const QVariant&, QVariant(injectedJavaScriptUrl)));
301352 }
302353 }
303354
@@ -391,11 +442,18 @@ QObject* TabletProxy::getTabletSurface() { · 87 unmodified lines
391442 }
392443
393444 void TabletProxy::addButtonsToMenuScreen() {
394− if (!_qmlTabletRoot) {
445+ QObject* root = nullptr;
446+ if (!_toolbarMode && _qmlTabletRoot) {
447+ root = _qmlTabletRoot;
448+ } else if (_toolbarMode && _desktopWindow) {
449+ root = _desktopWindow;
450+ }
451+
452+ if (!root) {
395453 return;
396454 }
397455
398− auto loader = _qmlTabletRoot->findChild<QQuickItem*>("loader");
456+ auto loader = root->findChild<QQuickItem*>("loader");
399457 if (!loader) {
400458 return;
401459 }
@@ -420,6 +478,10 @@ void TabletProxy::removeButtonsFromHomeScreen() { · 18 unmodified lines
420478 }
421479 }
422480
481+void TabletProxy::desktopWindowClosed() {
482+ gotoHomeScreen();
483+}
484+
423485 void TabletProxy::addButtonsToToolbar() {
424486 auto tabletScriptingInterface = DependencyManager::get<TabletScriptingInterface>();
425487 QObject* toolbarProxy = tabletScriptingInterface->getSystemToolbarProxy();
@@ -515,6 +577,9 @@ void TabletButtonProxy::setQmlButton(QQuickItem* qmlButton) { · 89 unmodified lines
515577 void TabletButtonProxy::setToolbarButtonProxy(QObject* toolbarButtonProxy) {
516578 std::lock_guard<std::mutex> guard(_mutex);
517579 _toolbarButtonProxy = toolbarButtonProxy;
580+ if (_toolbarButtonProxy) {
581+ QObject::connect(_toolbarButtonProxy, SIGNAL(clicked()), this, SLOT(clickedSlot()));
582+ }
518583 }
519584
520585 QVariantMap TabletButtonProxy::getProperties() const {