X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fcanvas%2FCanvasEventManager.hxx;h=5e3738c8a6a7287f159ced968e7a58fd20e07ffc;hb=d3a14bfd612efa7c7e2dda444bfc85fdbf2ebbcf;hp=efdd0b560ddf395c844acff6e861ca1f46d6f377;hpb=2d23c5351f294d9e2ac680430e5a678a778f850a;p=simgear.git diff --git a/simgear/canvas/CanvasEventManager.hxx b/simgear/canvas/CanvasEventManager.hxx index efdd0b56..5e3738c8 100644 --- a/simgear/canvas/CanvasEventManager.hxx +++ b/simgear/canvas/CanvasEventManager.hxx @@ -29,11 +29,18 @@ namespace canvas struct EventTarget { - ElementWeakPtr element; - osg::Vec2f local_pos, - local_delta; + ElementWeakPtr element; + + // Used as storage by EventManager during event propagation + mutable osg::Vec2f local_pos; + + EventTarget( Element* el, + const osg::Vec2f pos = osg::Vec2f() ): + element(el), + local_pos(pos) + {} }; - typedef std::deque EventPropagationPath; + inline bool operator==(const EventTarget& t1, const EventTarget& t2) { return t1.element.lock() == t2.element.lock(); @@ -47,6 +54,9 @@ namespace canvas bool handleEvent( const MouseEventPtr& event, const EventPropagationPath& path ); + bool propagateEvent( const EventPtr& event, + const EventPropagationPath& path ); + protected: struct StampedPropagationPath { @@ -62,11 +72,20 @@ 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_mouse_over; + StampedPropagationPath _last_mouse_over; size_t _current_click_count; + struct MouseEventInfo: + public StampedPropagationPath + { + int button; + osg::Vec2f pos; + + void set( const MouseEventPtr& event, + const EventPropagationPath& path ); + } _last_mouse_down, + _last_click; + /** * Propagate click event and handle multi-click (eg. create dblclick) */ @@ -79,16 +98,13 @@ namespace canvas bool handleMove( const MouseEventPtr& event, const EventPropagationPath& path ); - bool propagateEvent( const EventPtr& event, - const EventPropagationPath& path ); - /** * Check if two click events (either mousedown/up or two consecutive * clicks) are inside a maximum distance to still create a click or * dblclick event respectively. */ - bool checkClickDistance( const EventPropagationPath& path1, - const EventPropagationPath& path2 ) const; + bool checkClickDistance( const osg::Vec2f& pos1, + const osg::Vec2f& pos2 ) const; EventPropagationPath getCommonAncestor( const EventPropagationPath& path1, const EventPropagationPath& path2 ) const;