From 13cec7bd9955079bca2290a96a5a74cc9ec0522f Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Sat, 8 Dec 2012 15:02:15 +0100 Subject: [PATCH] Canvas MouseEvent now provides client and screen position --- src/Canvas/gui_mgr.cxx | 26 ++++++++++++++------------ src/GUI/CanvasWidget.cxx | 17 +++++++++++------ src/GUI/CanvasWidget.hxx | 3 ++- src/Scripting/NasalCanvas.cxx | 6 ++++-- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/Canvas/gui_mgr.cxx b/src/Canvas/gui_mgr.cxx index cf5a047b0..711eda309 100644 --- a/src/Canvas/gui_mgr.cxx +++ b/src/Canvas/gui_mgr.cxx @@ -261,18 +261,19 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea) sc::MouseEventPtr event(new sc::MouseEvent); event->time = ea.getTime(); - event->pos.x() = 0.5 * (ea.getXnormalized() + 1) * _width + 0.5; - event->pos.y() = 0.5 * (ea.getYnormalized() + 1) * _height + 0.5; + event->screen_pos.x() = 0.5 * (ea.getXnormalized() + 1) * _width + 0.5; + event->screen_pos.y() = 0.5 * (ea.getYnormalized() + 1) * _height + 0.5; if( ea.getMouseYOrientation() != osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS ) - event->pos.y() = _height - event->pos.y(); + event->screen_pos.y() = _height - event->screen_pos.y(); - event->delta.x() = event->pos.x() - _last_x; - event->delta.y() = event->pos.y() - _last_y; + event->delta.x() = event->getScreenX() - _last_x; + event->delta.y() = event->getScreenY() - _last_y; - _last_x = event->pos.x(); - _last_y = event->pos.y(); + _last_x = event->getScreenX(); + _last_y = event->getScreenY(); + event->client_pos = event->screen_pos; event->button = ea.getButton(); event->state = ea.getButtonMask(); event->mod = ea.getModKeyMask(); @@ -292,7 +293,8 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea) canvas::WindowPtr window = static_cast(layer->getChild(j)->getUserData()) ->window.lock(); - if( window->getRegion().contains(event->pos.x(), event->pos.y()) ) + if( window->getRegion().contains( event->getScreenX(), + event->getScreenY() ) ) { window_at_cursor = window; break; @@ -322,8 +324,8 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea) move_event->type = sc::Event::MOUSE_LEAVE; // Let the event position be always relative to the top left window corner - move_event->pos.x() -= last_mouse_over->getRegion().x(); - move_event->pos.y() -= last_mouse_over->getRegion().y(); + move_event->client_pos.x() -= last_mouse_over->getRegion().x(); + move_event->client_pos.y() -= last_mouse_over->getRegion().y(); last_mouse_over->handleMouseEvent(move_event); } @@ -349,8 +351,8 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea) if( target_window ) { // Let the event position be always relative to the top left window corner - event->pos.x() -= target_window->getRegion().x(); - event->pos.y() -= target_window->getRegion().y(); + event->client_pos.x() -= target_window->getRegion().x(); + event->client_pos.y() -= target_window->getRegion().y(); return target_window->handleMouseEvent(event); } diff --git a/src/GUI/CanvasWidget.cxx b/src/GUI/CanvasWidget.cxx index bbbecd55e..b505aa5ea 100644 --- a/src/GUI/CanvasWidget.cxx +++ b/src/GUI/CanvasWidget.cxx @@ -18,7 +18,8 @@ #include #include -SGPropertyNode_ptr CanvasWidget::_time; +SGPropertyNode_ptr CanvasWidget::_time, + CanvasWidget::_view_height; //------------------------------------------------------------------------------ CanvasWidget::CanvasWidget( int x, int y, @@ -120,12 +121,16 @@ void CanvasWidget::doHit(int button, int updown, int x, int y) _time = globals->get_props()->getNode("/sim/time/elapsed-sec"); event->time = _time->getDoubleValue(); - event->pos.set(x - abox.min[0], abox.max[1] - y); - event->delta.set( event->pos.x() - _last_x, - event->pos.y() - _last_y ); + if( !_view_height ) + _view_height = globals->get_props()->getNode("/sim/gui/canvas/size[1]"); + event->screen_pos.set(x, _view_height->getIntValue() - y); - _last_x = event->pos.x(); - _last_y = event->pos.y(); + event->client_pos.set(x - abox.min[0], abox.max[1] - y); + event->delta.set( event->getScreenX() - _last_x, + event->getScreenY() - _last_y ); + + _last_x = event->getScreenX(); + _last_y = event->getScreenY(); switch( button ) { diff --git a/src/GUI/CanvasWidget.hxx b/src/GUI/CanvasWidget.hxx index 403523b25..a14a9de9b 100644 --- a/src/GUI/CanvasWidget.hxx +++ b/src/GUI/CanvasWidget.hxx @@ -48,7 +48,8 @@ class CanvasWidget: float _last_x, _last_y; - static SGPropertyNode_ptr _time; + static SGPropertyNode_ptr _time, + _view_height; }; #endif /* CANVASWIDGET_HXX_ */ diff --git a/src/Scripting/NasalCanvas.cxx b/src/Scripting/NasalCanvas.cxx index b5b181e6f..edd66b7fc 100644 --- a/src/Scripting/NasalCanvas.cxx +++ b/src/Scripting/NasalCanvas.cxx @@ -178,8 +178,10 @@ naRef initNasalCanvas(naRef globals, naContext c, naRef gcSave) .method_func<&f_eventStopPropagation>("stopPropagation"); NasalMouseEvent::init("canvas.MouseEvent") .bases() - .member("x", &sc::MouseEvent::getPosX) - .member("y", &sc::MouseEvent::getPosY) + .member("screenX", &sc::MouseEvent::getScreenX) + .member("screenY", &sc::MouseEvent::getScreenY) + .member("clientX", &sc::MouseEvent::getClientX) + .member("clientY", &sc::MouseEvent::getClientY) .member("deltaX", &sc::MouseEvent::getDeltaX) .member("deltaY", &sc::MouseEvent::getDeltaY) .member("click_count", &sc::MouseEvent::getCurrentClickCount); -- 2.39.5