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