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