X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fcanvas%2FCanvasEventManager.hxx;h=5e3738c8a6a7287f159ced968e7a58fd20e07ffc;hb=d3a14bfd612efa7c7e2dda444bfc85fdbf2ebbcf;hp=8ec3cf7e702583f8d5282ec67c58836c7ff13588;hpb=4dfe36cdc160a6cac6a7bfd01f4e68cb6d35aeeb;p=simgear.git diff --git a/simgear/canvas/CanvasEventManager.hxx b/simgear/canvas/CanvasEventManager.hxx index 8ec3cf7e..5e3738c8 100644 --- a/simgear/canvas/CanvasEventManager.hxx +++ b/simgear/canvas/CanvasEventManager.hxx @@ -29,11 +29,22 @@ 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(); + } class EventManager { @@ -43,6 +54,9 @@ namespace canvas bool handleEvent( const MouseEventPtr& event, const EventPropagationPath& path ); + bool propagateEvent( const EventPtr& event, + const EventPropagationPath& path ); + protected: struct StampedPropagationPath { @@ -58,26 +72,39 @@ namespace canvas // TODO if we really need the paths modify to not copy around the paths // that much. - StampedPropagationPath _last_mouse_down, - _last_click; + 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) */ - void handleClick( const MouseEventPtr& event, + bool handleClick( const MouseEventPtr& event, const EventPropagationPath& path ); - bool propagateEvent( const EventPtr& event, - const EventPropagationPath& path ); + /** + * Handle mouseover/enter/out/leave + */ + bool handleMove( const MouseEventPtr& 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;