From 2dee8469307421182d1488da265b8e50f6c93b1c Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Sat, 8 Jun 2013 11:33:53 +0200 Subject: [PATCH] Base canvas::Window on simgear::canvas::Image --- src/Canvas/gui_mgr.cxx | 28 ++++++----------- src/Canvas/window.cxx | 69 ++++++++++++------------------------------ src/Canvas/window.hxx | 9 +----- 3 files changed, 31 insertions(+), 75 deletions(-) diff --git a/src/Canvas/gui_mgr.cxx b/src/Canvas/gui_mgr.cxx index 5ea1d8166..77ae16bde 100644 --- a/src/Canvas/gui_mgr.cxx +++ b/src/Canvas/gui_mgr.cxx @@ -92,19 +92,6 @@ class WindowPlacement: simgear::canvas::CanvasWeakPtr _canvas; }; -/** - * Store pointer to window as user data - */ -class WindowUserData: - public osg::Referenced -{ - public: - canvas::WindowWeakPtr window; - WindowUserData(canvas::WindowPtr window): - window(window) - {} -}; - //------------------------------------------------------------------------------ typedef boost::shared_ptr WindowPtr; WindowPtr windowFactory(SGPropertyNode* node) @@ -240,7 +227,7 @@ void GUIMgr::elementCreated(simgear::PropertyBasedElementPtr element) _transform->addChild(layer); } } - window->getGroup()->setUserData(new WindowUserData(window)); + layer->addChild(window->getGroup()); } @@ -345,8 +332,13 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea) { assert(layer->getChild(j)->getUserData()); canvas::WindowPtr window = - static_cast(layer->getChild(j)->getUserData()) - ->window.lock(); + boost::static_pointer_cast + ( + static_cast + ( + layer->getChild(j)->getUserData() + )->element + ); if( !window->isCapturingEvents() || !window->isVisible() ) continue; @@ -463,7 +455,7 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea) move_event->client_pos -= toOsg(last_mouse_over->getPosition()); move_event->local_pos = move_event->client_pos; - last_mouse_over->handleMouseEvent(move_event); + last_mouse_over->handleEvent(move_event); } _last_mouse_over = window_at_cursor; event->type = sc::Event::MOUSE_MOVE; @@ -488,7 +480,7 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea) { event->client_pos -= toOsg(target_window->getPosition()); event->local_pos = event->client_pos; - return target_window->handleMouseEvent(event); + return target_window->handleEvent(event); } else return false; diff --git a/src/Canvas/window.cxx b/src/Canvas/window.cxx index b42497024..3b5556a19 100644 --- a/src/Canvas/window.cxx +++ b/src/Canvas/window.cxx @@ -33,9 +33,8 @@ namespace canvas //---------------------------------------------------------------------------- Window::Window(SGPropertyNode* node): - PropertyBasedElement(node), + Image(sc::CanvasPtr(), node), _attributes_dirty(0), - _image(sc::CanvasPtr(), node), _resizable(false), _capture_events(true), _resize_top(node, "resize-top"), @@ -44,8 +43,6 @@ namespace canvas _resize_left(node, "resize-left"), _resize_status(node, "resize-status") { - _image.removeListener(); - node->setFloatValue("source/right", 1); node->setFloatValue("source/bottom", 1); node->setBoolValue("source/normalized", true); @@ -67,7 +64,7 @@ namespace canvas _attributes_dirty &= ~DECORATION; } - _image.update(delta_time_sec); + Image::update(delta_time_sec); } //---------------------------------------------------------------------------- @@ -95,37 +92,19 @@ namespace canvas } if( !handled ) - _image.valueChanged(node); - } - - //---------------------------------------------------------------------------- - void Window::childAdded(SGPropertyNode* parent, SGPropertyNode* child) - { - _image.childAdded(parent, child); - } - - //---------------------------------------------------------------------------- - void Window::childRemoved(SGPropertyNode* parent, SGPropertyNode* child) - { - _image.childRemoved(parent, child); + Image::valueChanged(node); } //---------------------------------------------------------------------------- osg::Group* Window::getGroup() { - return _image.getMatrixTransform(); - } - - //---------------------------------------------------------------------------- - const SGRect& Window::getRegion() const - { - return _image.getRegion(); + return getMatrixTransform(); } //---------------------------------------------------------------------------- const SGVec2 Window::getPosition() const { - const osg::Matrix& m = _image.getMatrixTransform()->getMatrix(); + const osg::Matrix& m = getMatrixTransform()->getMatrix(); return SGVec2( m(3, 0), m(3, 1) ); } @@ -139,13 +118,13 @@ namespace canvas void Window::setCanvas(sc::CanvasPtr canvas) { _canvas_content = canvas; - _image.setSrcCanvas(canvas); + setSrcCanvas(canvas); } //---------------------------------------------------------------------------- sc::CanvasWeakPtr Window::getCanvas() const { - return _image.getSrcCanvas(); + return getSrcCanvas(); } //---------------------------------------------------------------------------- @@ -154,12 +133,6 @@ namespace canvas return _canvas_decoration; } - //---------------------------------------------------------------------------- - bool Window::isVisible() const - { - return _image.isVisible(); - } - //---------------------------------------------------------------------------- bool Window::isResizable() const { @@ -172,12 +145,6 @@ namespace canvas return _capture_events; } - //---------------------------------------------------------------------------- - bool Window::handleMouseEvent(const sc::MouseEventPtr& event) - { - return _image.handleEvent(event); - } - //---------------------------------------------------------------------------- void Window::handleResize(uint8_t mode, const osg::Vec2f& delta) { @@ -212,13 +179,17 @@ namespace canvas if( node_raise && !node_raise->getBoolValue() ) return; + // Keep a reference to ensure the window is not deleted between removing and + // adding it back to the scenegraph + osg::ref_ptr window = getGroup(); + BOOST_FOREACH(osg::Group* parent, getGroup()->getParents()) { // Remove window... - parent->removeChild(getGroup()); + parent->removeChild(window); // ...and add again as topmost window - parent->addChild(getGroup()); + parent->addChild(window); } if( node_raise ) @@ -242,9 +213,9 @@ namespace canvas if( _decoration_border.isNone() && !shadow_radius ) { sc::CanvasPtr canvas_content = _canvas_content.lock(); - _image.setSrcCanvas(canvas_content); - _image.set("size[0]", canvas_content->getViewWidth()); - _image.set("size[1]", canvas_content->getViewHeight()); + setSrcCanvas(canvas_content); + set("size[0]", canvas_content->getViewWidth()); + set("size[1]", canvas_content->getViewHeight()); _image_content.reset(); _image_shadow.reset(); @@ -268,7 +239,7 @@ namespace canvas _canvas_decoration = mgr->createCanvas("window-decoration"); _canvas_decoration->getProps() ->setStringValue("background", "rgba(0,0,0,0)"); - _image.setSrcCanvas(_canvas_decoration); + setSrcCanvas(_canvas_decoration); _image_content = _canvas_decoration->getRootGroup() ->createChild("content"); @@ -297,9 +268,9 @@ namespace canvas _canvas_decoration->setViewWidth( outer_width ); _canvas_decoration->setViewHeight( outer_height ); - _image.set("size[0]", outer_width - shad2); - _image.set("size[1]", outer_height - shad2); - _image.set("outset", shadow_radius); + set("size[0]", outer_width - shad2); + set("size[1]", outer_height - shad2); + set("outset", shadow_radius); assert(_image_content); _image_content->set("x", shadow_radius + border.l); diff --git a/src/Canvas/window.hxx b/src/Canvas/window.hxx index 21e4844d2..9e47c4884 100644 --- a/src/Canvas/window.hxx +++ b/src/Canvas/window.hxx @@ -31,7 +31,7 @@ namespace canvas { class Window: - public simgear::PropertyBasedElement + public simgear::canvas::Image { public: @@ -50,11 +50,8 @@ namespace canvas virtual void update(double delta_time_sec); virtual void valueChanged(SGPropertyNode* node); - virtual void childAdded(SGPropertyNode* parent, SGPropertyNode* child); - virtual void childRemoved(SGPropertyNode* parent, SGPropertyNode* child); osg::Group* getGroup(); - const SGRect& getRegion() const; const SGVec2 getPosition() const; const SGRect getScreenRegion() const; @@ -63,12 +60,9 @@ namespace canvas simgear::canvas::CanvasPtr getCanvasDecoration(); - bool isVisible() const; bool isResizable() const; bool isCapturingEvents() const; - bool handleMouseEvent(const simgear::canvas::MouseEventPtr& event); - void handleResize(uint8_t mode, const osg::Vec2f& delta = osg::Vec2f()); void doRaise(SGPropertyNode* node_raise = 0); @@ -85,7 +79,6 @@ namespace canvas simgear::canvas::CanvasPtr _canvas_decoration; simgear::canvas::CanvasWeakPtr _canvas_content; - simgear::canvas::Image _image; simgear::canvas::ImagePtr _image_content, _image_shadow; -- 2.39.5