Mercurial > projects > doodle
annotate doodle/tk/events.d @ 67:31d10176415d
Checkpoint
author | daveb |
---|---|
date | Fri, 13 Aug 2010 15:28:04 +0930 |
parents | eb5436b47d13 |
children | 5cc2de64f6d0 |
rev | line source |
---|---|
28
1754cb773d41
Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents:
17
diff
changeset
|
1 module doodle.tk.events; |
0 | 2 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
3 public { |
28
1754cb773d41
Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents:
17
diff
changeset
|
4 import doodle.tk.geometry; |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
5 } |
0 | 6 |
67 | 7 private { |
8 import std.typecons; | |
9 } | |
10 | |
11 mixin(defineEnum!("ButtonAction", | |
12 "SINGLE_PRESS", "DOUBLE_PRESS", "TRIPLE_PRESS", "RELEASE")); | |
13 | |
14 mixin(defineEnum!("ButtonName", | |
15 "LEFT", "MIDDLE", "RIGHT", "FOUR", "FIVE")); | |
16 | |
17 mixin(defineEnum!("ScrollDirection", | |
18 "UP", "DOWN", "LEFT", "RIGHT")); | |
19 | |
20 mixin(defineEnum!("Modifier", | |
21 "SHIFT", "CAPS_LOCK", "CONTROL", "ALT", "NUM_LOCK", "META", | |
22 "SCROLL_LOCK", "LEFT_BUTTON", "MIDDLE_BUTTON", "RIGHT_BUTTON", | |
23 "UNUSED_BUTTON_1", "UNUSED_BUTTON_2")); | |
24 | |
25 mixin(defineEnum!("CrossingMode", // FIXME what to do about GRAB2/UNGRAB2 | |
26 "NORMAL", "GRAB", "UNGRAB", "GRAB2", "UNGRAB2", "STATE_CHANGED")); | |
27 | |
28 struct Mask { | |
29 this(in Modifier[] modifiers) { | |
30 foreach (m; modifiers) { | |
31 _bits |= 1 << m; | |
32 } | |
33 } | |
34 | |
35 string toString() { | |
36 if (_bits == 0) { | |
37 return "<NO_MASK>"; | |
38 } | |
39 else { | |
40 string s = ""; | |
41 | |
42 for (int i = 0; i < _bits.sizeof * 8; ++i) { | |
43 if (_bits & (1 << i)) { | |
44 if (s.length != 0) s ~= "|"; | |
45 s ~= enumToString(cast(Modifier)i); | |
46 } | |
47 } | |
48 | |
49 return s; | |
50 } | |
51 } | |
52 | |
53 bool isSet(in Modifier m) const { return _bits & (1 << m); } | |
54 bool isUnset(in Modifier m) const { return !isSet(m); } | |
55 | |
56 private immutable ushort _bits; | |
57 } | |
58 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
58
diff
changeset
|
59 // FIXME |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
60 // Do we need FocusEvent. Note, it has no mask. |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
58
diff
changeset
|
61 // Hence would need to refactor hierarchy slightly, eg InputEvent |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
58
diff
changeset
|
62 |
0 | 63 abstract class Event { |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
64 this(in Mask mask) { |
48 | 65 _mask = mask; |
0 | 66 } |
67 | |
48 | 68 Mask mask() const { return _mask; } |
0 | 69 |
70 private { | |
48 | 71 Mask _mask; |
0 | 72 } |
73 } | |
74 | |
13 | 75 final class KeyEvent : Event { |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
76 this(in string str, in uint value, in Mask mask) { |
0 | 77 super(mask); |
48 | 78 _str = str; |
79 _value = value; | |
0 | 80 } |
81 | |
48 | 82 string str() const { return _str; } |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
58
diff
changeset
|
83 uint value() const { return _value; } |
0 | 84 |
5 | 85 override string toString() const { |
48 | 86 return std.string.format("Key event: %s, %d, %s", _str, _value, _mask); |
0 | 87 } |
88 | |
89 private { | |
48 | 90 string _str; |
91 uint _value; | |
0 | 92 } |
93 } | |
94 | |
13 | 95 abstract class PointerEvent : Event { |
48 | 96 this(in Point pixelPoint, in Point modelPoint, in Mask mask) { |
0 | 97 super(mask); |
48 | 98 _pixelPoint = pixelPoint; |
99 _modelPoint = modelPoint; | |
0 | 100 } |
101 | |
48 | 102 Point pixelPoint() const { return _pixelPoint; } |
103 Point modelPoint() const { return _modelPoint; } | |
0 | 104 |
105 private { | |
48 | 106 Point _pixelPoint; |
107 Point _modelPoint; | |
0 | 108 } |
109 } | |
110 | |
33
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
111 final class CrossingEvent : PointerEvent { |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
112 this(in CrossingMode crossingMode, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
113 in Point pixelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
114 in Point modelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
115 in Mask mask) { |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
116 super(pixelPoint, modelPoint, mask); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
117 _crossingMode = crossingMode; |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
118 } |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
119 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
120 CrossingMode crossingMode() const { return _crossingMode; } |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
121 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
122 override string toString() const { |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
123 return std.string.format("Crossing event: %s, %s, %s, %s", enumToString(_crossingMode), pixelPoint, modelPoint, mask); |
33
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
124 } |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
125 |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
126 private { |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
127 CrossingMode _crossingMode; |
33
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
128 } |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
129 } |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
130 |
0 | 131 final class ButtonEvent : PointerEvent { |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
132 this(in ButtonAction buttonAction, |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
133 in ButtonName buttonName, |
48 | 134 in Point pixelPoint, |
135 in Point modelPoint, | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
136 in Mask mask) { |
48 | 137 super(pixelPoint, modelPoint, mask); |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
138 _buttonAction = buttonAction; |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
139 _buttonName = buttonName; |
0 | 140 } |
141 | |
5 | 142 override string toString() const { |
8 | 143 return std.string.format("Button event: %s, %s, %s, %s, %s", |
48 | 144 enumToString(_buttonAction), enumToString(_buttonName), |
145 _pixelPoint, _modelPoint, _mask); | |
0 | 146 } |
147 | |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
148 ButtonAction buttonAction() const { return _buttonAction; } |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
149 ButtonName buttonName() const { return _buttonName; } |
0 | 150 |
151 private { | |
48 | 152 ButtonAction _buttonAction; |
153 ButtonName _buttonName; | |
0 | 154 } |
155 } | |
156 | |
157 final class MotionEvent : PointerEvent { | |
48 | 158 this(in Point pixelPoint, |
159 in Point modelPoint, | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
160 in Mask mask) { |
48 | 161 super(pixelPoint, modelPoint, mask); |
0 | 162 } |
163 | |
5 | 164 override string toString() const { |
8 | 165 return std.string.format("Motion event: %s, %s, %s", |
48 | 166 _pixelPoint, _modelPoint, _mask); |
0 | 167 } |
168 } | |
169 | |
170 final class ScrollEvent : PointerEvent { | |
48 | 171 this(in ScrollDirection scrollDirection, |
172 in Point pixelPoint, | |
173 in Point modelPoint, | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
174 in Mask mask) { |
48 | 175 super(pixelPoint, modelPoint, mask); |
176 _scrollDirection = scrollDirection; | |
0 | 177 } |
178 | |
5 | 179 override string toString() const { |
8 | 180 return std.string.format("Scroll event: %s, %s, %s, %s", |
48 | 181 enumToString(_scrollDirection), _pixelPoint, _modelPoint, _mask); |
0 | 182 } |
183 | |
48 | 184 ScrollDirection scrollDirection() const { return _scrollDirection; } |
0 | 185 |
186 private { | |
48 | 187 ScrollDirection _scrollDirection; |
0 | 188 } |
189 } |