]> git.tdb.fi Git - libs/core.git/blob - source/io/eventdispatcher.cpp
Merge branch 'fs-master'
[libs/core.git] / source / io / eventdispatcher.cpp
1 #include <msp/time/units.h>
2 #include "base.h"
3 #include "eventdispatcher.h"
4 #include "eventobject.h"
5 #include "poll.h"
6
7 namespace Msp {
8 namespace IO {
9
10 EventDispatcher::EventDispatcher()
11 { }
12
13 void EventDispatcher::add(EventObject &obj)
14 {
15         SlotMap::iterator i = objects.find(&obj);
16         if(i==objects.end())
17         {
18                 i = objects.insert(SlotMap::value_type(&obj, Slot(&obj))).first;
19                 i->second.evch_conn = obj.signal_events_changed.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_events_changed), &obj));
20                 i->second.del_conn = obj.signal_deleted.connect(sigc::bind(sigc::mem_fun(this, &EventDispatcher::object_deleted), &obj));
21
22                 if(obj.get_events())
23                         poller.set_object(obj, obj.get_events());
24         }
25 }
26
27 void EventDispatcher::remove(EventObject &obj)
28 {
29         SlotMap::iterator i = objects.find(&obj);
30         if(i!=objects.end())
31         {
32                 i->second.evch_conn.disconnect();
33                 i->second.del_conn.disconnect();
34                 objects.erase(i);
35
36                 poller.set_object(obj, P_NONE);
37         }
38 }
39
40 void EventDispatcher::tick()
41 {
42         if(objects.empty())
43                 return;
44
45         if(poller.poll()>0)
46                 dispatch();
47 }
48
49 void EventDispatcher::tick(const Time::TimeDelta &dt)
50 {
51         if(objects.empty())
52                 return;
53
54         if(poller.poll(dt)>0)
55                 dispatch();
56 }
57
58 void EventDispatcher::object_events_changed(PollEvent ev, EventObject *obj)
59 {
60         poller.set_object(*obj, ev);
61 }
62
63 void EventDispatcher::object_deleted(EventObject *obj)
64 {
65         remove(*obj);
66 }
67
68 void EventDispatcher::dispatch()
69 {
70         const Poller::SlotList &result = poller.get_result();
71         for(Poller::SlotList::const_iterator i=result.begin(); i!=result.end(); ++i)
72                 i->object->event(i->events);
73 }
74
75 } // namespace IO
76 } // namespace Msp