From 865a78a8c8ca995efa11956c4f52be538cdf09b8 Mon Sep 17 00:00:00 2001 From: dante ruiz Date: Sun, 15 Jan 2017 20:41:32 -0800 Subject: [PATCH 1/7] saving work --- .../qml/hifi/tablet/TabletMouseHandler.qml | 4 ++-- interface/src/Application.cpp | 14 +++++++++----- interface/src/ui/overlays/Web3DOverlay.cpp | 2 ++ .../src/TabletScriptingInterface.cpp | 18 ++++++++++++++++++ .../src/TabletScriptingInterface.h | 7 +++++++ 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml index 57d4c5837f..13d8cec505 100644 --- a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml +++ b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml @@ -90,7 +90,7 @@ Item { } else { breadcrumbText.text = "Menu"; topMenu = null; - //offscreenFlags.navigationFocused = false; + offscreenFlags.navigationFocused = false; menuRoot.enabled = false; } } @@ -99,7 +99,7 @@ Item { menuStack.push(newMenu); topMenu = newMenu; topMenu.focus = true; - //offscreenFlags.navigationFocused = true; + offscreenFlags.navigationFocused = true; } function clearMenus() { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 45cea3f6c5..af9d27b08b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -977,7 +977,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(userInputMapper.data(), &UserInputMapper::actionEvent, [this](int action, float state) { using namespace controller; auto offscreenUi = DependencyManager::get(); + auto tabletScriptingInterface = DependencyManager::get(); if (offscreenUi->navigationFocused()) { + qDebug() << "NavigationFocused"; auto actionEnum = static_cast(action); int key = Qt::Key_unknown; static int lastKey = Qt::Key_unknown; @@ -1021,25 +1023,27 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo break; } - if (navAxis) { + auto window = tabletScriptingInterface->getTabletWindow(); + if (navAxis && window) { + qDebug() << "Sending input to qml"; if (lastKey != Qt::Key_unknown) { QKeyEvent event(QEvent::KeyRelease, lastKey, Qt::NoModifier); - sendEvent(offscreenUi->getWindow(), &event); + sendEvent(window, &event); lastKey = Qt::Key_unknown; } if (key != Qt::Key_unknown) { QKeyEvent event(QEvent::KeyPress, key, Qt::NoModifier); - sendEvent(offscreenUi->getWindow(), &event); + sendEvent(window, &event); lastKey = key; } } else if (key != Qt::Key_unknown) { if (state) { QKeyEvent event(QEvent::KeyPress, key, Qt::NoModifier); - sendEvent(offscreenUi->getWindow(), &event); + sendEvent(window, &event); } else { QKeyEvent event(QEvent::KeyRelease, key, Qt::NoModifier); - sendEvent(offscreenUi->getWindow(), &event); + sendEvent(window, &event); } return; } diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 652d1c6d6d..f052081cc6 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -151,6 +151,8 @@ void Web3DOverlay::loadSourceURL() { if (_webSurface->getRootItem() && _webSurface->getRootItem()->objectName() == "tabletRoot") { auto tabletScriptingInterface = DependencyManager::get(); + auto flags = tabletScriptingInterface->getFlags(); + _webSurface->getRootContext()->setContextProperty("offscreenFlags", flags); tabletScriptingInterface->setQmlTabletRoot("com.highfidelity.interface.tablet.system", _webSurface->getRootItem(), _webSurface.data()); } } diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index 822aa25306..e91bf051df 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -47,6 +47,20 @@ void TabletScriptingInterface::setQmlTabletRoot(QString tabletId, QQuickItem* qm } } +QQuickWindow* TabletScriptingInterface::getTabletWindow() { + TabletProxy* tablet = qobject_cast(getTablet("com.highfidelity.interface.tablet.system")); + QObject* qmlSurface = tablet->getTabletSurface(); + OffscreenQmlSurface* surface = dynamic_cast(qmlSurface); + QQuickWindow* window = surface->getWindow(); + return window; +} + +QObject* TabletScriptingInterface::getFlags() +{ + auto offscreenUi = DependencyManager::get(); + return offscreenUi->getFlags(); +} + // // TabletProxy // @@ -200,6 +214,10 @@ void TabletProxy::addButtonsToHomeScreen() { QObject::disconnect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen())); } +QObject* TabletProxy::getTabletSurface() { + return _qmlOffscreenSurface; +} + void TabletProxy::addButtonsToMenuScreen() { if (!_qmlTabletRoot) { return; diff --git a/libraries/script-engine/src/TabletScriptingInterface.h b/libraries/script-engine/src/TabletScriptingInterface.h index a7894c0afd..c139fd93c3 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.h +++ b/libraries/script-engine/src/TabletScriptingInterface.h @@ -47,6 +47,10 @@ public: void setQmlTabletRoot(QString tabletId, QQuickItem* qmlTabletRoot, QObject* qmlOffscreenSurface); + QQuickWindow* getTabletWindow(); + + QObject* getFlags(); + protected: std::mutex _mutex; std::map> _tabletProxies; @@ -112,6 +116,9 @@ public: */ Q_INVOKABLE void emitScriptEvent(QVariant msg); + + QObject* getTabletSurface(); + signals: /**jsdoc * Signaled when this tablet receives an event from the html/js embedded in the tablet From d3fa7651c94578db4c6d0d6b3427bb67dd945f33 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 16 Jan 2017 22:37:08 +0000 Subject: [PATCH 2/7] some what working d-pad --- .../resources/qml/hifi/tablet/Tablet.qml | 56 +++++++++++++++++-- .../qml/hifi/tablet/TabletButton.qml | 1 + .../resources/qml/hifi/tablet/TabletMenu.qml | 2 +- .../qml/hifi/tablet/TabletMenuView.qml | 2 + .../qml/hifi/tablet/TabletMouseHandler.qml | 5 +- .../resources/qml/hifi/tablet/TabletRoot.qml | 11 ++++ interface/src/Application.cpp | 2 +- .../src/TabletScriptingInterface.cpp | 5 ++ 8 files changed, 76 insertions(+), 8 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/Tablet.qml b/interface/resources/qml/hifi/tablet/Tablet.qml index 63ea386452..c51bb1a598 100644 --- a/interface/resources/qml/hifi/tablet/Tablet.qml +++ b/interface/resources/qml/hifi/tablet/Tablet.qml @@ -1,15 +1,19 @@ import QtQuick 2.0 import QtGraphicalEffects 1.0 -Item { +FocusScope { id: tablet objectName: "tablet" - + focus: true + enabled: true property double micLevel: 0.8 - + property int index: 0 + property int count: flowMain.children.length width: parent.width height: parent.height + //property alias currentItem: flowMain.currentItem + // called by C++ code to keep audio bar updated function setMicLevel(newMicLevel) { tablet.micLevel = newMicLevel; @@ -42,7 +46,6 @@ Item { // pass a reference to the tabletRoot object to the button. button.tabletRoot = parent.parent; - return button; } @@ -179,6 +182,7 @@ Item { clip: true Flow { id: flowMain + focus: true spacing: 16 anchors.right: parent.right anchors.rightMargin: 30 @@ -188,6 +192,50 @@ Item { anchors.bottomMargin: 30 anchors.top: parent.top anchors.topMargin: 30 + + function setCurrentItemState(state) { + flowMain.children[index].state = state; + } + function nextItem() { + setCurrentItemState("base state"); + index = (index + count + 1) % count; + setCurrentItemState("hover state"); + console.log("next item at index: " + index); + } + + function previousItem() { + setCurrentItemState("base state"); + index = (index + count - 1 ) % count; + setCurrentItemState("hover state"); + console.log("previous item at index: " + index); + } + + function upItem() { + setCurrentItemState("base state"); + index = (index + count - 3) % count; + setCurrentItemState("hover state"); + console.log("up item at index: " + index); + } + + function downItem() { + setCurrentItemState("base state"); + index = (index + count + 3) % count; + setCurrentItemState("hover state"); + console.log("down item at index :" + index); + } + + function selectItem() { + flowMain.children[index].clicked(); + if(tabletRoot) { + tabletRoot.playButtonClickSound(); + } + } + + Keys.onRightPressed: nextItem(); + Keys.onLeftPressed: previousItem(); + Keys.onDownPressed: downItem(); + Keys.onUpPressed: upItem(); + Keys.onReturnPressed: selectItem(); } } } diff --git a/interface/resources/qml/hifi/tablet/TabletButton.qml b/interface/resources/qml/hifi/tablet/TabletButton.qml index f9c668a81f..6c2685f155 100644 --- a/interface/resources/qml/hifi/tablet/TabletButton.qml +++ b/interface/resources/qml/hifi/tablet/TabletButton.qml @@ -109,6 +109,7 @@ Item { MouseArea { anchors.fill: parent hoverEnabled: true + enabled: true onClicked: { console.log("Tablet Button Clicked!"); if (tabletButton.inDebugMode) { diff --git a/interface/resources/qml/hifi/tablet/TabletMenu.qml b/interface/resources/qml/hifi/tablet/TabletMenu.qml index 39f48f0334..a782192b4d 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenu.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenu.qml @@ -5,7 +5,7 @@ import QtQml 2.2 import "." import "../../styles-uit" -Item { +FocusScope { id: tabletMenu objectName: "tabletMenu" diff --git a/interface/resources/qml/hifi/tablet/TabletMenuView.qml b/interface/resources/qml/hifi/tablet/TabletMenuView.qml index b02c5b67ec..dedbfc80ab 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenuView.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenuView.qml @@ -111,12 +111,14 @@ FocusScope { function previousItem() { currentIndex = (currentIndex + count - 1) % count; } function nextItem() { currentIndex = (currentIndex + count + 1) % count; } function selectCurrentItem() { if (currentIndex != -1) root.selected(currentItem.source); } + function previousPage() {console.log("going to previous page"); } Keys.onUpPressed: previousItem(); Keys.onDownPressed: nextItem(); Keys.onSpacePressed: selectCurrentItem(); Keys.onRightPressed: selectCurrentItem(); Keys.onReturnPressed: selectCurrentItem(); + Keys.onLeftPressed: previousPage(); } } diff --git a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml index 13d8cec505..1eb5f7cdd1 100644 --- a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml +++ b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml @@ -91,7 +91,7 @@ Item { breadcrumbText.text = "Menu"; topMenu = null; offscreenFlags.navigationFocused = false; - menuRoot.enabled = false; + //menuRoot.enabled = false; } } @@ -100,6 +100,7 @@ Item { topMenu = newMenu; topMenu.focus = true; offscreenFlags.navigationFocused = true; + console.log(offscreenWindow.activeFocusItem); } function clearMenus() { @@ -159,7 +160,7 @@ Item { function popup(parent, items) { d.clearMenus(); - menuRoot.enabled = true; + //menuRoot.enabled = true; d.buildMenu(items, point); } diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index 541119d4f0..66c22e2843 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -5,6 +5,7 @@ Item { id: tabletRoot objectName: "tabletRoot" property var eventBridge; + property bool desktopRoot: true function loadSource(url) { loader.source = url; @@ -24,6 +25,10 @@ Item { buttonClickSound.play(globalPosition); } + function forceFocus() { + loader.item.forceActiveFocus(); + } + Loader { id: loader objectName: "loader" @@ -44,8 +49,14 @@ Item { } }); } + //loader.item.parent = tablxetRoot; + loader.item.forceActiveFocus(); + offscreenFlags.navigationFocus = true; + console.log(loader.item.count); + console.log("Current focus item " + offscreenWindow.activeFocusItem); } } + Component.onDestruction: { offscreenFlags.navigationFocused = false; } width: 480 height: 720 diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index af9d27b08b..2626170bd6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1037,7 +1037,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo sendEvent(window, &event); lastKey = key; } - } else if (key != Qt::Key_unknown) { + } else if (key != Qt::Key_unknown && window) { if (state) { QKeyEvent event(QEvent::KeyPress, key, Qt::NoModifier); sendEvent(window, &event); diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index e91bf051df..f15f7da53e 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -51,6 +51,10 @@ QQuickWindow* TabletScriptingInterface::getTabletWindow() { TabletProxy* tablet = qobject_cast(getTablet("com.highfidelity.interface.tablet.system")); QObject* qmlSurface = tablet->getTabletSurface(); OffscreenQmlSurface* surface = dynamic_cast(qmlSurface); + + if (!surface) { + return nullptr; + } QQuickWindow* window = surface->getWindow(); return window; } @@ -212,6 +216,7 @@ void TabletProxy::addButtonsToHomeScreen() { } auto loader = _qmlTabletRoot->findChild("loader"); QObject::disconnect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen())); + QMetaObject::invokeMethod(_qmlTabletRoot, "forceFocus"); } QObject* TabletProxy::getTabletSurface() { From 9a61b6030b6fb2819bf3c8957b594cc52efaa43a Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 17 Jan 2017 17:27:37 +0000 Subject: [PATCH 3/7] tabletFocus update --- .../resources/qml/hifi/tablet/Tablet.qml | 118 ++++++++++-------- .../resources/qml/hifi/tablet/TabletMenu.qml | 4 + .../qml/hifi/tablet/TabletMenuView.qml | 6 +- .../qml/hifi/tablet/TabletMouseHandler.qml | 3 - .../resources/qml/hifi/tablet/TabletRoot.qml | 6 +- interface/src/Application.cpp | 2 - .../src/TabletScriptingInterface.cpp | 3 +- 7 files changed, 81 insertions(+), 61 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/Tablet.qml b/interface/resources/qml/hifi/tablet/Tablet.qml index c51bb1a598..545ab2fa58 100644 --- a/interface/resources/qml/hifi/tablet/Tablet.qml +++ b/interface/resources/qml/hifi/tablet/Tablet.qml @@ -3,17 +3,15 @@ import QtGraphicalEffects 1.0 FocusScope { id: tablet - objectName: "tablet" focus: true - enabled: true + objectName: "tablet" property double micLevel: 0.8 - property int index: 0 - property int count: flowMain.children.length + property int rowIndex: 0 + property int columnIndex: 0 + property int count: (flowMain.children.length - 1) width: parent.width height: parent.height - //property alias currentItem: flowMain.currentItem - // called by C++ code to keep audio bar updated function setMicLevel(newMicLevel) { tablet.micLevel = newMicLevel; @@ -182,7 +180,6 @@ FocusScope { clip: true Flow { id: flowMain - focus: true spacing: 16 anchors.right: parent.right anchors.rightMargin: 30 @@ -192,50 +189,6 @@ FocusScope { anchors.bottomMargin: 30 anchors.top: parent.top anchors.topMargin: 30 - - function setCurrentItemState(state) { - flowMain.children[index].state = state; - } - function nextItem() { - setCurrentItemState("base state"); - index = (index + count + 1) % count; - setCurrentItemState("hover state"); - console.log("next item at index: " + index); - } - - function previousItem() { - setCurrentItemState("base state"); - index = (index + count - 1 ) % count; - setCurrentItemState("hover state"); - console.log("previous item at index: " + index); - } - - function upItem() { - setCurrentItemState("base state"); - index = (index + count - 3) % count; - setCurrentItemState("hover state"); - console.log("up item at index: " + index); - } - - function downItem() { - setCurrentItemState("base state"); - index = (index + count + 3) % count; - setCurrentItemState("hover state"); - console.log("down item at index :" + index); - } - - function selectItem() { - flowMain.children[index].clicked(); - if(tabletRoot) { - tabletRoot.playButtonClickSound(); - } - } - - Keys.onRightPressed: nextItem(); - Keys.onLeftPressed: previousItem(); - Keys.onDownPressed: downItem(); - Keys.onUpPressed: upItem(); - Keys.onReturnPressed: selectItem(); } } } @@ -260,5 +213,68 @@ FocusScope { } } ] + + function setCurrentItemState(state) { + var index = rowIndex + columnIndex; + + if (index >= 0 && index <= count ) { + flowMain.children[index].state = state; + } + } + function nextItem() { + setCurrentItemState("base state"); + + if((rowIndex + columnIndex) != count) { + columnIndex = (columnIndex + 3 + 1) % 3 + }; + setCurrentItemState("hover state"); + } + + function previousItem() { + setCurrentItemState("base state"); + var prevIndex = (columnIndex + 3 - 1) % 3; + if((rowIndex + prevIndex) <= count){ + columnIndex = prevIndex; + } + setCurrentItemState("hover state"); + } + + function upItem() { + setCurrentItemState("base state"); + rowIndex = rowIndex - 3; + if (rowIndex < 0 ) { + rowIndex = (count - (count % 3)); + var index = rowIndex + columnIndex; + if(index > count) { + rowIndex = rowIndex - 3; + console.log("index: " + (rowIndex +columnIndex)); + } + } + console.log("row index: " + rowIndex); + setCurrentItemState("hover state"); + } + + function downItem() { + setCurrentItemState("base state"); + rowIndex = rowIndex + 3; + var index = rowIndex + columnIndex; + if (index > count ) { + rowIndex = 0; + } + setCurrentItemState("hover state"); + } + + function selectItem() { + flowMain.children[rowIndex + columnIndex].clicked(); + if (tabletRoot) { + tabletRoot.playButtonClickSound(); + } + } + + Keys.onRightPressed: nextItem(); + Keys.onLeftPressed: previousItem(); + Keys.onDownPressed: downItem(); + Keys.onUpPressed: upItem(); + Keys.onReturnPressed: selectItem(); } diff --git a/interface/resources/qml/hifi/tablet/TabletMenu.qml b/interface/resources/qml/hifi/tablet/TabletMenu.qml index a782192b4d..a80ca12d5f 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenu.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenu.qml @@ -87,6 +87,10 @@ FocusScope { } } + function pop() { + menuPopperUpper.closeLastMenu(); + } + function setRootMenu(menu) { tabletMenu.rootMenu = menu buildMenu() diff --git a/interface/resources/qml/hifi/tablet/TabletMenuView.qml b/interface/resources/qml/hifi/tablet/TabletMenuView.qml index dedbfc80ab..da791a8ed2 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenuView.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenuView.qml @@ -13,12 +13,12 @@ import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 import "../../styles-uit" - +import "." FocusScope { id: root implicitHeight: background.height implicitWidth: background.width - + property alias currentItem: listView.currentItem property alias model: listView.model property bool isSubMenu: false @@ -111,7 +111,7 @@ FocusScope { function previousItem() { currentIndex = (currentIndex + count - 1) % count; } function nextItem() { currentIndex = (currentIndex + count + 1) % count; } function selectCurrentItem() { if (currentIndex != -1) root.selected(currentItem.source); } - function previousPage() {console.log("going to previous page"); } + function previousPage() { root.parent.pop(); } Keys.onUpPressed: previousItem(); Keys.onDownPressed: nextItem(); diff --git a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml index 1eb5f7cdd1..bf8e72ce8a 100644 --- a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml +++ b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml @@ -91,7 +91,6 @@ Item { breadcrumbText.text = "Menu"; topMenu = null; offscreenFlags.navigationFocused = false; - //menuRoot.enabled = false; } } @@ -100,7 +99,6 @@ Item { topMenu = newMenu; topMenu.focus = true; offscreenFlags.navigationFocused = true; - console.log(offscreenWindow.activeFocusItem); } function clearMenus() { @@ -160,7 +158,6 @@ Item { function popup(parent, items) { d.clearMenus(); - //menuRoot.enabled = true; d.buildMenu(items, point); } diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index 66c22e2843..aa2ce947b8 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -1,7 +1,7 @@ import QtQuick 2.0 import Hifi 1.0 -Item { +FocusScope { id: tabletRoot objectName: "tabletRoot" property var eventBridge; @@ -26,7 +26,11 @@ Item { } function forceFocus() { + console.log(loader.item.objectName); + offscreenWindow.requestActivate(); loader.item.forceActiveFocus(); + console.log("----------> adding focus"); + console.log("------>Current foucs itrm: " + offscreenWindow.activeFocusItem); } Loader { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2626170bd6..a5727e36ff 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -979,7 +979,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo auto offscreenUi = DependencyManager::get(); auto tabletScriptingInterface = DependencyManager::get(); if (offscreenUi->navigationFocused()) { - qDebug() << "NavigationFocused"; auto actionEnum = static_cast(action); int key = Qt::Key_unknown; static int lastKey = Qt::Key_unknown; @@ -1025,7 +1024,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo auto window = tabletScriptingInterface->getTabletWindow(); if (navAxis && window) { - qDebug() << "Sending input to qml"; if (lastKey != Qt::Key_unknown) { QKeyEvent event(QEvent::KeyRelease, lastKey, Qt::NoModifier); sendEvent(window, &event); diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index f15f7da53e..ddf999e5d2 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -215,8 +215,9 @@ void TabletProxy::addButtonsToHomeScreen() { addButtonProxyToQmlTablet(tablet, buttonProxy.data()); } auto loader = _qmlTabletRoot->findChild("loader"); - QObject::disconnect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen())); QMetaObject::invokeMethod(_qmlTabletRoot, "forceFocus"); + qDebug() << "----> INVOKEMETHOD"; + QObject::disconnect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen())); } QObject* TabletProxy::getTabletSurface() { From baff07b0f9bfabc4001598dda7306114591f90e7 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 18 Jan 2017 01:11:40 +0000 Subject: [PATCH 4/7] controller with menus finally work --- .../resources/qml/hifi/tablet/Tablet.qml | 6 +- .../qml/hifi/tablet/TabletMenuView.qml | 3 +- .../qml/hifi/tablet/TabletMouseHandler.qml | 2 + .../resources/qml/hifi/tablet/TabletRoot.qml | 24 ++--- interface/src/Application.cpp | 2 + .../src/TabletScriptingInterface.cpp | 91 ++++++++++++++++++- .../src/TabletScriptingInterface.h | 11 ++- 7 files changed, 117 insertions(+), 22 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/Tablet.qml b/interface/resources/qml/hifi/tablet/Tablet.qml index 545ab2fa58..8fb14b8967 100644 --- a/interface/resources/qml/hifi/tablet/Tablet.qml +++ b/interface/resources/qml/hifi/tablet/Tablet.qml @@ -1,9 +1,8 @@ import QtQuick 2.0 import QtGraphicalEffects 1.0 -FocusScope { +Item { id: tablet - focus: true objectName: "tablet" property double micLevel: 0.8 property int rowIndex: 0 @@ -214,6 +213,9 @@ FocusScope { } ] + Component.onCompleted: { + console.log("On Complete tab: " + activeFocus ); } + function setCurrentItemState(state) { var index = rowIndex + columnIndex; diff --git a/interface/resources/qml/hifi/tablet/TabletMenuView.qml b/interface/resources/qml/hifi/tablet/TabletMenuView.qml index da791a8ed2..33e5b3f34c 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenuView.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenuView.qml @@ -18,7 +18,7 @@ FocusScope { id: root implicitHeight: background.height implicitWidth: background.width - + objectName: "root" property alias currentItem: listView.currentItem property alias model: listView.model property bool isSubMenu: false @@ -45,6 +45,7 @@ FocusScope { height: 720 contentWidth: 480 contentHeight: 720 + objectName: "menuList" topMargin: hifi.dimensions.menuPadding.y bottomMargin: hifi.dimensions.menuPadding.y diff --git a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml index bf8e72ce8a..33cfb7a646 100644 --- a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml +++ b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml @@ -81,6 +81,7 @@ Item { if (menuStack.length) { topMenu = menuStack[menuStack.length - 1]; topMenu.focus = true; + topMenu.forceActiveFocus(); // show current menu level on nav bar if (topMenu.objectName === "") { breadcrumbText.text = "Menu"; @@ -98,6 +99,7 @@ Item { menuStack.push(newMenu); topMenu = newMenu; topMenu.focus = true; + topMenu.forceActiveFocus(); offscreenFlags.navigationFocused = true; } diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index aa2ce947b8..f27e694aa6 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -1,12 +1,14 @@ import QtQuick 2.0 import Hifi 1.0 - +import "../../desktop" FocusScope { id: tabletRoot objectName: "tabletRoot" property var eventBridge; property bool desktopRoot: true + signal showDesktop(); + function loadSource(url) { loader.source = url; } @@ -24,15 +26,7 @@ FocusScope { function playButtonClickSound() { buttonClickSound.play(globalPosition); } - - function forceFocus() { - console.log(loader.item.objectName); - offscreenWindow.requestActivate(); - loader.item.forceActiveFocus(); - console.log("----------> adding focus"); - console.log("------>Current foucs itrm: " + offscreenWindow.activeFocusItem); - } - + Loader { id: loader objectName: "loader" @@ -42,7 +36,6 @@ FocusScope { height: parent.height onLoaded: { - // propogate eventBridge to WebEngineView if (loader.item.hasOwnProperty("eventBridge")) { loader.item.eventBridge = eventBridge; @@ -53,13 +46,14 @@ FocusScope { } }); } - //loader.item.parent = tablxetRoot; loader.item.forceActiveFocus(); - offscreenFlags.navigationFocus = true; - console.log(loader.item.count); - console.log("Current focus item " + offscreenWindow.activeFocusItem); + offscreenFlags.navigationFocused = true; } } + Component.onCompleted: { + offscreenWindow.requestActivate(); + offscreenWindow.forceActiveFocus(); + } Component.onDestruction: { offscreenFlags.navigationFocused = false; } width: 480 diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a5727e36ff..5e278fee86 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1033,12 +1033,14 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo if (key != Qt::Key_unknown) { QKeyEvent event(QEvent::KeyPress, key, Qt::NoModifier); sendEvent(window, &event); + tabletScriptingInterface->processEvent(&event); lastKey = key; } } else if (key != Qt::Key_unknown && window) { if (state) { QKeyEvent event(QEvent::KeyPress, key, Qt::NoModifier); sendEvent(window, &event); + tabletScriptingInterface->processEvent(&event); } else { QKeyEvent event(QEvent::KeyRelease, key, Qt::NoModifier); sendEvent(window, &event); diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index ddf999e5d2..bb40dc33e2 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -59,6 +59,71 @@ QQuickWindow* TabletScriptingInterface::getTabletWindow() { return window; } +void TabletScriptingInterface::processMenuEvents(QObject* object, const QKeyEvent* event) { + switch (event->key()) { + case Qt::Key_Down: + QMetaObject::invokeMethod(object, "nextItem"); + break; + + case Qt::Key_Up: + QMetaObject::invokeMethod(object, "previousItem"); + break; + + case Qt::Key_Left: + QMetaObject::invokeMethod(object, "previousPage"); + break; + + case Qt::Key_Right: + QMetaObject::invokeMethod(object, "selectCurrentItem"); + break; + + case Qt::Key_Return: + QMetaObject::invokeMethod(object, "selectCurrentItem"); + break; + defualt: + break; + } +} + +void TabletScriptingInterface::processTabletEvents(QObject* object, const QKeyEvent* event) { + switch (event->key()) { + case Qt::Key_Down: + QMetaObject::invokeMethod(object, "downItem"); + break; + + case Qt::Key_Up: + QMetaObject::invokeMethod(object, "upItem"); + break; + + case Qt::Key_Left: + QMetaObject::invokeMethod(object, "previousItem"); + break; + + case Qt::Key_Right: + QMetaObject::invokeMethod(object, "nextItem"); + break; + + case Qt::Key_Return: + QMetaObject::invokeMethod(object, "selectItem"); + break; + defualt: + break; + } +} + + +void TabletScriptingInterface::processEvent(const QKeyEvent* event) { + TabletProxy* tablet = qobject_cast(getTablet("com.highfidelity.interface.tablet.system")); + QObject* qmlTablet = tablet->getQmlTablet(); + QObject* qmlMenu = tablet->getQmlMenu(); + + if (qmlTablet) { + processTabletEvents(qmlTablet, event); + } else if (qmlMenu) { + processMenuEvents(qmlMenu, event); + } +} + QObject* TabletScriptingInterface::getFlags() { auto offscreenUi = DependencyManager::get(); @@ -215,8 +280,6 @@ void TabletProxy::addButtonsToHomeScreen() { addButtonProxyToQmlTablet(tablet, buttonProxy.data()); } auto loader = _qmlTabletRoot->findChild("loader"); - QMetaObject::invokeMethod(_qmlTabletRoot, "forceFocus"); - qDebug() << "----> INVOKEMETHOD"; QObject::disconnect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen())); } @@ -236,7 +299,6 @@ void TabletProxy::addButtonsToMenuScreen() { QQuickItem* VrMenu = loader->findChild("tabletMenu"); if (!VrMenu) { - qDebug() << "----------> could not find vr menu"; return; } @@ -270,6 +332,29 @@ QQuickItem* TabletProxy::getQmlTablet() const { return tablet; } +QQuickItem* TabletProxy::getQmlMenu() const { + if (!_qmlTabletRoot) { + return nullptr; + } + + auto loader = _qmlTabletRoot->findChild("loader"); + if (!loader) { + return nullptr; + } + + QQuickItem* VrMenu = loader->findChild("tabletMenu"); + if (!VrMenu) { + return nullptr; + } + + QQuickItem* menuList = VrMenu->findChild("menuList"); + if (!menuList) { + return nullptr; + } + qDebug() << "---------->found menuList"; + return menuList; +} + // // TabletButtonProxy // diff --git a/libraries/script-engine/src/TabletScriptingInterface.h b/libraries/script-engine/src/TabletScriptingInterface.h index c139fd93c3..4b8c792af3 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.h +++ b/libraries/script-engine/src/TabletScriptingInterface.h @@ -47,10 +47,16 @@ public: void setQmlTabletRoot(QString tabletId, QQuickItem* qmlTabletRoot, QObject* qmlOffscreenSurface); + void processEvent(const QKeyEvent* event); + QQuickWindow* getTabletWindow(); QObject* getFlags(); +private: + void processMenuEvents(QObject* object, const QKeyEvent* event); + void processTabletEvents(QObject* object, const QKeyEvent* event); + protected: std::mutex _mutex; std::map> _tabletProxies; @@ -119,6 +125,10 @@ public: QObject* getTabletSurface(); + QQuickItem* getQmlTablet() const; + + QQuickItem* getQmlMenu() const; + signals: /**jsdoc * Signaled when this tablet receives an event from the html/js embedded in the tablet @@ -133,7 +143,6 @@ private slots: void addButtonsToMenuScreen(); protected: void removeButtonsFromHomeScreen(); - QQuickItem* getQmlTablet() const; QString _name; std::mutex _mutex; From fa3bea52cd29c1a20e6acd1e8685504c399f3b10 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 18 Jan 2017 16:45:27 +0000 Subject: [PATCH 5/7] fixed bug with menu --- .../resources/qml/hifi/tablet/TabletMenuView.qml | 14 ++++++++------ .../qml/hifi/tablet/TabletMouseHandler.qml | 5 +++++ .../script-engine/src/TabletScriptingInterface.cpp | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/TabletMenuView.qml b/interface/resources/qml/hifi/tablet/TabletMenuView.qml index 33e5b3f34c..120ad78f2e 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenuView.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenuView.qml @@ -108,12 +108,7 @@ FocusScope { } currentIndex = originalIndex; } - - function previousItem() { currentIndex = (currentIndex + count - 1) % count; } - function nextItem() { currentIndex = (currentIndex + count + 1) % count; } - function selectCurrentItem() { if (currentIndex != -1) root.selected(currentItem.source); } - function previousPage() { root.parent.pop(); } - + Keys.onUpPressed: previousItem(); Keys.onDownPressed: nextItem(); Keys.onSpacePressed: selectCurrentItem(); @@ -121,6 +116,13 @@ FocusScope { Keys.onReturnPressed: selectCurrentItem(); Keys.onLeftPressed: previousPage(); } + + function previousItem() { listView.currentIndex = (listView.currentIndex + listView.count - 1) % listView.count; } + function nextItem() { listView.currentIndex = (listView.currentIndex + listView.count + 1) % listView.count; } + function selectCurrentItem() { if (listView.currentIndex != -1) root.selected(currentItem.source); } + function previousPage() { root.parent.pop(); } + + } diff --git a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml index 33cfb7a646..77c1ae0a39 100644 --- a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml +++ b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml @@ -171,4 +171,9 @@ Item { return false; } + function previousItem() { d.topMenu.previousItem(); } + function nextItem() { d.topMenu.nextItem(); } + function selectCurrentItem() { d.topMenu.selectCurrentItem(); } + function previousPage() { d.topMenu.previousPage(); } + } diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index bb40dc33e2..c57389db2a 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -347,7 +347,7 @@ QQuickItem* TabletProxy::getQmlMenu() const { return nullptr; } - QQuickItem* menuList = VrMenu->findChild("menuList"); + QQuickItem* menuList = VrMenu->findChild("tabletMenuHandlerItem"); if (!menuList) { return nullptr; } From 1c13f538f714438c553232ebac15a95845bf7cbd Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 18 Jan 2017 17:08:13 +0000 Subject: [PATCH 6/7] removed debug output --- interface/resources/qml/hifi/tablet/Tablet.qml | 5 ----- .../resources/qml/hifi/tablet/TabletMenuView.qml | 2 +- .../resources/qml/hifi/tablet/TabletMouseHandler.qml | 3 +-- interface/resources/qml/hifi/tablet/TabletRoot.qml | 12 ++++-------- .../script-engine/src/TabletScriptingInterface.cpp | 1 - 5 files changed, 6 insertions(+), 17 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/Tablet.qml b/interface/resources/qml/hifi/tablet/Tablet.qml index 8fb14b8967..db8b595135 100644 --- a/interface/resources/qml/hifi/tablet/Tablet.qml +++ b/interface/resources/qml/hifi/tablet/Tablet.qml @@ -213,9 +213,6 @@ Item { } ] - Component.onCompleted: { - console.log("On Complete tab: " + activeFocus ); } - function setCurrentItemState(state) { var index = rowIndex + columnIndex; @@ -249,10 +246,8 @@ Item { var index = rowIndex + columnIndex; if(index > count) { rowIndex = rowIndex - 3; - console.log("index: " + (rowIndex +columnIndex)); } } - console.log("row index: " + rowIndex); setCurrentItemState("hover state"); } diff --git a/interface/resources/qml/hifi/tablet/TabletMenuView.qml b/interface/resources/qml/hifi/tablet/TabletMenuView.qml index 120ad78f2e..6411c1af02 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenuView.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenuView.qml @@ -120,7 +120,7 @@ FocusScope { function previousItem() { listView.currentIndex = (listView.currentIndex + listView.count - 1) % listView.count; } function nextItem() { listView.currentIndex = (listView.currentIndex + listView.count + 1) % listView.count; } function selectCurrentItem() { if (listView.currentIndex != -1) root.selected(currentItem.source); } - function previousPage() { root.parent.pop(); } + function previousPage() { root.parent.pop(); } } diff --git a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml index 77c1ae0a39..3f8a3d8245 100644 --- a/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml +++ b/interface/resources/qml/hifi/tablet/TabletMouseHandler.qml @@ -58,7 +58,6 @@ Item { for (var i = 0; i < items.length; ++i) { var item = items[i]; if (!item.visible) continue; - console.log(item.title) switch (item.type) { case MenuItemType.Menu: result.append({"name": item.title, "item": item}) @@ -164,7 +163,7 @@ Item { } function closeLastMenu() { - if (d.menuStack.length) { + if (d.menuStack.length > 1) { d.popMenu(); return true; } diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index f27e694aa6..ec803fd919 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -1,11 +1,10 @@ import QtQuick 2.0 import Hifi 1.0 -import "../../desktop" -FocusScope { + +Item { id: tabletRoot objectName: "tabletRoot" property var eventBridge; - property bool desktopRoot: true signal showDesktop(); @@ -26,7 +25,7 @@ FocusScope { function playButtonClickSound() { buttonClickSound.play(globalPosition); } - + Loader { id: loader objectName: "loader" @@ -50,10 +49,7 @@ FocusScope { offscreenFlags.navigationFocused = true; } } - Component.onCompleted: { - offscreenWindow.requestActivate(); - offscreenWindow.forceActiveFocus(); - } + Component.onDestruction: { offscreenFlags.navigationFocused = false; } width: 480 diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index c57389db2a..4c4eb19f45 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -351,7 +351,6 @@ QQuickItem* TabletProxy::getQmlMenu() const { if (!menuList) { return nullptr; } - qDebug() << "---------->found menuList"; return menuList; } From 0f3ac2831e4f6407240fff73d2a20bd4e4e3695e Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 18 Jan 2017 17:20:42 +0000 Subject: [PATCH 7/7] fix tablet menu selection issue --- interface/resources/qml/hifi/tablet/Tablet.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/Tablet.qml b/interface/resources/qml/hifi/tablet/Tablet.qml index db8b595135..9ca230b577 100644 --- a/interface/resources/qml/hifi/tablet/Tablet.qml +++ b/interface/resources/qml/hifi/tablet/Tablet.qml @@ -222,9 +222,10 @@ Item { } function nextItem() { setCurrentItemState("base state"); - - if((rowIndex + columnIndex) != count) { - columnIndex = (columnIndex + 3 + 1) % 3 + var nextColumnIndex = (columnIndex + 3 + 1) % 3; + var nextIndex = rowIndex + nextColumnIndex; + if(nextIndex <= count) { + columnIndex = nextColumnIndex; }; setCurrentItemState("hover state"); }