From baff07b0f9bfabc4001598dda7306114591f90e7 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 18 Jan 2017 01:11:40 +0000 Subject: [PATCH] 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;