Canvas: Fix handling drag events and some cleanup.
This commit is contained in:
parent
fc49be1e05
commit
4dfe36cdc1
@ -28,6 +28,38 @@ namespace canvas
|
||||
const unsigned int drag_threshold = 8;
|
||||
const double multi_click_timeout = 0.4;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
EventManager::StampedPropagationPath::StampedPropagationPath():
|
||||
time(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
EventManager::StampedPropagationPath::StampedPropagationPath(
|
||||
const EventPropagationPath& path,
|
||||
double time
|
||||
):
|
||||
path(path),
|
||||
time(time)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void EventManager::StampedPropagationPath::clear()
|
||||
{
|
||||
path.clear();
|
||||
time = 0;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool EventManager::StampedPropagationPath::valid() const
|
||||
{
|
||||
return !path.empty() && time > 0;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
EventManager::EventManager():
|
||||
_current_click_count(0)
|
||||
@ -39,7 +71,6 @@ namespace canvas
|
||||
bool EventManager::handleEvent( const MouseEventPtr& event,
|
||||
const EventPropagationPath& path )
|
||||
{
|
||||
propagateEvent(event, path);
|
||||
switch( event->type )
|
||||
{
|
||||
case Event::MOUSE_DOWN:
|
||||
@ -51,16 +82,30 @@ namespace canvas
|
||||
// Ignore mouse up without any previous mouse down
|
||||
return false;
|
||||
|
||||
// normal mouseup
|
||||
propagateEvent(event, path);
|
||||
|
||||
// now handle click/dblclick
|
||||
if( checkClickDistance(path, _last_mouse_down.path) )
|
||||
handleClick(event, getCommonAncestor(_last_mouse_down.path, path));
|
||||
|
||||
break;
|
||||
_last_mouse_down.clear();
|
||||
|
||||
return true;
|
||||
}
|
||||
case Event::DRAG:
|
||||
if( !_last_mouse_down.valid() )
|
||||
return false;
|
||||
else
|
||||
return propagateEvent(event, _last_mouse_down.path);
|
||||
case Event::WHEEL:
|
||||
case Event::MOUSE_MOVE:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return propagateEvent(event, path);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -135,8 +180,12 @@ namespace canvas
|
||||
// (eg. removed by another event handler)
|
||||
continue;
|
||||
|
||||
if( mouse_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;
|
||||
|
@ -46,14 +46,11 @@ namespace canvas
|
||||
protected:
|
||||
struct StampedPropagationPath
|
||||
{
|
||||
StampedPropagationPath():
|
||||
time(0)
|
||||
{}
|
||||
StampedPropagationPath();
|
||||
StampedPropagationPath(const EventPropagationPath& path, double time);
|
||||
|
||||
StampedPropagationPath(const EventPropagationPath& path, double time):
|
||||
path(path),
|
||||
time(time)
|
||||
{}
|
||||
void clear();
|
||||
bool valid() const;
|
||||
|
||||
EventPropagationPath path;
|
||||
double time;
|
||||
|
Loading…
Reference in New Issue
Block a user