Merge pull request #5570 from jherico/homer

WebEntity keyboard input with mouse hover
This commit is contained in:
Brad Hefta-Gaub 2015-08-14 17:32:47 -07:00
commit fe8fef4242
6 changed files with 71 additions and 2 deletions

View file

@ -98,6 +98,8 @@
#include <input-plugins/UserInputMapper.h>
#include <VrMenu.h>
#include <RenderableWebEntityItem.h>
#include "AudioClient.h"
#include "DiscoverabilityManager.h"
#include "GLCanvas.h"
@ -146,9 +148,8 @@
#include "ui/AddressBarDialog.h"
#include "ui/UpdateDialog.h"
//#include <qopenglcontext.h>
// ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU
// FIXME seems to be broken.
#if defined(Q_OS_WIN)
extern "C" {
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
@ -671,6 +672,28 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) :
auto& packetReceiver = nodeList->getPacketReceiver();
packetReceiver.registerListener(PacketType::DomainConnectionDenied, this, "handleDomainConnectionDeniedPacket");
auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
connect(entityScriptingInterface.data(), &EntityScriptingInterface::hoverEnterEntity, [this, entityScriptingInterface](const EntityItemID& entityItemID, const MouseEvent& event) {
if (_keyboardFocusedItem != entityItemID) {
_keyboardFocusedItem = UNKNOWN_ENTITY_ID;
auto properties = entityScriptingInterface->getEntityProperties(entityItemID);
if (EntityTypes::Web == properties.getType() && !properties.getLocked()) {
auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(entityItemID);
RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get());
if (webEntity) {
webEntity->setProxyWindow(_window->windowHandle());
_keyboardFocusedItem = entityItemID;
}
}
}
});
connect(entityScriptingInterface.data(), &EntityScriptingInterface::hoverLeaveEntity, [=](const EntityItemID& entityItemID, const MouseEvent& event) {
if (_keyboardFocusedItem == entityItemID) {
_keyboardFocusedItem = UNKNOWN_ENTITY_ID;
}
});
}
void Application::aboutToQuit() {
@ -854,6 +877,10 @@ void Application::initializeGL() {
InfoView::show(INFO_HELP_PATH, true);
}
QWindow* getProxyWindow() {
return qApp->getWindow()->windowHandle();
}
void Application::initializeUi() {
AddressBarDialog::registerType();
ErrorDialog::registerType();
@ -1232,6 +1259,28 @@ bool Application::event(QEvent* event) {
return true;
}
if (!_keyboardFocusedItem.isInvalidID()) {
switch (event->type()) {
case QEvent::KeyPress:
case QEvent::KeyRelease: {
auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(_keyboardFocusedItem);
RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get());
if (webEntity && webEntity->getEventHandler()) {
event->setAccepted(false);
QCoreApplication::sendEvent(webEntity->getEventHandler(), event);
if (event->isAccepted()) {
return true;
}
}
break;
}
default:
break;
}
}
switch (event->type()) {
case QEvent::MouseMove:
mouseMoveEvent((QMouseEvent*)event);

View file

@ -678,6 +678,8 @@ private:
bool _overlayEnabled = true;
QRect _savedGeometry;
DialogsManagerScriptingInterface* _dialogsManagerScriptingInterface = new DialogsManagerScriptingInterface();
EntityItemID _keyboardFocusedItem;
};
#endif // hifi_Application_h

View file

@ -195,3 +195,11 @@ void RenderableWebEntityItem::setSourceUrl(const QString& value) {
}
}
}
void RenderableWebEntityItem::setProxyWindow(QWindow* proxyWindow) {
_webSurface->setProxyWindow(proxyWindow);
}
QObject* RenderableWebEntityItem::getEventHandler() {
return _webSurface->getEventHandler();
}

View file

@ -16,6 +16,8 @@
#include "RenderableEntityItem.h"
class OffscreenQmlSurface;
class QWindow;
class QObject;
class RenderableWebEntityItem : public WebEntityItem {
public:
@ -26,6 +28,9 @@ public:
virtual void render(RenderArgs* args);
virtual void setSourceUrl(const QString& value);
void setProxyWindow(QWindow* proxyWindow);
QObject* getEventHandler();
SIMPLE_RENDERABLE();

View file

@ -599,6 +599,10 @@ void OffscreenQmlSurface::setProxyWindow(QWindow* window) {
_renderer->_renderControl->_renderWindow = window;
}
QObject* OffscreenQmlSurface::getEventHandler() {
return getWindow();
}
QQuickWindow* OffscreenQmlSurface::getWindow() {
return _renderer->_quickWindow;
}

View file

@ -59,6 +59,7 @@ public:
void setBaseUrl(const QUrl& baseUrl);
QQuickItem* getRootItem();
QQuickWindow* getWindow();
QObject* getEventHandler();
virtual bool eventFilter(QObject* originalDestination, QEvent* event);