Further work on event handling in CompositeViewer

This commit is contained in:
Robert Osfield
2007-01-16 14:15:49 +00:00
parent c7211f41ec
commit 46b9c19fb5
2 changed files with 57 additions and 112 deletions

View File

@@ -734,8 +734,10 @@ void CompositeViewer::eventTraversal()
// osg::notify(osg::NOTICE)<<"CompositeViewer::frameEventTraversal()."<<std::endl; // osg::notify(osg::NOTICE)<<"CompositeViewer::frameEventTraversal()."<<std::endl;
// need to copy events from the GraphicsWindow's into local EventQueue; // need to copy events from the GraphicsWindow's into local EventQueue;
osgGA::EventQueue::Events events;
typedef std::map<osgViewer::View*, osgGA::EventQueue::Events> ViewEventsMap;
ViewEventsMap viewEventsMap;
Contexts contexts; Contexts contexts;
getContexts(contexts); getContexts(contexts);
@@ -894,7 +896,7 @@ void CompositeViewer::eventTraversal()
} }
} }
events.insert(events.end(), gw_events.begin(), gw_events.end()); viewEventsMap[masterView].insert( viewEventsMap[masterView].end(), gw_events.begin(), gw_events.end() );
} }
} }
@@ -903,6 +905,16 @@ void CompositeViewer::eventTraversal()
// osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl; // osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl;
for(Views::iterator vitr = _views.begin();
vitr != _views.end();
++vitr)
{
View* view = vitr->get();
view->getEventQueue()->frame( getFrameStamp()->getReferenceTime() );
view->getEventQueue()->takeEvents(viewEventsMap[view]);
}
#if 0
_eventQueue->getCurrentEventState()->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); _eventQueue->getCurrentEventState()->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
_eventQueue->getCurrentEventState()->setX(eventState->getX()); _eventQueue->getCurrentEventState()->setX(eventState->getX());
_eventQueue->getCurrentEventState()->setY(eventState->getY()); _eventQueue->getCurrentEventState()->setY(eventState->getY());
@@ -911,138 +923,64 @@ void CompositeViewer::eventTraversal()
_eventQueue->frame( getFrameStamp()->getReferenceTime() ); _eventQueue->frame( getFrameStamp()->getReferenceTime() );
_eventQueue->takeEvents(events); _eventQueue->takeEvents(events);
#if 0
// osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl;
for(osgGA::EventQueue::Events::iterator itr = events.begin();
itr != events.end();
++itr)
{
osgGA::GUIEventAdapter* event = itr->get();
switch(event->getEventType())
{
case(osgGA::GUIEventAdapter::PUSH):
osg::notify(osg::NOTICE)<<" PUSH "<<event->getButton()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
break;
case(osgGA::GUIEventAdapter::RELEASE):
osg::notify(osg::NOTICE)<<" RELEASE "<<event->getButton()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
break;
case(osgGA::GUIEventAdapter::DRAG):
osg::notify(osg::NOTICE)<<" DRAG "<<event->getButtonMask()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
break;
case(osgGA::GUIEventAdapter::MOVE):
osg::notify(osg::NOTICE)<<" MOVE "<<event->getButtonMask()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
break;
case(osgGA::GUIEventAdapter::SCROLL):
osg::notify(osg::NOTICE)<<" SCROLL "<<event->getScrollingMotion()<<std::endl;
break;
case(osgGA::GUIEventAdapter::KEYDOWN):
osg::notify(osg::NOTICE)<<" KEYDOWN '"<<(char)event->getKey()<<"'"<<std::endl;
break;
case(osgGA::GUIEventAdapter::KEYUP):
osg::notify(osg::NOTICE)<<" KEYUP '"<<(char)event->getKey()<<"'"<<std::endl;
break;
case(osgGA::GUIEventAdapter::RESIZE):
osg::notify(osg::NOTICE)<<" RESIZE "<<event->getWindowX()<<"/"<<event->getWindowY()<<" x "<<event->getWindowWidth()<<"/"<<event->getWindowHeight() << std::endl;
break;
case(osgGA::GUIEventAdapter::QUIT_APPLICATION):
osg::notify(osg::NOTICE)<<" QUIT_APPLICATION " << std::endl;
break;
case(osgGA::GUIEventAdapter::FRAME):
// osg::notify(osg::NOTICE)<<" FRAME "<<std::endl;
break;
default:
// osg::notify(osg::NOTICE)<<" Event not handled"<<std::endl;
break;
}
}
#endif #endif
// osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl; // osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl;
if ((_keyEventSetsDone!=0) || _quitEventSetsDone) if ((_keyEventSetsDone!=0) || _quitEventSetsDone)
{ {
for(osgGA::EventQueue::Events::iterator itr = events.begin(); for(ViewEventsMap::iterator veitr = viewEventsMap.begin();
itr != events.end(); veitr != viewEventsMap.end();
++itr) ++veitr)
{ {
osgGA::GUIEventAdapter* event = itr->get(); for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
switch(event->getEventType()) itr != veitr->second.end();
++itr)
{ {
case(osgGA::GUIEventAdapter::KEYUP): osgGA::GUIEventAdapter* event = itr->get();
if (_keyEventSetsDone && event->getKey()==_keyEventSetsDone) _done = true; switch(event->getEventType())
break; {
case(osgGA::GUIEventAdapter::KEYUP):
case(osgGA::GUIEventAdapter::QUIT_APPLICATION): if (_keyEventSetsDone && event->getKey()==_keyEventSetsDone) _done = true;
if (_quitEventSetsDone) _done = true; break;
break;
case(osgGA::GUIEventAdapter::QUIT_APPLICATION):
default: if (_quitEventSetsDone) _done = true;
break; break;
default:
break;
}
} }
} }
} }
if (_done) return; if (_done) return;
if (getViewWithFocus()) for(ViewEventsMap::iterator veitr = viewEventsMap.begin();
veitr != viewEventsMap.end();
++veitr)
{ {
View* view = getViewWithFocus(); View* view = veitr->first;
for(osgGA::EventQueue::Events::iterator itr = events.begin(); for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
itr != events.end(); itr != veitr->second.end();
++itr) ++itr)
{ {
osgGA::GUIEventAdapter* event = itr->get(); osgGA::GUIEventAdapter* event = itr->get();
if (event->getEventType()!=osgGA::GUIEventAdapter::FRAME) bool handled = false;
{
bool handled = false;
if (view->getCameraManipulator()) if (view->getCameraManipulator())
{ {
view->getCameraManipulator()->handle( *event, *this); view->getCameraManipulator()->handle( *event, *view);
}
#if 0
for(EventHandlers::iterator hitr = view->getEventHandlers().begin();
hitr != view->getEventHandlers().end() && !handled;
++hitr)
{
handled = (*hitr)->handle( *event, *this, 0, 0);
}
#endif
} }
}
}
for(Views::iterator vitr = _views.begin();
vitr != _views.end();
++vitr)
{
View* view = vitr->get();
for(osgGA::EventQueue::Events::iterator itr = events.begin();
itr != events.end();
++itr)
{
osgGA::GUIEventAdapter* event = itr->get();
if (event->getEventType()==osgGA::GUIEventAdapter::FRAME) for(View::EventHandlers::iterator hitr = view->getEventHandlers().begin();
hitr != view->getEventHandlers().end() && !handled;
++hitr)
{ {
bool handled = false; handled = (*hitr)->handle( *event, *view, 0, 0);
if (view->getCameraManipulator())
{
view->getCameraManipulator()->handle( *event, *this);
}
#if 0
for(EventHandlers::iterator hitr = view->getEventHandlers().begin();
hitr != view->getEventHandlers().end() && !handled;
++hitr)
{
handled = (*hitr)->handle( *event, *this, 0, 0);
}
#endif
} }
} }
} }
@@ -1186,4 +1124,5 @@ void CompositeViewer::requestContinuousUpdate(bool)
void CompositeViewer::requestWarpPointer(float x,float y) void CompositeViewer::requestWarpPointer(float x,float y)
{ {
osg::notify(osg::NOTICE)<<"CompositeViewer::requestWarpPointer("<<x<<","<<y<<")"<<std::endl;
} }

View File

@@ -312,6 +312,8 @@ void View::requestContinuousUpdate(bool)
void View::requestWarpPointer(float x,float y) void View::requestWarpPointer(float x,float y)
{ {
osg::notify(osg::NOTICE)<<"View::requestWarpPointer("<<x<<","<<y<<")"<<std::endl;
float local_x, local_y; float local_x, local_y;
const osg::Camera* camera = getCameraContainingPosition(x, y, local_x, local_y); const osg::Camera* camera = getCameraContainingPosition(x, y, local_x, local_y);
if (camera) if (camera)
@@ -326,6 +328,10 @@ void View::requestWarpPointer(float x,float y)
const_cast<osgViewer::GraphicsWindow*>(gw)->requestWarpPointer(local_x, local_y); const_cast<osgViewer::GraphicsWindow*>(gw)->requestWarpPointer(local_x, local_y);
} }
} }
else
{
osg::notify(osg::NOTICE)<<"View::requestWarpPointer failed no camera containing pointer"<<std::endl;
}
} }
bool View::containsCamera(const osg::Camera* camera) const bool View::containsCamera(const osg::Camera* camera) const