Mercurial > projects > dynamin
annotate dynamin/gui/control.d @ 53:6e33b00595e9
Fix capitalization in a couple comments.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Tue, 04 Aug 2009 21:37:55 -0500 |
parents | d5823ccfddc6 |
children | c138461bf845 |
rev | line source |
---|---|
0 | 1 // Written in the D programming language |
2 // www.digitalmars.com/d/ | |
3 | |
4 /* | |
5 * The contents of this file are subject to the Mozilla Public License Version | |
6 * 1.1 (the "License"); you may not use this file except in compliance with | |
7 * the License. You may obtain a copy of the License at | |
8 * http://www.mozilla.org/MPL/ | |
9 * | |
10 * Software distributed under the License is distributed on an "AS IS" basis, | |
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
12 * for the specific language governing rights and limitations under the | |
13 * License. | |
14 * | |
15 * The Original Code is the Dynamin library. | |
16 * | |
17 * The Initial Developer of the Original Code is Jordan Miner. | |
18 * Portions created by the Initial Developer are Copyright (C) 2006-2009 | |
19 * the Initial Developer. All Rights Reserved. | |
20 * | |
21 * Contributor(s): | |
22 * Jordan Miner <jminer7@gmail.com> | |
23 * | |
24 */ | |
25 | |
26 module dynamin.gui.control; | |
27 | |
28 import dynamin.all_core; | |
29 import dynamin.all_painting; | |
30 import dynamin.gui.container; | |
31 import dynamin.gui.events; | |
32 import dynamin.gui.window; | |
33 import dynamin.gui.cursor; | |
34 import tango.io.Stdout; | |
35 | |
36 Control hotControl; | |
37 // the hot control is the one the mouse is over | |
38 package void setHotControl(Control c) { | |
39 if(c !is hotControl) { | |
40 if(hotControl) | |
41 hotControl.mouseLeft(new EventArgs); | |
42 hotControl = c; | |
43 if(c) | |
44 c.mouseEntered(new EventArgs); | |
45 } | |
46 } | |
47 package Control getHotControl() { return hotControl; } | |
48 Control captorControl; | |
49 package void setCaptorControl(Control c) { | |
50 captorControl = c; | |
51 } | |
52 package Control getCaptorControl() { return captorControl; } | |
53 | |
54 /** | |
55 * The painting event is an exception to the rule that added handlers are called | |
56 * before whenPainting. The painting event is far more useful since | |
57 * added handles are called after the control's whenPainting has finished. | |
58 * Otherwise, anything handlers painted would likely be painted over when the | |
59 * control painted. | |
60 */ | |
61 class Control { | |
62 protected: | |
63 bool _visible; | |
64 bool _focusable; | |
65 bool _focused; | |
49 | 66 int _tabIndex; |
0 | 67 package Point _location; |
68 package Size _size; | |
69 string _text; | |
70 Color _backColor; | |
71 Color _foreColor; | |
72 Font _font; | |
73 Cursor _cursor; | |
74 Container _parent; | |
75 bool _elasticX, _elasticY; | |
76 public: | |
77 protected void dispatchMouseEntered(EventArgs e) { | |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
78 setCurrentCursor(_cursor); |
0 | 79 mouseEntered.callHandlers(e); |
80 mouseEntered.callMainHandler(e); | |
81 } | |
82 protected void dispatchMouseDown(MouseEventArgs e) { | |
83 setCaptorControl(this); | |
84 mouseDown.callHandlers(e); | |
85 mouseDown.callMainHandler(e); | |
86 } | |
87 protected void dispatchMouseUp(MouseEventArgs e) { | |
88 setCaptorControl(null); | |
89 mouseUp.callHandlers(e); | |
90 mouseUp.callMainHandler(e); | |
91 } | |
92 protected void dispatchMouseMoved(MouseEventArgs e) { | |
93 setHotControl(this); | |
94 mouseMoved.callHandlers(e); | |
95 mouseMoved.callMainHandler(e); | |
96 } | |
97 protected void dispatchMouseDragged(MouseEventArgs e) { | |
98 setHotControl(this); | |
99 mouseDragged.callHandlers(e); | |
100 mouseDragged.callMainHandler(e); | |
101 } | |
102 protected void dispatchMouseTurned(MouseTurnedEventArgs e) { | |
103 mouseTurned.callHandlers(e); | |
104 mouseTurned.callMainHandler(e); | |
105 if(!e.stopped && _parent) | |
106 _parent.mouseTurned(e); | |
107 } | |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
108 protected void dispatchKeyDown(KeyEventArgs e) { |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
109 keyDown.callHandlers(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
110 keyDown.callMainHandler(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
111 if(!e.stopped && _parent) |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
112 _parent.keyDown(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
113 } |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
114 protected void dispatchKeyUp(KeyEventArgs e) { |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
115 keyUp.callHandlers(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
116 keyUp.callMainHandler(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
117 if(!e.stopped && _parent) |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
118 _parent.keyUp(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
119 } |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
120 protected void dispatchKeyTyped(KeyTypedEventArgs e) { |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
121 keyTyped.callHandlers(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
122 keyTyped.callMainHandler(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
123 if(!e.stopped && _parent) |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
124 _parent.keyTyped(e); |
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
125 } |
0 | 126 protected void dispatchPainting(PaintingEventArgs e) { |
127 e.graphics.save(); | |
128 painting.callMainHandler(e); | |
129 e.graphics.restore(); | |
130 e.graphics.save(); | |
131 // TODO: every call to a handler should be wrapped in a save/restore | |
132 painting.callHandlers(e); | |
133 e.graphics.restore(); | |
134 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
135 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
136 /// Override this method in a subclass to handle the moved event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
137 protected void whenMoved(EventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
138 /// This event occurs after the control has been moved. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
139 Event!(whenMoved) moved; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
140 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
141 /// Override this method in a subclass to handle the resized event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
142 protected void whenResized(EventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
143 /// This event occurs after the control has been resized. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
144 Event!(whenResized) resized; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
145 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
146 /// Override this method in a subclass to handle the mouseEntered event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
147 protected void whenMouseEntered(EventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
148 /// This event occurs after the mouse has entered the control. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
149 Event!(whenMouseEntered) mouseEntered; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
150 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
151 /// Override this method in a subclass to handle the mouseLeft event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
152 protected void whenMouseLeft(EventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
153 /// This event occurs after the mouse has left the control. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
154 Event!(whenMouseLeft) mouseLeft; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
155 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
156 /// Override this method in a subclass to handle the mouseDown event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
157 protected void whenMouseDown(MouseEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
158 /// This event occurs after a mouse button is pressed. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
159 Event!(whenMouseDown) mouseDown; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
160 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
161 /// Override this method in a subclass to handle the mouseUp event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
162 protected void whenMouseUp(MouseEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
163 /// This event occurs after a mouse button is released. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
164 Event!(whenMouseUp) mouseUp; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
165 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
166 /// Override this method in a subclass to handle the mouseMoved event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
167 protected void whenMouseMoved(MouseEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
168 /// This event occurs after the mouse has been moved. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
169 Event!(whenMouseMoved) mouseMoved; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
170 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
171 /// Override this method in a subclass to handle the mouseMoved event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
172 protected void whenMouseDragged(MouseEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
173 /// This event occurs after the mouse has been moved. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
174 Event!(whenMouseDragged) mouseDragged; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
175 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
176 /// Override this method in a subclass to handle the mouseTurned event. |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
177 /// If this event is not stopped, it will be sent to the control's parent. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
178 protected void whenMouseTurned(MouseTurnedEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
179 /// This event occurs after the mouse wheel has been turned. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
180 Event!(whenMouseTurned) mouseTurned; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
181 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
182 /// Override this method in a subclass to handle the keyDown event. |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
183 /// If this event is not stopped, it will be sent to the control's parent. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
184 protected void whenKeyDown(KeyEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
185 /// This event occurs after a key is pressed. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
186 Event!(whenKeyDown) keyDown; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
187 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
188 /// Override this method in a subclass to handle the keyTyped event. |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
189 /// If this event is not stopped, it will be sent to the control's parent. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
190 protected void whenKeyTyped(KeyTypedEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
191 /// This event occurs after a character key is pressed. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
192 Event!(whenKeyTyped) keyTyped; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
193 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
194 /// Override this method in a subclass to handle the keyUp event. |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
195 /// If this event is not stopped, it will be sent to the control's parent. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
196 protected void whenKeyUp(KeyEventArgs e) { } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
197 /// This event occurs after a key is released. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
198 Event!(whenKeyUp) keyUp; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
199 |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
200 /// Override this method in a subclass to handle the painting event. |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
201 protected void whenPainting(PaintingEventArgs e) { |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
202 e.graphics.source = backColor; |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
203 e.graphics.paint(); |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
204 } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
205 /// This event occurs when the control needs to be painted. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
206 Event!(whenPainting) painting; |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
207 |
0 | 208 this() { |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
209 moved.mainHandler = &whenMoved; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
210 resized.mainHandler = &whenResized; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
211 mouseEntered.mainHandler = &whenMouseEntered; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
212 mouseEntered.dispatcher = &dispatchMouseEntered; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
213 mouseLeft.mainHandler = &whenMouseLeft; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
214 mouseDown.mainHandler = &whenMouseDown; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
215 mouseDown.dispatcher = &dispatchMouseDown; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
216 mouseUp.mainHandler = &whenMouseUp; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
217 mouseUp.dispatcher = &dispatchMouseUp; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
218 mouseMoved.mainHandler = &whenMouseMoved; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
219 mouseMoved.dispatcher = &dispatchMouseMoved; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
220 mouseDragged.mainHandler = &whenMouseDragged; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
221 mouseDragged.dispatcher = &dispatchMouseDragged; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
222 mouseTurned.mainHandler = &whenMouseTurned; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
223 mouseTurned.dispatcher = &dispatchMouseTurned; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
224 keyDown.mainHandler = &whenKeyDown; |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
225 keyDown.dispatcher = &dispatchKeyDown; |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
226 keyTyped.mainHandler = &whenKeyTyped; |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
227 keyTyped.dispatcher = &dispatchKeyTyped; |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
228 keyUp.mainHandler = &whenKeyUp; |
47
41b76c218851
Change keyUp, keyDown, and keyTyped to bubble to a control's parent if not stopped.
Jordan Miner <jminer7@gmail.com>
parents:
23
diff
changeset
|
229 keyUp.dispatcher = &dispatchKeyUp; |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
230 painting.mainHandler = &whenPainting; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
231 painting.dispatcher = &dispatchPainting; |
0 | 232 |
233 _location = Point(0, 0); | |
234 _size = Size(100, 100); | |
235 _text = ""; | |
236 _focusable = false; | |
237 _focused = false; | |
49 | 238 _tabIndex = 0; |
0 | 239 _visible = true; |
240 _cursor = Cursor.Arrow; | |
241 _elasticX = false; | |
242 _elasticY = false; | |
243 | |
244 // TODO: remove these when themes mature | |
245 _foreColor = Color.Black; | |
246 _font = new Font("Tahoma", 11); | |
247 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
248 |
0 | 249 protected Graphics quickCreateGraphics() { |
250 if(_parent is null) | |
251 return null; | |
252 auto g = _parent.quickCreateGraphics(); | |
253 g.translate(location); | |
254 return g; | |
255 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
256 |
0 | 257 /** |
258 * Sets the specified Graphics' font and source to this control's font | |
259 * and foreground color. Also, clips to this control's rectangle. | |
260 */ | |
261 void setupGraphics(Graphics g) { | |
262 g.rectangle(0, 0, width, height); | |
263 g.clip(); | |
264 g.font = font; | |
265 g.source = foreColor; | |
266 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
267 |
0 | 268 /** |
269 * Creates a Graphics, calls the specified delegate with it, and deletes | |
270 * it to release resources. | |
271 */ | |
272 void withGraphics(void delegate(Graphics g) dg) { | |
273 auto g = quickCreateGraphics(); | |
274 setupGraphics(g); | |
275 dg(g); | |
276 delete g; | |
277 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
278 |
0 | 279 /** |
280 * | |
281 */ | |
282 bool focused() { | |
283 return _focused; | |
284 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
285 |
0 | 286 /** |
49 | 287 * Gets or sets this control's tab index. The tab index of controls |
288 * decides in what order they are focused when the tab key is pressed. | |
289 * If multiple controls in a window have the same tab index, focus is | |
290 * changed based on the order they were added to the window. | |
291 * The default is 0. | |
292 */ | |
293 int tabIndex() { | |
294 return _tabIndex; | |
295 } | |
296 /// ditto | |
297 void tabIndex(int i) { | |
298 _tabIndex = i; | |
299 } | |
300 | |
301 /** | |
0 | 302 * |
303 */ | |
304 void focus() { | |
305 if(!_focusable) | |
306 return; | |
50
a18c2fd9fe36
Fix a crash if Control.focus was called on a Control not in a Window.
Jordan Miner <jminer7@gmail.com>
parents:
49
diff
changeset
|
307 auto top = getTopLevel(); |
a18c2fd9fe36
Fix a crash if Control.focus was called on a Control not in a Window.
Jordan Miner <jminer7@gmail.com>
parents:
49
diff
changeset
|
308 if(!top) |
a18c2fd9fe36
Fix a crash if Control.focus was called on a Control not in a Window.
Jordan Miner <jminer7@gmail.com>
parents:
49
diff
changeset
|
309 return; |
a18c2fd9fe36
Fix a crash if Control.focus was called on a Control not in a Window.
Jordan Miner <jminer7@gmail.com>
parents:
49
diff
changeset
|
310 if(auto win = cast(Window)top) { |
0 | 311 if(win.focusedControl) { |
312 win.focusedControl._focused = false; | |
313 win.focusedControl.repaint(); | |
314 } | |
315 win.focusedControl = this; | |
316 _focused = true; | |
317 repaint(); | |
318 } | |
319 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
320 |
0 | 321 /** |
322 * Returns whether this control is on the screen. A control is | |
323 * on screen if one of its ancestors is a top level window. Whether or | |
324 * not the control is visible has no bearing on this value. If a control | |
325 * has no parent, then it is clearly not on the screen. | |
326 */ | |
327 bool onScreen() { | |
328 return _parent && _parent.onScreen; | |
329 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
330 |
0 | 331 /** |
332 * Gets the location of this control in screen coordinates. An exception is | |
333 * thrown if this control is not on the screen. | |
334 */ | |
335 Point screenLocation() { | |
336 if(!_parent) | |
337 throw new Exception("control is not on screen"); | |
338 return _parent.screenLocation + location; | |
339 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
340 |
0 | 341 /** |
342 * Converts the specified point in content coordinates into screen | |
343 * coordinates. An exception is thrown if this control is not on the screen. | |
344 */ | |
345 Point contentToScreen(Point pt) { // TODO: content?? even on Window?? | |
346 if(!_parent) | |
347 throw new Exception("control is not on screen"); | |
348 return _parent.contentToScreen(pt + location); | |
349 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
350 |
0 | 351 /** |
352 * Converts the specified point in screen coordinates into content | |
353 * coordinates. An exception is thrown if this control is not on the screen. | |
354 */ | |
355 Point screenToContent(Point pt) { | |
356 if(!_parent) | |
357 throw new Exception("control is not on screen"); | |
358 return _parent.screenToContent(pt) - location; // TODO: borders | |
359 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
360 |
0 | 361 /** |
362 * Converts the specified point in this control's content coordinates | |
363 * into the specified control's content coordinates. An exception is | |
364 * thrown if this control is not on the screen. | |
365 */ | |
366 Point contentToContent(Point pt, Control c) { | |
367 return c.screenToContent(contentToScreen(pt)); | |
368 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
369 |
0 | 370 /** |
371 * Returns whether the specified point is inside this control. | |
372 */ | |
373 bool contains(Point pt) { | |
374 return pt.x >= 0 && pt.y >= 0 && pt.x < width && pt.y < height; | |
375 } | |
376 /// ditto | |
377 bool contains(real x, real y) { | |
378 return contains(Point(x, y)); | |
379 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
380 |
51 | 381 /** |
382 * Returns true if this control is a top-level control and false otherwise. | |
383 * Top-level controls do not have parents. Non-top-level controls can only | |
384 * be shown on the screen by adding them as children to a top-level control. | |
385 * Currently, the only top-level control is Window. | |
386 */ | |
0 | 387 bool topLevel() { return false; } |
388 // TODO: return NativeControl/Window? | |
51 | 389 /** |
390 * Loops over this control's ancestors, and if a top-level control is found, | |
391 * it is returned. If this control does not have a top-level ancestor, | |
392 * null is returned. | |
393 */ | |
0 | 394 Control getTopLevel() { |
395 Control c = this; | |
396 while(c.parent) | |
397 c = c.parent; | |
398 return c.topLevel ? c : null; | |
399 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
400 |
0 | 401 /** |
402 * Gets this control's parent. | |
403 */ | |
404 Container parent() { return _parent; } | |
405 package void parent(Container c) { | |
406 _parent = c; | |
53
6e33b00595e9
Fix capitalization in a couple comments.
Jordan Miner <jminer7@gmail.com>
parents:
51
diff
changeset
|
407 //parentChanged(new EventArgs); // TODO: add event |
0 | 408 } |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
409 |
0 | 410 /** |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
411 * Gets or sets whether is control is visible. The default is true, except |
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
412 * on top-level windows. |
0 | 413 */ |
414 //void visible(bool b) { visible = b; } | |
415 bool visible() { return _visible; } | |
416 | |
417 /** | |
418 * Gets or sets the location of this control in its parent's content | |
419 * coordinates. | |
420 * Examples: | |
421 * ----- | |
422 * control.location = [5, 35]; | |
423 * control.location = Point(50, 50); | |
424 * ----- | |
425 */ | |
426 Point location() { return _location; } | |
427 /// ditto | |
428 void location(Point pt) { | |
429 if((cast(Window)_parent) !is null) | |
430 throw new Exception("cannot set location of a window's content"); | |
431 pt.x = round(pt.x); | |
432 pt.y = round(pt.y); | |
433 repaint(); | |
434 _location = pt; | |
435 repaint(); | |
436 moved(new EventArgs); | |
437 } | |
438 /// ditto | |
439 void location(real[] pt) { | |
440 assert(pt.length == 2, "pt must be just an x and y"); | |
441 location = Point(pt[0], pt[1]); | |
442 } | |
443 | |
444 /** | |
445 * Gets or sets the size of this control. | |
446 * Examples: | |
447 * ----- | |
448 * control.size = [75, 23]; | |
449 * control.size = Size(80, 20); | |
450 * ----- | |
451 */ | |
452 Size size() { return _size; } | |
453 /// ditto | |
454 void size(Size newSize) { | |
455 if(newSize.width < 0) | |
456 newSize.width = 0; | |
457 if(newSize.height < 0) | |
458 newSize.height = 0; | |
459 newSize.width = round(newSize.width); | |
460 newSize.height = round(newSize.height); | |
461 repaint(); | |
462 _size = newSize; | |
463 repaint(); | |
464 resized(new EventArgs); | |
465 } | |
466 /// ditto | |
467 void size(real[] newSize) { | |
468 assert(newSize.length == 2, "size must be just a width and height"); | |
469 size = Size(newSize[0], newSize[1]); | |
470 } | |
471 | |
472 /** | |
473 * Gets the size at which this control looks the best. It is intended that | |
474 * the control not be made smaller than this size, and only be made larger | |
475 * if it is elastic, or if it needs to be aligned with other controls. | |
476 * | |
477 * This property should be overridden in subclasses to return a best size. | |
478 */ | |
479 Size bestSize() { return Size(100, 100); } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
480 |
0 | 481 /** |
482 * Gets the distance from the top of this control to the baseline of | |
483 * the first line of this control's text. If this control does not have | |
484 * text, 0 may be returned. | |
485 */ | |
486 int baseline() { return 0; } | |
487 | |
488 /// Same as location.x | |
489 real x() { return location.x; } | |
490 /// Same as location.y | |
491 real y() { return location.y; } | |
492 /// Same as size.width | |
493 real width() { return size.width; } | |
494 /// Same as size.height | |
495 real height() { return size.height; } | |
496 | |
497 /** | |
498 * Gets or sets whether this control is elastic horizontally or vertically. | |
499 * If a control is elastic, then it is intended to be made larger than its | |
500 * best size. | |
501 */ | |
502 bool elasticX() { return _elasticX; } | |
503 /// ditto | |
504 void elasticX(bool b) { _elasticX = b; } | |
505 /// ditto | |
506 bool elasticY() { return _elasticY; } | |
507 /// ditto | |
508 void elasticY(bool b) { _elasticY = b; } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
509 |
0 | 510 /** |
511 * Gets or sets the text that this control shows. | |
512 */ | |
513 string text() { return _text.dup; } | |
514 /// ditto | |
515 void text(string str) { | |
516 _text = str.dup; | |
517 repaint(); | |
518 //TextChanged(EventArgs e) // TODO: add event | |
519 } | |
520 | |
521 /** | |
522 * Gets or sets the background color of this control. | |
523 */ | |
524 Color backColor() { return _backColor; } | |
525 /// ditto | |
526 void backColor(Color c) { | |
527 _backColor = c; | |
528 repaint(); | |
529 } | |
530 | |
531 /** | |
532 * Gets or sets the foreground color of this control. | |
533 */ | |
534 Color foreColor() { return _foreColor; } | |
535 /// ditto | |
536 void foreColor(Color c) { | |
537 _foreColor = c; | |
538 repaint(); | |
539 } | |
540 | |
541 /** | |
542 * Gets or sets the font of this control uses to display text. A value of | |
543 * null means that the font is unset. When the font is null, the | |
544 * current theme's font is used. The default is null. | |
545 */ | |
546 Font font() { | |
547 // TODO: if font is null (unset), return from theme | |
548 //if(font is null) | |
549 // return Theme.Current.Control_Font(this); | |
550 //else | |
551 return _font; | |
552 } | |
553 /// ditto | |
554 void font(Font f) { | |
555 _font = f; | |
556 repaint(); | |
557 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
558 |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
559 void setCurrentCursor(Cursor cur) { |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
560 if(parent) |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
561 parent.setCurrentCursor(cur); |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
562 } |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
563 /** |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
564 * Gets or sets the mouse cursor that will be shown when the mouse |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
565 * is over this control. |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
566 */ |
0 | 567 Cursor cursor() { |
568 return _cursor; | |
569 } | |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
570 /// ditto |
0 | 571 void cursor(Cursor cur) { |
572 if(_cursor is cur) | |
573 return; | |
574 _cursor = cur; | |
575 if(getHotControl() is this) | |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
576 setCurrentCursor(_cursor); |
0 | 577 } |
578 | |
579 /** | |
580 * Causes the part of the control inside the specified | |
581 * rectangle to be repainted. The rectangle is in content coordinates. | |
582 * | |
583 * The control will not be repainted before this method returns; rather, | |
584 * the area is just marked as needing to be repainted. The next time there | |
15 | 585 * are no other system events to be processed, a painting event will |
586 * be called. | |
0 | 587 */ |
588 void repaint(Rect rect) { | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
589 // TODO: make sure that parts clipped off by the parent are |
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
590 // not invalidated |
0 | 591 if(_parent) |
592 _parent.repaint(rect + location); | |
593 } | |
594 /// ditto | |
595 void repaint(real x, real y, real width, real height) { | |
596 repaint(Rect(x, y, width, height)); | |
597 } | |
598 /** | |
599 * Causes the entire control to be repainted. | |
600 */ | |
601 void repaint() { | |
602 repaint(Rect(0, 0, width, height)); | |
603 } | |
604 } | |
605 | |
606 |