]> git.mxchange.org Git - simgear.git/blobdiff - simgear/canvas/CanvasEventManager.cxx
Canvas: create mouseover/mouseout events
[simgear.git] / simgear / canvas / CanvasEventManager.cxx
index 53da08d191ea14e96d15bdfee244169210247330..89f25719107d0303cbb6adb1cb45fc0b5663414f 100644 (file)
@@ -98,8 +98,14 @@ namespace canvas
           return false;
         else
           return propagateEvent(event, _last_mouse_down.path);
-      case Event::WHEEL:
       case Event::MOUSE_MOVE:
+        handleMove(event, path);
+        break;
+      case Event::MOUSE_LEAVE:
+        // Mouse leaves window and therefore also current mouseover element
+        handleMove(event, EventPropagationPath());
+        return true;
+      case Event::WHEEL:
         break;
       default:
         return false;
@@ -147,6 +153,30 @@ namespace canvas
     _last_click = StampedPropagationPath(path, event->getTime());
   }
 
+  //----------------------------------------------------------------------------
+  void EventManager::handleMove( const MouseEventPtr& event,
+                                 const EventPropagationPath& path )
+  {
+    if( _last_mouse_over.path == path )
+      return;
+
+    if( !_last_mouse_over.path.empty() )
+    {
+      MouseEventPtr mouseout(new MouseEvent(*event));
+      mouseout->type = Event::MOUSE_OUT;
+      propagateEvent(mouseout, _last_mouse_over.path);
+    }
+
+    if( !path.empty() )
+    {
+      MouseEventPtr mouseover(new MouseEvent(*event));
+      mouseover->type = Event::MOUSE_OVER;
+      propagateEvent(mouseover, path);
+    }
+
+    _last_mouse_over.path = path;
+  }
+
   //----------------------------------------------------------------------------
   bool EventManager::propagateEvent( const EventPtr& event,
                                      const EventPropagationPath& path )