1 module graphite.events.events;
2
3 import carbon.event;
4 //import graphite.types.point;
5
6 import std.array,
7 std.format,
8 std.string,
9 std.variant;
10
11 /+
12 struct Mouse
13 {
14 enum Type { pressed, moved, released, dragged, }
15
16 static:
17 bool pressed(int button = -1);
18 int x() @property;
19 int y() @property;
20 int previousX() @property;
21 int previousY() @property;
22 }
23
24
25 struct KeyBoard
26 {
27 static:
28 bool pressed(int key = -1);
29 }
30
31
32 struct AppRuntime
33 {
34 static:
35 void exit();
36 void setEscapeQuitsApp(bool bQuitOnEscape);
37 }
38
39
40 struct DragInfo
41 {
42 string[] files;
43 Point position;
44 }
45
46
47 struct EntryEventInfo
48 {
49 int state;
50 }
51
52
53 struct KeyEventInfo
54 {
55 enum Type{ pressed, released }
56 Type type;
57 int key;
58 }
59
60
61 struct MouseEventInfo
62 {
63 enum Type{ pressed, moved, released, dragged }
64 Type type;
65 int button;
66 }
67
68
69 struct TouchEventInfo
70 {
71 enum Type{down, up, move, doubleTap, cancel}
72 Type type;
73
74 int id;
75 int time;
76 int numTouches;
77 float width, height;
78 float angle;
79 float minoraxis, majoraxis;
80 float pressure;
81 float xspeed, yspeed;
82 float xaccel, yaccel;
83 }
84
85
86 struct AudioEventInfo
87 {
88 float[] buffer;
89 int nChannels;
90 }
91
92
93 struct ResizeEventInfo
94 {
95 int width;
96 int height;
97 }
98
99
100 final class CoreEvents
101 {
102 this(){}
103
104 Event!(Variant) setup, update, draw, exit;
105
106 Event!(EntryEventInfo) windowEntered;
107 Event!(ResizeEventInfo) windowResized;
108
109 Event!(KeyEventInfo) keyPressed, keyReleased;
110
111 Event!(MouseEventInfo) mouseMoved, mouseDragged, mousePressed, mouseReleased;
112
113 Event!(AudioEventInfo) audioReceived, audioRequested;
114
115 Event!(TouchEventInfo) touchDown, touchUp, touchMoved, touchDoubleTap, touchCancelled;
116
117 Event!(string) messageEvent;
118 Event!(DragInfo) fileDragEvent;
119
120
121 void disable()
122 {
123 setup.disable();
124 update.disable();
125 draw.disable();
126 exit.disable();
127 //windowEntered.disable();
128 //windowResized.disable();
129 keyPressed.disable();
130 keyReleased.disable();
131 mouseMoved.disable();
132 mouseDragged.disable();
133 mousePressed.disable();
134 mouseReleased.disable();
135 audioReceived.disable();
136 audioRequested.disable();
137 touchDown.disable();
138 touchUp.disable();
139 touchMoved.disable();
140 touchDoubleTap.disable();
141 touchCancelled.disable();
142 messageEvent.disable();
143 fileDragEvent.disable();
144 }
145
146
147 void enable()
148 {
149 setup.enable();
150 update.enable();
151 draw.enable();
152 exit.enable();
153 //windowEntered.enable();
154 //windowResized.enable();
155 keyPressed.enable();
156 keyReleased.enable();
157 mouseMoved.enable();
158 mouseDragged.enable();
159 mousePressed.enable();
160 mouseReleased.enable();
161 audioReceived.enable();
162 audioRequested.enable();
163 touchDown.enable();
164 touchUp.enable();
165 touchMoved.enable();
166 touchDoubleTap.enable();
167 touchCancelled.enable();
168 messageEvent.enable();
169 fileDragEvent.enable();
170 }
171
172
173 mixin(genMethods("MouseEvents", ["mouseMoved", "mouseDragged", "mousePressed", "mouseReleased"]));
174 mixin(genMethods("KeyEvents", ["keyPressed", "keyReleased"]));
175 mixin(genMethods("TouchEvents", ["touchDoubleTap", "touchDown", "touchMoved", "touchUp", "touchCancelled"]));
176 //mixin(genMethods("GetMessage", ["messageEvent"]));
177 //mixin(genMethods("DragEvents", ["fileDragEvent"]));
178
179
180 private:
181 static string genMethods(string name, string[] slots)
182 {
183 return format(q{
184 void connect%1$s(string method, ClassType)(ClassType obj)
185 {
186 foreach(e; TypeTuple!(%2$(%s,%)))
187 mixin("this." ~ e ~ ".connect!method(obj);");
188 }
189
190
191 void connect%1$s(ClassType, Args...)(ClassType obj, void delegate(ClassType obj, Args) dg)
192 {
193 foreach(e; TypeTuple!(%2$(%s,%)))
194 mixin("this." ~ e ~ ".connect(obj, dg);");
195 }
196
197
198 void strongConnect%1$s(Args...)(void delegate(ClassType obj, Args) dg)
199 {
200 foreach(e; TypeTuple!(%2$(%s,%)))
201 mixin("this." ~ e ~ ".strongConnect(dg);");
202 }
203
204
205 void disconnect%1$s(string method, ClassType)(ClassType obj)
206 {
207 foreach(e; TypeTuple!(%2$(%s,%)))
208 mixin("this." ~ e ~ ".disconnect!method(obj);");
209 }
210
211
212 void disconnect%1$s(ClassType, Args...)(ClassType obj, void delegate(ClassType obj, Args) dg)
213 {
214 foreach(e; TypeTuple!(%2$(%s,%)))
215 mixin("this." ~ e ~ ".disconnect!method(obj, dg);");
216 }
217
218
219 void disconnect%1$s(ClassType)(ClassType obj)
220 {
221 foreach(e; TypeTuple!(%2$(%s,%)))
222 mixin("this." ~ e ~ ".disconnect(obj);");
223 }
224
225
226 void strongDisconnect%1$s(Args...)(void delegate(Args) dg)
227 {
228 foreach(e; TypeTuple!(%2$(%s,%)))
229 mixin("this." ~ e ~ ".strongDisconnect(dg);");
230 }
231 }, name, slots);
232 }
233 }
234
235
236 CoreEvents globalEvents() @property
237 {
238 static CoreEvents events;
239 if(events is null)
240 events = new CoreEvents();
241
242 return events;
243 }
244 +/