]> git.mxchange.org Git - simgear.git/blobdiff - simgear/canvas/CanvasEventManager.cxx
Canvas: create mouseover/mouseout events
[simgear.git] / simgear / canvas / CanvasEventManager.cxx
index d7135f802746d1a806fb237dbb86aab7997e7c53..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 )
@@ -180,17 +210,21 @@ namespace canvas
         // (eg. removed by another event handler)
         continue;
 
-      if( mouse_event && event->type != Event::DRAG )
-      {
-        // TODO transform pos and delta for drag events. Maybe we should just
-        //      store the global coordinates and convert to local coordinates
-        //      on demand.
-
-        // Position and delta are specified in local coordinate system of
-        // current element
-        mouse_event->pos = it->local_pos;
-        mouse_event->delta = it->local_delta;
-      }
+      // TODO provide functions to convert position and delta to local
+      //      coordinates on demand. Events shouldn't contain informations in
+      //      local coordinates as they might differe between different elements
+      //      receiving the same event.
+//      if( mouse_event && event->type != Event::DRAG )
+//      {
+//        // TODO transform pos and delta for drag events. Maybe we should just
+//        //      store the global coordinates and convert to local coordinates
+//        //      on demand.
+//
+//        // Position and delta are specified in local coordinate system of
+//        // current element
+//        mouse_event->pos = it->local_pos;
+//        mouse_event->delta = it->local_delta;
+//      }
 
       el->callListeners(event);