//----------------------------------------------------------------------------
bool Canvas::handleMouseEvent(const MouseEventPtr& event)
{
- _mouse_x = event->pos.x();
- _mouse_y = event->pos.y();
+ _mouse_x = event->client_pos.x();
+ _mouse_y = event->client_pos.y();
_mouse_dx = event->delta.x();
_mouse_dy = event->delta.y();
_mouse_button = event->button;
return false;
EventVisitor visitor( EventVisitor::TRAVERSE_DOWN,
- event->getPos(),
+ event->getClientPos(),
event->getDelta() );
if( !_root_group->accept(visitor) )
return false;
// (eg. removed by another event handler)
continue;
- if( mouse_event && event->type != Event::DRAG )
- {
- // TODO transform pos and delta for drag events. Maybe we should just
- // store the global coordinates and convert to local coordinates
- // on demand.
-
- // Position and delta are specified in local coordinate system of
- // current element
- mouse_event->pos = it->local_pos;
- mouse_event->delta = it->local_delta;
- }
+ // TODO provide functions to convert position and delta to local
+ // coordinates on demand. Events shouldn't contain informations in
+ // local coordinates as they might differe between different elements
+ // receiving the same event.
+// if( mouse_event && event->type != Event::DRAG )
+// {
+// // TODO transform pos and delta for drag events. Maybe we should just
+// // store the global coordinates and convert to local coordinates
+// // on demand.
+//
+// // Position and delta are specified in local coordinate system of
+// // current element
+// mouse_event->pos = it->local_pos;
+// mouse_event->delta = it->local_delta;
+// }
el->callListeners(event);
click_count(0)
{}
- osg::Vec2f getPos() const { return pos; }
- osg::Vec3f getPos3() const { return osg::Vec3f(pos, 0); }
+ osg::Vec2f getScreenPos() const { return screen_pos; }
+ osg::Vec2f getClientPos() const { return client_pos; }
osg::Vec2f getDelta() const { return delta; }
- float getPosX() const { return pos.x(); }
- float getPosY() const { return pos.y(); }
+ float getScreenX() const { return screen_pos.x(); }
+ float getScreenY() const { return screen_pos.y(); }
+
+ float getClientX() const { return client_pos.x(); }
+ float getClientY() const { return client_pos.y(); }
float getDeltaX() const { return delta.x(); }
float getDeltaY() const { return delta.y(); }
int getCurrentClickCount() const { return click_count; }
- osg::Vec2f pos,
+ osg::Vec2f screen_pos, //<! Position in screen coordinates
+ client_pos, //<! Position in window/canvas coordinates
delta;
int button, //<! Button for this event
state, //<! Current button state