From 86c67a3017eae916deceb22810d5030e99976d0b Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Sat, 8 Apr 2017 02:01:21 +0100 Subject: [PATCH] tablet pages --- .../qml/dialogs/TabletLoginDialog.qml | 7 ++- .../resources/qml/hifi/tablet/TabletRoot.qml | 44 ++++++++++++++++ .../src/TabletScriptingInterface.cpp | 52 +++++++++++++++++++ .../src/TabletScriptingInterface.h | 7 +++ scripts/system/snapshot.js | 10 +++- 5 files changed, 117 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/dialogs/TabletLoginDialog.qml b/interface/resources/qml/dialogs/TabletLoginDialog.qml index 78e5edebb5..89e94c3a57 100644 --- a/interface/resources/qml/dialogs/TabletLoginDialog.qml +++ b/interface/resources/qml/dialogs/TabletLoginDialog.qml @@ -66,7 +66,12 @@ TabletModalWindow { HifiConstants { id: hifi } onCanceled: { - loginDialogRoot.Stack.view.pop() + if (loginDialogRoot.Stack.view) { + loginDialogRoot.Stack.view.pop(); + } else { + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + tablet.returnToPreviousApp(); + } } LoginDialog { diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index f5144e698f..8214c5452c 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -14,6 +14,8 @@ Item { property string subMenu: "" signal showDesktop(); property bool shown: true + property int currentApp: -1; + property alias tabletApps: tabletApps function setOption(value) { option = value; @@ -56,13 +58,47 @@ Item { } function loadSource(url) { + tabletApps.clear(); loader.source = ""; // make sure we load the qml fresh each time. loader.source = url; + //tabletApps.append({appUrl: url, isWebUrl: false, scriptUrl: ""}); + } + + function loadQMLOnTop(url) { + tabletApps.append({"appUrl": url, "isWebUrl": false, "scriptUrl": ""}); + loader.source = ""; + loader.source = tabletApps.get(currentApp).appUrl; + } + + function loadWebOnTop(url, injectJavaScriptUrl) { + tabletApps.append({"appUrl": loader.source, "isWebUrl": true, "scriptUrl": injectJavaScriptUrl, "appWebUrl": url}); + loader.item.url = tabletApps.get(currentApp).appWebUrl; + loader.item.scriptUrl = tabletApps.get(currentApp).scriptUrl; + } + + function returnToPreviousApp() { + loader.source = ""; + tabletApps.remove(currentApp); + var isWebPage = tabletApps.get(currentApp).isWebUrl; + console.log(isWebPage); + if (isWebPage) { + console.log(tabletApps.get(currentApp).appUrl); + loader.source = tabletApps.get(currentApp).appUrl; + console.log(tabletApps.get(currentApp).appWebUrl); + console.log(tabletApps.get(currentApp).scriptUrl); + loader.item.url = tabletApps.get(currentApp).appWebUrl; + loader.item.scriptUrl = tabletApps.get(currentApp).scriptUrl; + } else { + console.log(tabletApps.get(currentApp).appUrl); + loader.source = tabletApps.get(currentApp).appUrl; + } } function loadWebUrl(url, injectedJavaScriptUrl) { loader.item.url = url; loader.item.scriptURL = injectedJavaScriptUrl; + var appUrl = loader.source; + tabletApps.append({"appUrl": "Tablet.qml", "isWebUrl": true, "scriptUrl": injectedJavaScriptUrl, "appWebUrl": url}); } // used to send a message from qml to interface script. @@ -97,6 +133,14 @@ Item { username = newUsername; } + ListModel { + id: tabletApps + onCountChanged: { + currentApp = count; + console.log("[DR] -> the currnet count: " + currentApp); + } + } + Loader { id: loader objectName: "loader" diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index b4d8977b6d..bf207d361a 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -349,6 +349,38 @@ void TabletProxy::gotoMenuScreen(const QString& submenu) { } } +void TabletProxy::loadQMLOnTop(const QVariant& path) { + QObject* root = nullptr; + if (!_toolbarMode && _qmlTabletRoot) { + root = _qmlTabletRoot; + } else if (_toolbarMode && _desktopWindow) { + root = _desktopWindow->asQuickItem(); + } + + if (root) { + QMetaObject::invokeMethod(root, "loadQMLOnTop", Q_ARG(const QVariant&, path)); + QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); + } else { + qCDebug(scriptengine) << "tablet cannot load QML because _qmlTabletRoot is null"; + } +} + +void TabletProxy::returnToPreviousApp() { + QObject* root = nullptr; + if (!_toolbarMode && _qmlTabletRoot) { + root = _qmlTabletRoot; + } else if (_toolbarMode && _desktopWindow) { + root = _desktopWindow->asQuickItem(); + } + + if (root) { + QMetaObject::invokeMethod(root, "returnToPreviousApp"); + QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); + } else { + qCDebug(scriptengine) << "tablet cannot load QML because _qmlTabletRoot is null"; + } +} + void TabletProxy::loadQMLSource(const QVariant& path) { QObject* root = nullptr; @@ -433,6 +465,26 @@ void TabletProxy::gotoWebScreen(const QString& url) { gotoWebScreen(url, ""); } +void TabletProxy::loadWebScreenOnTop(const QVariant& url) { + loadWebScreenOnTop(url, ""); +} + +void TabletProxy::loadWebScreenOnTop(const QVariant& url, const QString& injectJavaScriptUrl) { + QObject* root = nullptr; + if (!_toolbarMode && _qmlTabletRoot) { + root = _qmlTabletRoot; + } else if (_toolbarMode && _desktopWindow) { + root = _desktopWindow->asQuickItem(); + } + + if (root) { + QMetaObject::invokeMethod(root, "loadQMLOnTop", Q_ARG(const QVariant&, QVariant(WEB_VIEW_SOURCE_URL))); + QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); + QMetaObject::invokeMethod(root, "loadWebOnTop", Q_ARG(const QVariant&, QVariant(url)), Q_ARG(const QVariant&, QVariant(injectJavaScriptUrl))); + } + _state = State::Web; +} + void TabletProxy::gotoWebScreen(const QString& url, const QString& injectedJavaScriptUrl) { QObject* root = nullptr; diff --git a/libraries/script-engine/src/TabletScriptingInterface.h b/libraries/script-engine/src/TabletScriptingInterface.h index e9ae60fee1..fc586957cd 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.h +++ b/libraries/script-engine/src/TabletScriptingInterface.h @@ -120,6 +120,13 @@ public: Q_INVOKABLE void pushOntoStack(const QVariant& path); Q_INVOKABLE void popFromStack(); + Q_INVOKABLE void loadQMLOnTop(const QVariant& path); + Q_INVOKABLE void loadWebScreenOnTop(const QVariant& url); + Q_INVOKABLE void loadWebScreenOnTop(const QVariant& url, const QString& injectedJavaScriptUrl); + Q_INVOKABLE void returnToPreviousApp(); + + + /** jsdoc * Check if the tablet has a message dialog open * @function TabletProxy#isMessageDialogOpen diff --git a/scripts/system/snapshot.js b/scripts/system/snapshot.js index 8f393846c0..479545791d 100644 --- a/scripts/system/snapshot.js +++ b/scripts/system/snapshot.js @@ -70,7 +70,7 @@ function onMessage(message) { || (!HMD.active && Settings.getValue("desktopTabletBecomesToolbar"))) { Desktop.show("hifi/dialogs/GeneralPreferencesDialog.qml", "General Preferences"); } else { - tablet.loadQMLSource("TabletGeneralPreferences.qml"); + tablet.loadQMLOnTop("TabletGeneralPreferences.qml"); } break; case 'setOpenFeedFalse': @@ -96,12 +96,18 @@ function onMessage(message) { } else { print('not sharing', submessage.localPath); } + }); if (!outstanding && shouldOpenFeedAfterShare()) { //showFeedWindow(); } if (needsLogin) { // after the possible feed, so that the login is on top - Account.checkAndSignalForAccessToken(); + var isLoggedIn = Account.isLoggedIn(); + + if (!isLoggedIn) { + tablet.loadQMLOnTop("../../dialogs/TabletLoginDialog.qml"); + HMD.openTablet(); + } } } }