From ff78d30cee14a169b92bc92dcbc17fbe6a90d6d5 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 1 Aug 2014 10:57:24 +0000 Subject: [PATCH] Moved responsiblity for checking current event focus onto Widget::handleImplementations(). Added support for closing CombinBox popup when the mouse is clicked outside the popup or combobox widget. git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14396 16af8721-9629-0410-8352-f15c8da7e697 --- src/osgUI/ComboBox.cpp | 15 +++++++++++++++ src/osgUI/LineEdit.cpp | 2 ++ src/osgUI/PushButton.cpp | 2 ++ src/osgUI/Widget.cpp | 21 +++++++++------------ 4 files changed, 28 insertions(+), 12 deletions(-) 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); } }