X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Feventdispatcher.cpp;fp=source%2Fio%2Feventdispatcher.cpp;h=06a594f76d397165789940184f7c1a8d0ab65771;hp=0000000000000000000000000000000000000000;hb=6e0fd758970bcb5bad5e3f2454b694cc4d7b4b66;hpb=b97d4e9f86e90254ab9edef7ee62a910f6333c78 diff --git a/source/io/eventdispatcher.cpp b/source/io/eventdispatcher.cpp new file mode 100644 index 0000000..06a594f --- /dev/null +++ b/source/io/eventdispatcher.cpp @@ -0,0 +1,75 @@ +#include +#include "base.h" +#include "eventdispatcher.h" +#include "poll.h" + +namespace Msp { +namespace IO { + +EventDispatcher::EventDispatcher() +{ } + +void EventDispatcher::add(Base &obj) +{ + SlotMap::iterator i = objects.find(&obj); + if(i==objects.end()) + { + i = objects.insert(SlotMap::value_type(&obj, Slot(&obj))).first; + i->second.evch_conn = obj.signal_events_changed.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_events_changed), &obj)); + i->second.del_conn = obj.signal_deleted.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_deleted), &obj)); + + if(obj.get_events()) + poller.set_object(obj, obj.get_events()); + } +} + +void EventDispatcher::remove(Base &obj) +{ + SlotMap::iterator i = objects.find(&obj); + if(i!=objects.end()) + { + i->second.evch_conn.disconnect(); + i->second.del_conn.disconnect(); + objects.erase(i); + + poller.set_object(obj, P_NONE); + } +} + +void EventDispatcher::tick() +{ + if(objects.empty()) + return; + + if(poller.poll()>0) + dispatch(); +} + +void EventDispatcher::tick(const Time::TimeDelta &dt) +{ + if(objects.empty()) + return; + + if(poller.poll(dt)>0) + dispatch(); +} + +void EventDispatcher::object_events_changed(PollEvent ev, Base *obj) +{ + poller.set_object(*obj, ev); +} + +void EventDispatcher::object_deleted(Base *obj) +{ + remove(*obj); +} + +void EventDispatcher::dispatch() +{ + const Poller::SlotSeq &result = poller.get_result(); + for(Poller::SlotSeq::const_iterator i=result.begin(); i!=result.end(); ++i) + i->object->event(i->events); +} + +} // namespace IO +} // namespace Msp