Canvas: create mouseover/mouseout events

This commit is contained in:
Thomas Geymayer 2012-12-16 18:52:20 +01:00
parent e9c70f8b1c
commit f6270ec395
2 changed files with 43 additions and 2 deletions

View File

@ -98,8 +98,14 @@ namespace canvas
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;
@ -147,6 +153,30 @@ namespace canvas
_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 )

View File

@ -34,6 +34,10 @@ namespace canvas
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
{
@ -59,7 +63,8 @@ namespace canvas
// 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;
/**
@ -68,6 +73,12 @@ namespace canvas
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 );