&windowFactory ),
_event_handler( new GUIEventHandler(this) ),
_transform( new osg::MatrixTransform ),
+ _cb_mouse_mode( this,
+ &GUIMgr::handleMouseMode,
+ fgGetNode("/devices/status/mice/mouse[0]/mode") ),
+ _handle_events(true),
_width(_props, "size[0]"),
_height(_props, "size[1]"),
_resize(canvas::Window::NONE),
//------------------------------------------------------------------------------
bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea)
{
- if( !_transform->getNumChildren() )
+ if( !_transform->getNumChildren() || !_handle_events )
return false;
namespace sc = simgear::canvas;
canvas::WindowPtr window =
static_cast<WindowUserData*>(layer->getChild(j)->getUserData())
->window.lock();
+
+ if( !window->isCapturingEvents() )
+ continue;
+
float margin = window->isResizable() ? resize_margin_pos : 0;
if( window->getRegion().contains( event->getScreenX(),
event->getScreenY(),
0, _height, 0, 1
));
}
+
+//------------------------------------------------------------------------------
+void GUIMgr::handleMouseMode(SGPropertyNode* node)
+{
+ // pass-through indicates events should pass through to the UI
+ _handle_events = fgGetNode("/input/mice/mouse[0]/mode", node->getIntValue())
+ ->getBoolValue("pass-through");
+}
osg::ref_ptr<GUIEventHandler> _event_handler;
osg::ref_ptr<osg::MatrixTransform> _transform;
+ SGPropertyChangeCallback<GUIMgr> _cb_mouse_mode;
+ bool _handle_events;
simgear::PropertyObject<int> _width,
_height;
canvas::WindowPtr getWindow(size_t i);
simgear::canvas::Placements
- addPlacement(SGPropertyNode*, simgear::canvas::CanvasPtr canvas );
+ addPlacement(SGPropertyNode*, simgear::canvas::CanvasPtr canvas);
bool handleMouse(const osgGA::GUIEventAdapter& ea);
void handleResize(int x, int y, int width, int height);
+ void handleMouseMode(SGPropertyNode* node);
};
#endif /* CANVAS_GUI_MGR_HXX_ */
node,
simgear::canvas::Style() ),
_resizable(false),
+ _capture_events(true),
_resize_top(node, "resize-top"),
_resize_right(node, "resize-right"),
_resize_bottom(node, "resize-bottom"),
doRaise(node);
else if( node->getNameString() == "resize" )
_resizable = node->getBoolValue();
+ else if( node->getNameString() == "capture-events" )
+ _capture_events = node->getBoolValue();
else
handled = false;
}
return _resizable;
}
+ //----------------------------------------------------------------------------
+ bool Window::isCapturingEvents() const
+ {
+ return _capture_events;
+ }
+
//----------------------------------------------------------------------------
bool Window::handleMouseEvent(const simgear::canvas::MouseEventPtr& event)
{
simgear::canvas::CanvasWeakPtr getCanvas() const;
bool isResizable() const;
+ bool isCapturingEvents() const;
bool handleMouseEvent(const simgear::canvas::MouseEventPtr& event);
protected:
simgear::canvas::Image _image;
- bool _resizable;
+ bool _resizable,
+ _capture_events;
simgear::PropertyObject<int> _resize_top,
_resize_right,