]> git.mxchange.org Git - simgear.git/commitdiff
Canvas: create mouseover/mouseout events
authorThomas Geymayer <tomgey@gmail.com>
Sun, 16 Dec 2012 17:52:20 +0000 (18:52 +0100)
committerThomas Geymayer <tomgey@gmail.com>
Sun, 16 Dec 2012 17:52:32 +0000 (18:52 +0100)
simgear/canvas/CanvasEventManager.cxx
simgear/canvas/CanvasEventManager.hxx

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 )
index 8ec3cf7e702583f8d5282ec67c58836c7ff13588..d0504c101a7b4df46a4074a1544799907ef7d963 100644 (file)
@@ -34,6 +34,10 @@ namespace canvas
                     local_delta;
   };
   typedef std::deque<EventTarget> EventPropagationPath;
+  inline bool operator==(const EventTarget& t1, const EventTarget& t2)
+  {
+    return t1.element.lock() == t2.element.lock();
+  }
 
   class EventManager
   {
@@ -59,7 +63,8 @@ namespace canvas
       // TODO if we really need the paths modify to not copy around the paths
       //      that much.
       StampedPropagationPath _last_mouse_down,
-                             _last_click;
+                             _last_click,
+                             _last_mouse_over;
       size_t _current_click_count;
 
       /**
@@ -68,6 +73,12 @@ namespace canvas
       void handleClick( const MouseEventPtr& event,
                         const EventPropagationPath& path );
 
+      /**
+       * Handle mouseover/enter/out/leave
+       */
+      void handleMove( const MouseEventPtr& event,
+                       const EventPropagationPath& path );
+
       bool propagateEvent( const EventPtr& event,
                            const EventPropagationPath& path );