]> git.mxchange.org Git - simgear.git/blobdiff - simgear/canvas/Canvas.cxx
First working version of DOM like Canvas event handling
[simgear.git] / simgear / canvas / Canvas.cxx
index 350fdf9563edec6521d2e888c122a80aa91720b6..58c115a85eb74adf11c07e8c44319f4ae236b12e 100644 (file)
@@ -17,7 +17,9 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
 
 #include "Canvas.hxx"
+#include "CanvasEventVisitor.hxx"
 #include <simgear/canvas/MouseEvent.hxx>
+#include <simgear/canvas/CanvasPlacement.hxx>
 #include <simgear/scene/util/parse_color.hxx>
 #include <simgear/scene/util/RenderConstants.hxx>
 
@@ -254,6 +256,15 @@ namespace canvas
     }
   }
 
+  //----------------------------------------------------------------------------
+  naRef Canvas::addEventListener(const nasal::CallContext& ctx)
+  {
+    if( !_root_group.get() )
+      naRuntimeError(ctx.c, "Canvas: No root group!");
+
+    return _root_group->addEventListener(ctx);
+  }
+
   //----------------------------------------------------------------------------
   void Canvas::setSizeX(int sx)
   {
@@ -323,23 +334,31 @@ namespace canvas
   }
 
   //----------------------------------------------------------------------------
-  bool Canvas::handleMouseEvent(const MouseEvent& event)
+  bool Canvas::handleMouseEvent(const MouseEventPtr& event)
   {
-    _mouse_x = event.x;
-    _mouse_y = event.y;
-    _mouse_dx = event.dx;
-    _mouse_dy = event.dy;
-    _mouse_button = event.button;
-    _mouse_state = event.state;
-    _mouse_mod = event.mod;
-    _mouse_scroll = event.scroll;
+    _mouse_x = event->pos.x();
+    _mouse_y = event->pos.y();
+    _mouse_dx = event->delta.x();
+    _mouse_dy = event->delta.y();
+    _mouse_button = event->button;
+    _mouse_state = event->state;
+    _mouse_mod = event->mod;
+    //_mouse_scroll = event.scroll;
     // Always set event type last because all listeners are attached to it
-    _mouse_event = event.type;
+    _mouse_event = event->type;
 
-    if( _root_group.get() )
-      return _root_group->handleMouseEvent(event);
-    else
+    if( !_root_group.get() )
+      return false;
+
+    EventVisitor visitor( EventVisitor::TRAVERSE_DOWN,
+                          event->getPos(),
+                          event->getDelta() );
+    if( !_root_group->accept(visitor) )
       return false;
+
+    // TODO create special events like click/dblclick etc.
+
+    return visitor.propagateEvent(event);
   }
 
   //----------------------------------------------------------------------------
@@ -382,6 +401,21 @@ namespace canvas
     if(    node->getParent()->getParent() == _node
         && node->getParent()->getNameString() == "placement" )
     {
+      bool placement_dirty = false;
+      BOOST_FOREACH(Placements& placements, _placements)
+      {
+        BOOST_FOREACH(PlacementPtr& placement, placements)
+        {
+          // check if change can be directly handled by placement
+          if(    placement->getProps() == node->getParent()
+              && !placement->childChanged(node) )
+            placement_dirty = true;
+        }
+      }
+
+      if( !placement_dirty )
+        return;
+
       // prevent double updates...
       for( size_t i = 0; i < _dirty_placements.size(); ++i )
       {