From 42ab4fd22269b390fa81f79ab5266b900a5a455d Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Sun, 24 Nov 2013 15:50:44 +0100 Subject: [PATCH] Canvas/GUI: add/remove placement factories on init/shutdown. --- src/Canvas/canvas_mgr.cxx | 18 ++++++++++++- src/Canvas/canvas_mgr.hxx | 3 +++ src/Canvas/gui_mgr.cxx | 55 +++++++++++++++++++-------------------- src/Canvas/gui_mgr.hxx | 4 +++ 4 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/Canvas/canvas_mgr.cxx b/src/Canvas/canvas_mgr.cxx index 29a1228bc..113da4f0c 100644 --- a/src/Canvas/canvas_mgr.cxx +++ b/src/Canvas/canvas_mgr.cxx @@ -68,6 +68,12 @@ CanvasMgr::CanvasMgr(): &CanvasMgr::handleModelReinit, fgGetNode("/sim/signals/model-reinit", true) ) +{ + +} + +//---------------------------------------------------------------------------- +void CanvasMgr::init() { sc::Canvas::addPlacementFactory ( @@ -81,8 +87,18 @@ CanvasMgr::CanvasMgr(): _2 ) ); - sc::Canvas::addPlacementFactory("scenery-object", &addSceneObjectPlacement); + + simgear::canvas::CanvasMgr::init(); +} + +//---------------------------------------------------------------------------- +void CanvasMgr::shutdown() +{ + simgear::canvas::CanvasMgr::shutdown(); + + sc::Canvas::removePlacementFactory("object"); + sc::Canvas::removePlacementFactory("scenery-object"); } //------------------------------------------------------------------------------ diff --git a/src/Canvas/canvas_mgr.hxx b/src/Canvas/canvas_mgr.hxx index c1bf7e785..4bc712bd9 100644 --- a/src/Canvas/canvas_mgr.hxx +++ b/src/Canvas/canvas_mgr.hxx @@ -28,6 +28,9 @@ class CanvasMgr: public: CanvasMgr(); + virtual void init(); + virtual void shutdown(); + /** * Get OpenGL texture name for given canvas * diff --git a/src/Canvas/gui_mgr.cxx b/src/Canvas/gui_mgr.cxx index b501a2a40..9346e06de 100644 --- a/src/Canvas/gui_mgr.cxx +++ b/src/Canvas/gui_mgr.cxx @@ -136,27 +136,6 @@ class DesktopGroup: return Group::getChildFactory(type); } - - /** - * - */ - simgear::canvas::Placements - addPlacement(SGPropertyNode* node, simgear::canvas::CanvasPtr canvas) - { - const std::string& id = node->getStringValue("id"); - - simgear::canvas::Placements placements; - canvas::WindowPtr window = getChild(id); - if( window ) - { - window->setCanvasContent(canvas); - placements.push_back( - simgear::canvas::PlacementPtr( - new WindowPlacement(node, window, canvas) - )); - } - return placements; - } }; //------------------------------------------------------------------------------ @@ -199,13 +178,6 @@ DesktopGroup::DesktopGroup(): assert(camera); camera->addChild( getMatrixTransform() ); - simgear::canvas::Canvas::addPlacementFactory - ( - "window", - boost::bind(&DesktopGroup::addPlacement, this, _1, _2) - ); - - osg::StateSet* stateSet = _transform->getOrCreateStateSet(); stateSet->setDataVariance(osg::Object::STATIC); stateSet->setRenderBinDetails(1000, "RenderBin"); @@ -548,6 +520,12 @@ void GUIMgr::init() // GUI is on top of everything so lets install as first event handler .push_front( _event_handler ); + + simgear::canvas::Canvas::addPlacementFactory + ( + "window", + boost::bind(&GUIMgr::addWindowPlacement, this, _1, _2) + ); _desktop->getProps()->addChangeListener(_desktop.get()); _desktop->getProps()->fireCreatedRecursive(); } @@ -556,6 +534,7 @@ void GUIMgr::init() void GUIMgr::shutdown() { _desktop->getProps()->removeChangeListener(_desktop.get()); + simgear::canvas::Canvas::removePlacementFactory("window"); globals->get_renderer() ->getViewer() @@ -573,3 +552,23 @@ simgear::canvas::GroupPtr GUIMgr::getDesktop() { return _desktop; } + +//------------------------------------------------------------------------------ +simgear::canvas::Placements +GUIMgr::addWindowPlacement( SGPropertyNode* placement, + simgear::canvas::CanvasPtr canvas ) +{ + const std::string& id = placement->getStringValue("id"); + + simgear::canvas::Placements placements; + canvas::WindowPtr window = _desktop->getChild(id); + if( window ) + { + window->setCanvasContent(canvas); + placements.push_back( + simgear::canvas::PlacementPtr( + new WindowPlacement(placement, window, canvas) + )); + } + return placements; +} diff --git a/src/Canvas/gui_mgr.hxx b/src/Canvas/gui_mgr.hxx index 0b1287af3..770c8077c 100644 --- a/src/Canvas/gui_mgr.hxx +++ b/src/Canvas/gui_mgr.hxx @@ -58,6 +58,10 @@ class GUIMgr: simgear::canvas::GroupPtr _desktop; osg::ref_ptr _event_handler; + + simgear::canvas::Placements + addWindowPlacement( SGPropertyNode* placement, + simgear::canvas::CanvasPtr canvas ); }; #endif /* CANVAS_GUI_MGR_HXX_ */ -- 2.39.5