]> git.mxchange.org Git - flightgear.git/commitdiff
Canvas MouseEvent now provides client and screen position
authorThomas Geymayer <tomgey@gmail.com>
Sat, 8 Dec 2012 14:02:15 +0000 (15:02 +0100)
committerThomas Geymayer <tomgey@gmail.com>
Sat, 8 Dec 2012 14:02:15 +0000 (15:02 +0100)
src/Canvas/gui_mgr.cxx
src/GUI/CanvasWidget.cxx
src/GUI/CanvasWidget.hxx
src/Scripting/NasalCanvas.cxx

index cf5a047b061ede69ee321ffefea46b2fb4ada165..711eda3094979bcc568271d2bd6feb7665ebece2 100644 (file)
@@ -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<WindowUserData*>(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);
   }
index bbbecd55eca3579632948f0b137677cfd0eb4509..b505aa5eab425a64de0c60d6d7c2f570f4f79bc6 100644 (file)
@@ -18,7 +18,8 @@
 #include <simgear/canvas/Canvas.hxx>
 #include <simgear/canvas/MouseEvent.hxx>
 
-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 )
   {
index 403523b255f5ec587d560e0552f5173bc11c3b21..a14a9de9bb3b5826d710d9ce14e65e92e66723b1 100644 (file)
@@ -48,7 +48,8 @@ class CanvasWidget:
     float _last_x,
           _last_y;
 
-    static SGPropertyNode_ptr _time;
+    static SGPropertyNode_ptr _time,
+                              _view_height;
 };
 
 #endif /* CANVASWIDGET_HXX_ */
index b5b181e6f72c71e42b11a11c30a8873af1b8734c..edd66b7fcd64ac1ba195c55114e74d63169e989b 100644 (file)
@@ -178,8 +178,10 @@ naRef initNasalCanvas(naRef globals, naContext c, naRef gcSave)
     .method_func<&f_eventStopPropagation>("stopPropagation");
   NasalMouseEvent::init("canvas.MouseEvent")
     .bases<NasalEvent>()
-    .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);