diff --git a/simgear/canvas/CanvasEvent.hxx b/simgear/canvas/CanvasEvent.hxx index 23da1048..fcda8690 100644 --- a/simgear/canvas/CanvasEvent.hxx +++ b/simgear/canvas/CanvasEvent.hxx @@ -65,6 +65,11 @@ namespace canvas // of the actual event instances. virtual ~Event(); + /** + * Clone event and set to the given type (Same type if not specified) + */ + virtual Event* clone(int type = 0) const = 0; + /** * Get whether this events support bubbling */ diff --git a/simgear/canvas/CanvasEventManager.cxx b/simgear/canvas/CanvasEventManager.cxx index 38bc59f9..9d9df35d 100644 --- a/simgear/canvas/CanvasEventManager.cxx +++ b/simgear/canvas/CanvasEventManager.cxx @@ -114,6 +114,8 @@ namespace canvas return handled; } case Event::DRAG: + case Event::DRAG_START: + case Event::DRAG_END: if( !_last_mouse_down.valid() ) return false; else diff --git a/simgear/canvas/CanvasEventTypes.hxx b/simgear/canvas/CanvasEventTypes.hxx index 8e1d9f1e..bbe1fe71 100644 --- a/simgear/canvas/CanvasEventTypes.hxx +++ b/simgear/canvas/CanvasEventTypes.hxx @@ -25,6 +25,8 @@ ENUM_MAPPING(MOUSE_UP, "mouseup", MouseEvent) ENUM_MAPPING(CLICK, "click", MouseEvent) ENUM_MAPPING(DBL_CLICK, "dblclick", MouseEvent) ENUM_MAPPING(DRAG, "drag", MouseEvent) +ENUM_MAPPING(DRAG_START, "dragstart", MouseEvent) +ENUM_MAPPING(DRAG_END, "dragend", MouseEvent) ENUM_MAPPING(WHEEL, "wheel", MouseEvent) ENUM_MAPPING(MOUSE_MOVE, "mousemove", MouseEvent) ENUM_MAPPING(MOUSE_OVER, "mouseover", MouseEvent) diff --git a/simgear/canvas/CanvasWindow.cxx b/simgear/canvas/CanvasWindow.cxx index 0e6b52bd..6ffd40d0 100644 --- a/simgear/canvas/CanvasWindow.cxx +++ b/simgear/canvas/CanvasWindow.cxx @@ -212,6 +212,19 @@ namespace canvas _resize_left = getRegion().l() + offset.x(); } + //---------------------------------------------------------------------------- + bool Window::handleEvent(const EventPtr& event) + { + if( auto mouse_event = dynamic_cast(event.get()) ) + { + mouse_event->local_pos = + mouse_event->client_pos = + mouse_event->screen_pos - toOsg(getPosition()); + } + + return Image::handleEvent(event); + } + //---------------------------------------------------------------------------- void Window::parseDecorationBorder(const std::string& str) { diff --git a/simgear/canvas/CanvasWindow.hxx b/simgear/canvas/CanvasWindow.hxx index 1605164f..c4f569ab 100644 --- a/simgear/canvas/CanvasWindow.hxx +++ b/simgear/canvas/CanvasWindow.hxx @@ -96,6 +96,8 @@ namespace canvas void handleResize( uint8_t mode, const osg::Vec2f& offset = osg::Vec2f() ); + bool handleEvent(const EventPtr& event) override; + protected: enum Attributes diff --git a/simgear/canvas/elements/CanvasElement.cxx b/simgear/canvas/elements/CanvasElement.cxx index 7efcd6f0..641fb876 100644 --- a/simgear/canvas/elements/CanvasElement.cxx +++ b/simgear/canvas/elements/CanvasElement.cxx @@ -271,8 +271,7 @@ namespace canvas //---------------------------------------------------------------------------- void Element::setFocus() { - CanvasPtr canvas = _canvas.lock(); - if( canvas ) + if( auto canvas = _canvas.lock() ) canvas->setFocusElement(this); } diff --git a/simgear/canvas/elements/CanvasImage.hxx b/simgear/canvas/elements/CanvasImage.hxx index 162349b1..8831b184 100644 --- a/simgear/canvas/elements/CanvasImage.hxx +++ b/simgear/canvas/elements/CanvasImage.hxx @@ -93,7 +93,7 @@ namespace canvas const SGRect& getRegion() const; - bool handleEvent(const EventPtr& event); + bool handleEvent(const EventPtr& event) override; /** * diff --git a/simgear/canvas/events/CustomEvent.cxx b/simgear/canvas/events/CustomEvent.cxx index 460c2f11..3aab6413 100644 --- a/simgear/canvas/events/CustomEvent.cxx +++ b/simgear/canvas/events/CustomEvent.cxx @@ -46,6 +46,14 @@ namespace canvas // assert( type_map.find(type_id) != type_map.end() ); } + //---------------------------------------------------------------------------- + CustomEvent* CustomEvent::clone(int type) const + { + auto event = new CustomEvent(*this); + event->type = type; + return event; + } + //---------------------------------------------------------------------------- void CustomEvent::setDetail(StringMap const& data) { diff --git a/simgear/canvas/events/CustomEvent.hxx b/simgear/canvas/events/CustomEvent.hxx index 50f5ff5a..dc139d46 100644 --- a/simgear/canvas/events/CustomEvent.hxx +++ b/simgear/canvas/events/CustomEvent.hxx @@ -58,6 +58,8 @@ namespace canvas bool bubbles = false, StringMap const& data = StringMap() ); + CustomEvent* clone(int type = 0) const override; + /** * Set user data */ diff --git a/simgear/canvas/events/KeyboardEvent.cxx b/simgear/canvas/events/KeyboardEvent.cxx index f5edbb09..2f6147c9 100644 --- a/simgear/canvas/events/KeyboardEvent.cxx +++ b/simgear/canvas/events/KeyboardEvent.cxx @@ -69,6 +69,14 @@ namespace canvas // // TODO what to do with wrong event type? } + //---------------------------------------------------------------------------- + KeyboardEvent* KeyboardEvent::clone(int type) const + { + auto event = new KeyboardEvent(*this); + event->type = type; + return event; + } + //---------------------------------------------------------------------------- void KeyboardEvent::setKey(uint32_t key) { diff --git a/simgear/canvas/events/KeyboardEvent.hxx b/simgear/canvas/events/KeyboardEvent.hxx index 9040437c..2a98ee6c 100644 --- a/simgear/canvas/events/KeyboardEvent.hxx +++ b/simgear/canvas/events/KeyboardEvent.hxx @@ -45,6 +45,7 @@ namespace canvas KeyboardEvent(); KeyboardEvent(const osgGA::GUIEventAdapter& ea); + KeyboardEvent* clone(int type = 0) const override; void setKey(uint32_t key); void setUnmodifiedKey(uint32_t key); diff --git a/simgear/canvas/events/MouseEvent.cxx b/simgear/canvas/events/MouseEvent.cxx index 3feccd28..e513f2da 100644 --- a/simgear/canvas/events/MouseEvent.cxx +++ b/simgear/canvas/events/MouseEvent.cxx @@ -48,6 +48,14 @@ namespace canvas button += 1; } + //---------------------------------------------------------------------------- + MouseEvent* MouseEvent::clone(int type) const + { + auto event = new MouseEvent(*this); + event->type = type; + return event; + } + //---------------------------------------------------------------------------- bool MouseEvent::canBubble() const { diff --git a/simgear/canvas/events/MouseEvent.hxx b/simgear/canvas/events/MouseEvent.hxx index f0a0b4a6..49377dbf 100644 --- a/simgear/canvas/events/MouseEvent.hxx +++ b/simgear/canvas/events/MouseEvent.hxx @@ -36,6 +36,7 @@ namespace canvas public: MouseEvent(); MouseEvent(const osgGA::GUIEventAdapter& ea); + MouseEvent* clone(int type = 0) const override; virtual bool canBubble() const;