mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 21:29:33 +02:00
Merge pull request #5570 from jherico/homer
WebEntity keyboard input with mouse hover
This commit is contained in:
commit
fe8fef4242
6 changed files with 71 additions and 2 deletions
|
@ -98,6 +98,8 @@
|
||||||
#include <input-plugins/UserInputMapper.h>
|
#include <input-plugins/UserInputMapper.h>
|
||||||
#include <VrMenu.h>
|
#include <VrMenu.h>
|
||||||
|
|
||||||
|
#include <RenderableWebEntityItem.h>
|
||||||
|
|
||||||
#include "AudioClient.h"
|
#include "AudioClient.h"
|
||||||
#include "DiscoverabilityManager.h"
|
#include "DiscoverabilityManager.h"
|
||||||
#include "GLCanvas.h"
|
#include "GLCanvas.h"
|
||||||
|
@ -146,9 +148,8 @@
|
||||||
#include "ui/AddressBarDialog.h"
|
#include "ui/AddressBarDialog.h"
|
||||||
#include "ui/UpdateDialog.h"
|
#include "ui/UpdateDialog.h"
|
||||||
|
|
||||||
//#include <qopenglcontext.h>
|
|
||||||
|
|
||||||
// ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU
|
// ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU
|
||||||
|
// FIXME seems to be broken.
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
|
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
|
||||||
|
@ -671,6 +672,28 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) :
|
||||||
|
|
||||||
auto& packetReceiver = nodeList->getPacketReceiver();
|
auto& packetReceiver = nodeList->getPacketReceiver();
|
||||||
packetReceiver.registerListener(PacketType::DomainConnectionDenied, this, "handleDomainConnectionDeniedPacket");
|
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() {
|
void Application::aboutToQuit() {
|
||||||
|
@ -854,6 +877,10 @@ void Application::initializeGL() {
|
||||||
InfoView::show(INFO_HELP_PATH, true);
|
InfoView::show(INFO_HELP_PATH, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QWindow* getProxyWindow() {
|
||||||
|
return qApp->getWindow()->windowHandle();
|
||||||
|
}
|
||||||
|
|
||||||
void Application::initializeUi() {
|
void Application::initializeUi() {
|
||||||
AddressBarDialog::registerType();
|
AddressBarDialog::registerType();
|
||||||
ErrorDialog::registerType();
|
ErrorDialog::registerType();
|
||||||
|
@ -1232,6 +1259,28 @@ bool Application::event(QEvent* event) {
|
||||||
return true;
|
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()) {
|
switch (event->type()) {
|
||||||
case QEvent::MouseMove:
|
case QEvent::MouseMove:
|
||||||
mouseMoveEvent((QMouseEvent*)event);
|
mouseMoveEvent((QMouseEvent*)event);
|
||||||
|
|
|
@ -678,6 +678,8 @@ private:
|
||||||
bool _overlayEnabled = true;
|
bool _overlayEnabled = true;
|
||||||
QRect _savedGeometry;
|
QRect _savedGeometry;
|
||||||
DialogsManagerScriptingInterface* _dialogsManagerScriptingInterface = new DialogsManagerScriptingInterface();
|
DialogsManagerScriptingInterface* _dialogsManagerScriptingInterface = new DialogsManagerScriptingInterface();
|
||||||
|
|
||||||
|
EntityItemID _keyboardFocusedItem;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_Application_h
|
#endif // hifi_Application_h
|
||||||
|
|
|
@ -195,3 +195,11 @@ void RenderableWebEntityItem::setSourceUrl(const QString& value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderableWebEntityItem::setProxyWindow(QWindow* proxyWindow) {
|
||||||
|
_webSurface->setProxyWindow(proxyWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject* RenderableWebEntityItem::getEventHandler() {
|
||||||
|
return _webSurface->getEventHandler();
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
#include "RenderableEntityItem.h"
|
#include "RenderableEntityItem.h"
|
||||||
|
|
||||||
class OffscreenQmlSurface;
|
class OffscreenQmlSurface;
|
||||||
|
class QWindow;
|
||||||
|
class QObject;
|
||||||
|
|
||||||
class RenderableWebEntityItem : public WebEntityItem {
|
class RenderableWebEntityItem : public WebEntityItem {
|
||||||
public:
|
public:
|
||||||
|
@ -26,6 +28,9 @@ public:
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
virtual void setSourceUrl(const QString& value);
|
virtual void setSourceUrl(const QString& value);
|
||||||
|
|
||||||
|
void setProxyWindow(QWindow* proxyWindow);
|
||||||
|
QObject* getEventHandler();
|
||||||
|
|
||||||
SIMPLE_RENDERABLE();
|
SIMPLE_RENDERABLE();
|
||||||
|
|
||||||
|
|
|
@ -599,6 +599,10 @@ void OffscreenQmlSurface::setProxyWindow(QWindow* window) {
|
||||||
_renderer->_renderControl->_renderWindow = window;
|
_renderer->_renderControl->_renderWindow = window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QObject* OffscreenQmlSurface::getEventHandler() {
|
||||||
|
return getWindow();
|
||||||
|
}
|
||||||
|
|
||||||
QQuickWindow* OffscreenQmlSurface::getWindow() {
|
QQuickWindow* OffscreenQmlSurface::getWindow() {
|
||||||
return _renderer->_quickWindow;
|
return _renderer->_quickWindow;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,7 @@ public:
|
||||||
void setBaseUrl(const QUrl& baseUrl);
|
void setBaseUrl(const QUrl& baseUrl);
|
||||||
QQuickItem* getRootItem();
|
QQuickItem* getRootItem();
|
||||||
QQuickWindow* getWindow();
|
QQuickWindow* getWindow();
|
||||||
|
QObject* getEventHandler();
|
||||||
|
|
||||||
virtual bool eventFilter(QObject* originalDestination, QEvent* event);
|
virtual bool eventFilter(QObject* originalDestination, QEvent* event);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue