diff --git a/src/osgUI/ComboBox.cpp b/src/osgUI/ComboBox.cpp index 29272e0d0..6a738584b 100644 --- a/src/osgUI/ComboBox.cpp +++ b/src/osgUI/ComboBox.cpp @@ -40,6 +40,17 @@ bool ComboBox::handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event osgGA::GUIEventAdapter* ea = event->asGUIEventAdapter(); if (!ea) return false; + if (!getHasEventFocus()) + { + if (ea->getEventType()==osgGA::GUIEventAdapter::PUSH && _popup->getVisible()) + { + _popup->setVisible(false); + } + + return false; + } + + switch(ea->getEventType()) { case(osgGA::GUIEventAdapter::SCROLL): @@ -126,6 +137,10 @@ bool ComboBox::handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event _popup->setVisible(false); } } + else + { + _popup->setVisible(false); + } break; } case(osgGA::GUIEventAdapter::RELEASE): diff --git a/src/osgUI/LineEdit.cpp b/src/osgUI/LineEdit.cpp index 156e91b93..96000c749 100644 --- a/src/osgUI/LineEdit.cpp +++ b/src/osgUI/LineEdit.cpp @@ -32,6 +32,8 @@ LineEdit::LineEdit(const osgUI::LineEdit& label, const osg::CopyOp& copyop): bool LineEdit::handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event) { + if (!getHasEventFocus()) return false; + osgGA::GUIEventAdapter* ea = event->asGUIEventAdapter(); if (!ea) return false; diff --git a/src/osgUI/PushButton.cpp b/src/osgUI/PushButton.cpp index b346e7482..b421fae13 100644 --- a/src/osgUI/PushButton.cpp +++ b/src/osgUI/PushButton.cpp @@ -32,6 +32,8 @@ PushButton::PushButton(const osgUI::PushButton& pb, const osg::CopyOp& copyop): bool PushButton::handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event) { + if (!getHasEventFocus()) return false; + osgGA::GUIEventAdapter* ea = event->asGUIEventAdapter(); if (!ea) return false; diff --git a/src/osgUI/Widget.cpp b/src/osgUI/Widget.cpp index 69af9f1df..764672d05 100644 --- a/src/osgUI/Widget.cpp +++ b/src/osgUI/Widget.cpp @@ -212,20 +212,17 @@ void Widget::traverseImplementation(osg::NodeVisitor& nv) // OSG_NOTICE<<"EventTraversal getHasEventFocus()="<setEventHandled(true); + // signify that event has been taken by widget with focus - osgGA::EventQueue::Events& events = ev->getEvents(); - for(osgGA::EventQueue::Events::iterator itr = events.begin(); - itr != events.end(); - ++itr) + osgGA::EventQueue::Events& events = ev->getEvents(); + for(osgGA::EventQueue::Events::iterator itr = events.begin(); + itr != events.end(); + ++itr) + { + if (handle(ev, itr->get())) { - if (handle(ev, itr->get())) - { - (*itr)->setHandled(true); - } + (*itr)->setHandled(true); + ev->setEventHandled(true); } }