uint8_t _resize;
int _last_cursor;
+ osg::Vec2 _drag_start;
float _last_x,
_last_y;
double _last_scroll_time;
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<canvas::Window>(id);
- if( window )
- {
- window->setCanvasContent(canvas);
- placements.push_back(
- simgear::canvas::PlacementPtr(
- new WindowPlacement(node, window, canvas)
- ));
- }
- return placements;
- }
};
//------------------------------------------------------------------------------
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");
// Do not change values on reinit
_width.node()->setAttribute(SGPropertyNode::PRESERVE, true);
_height.node()->setAttribute(SGPropertyNode::PRESERVE, true);
+
+ // Do not restore windows on reinit (all windows will need to be recreated,
+ // but hey it's a reset ;-))
+ _node->setAttribute(SGPropertyNode::PRESERVE, true);
}
//------------------------------------------------------------------------------
_resize_window.reset();
break;
case osgGA::GUIEventAdapter::DRAG:
- _resize_window.lock()->handleResize(_resize, event->delta);
+ _resize_window.lock()->handleResize( _resize,
+ event->screen_pos - _drag_start );
return true;
default:
return false;
if( ea.getEventType() == osgGA::GUIEventAdapter::PUSH )
{
_resize_window = window_at_cursor;
+ _drag_start = event->screen_pos;
+
window_at_cursor->raise();
- window_at_cursor->handleResize( _resize | canvas::Window::INIT,
- event->delta );
+ window_at_cursor->handleResize(_resize | canvas::Window::INIT);
}
return true;
}
//------------------------------------------------------------------------------
-GUIMgr::GUIMgr():
- _desktop( new DesktopGroup ),
- _event_handler( new GUIEventHandler(
- boost::static_pointer_cast<DesktopGroup>(_desktop)
- ))
+GUIMgr::GUIMgr()
{
- // We handle the property listener manually within ::init and ::shutdown.
- _desktop->removeListener();
+
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void GUIMgr::init()
{
- boost::static_pointer_cast<DesktopGroup>(_desktop)->handleResize
+ DesktopPtr desktop( new DesktopGroup );
+ desktop->handleResize
(
0,
0,
fgGetInt("/sim/startup/xsize"),
fgGetInt("/sim/startup/ysize")
);
+ _desktop = desktop;
+ _event_handler = new GUIEventHandler(desktop);
globals->get_renderer()
->getViewer()
->getEventHandlers()
// GUI is on top of everything so lets install as first event handler
.push_front( _event_handler );
- _desktop->getProps()->addChangeListener(_desktop.get());
+ simgear::canvas::Canvas::addPlacementFactory
+ (
+ "window",
+ boost::bind(&GUIMgr::addWindowPlacement, this, _1, _2)
+ );
+
_desktop->getProps()->fireCreatedRecursive();
}
//------------------------------------------------------------------------------
void GUIMgr::shutdown()
{
- _desktop->getProps()->removeChangeListener(_desktop.get());
+ _desktop->destroy();
+ _desktop.reset();
+ simgear::canvas::Canvas::removePlacementFactory("window");
globals->get_renderer()
->getViewer()
->removeEventHandler( _event_handler );
+ _event_handler = 0;
}
//------------------------------------------------------------------------------
{
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<canvas::Window>(id);
+ if( window )
+ {
+ window->setCanvasContent(canvas);
+ placements.push_back(
+ simgear::canvas::PlacementPtr(
+ new WindowPlacement(placement, window, canvas)
+ ));
+ }
+ return placements;
+}