Mercurial > projects > doodle
annotate doodle/tk/events.d @ 105:7abaf5c3959f
Merge
author | David Bryant <bagnose@gmail.com> |
---|---|
date | Sun, 20 Feb 2011 22:27:06 +1030 |
parents | ab745d8b10e5 523269b36711 |
children | 89016abde9fe |
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; |
81 | 5 import doodle.tk.screen_model; |
72
5cc2de64f6d0
Cautious Saturday night commits
"David Bryant <bagnose@gmail.com>"
parents:
67
diff
changeset
|
6 import gtkc.gdktypes; |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
7 } |
0 | 8 |
67 | 9 private { |
101 | 10 import std.conv; |
67 | 11 } |
12 | |
104 | 13 enum ButtonAction { |
14 SINGLE_PRESS, | |
15 DOUBLE_PRESS, | |
16 TRIPLE_PRESS, | |
17 RELEASE | |
18 } | |
19 | |
20 enum ButtonName { | |
21 LEFT, | |
22 MIDDLE, | |
23 RIGHT, | |
24 FOUR, | |
25 FIVE | |
67 | 26 } |
27 | |
104 | 28 enum ScrollDirection { |
29 UP, | |
30 DOWN, | |
31 LEFT, | |
32 RIGHT | |
33 } | |
67 | 34 |
104 | 35 enum Modifier { |
36 SHIFT, | |
37 CAPS_LOCK, | |
38 CONTROL, | |
39 ALT, | |
40 NUM_LOCK, | |
41 META, | |
42 SCROLL_LOCK, | |
43 LEFT_BUTTON, | |
44 MIDDLE_BUTTON, | |
45 RIGHT_BUTTON, | |
46 UNUSED_BUTTON_1, | |
47 UNUSED_BUTTON_2 | |
48 } | |
67 | 49 |
104 | 50 enum CrossingMode { // FIXME what to do about GRAB2/UNGRAB2 |
51 NORMAL, | |
52 GRAB, | |
53 UNGRAB, | |
54 GRAB2, | |
55 UNGRAB2, | |
56 STATE_CHANGED | |
57 } | |
67 | 58 |
59 struct Mask { | |
60 this(in Modifier[] modifiers) { | |
61 foreach (m; modifiers) { | |
62 _bits |= 1 << m; | |
63 } | |
64 } | |
65 | |
66 string toString() { | |
67 if (_bits == 0) { | |
68 return "<NO_MASK>"; | |
69 } | |
70 else { | |
71 string s = ""; | |
72 | |
73 for (int i = 0; i < _bits.sizeof * 8; ++i) { | |
74 if (_bits & (1 << i)) { | |
75 if (s.length != 0) s ~= "|"; | |
101 | 76 s ~= to!string(cast(Modifier)i); |
67 | 77 } |
78 } | |
79 | |
80 return s; | |
81 } | |
82 } | |
83 | |
84 bool isSet(in Modifier m) const { return _bits & (1 << m); } | |
85 bool isUnset(in Modifier m) const { return !isSet(m); } | |
86 | |
87 private immutable ushort _bits; | |
88 } | |
89 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
58
diff
changeset
|
90 // FIXME |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
91 // 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
|
92 // 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
|
93 |
0 | 94 abstract class Event { |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
95 this(in Mask mask) { |
48 | 96 _mask = mask; |
0 | 97 } |
98 | |
48 | 99 Mask mask() const { return _mask; } |
0 | 100 |
101 private { | |
48 | 102 Mask _mask; |
0 | 103 } |
104 } | |
105 | |
13 | 106 final class KeyEvent : Event { |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
107 this(in string str, in uint value, in Mask mask) { |
0 | 108 super(mask); |
48 | 109 _str = str; |
110 _value = value; | |
0 | 111 } |
112 | |
48 | 113 string str() const { return _str; } |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
58
diff
changeset
|
114 uint value() const { return _value; } |
0 | 115 |
5 | 116 override string toString() const { |
48 | 117 return std.string.format("Key event: %s, %d, %s", _str, _value, _mask); |
0 | 118 } |
119 | |
120 private { | |
48 | 121 string _str; |
122 uint _value; | |
0 | 123 } |
124 } | |
125 | |
13 | 126 abstract class PointerEvent : Event { |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
127 this(in Point screenPoint, in Point modelPoint, in Mask mask) { |
0 | 128 super(mask); |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
129 _screenPoint = screenPoint; |
48 | 130 _modelPoint = modelPoint; |
0 | 131 } |
132 | |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
133 Point screenPoint() const { return _screenPoint; } |
48 | 134 Point modelPoint() const { return _modelPoint; } |
0 | 135 |
136 private { | |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
137 Point _screenPoint; |
48 | 138 Point _modelPoint; |
0 | 139 } |
140 } | |
141 | |
33
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
142 final class CrossingEvent : PointerEvent { |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
143 this(in CrossingMode crossingMode, |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
144 in Point screenPoint, |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
145 in Point modelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
146 in Mask mask) { |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
147 super(screenPoint, modelPoint, mask); |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
148 _crossingMode = crossingMode; |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
149 } |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
150 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
151 CrossingMode crossingMode() const { return _crossingMode; } |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
152 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
153 override string toString() const { |
104 | 154 return std.string.format("Crossing event: %s, %s, %s, %s", to!string(_crossingMode), screenPoint, modelPoint, mask); |
33
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
155 } |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
156 |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
157 private { |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
158 CrossingMode _crossingMode; |
33
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
159 } |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
160 } |
157b4ad5615d
Added intersection code for lines and segments.
David Bryant <bagnose@gmail.com>
parents:
28
diff
changeset
|
161 |
0 | 162 final class ButtonEvent : PointerEvent { |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
163 this(in ButtonAction buttonAction, |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
164 in ButtonName buttonName, |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
165 in Point screenPoint, |
48 | 166 in Point modelPoint, |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
167 in Mask mask) { |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
168 super(screenPoint, modelPoint, mask); |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
169 _buttonAction = buttonAction; |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
170 _buttonName = buttonName; |
0 | 171 } |
172 | |
5 | 173 override string toString() const { |
8 | 174 return std.string.format("Button event: %s, %s, %s, %s, %s", |
104 | 175 to!string(_buttonAction), to!string(_buttonName), |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
176 _screenPoint, _modelPoint, _mask); |
0 | 177 } |
178 | |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
179 ButtonAction buttonAction() const { return _buttonAction; } |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
48
diff
changeset
|
180 ButtonName buttonName() const { return _buttonName; } |
0 | 181 |
182 private { | |
48 | 183 ButtonAction _buttonAction; |
184 ButtonName _buttonName; | |
0 | 185 } |
186 } | |
187 | |
188 final class MotionEvent : PointerEvent { | |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
189 this(in Point screenPoint, |
48 | 190 in Point modelPoint, |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
191 in Mask mask) { |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
192 super(screenPoint, modelPoint, mask); |
0 | 193 } |
194 | |
5 | 195 override string toString() const { |
8 | 196 return std.string.format("Motion event: %s, %s, %s", |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
197 _screenPoint, _modelPoint, _mask); |
0 | 198 } |
199 } | |
200 | |
201 final class ScrollEvent : PointerEvent { | |
48 | 202 this(in ScrollDirection scrollDirection, |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
203 in Point screenPoint, |
48 | 204 in Point modelPoint, |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
13
diff
changeset
|
205 in Mask mask) { |
80
b759414d2b72
Switched from cairo to Drawable abstraction
"David Bryant <bagnose@gmail.com>"
parents:
72
diff
changeset
|
206 super(screenPoint, modelPoint, mask); |
48 | 207 _scrollDirection = scrollDirection; |
0 | 208 } |
209 | |
5 | 210 override string toString() const { |
8 | 211 return std.string.format("Scroll event: %s, %s, %s, %s", |
101 | 212 to!string(_scrollDirection), _screenPoint, _modelPoint, _mask); |
0 | 213 } |
214 | |
48 | 215 ScrollDirection scrollDirection() const { return _scrollDirection; } |
0 | 216 |
217 private { | |
48 | 218 ScrollDirection _scrollDirection; |
0 | 219 } |
220 } |