Canvas: allow dispatching events to Canavs itself

This commit is contained in:
Thomas Geymayer
2014-05-29 16:34:33 +02:00
parent dfdd1c6d5e
commit 0b21181f1a
6 changed files with 38 additions and 11 deletions

View File

@@ -326,11 +326,20 @@ namespace canvas
const EventListener& cb )
{
if( !_root_group.get() )
throw std::runtime_error("Canvas::AddEventListener: no root group!");
throw std::runtime_error("Canvas::addEventListener: no root group!");
return _root_group->addEventListener(type, cb);
}
//----------------------------------------------------------------------------
bool Canvas::dispatchEvent(const EventPtr& event)
{
if( !_root_group.get() )
throw std::runtime_error("Canvas::dispatchEvent: no root group!");
return _root_group->dispatchEvent(event);
}
//----------------------------------------------------------------------------
void Canvas::setSizeX(int sx)
{

View File

@@ -132,6 +132,7 @@ namespace canvas
void update(double delta_time_sec);
bool addEventListener(const std::string& type, const EventListener& cb);
bool dispatchEvent(const EventPtr& event);
void setSizeX(int sx);
void setSizeY(int sy);

View File

@@ -159,11 +159,17 @@ namespace canvas
}
//----------------------------------------------------------------------------
ElementPtr Element::getParent()
ElementPtr Element::getParent() const
{
return _parent;
}
//----------------------------------------------------------------------------
CanvasWeakPtr Element::getCanvas() const
{
return _canvas;
}
//----------------------------------------------------------------------------
void Element::update(double dt)
{
@@ -246,20 +252,31 @@ namespace canvas
}
//----------------------------------------------------------------------------
bool Element::handleEvent(EventPtr event)
bool Element::handleEvent(const EventPtr& event)
{
ListenerMap::iterator listeners = _listener.find(event->getType());
if( listeners == _listener.end() )
return false;
BOOST_FOREACH(EventListener const& listener, listeners->second)
listener(event);
try
{
listener(event);
}
catch( std::exception const& ex )
{
SG_LOG(
SG_GENERAL,
SG_WARN,
"canvas::Element: event handler error: '" << ex.what() << "'"
);
}
return true;
}
//----------------------------------------------------------------------------
bool Element::dispatchEvent(EventPtr event)
bool Element::dispatchEvent(const EventPtr& event)
{
EventPropagationPath path;
path.push_back( EventTarget(this) );

View File

@@ -95,7 +95,8 @@ namespace canvas
virtual ~Element() = 0;
virtual void onDestroy();
ElementPtr getParent();
ElementPtr getParent() const;
CanvasWeakPtr getCanvas() const;
/**
* Called every frame to update internal state
@@ -111,8 +112,8 @@ namespace canvas
virtual bool ascend(EventVisitor& visitor);
virtual bool traverse(EventVisitor& visitor);
virtual bool handleEvent(EventPtr event);
bool dispatchEvent(EventPtr event);
virtual bool handleEvent(const EventPtr& event);
bool dispatchEvent(const EventPtr& event);
/**
*

View File

@@ -441,7 +441,7 @@ namespace canvas
}
//----------------------------------------------------------------------------
bool Image::handleEvent(EventPtr event)
bool Image::handleEvent(const EventPtr& event)
{
bool handled = Element::handleEvent(event);
@@ -453,7 +453,6 @@ namespace canvas
if( mouse_event )
{
mouse_event.reset( new MouseEvent(*mouse_event) );
event = mouse_event;
mouse_event->client_pos = mouse_event->local_pos
- toOsg(_region.getMin());

View File

@@ -85,7 +85,7 @@ namespace canvas
const SGRect<float>& getRegion() const;
bool handleEvent(EventPtr event);
bool handleEvent(const EventPtr& event);
protected: