return false;
else
return propagateEvent(event, _last_mouse_down.path);
- case Event::WHEEL:
case Event::MOUSE_MOVE:
+ handleMove(event, path);
+ break;
+ case Event::MOUSE_LEAVE:
+ // Mouse leaves window and therefore also current mouseover element
+ handleMove(event, EventPropagationPath());
+ return true;
+ case Event::WHEEL:
break;
default:
return false;
_last_click = StampedPropagationPath(path, event->getTime());
}
+ //----------------------------------------------------------------------------
+ void EventManager::handleMove( const MouseEventPtr& event,
+ const EventPropagationPath& path )
+ {
+ if( _last_mouse_over.path == path )
+ return;
+
+ if( !_last_mouse_over.path.empty() )
+ {
+ MouseEventPtr mouseout(new MouseEvent(*event));
+ mouseout->type = Event::MOUSE_OUT;
+ propagateEvent(mouseout, _last_mouse_over.path);
+ }
+
+ if( !path.empty() )
+ {
+ MouseEventPtr mouseover(new MouseEvent(*event));
+ mouseover->type = Event::MOUSE_OVER;
+ propagateEvent(mouseover, path);
+ }
+
+ _last_mouse_over.path = path;
+ }
+
//----------------------------------------------------------------------------
bool EventManager::propagateEvent( const EventPtr& event,
const EventPropagationPath& path )
local_delta;
};
typedef std::deque<EventTarget> EventPropagationPath;
+ inline bool operator==(const EventTarget& t1, const EventTarget& t2)
+ {
+ return t1.element.lock() == t2.element.lock();
+ }
class EventManager
{
// TODO if we really need the paths modify to not copy around the paths
// that much.
StampedPropagationPath _last_mouse_down,
- _last_click;
+ _last_click,
+ _last_mouse_over;
size_t _current_click_count;
/**
void handleClick( const MouseEventPtr& event,
const EventPropagationPath& path );
+ /**
+ * Handle mouseover/enter/out/leave
+ */
+ void handleMove( const MouseEventPtr& event,
+ const EventPropagationPath& path );
+
bool propagateEvent( const EventPtr& event,
const EventPropagationPath& path );