Mercurial > projects > dynamin
annotate dynamin/gui/control.d @ 64:aa7eafe2865d
Add setTabOrder()
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Sat, 08 Aug 2009 22:32:14 -0500 |
parents | cf7c5f968306 |
children | 419e38206522 |
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 | |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
36 //{{{ hotControl |
0 | 37 Control hotControl; |
38 // the hot control is the one the mouse is over | |
39 package void setHotControl(Control c) { | |
40 if(c !is hotControl) { | |
41 if(hotControl) | |
42 hotControl.mouseLeft(new EventArgs); | |
43 hotControl = c; | |
44 if(c) | |
45 c.mouseEntered(new EventArgs); | |
46 } | |
47 } | |
48 package Control getHotControl() { return hotControl; } | |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
49 //}}} |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
50 |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
51 //{{{ captorControl |
0 | 52 Control captorControl; |
53 package void setCaptorControl(Control c) { | |
54 captorControl = c; | |
55 } | |
56 package Control getCaptorControl() { return captorControl; } | |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
57 //}}} |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
58 |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
59 //{{{ focusedControl |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
60 Control focusedControl; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
61 package void setFocusedControl(Control c) { |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
62 if(focusedControl is c) |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
63 return; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
64 scope e = new EventArgs; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
65 if(focusedControl) |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
66 focusedControl.focusLost(e); |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
67 focusedControl = c; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
68 if(focusedControl) |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
69 focusedControl.focusGained(e); |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
70 } |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
71 package Control getFocusedControl() { return focusedControl; } |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
72 //}}} |
0 | 73 |
74 /** | |
75 * The painting event is an exception to the rule that added handlers are called | |
76 * before whenPainting. The painting event is far more useful since | |
77 * added handles are called after the control's whenPainting has finished. | |
78 * Otherwise, anything handlers painted would likely be painted over when the | |
79 * control painted. | |
80 */ | |
81 class Control { | |
82 protected: | |
83 bool _visible; | |
84 bool _focusable; | |
85 bool _focused; | |
49 | 86 int _tabIndex; |
0 | 87 package Point _location; |
88 package Size _size; | |
89 string _text; | |
90 Color _backColor; | |
91 Color _foreColor; | |
92 Font _font; | |
93 Cursor _cursor; | |
94 Container _parent; | |
95 bool _elasticX, _elasticY; | |
96 public: | |
97 protected void dispatchMouseEntered(EventArgs e) { | |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
98 setCurrentCursor(_cursor); |
0 | 99 mouseEntered.callHandlers(e); |
100 mouseEntered.callMainHandler(e); | |
101 } | |
102 protected void dispatchMouseDown(MouseEventArgs e) { | |
103 setCaptorControl(this); | |
104 mouseDown.callHandlers(e); | |
105 mouseDown.callMainHandler(e); | |
106 } | |
107 protected void dispatchMouseUp(MouseEventArgs e) { | |
108 setCaptorControl(null); | |
109 mouseUp.callHandlers(e); | |
110 mouseUp.callMainHandler(e); | |
111 } | |
112 protected void dispatchMouseMoved(MouseEventArgs e) { | |
113 setHotControl(this); | |
114 mouseMoved.callHandlers(e); | |
115 mouseMoved.callMainHandler(e); | |
116 } | |
117 protected void dispatchMouseDragged(MouseEventArgs e) { | |
118 setHotControl(this); | |
119 mouseDragged.callHandlers(e); | |
120 mouseDragged.callMainHandler(e); | |
121 } | |
122 protected void dispatchMouseTurned(MouseTurnedEventArgs e) { | |
123 mouseTurned.callHandlers(e); | |
124 mouseTurned.callMainHandler(e); | |
125 if(!e.stopped && _parent) | |
126 _parent.mouseTurned(e); | |
127 } | |
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
|
128 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
|
129 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
|
130 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
|
131 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
|
132 _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
|
133 } |
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
|
134 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
|
135 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
|
136 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
|
137 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
|
138 _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
|
139 } |
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
|
140 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
|
141 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
|
142 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
|
143 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
|
144 _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
|
145 } |
0 | 146 protected void dispatchPainting(PaintingEventArgs e) { |
147 e.graphics.save(); | |
148 painting.callMainHandler(e); | |
149 e.graphics.restore(); | |
150 e.graphics.save(); | |
151 // TODO: every call to a handler should be wrapped in a save/restore | |
152 painting.callHandlers(e); | |
153 e.graphics.restore(); | |
154 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
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 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
|
157 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
|
158 /// 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
|
159 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
|
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 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
|
162 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
|
163 /// 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
|
164 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
|
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 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
|
167 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
|
168 /// 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
|
169 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
|
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 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
|
172 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
|
173 /// 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
|
174 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
|
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 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
|
177 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
|
178 /// 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
|
179 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
|
180 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
181 /// 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
|
182 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
|
183 /// 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
|
184 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
|
185 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
186 /// 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
|
187 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
|
188 /// 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
|
189 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
|
190 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
191 /// 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
|
192 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
|
193 /// 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
|
194 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
|
195 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
196 /// 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
|
197 /// 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
|
198 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
|
199 /// 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
|
200 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
|
201 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
202 /// 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
|
203 /// 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
|
204 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
|
205 /// 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
|
206 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
|
207 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
208 /// 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
|
209 /// 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
|
210 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
|
211 /// 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
|
212 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
|
213 |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
214 /// 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
|
215 /// 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
|
216 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
|
217 /// 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
|
218 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
|
219 |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
220 /// 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
|
221 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
|
222 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
|
223 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
|
224 } |
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
5
diff
changeset
|
225 /// 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
|
226 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
|
227 |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
228 /// Override this method in a subclass to handle the focusGained event. |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
229 protected void whenFocusGained(EventArgs e) { |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
230 repaint(); |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
231 } |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
232 /// This event occurs after this control is focused. |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
233 Event!(whenFocusGained) focusGained; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
234 |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
235 /// Override this method in a subclass to handle the focusLost event. |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
236 protected void whenFocusLost(EventArgs e) { |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
237 repaint(); |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
238 } |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
239 /// This event occurs after this control loses focus. |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
240 Event!(whenFocusLost) focusLost; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
241 |
0 | 242 this() { |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
243 moved.mainHandler = &whenMoved; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
244 resized.mainHandler = &whenResized; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
245 mouseEntered.mainHandler = &whenMouseEntered; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
246 mouseEntered.dispatcher = &dispatchMouseEntered; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
247 mouseLeft.mainHandler = &whenMouseLeft; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
248 mouseDown.mainHandler = &whenMouseDown; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
249 mouseDown.dispatcher = &dispatchMouseDown; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
250 mouseUp.mainHandler = &whenMouseUp; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
251 mouseUp.dispatcher = &dispatchMouseUp; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
252 mouseMoved.mainHandler = &whenMouseMoved; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
253 mouseMoved.dispatcher = &dispatchMouseMoved; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
254 mouseDragged.mainHandler = &whenMouseDragged; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
255 mouseDragged.dispatcher = &dispatchMouseDragged; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
256 mouseTurned.mainHandler = &whenMouseTurned; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
257 mouseTurned.dispatcher = &dispatchMouseTurned; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
258 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 painting.mainHandler = &whenPainting; |
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
265 painting.dispatcher = &dispatchPainting; |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
266 focusGained.mainHandler = &whenFocusGained; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
267 focusLost.mainHandler = &whenFocusLost; |
0 | 268 |
269 _location = Point(0, 0); | |
270 _size = Size(100, 100); | |
271 _text = ""; | |
272 _focusable = false; | |
273 _focused = false; | |
49 | 274 _tabIndex = 0; |
0 | 275 _visible = true; |
276 _cursor = Cursor.Arrow; | |
277 _elasticX = false; | |
278 _elasticY = false; | |
279 | |
280 // TODO: remove these when themes mature | |
281 _foreColor = Color.Black; | |
282 _font = new Font("Tahoma", 11); | |
283 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
284 |
0 | 285 protected Graphics quickCreateGraphics() { |
286 if(_parent is null) | |
287 return null; | |
288 auto g = _parent.quickCreateGraphics(); | |
60
cf7c5f968306
Fix crash in withGraphics() if there wasn't a Window ancestor with a handle.
Jordan Miner <jminer7@gmail.com>
parents:
59
diff
changeset
|
289 if(g) |
cf7c5f968306
Fix crash in withGraphics() if there wasn't a Window ancestor with a handle.
Jordan Miner <jminer7@gmail.com>
parents:
59
diff
changeset
|
290 g.translate(location); |
0 | 291 return g; |
292 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
293 |
0 | 294 /** |
295 * Sets the specified Graphics' font and source to this control's font | |
296 * and foreground color. Also, clips to this control's rectangle. | |
297 */ | |
298 void setupGraphics(Graphics g) { | |
299 g.rectangle(0, 0, width, height); | |
300 g.clip(); | |
301 g.font = font; | |
302 g.source = foreColor; | |
303 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
304 |
0 | 305 /** |
306 * Creates a Graphics, calls the specified delegate with it, and deletes | |
307 * it to release resources. | |
308 */ | |
309 void withGraphics(void delegate(Graphics g) dg) { | |
310 auto g = quickCreateGraphics(); | |
60
cf7c5f968306
Fix crash in withGraphics() if there wasn't a Window ancestor with a handle.
Jordan Miner <jminer7@gmail.com>
parents:
59
diff
changeset
|
311 if(!g) |
cf7c5f968306
Fix crash in withGraphics() if there wasn't a Window ancestor with a handle.
Jordan Miner <jminer7@gmail.com>
parents:
59
diff
changeset
|
312 return; |
0 | 313 setupGraphics(g); |
314 dg(g); | |
315 delete g; | |
316 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
317 |
0 | 318 /** |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
319 * Returns whether or not this control can receive focus. |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
320 */ |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
321 bool focusable() { |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
322 return _focusable; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
323 } |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
324 void focusable(bool f) { |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
325 _focusable = f; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
326 // TODO: |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
327 } |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
328 |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
329 /** |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
330 * Returns whether this control currently has focus. A control with focus |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
331 * receives keyboard events. |
0 | 332 */ |
333 bool focused() { | |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
334 return getFocusedControl() is this; |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
335 } |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
336 |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
337 /** |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
338 * Returns true if this control should visually show when it has focus |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
339 * and returns false if not. Focus is usually hidden until the |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
340 * user uses the keyboard to navigate. |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
341 * |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
342 * A text box is one control that shows when it is |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
343 * focused (by its caret), regardless of this value. (Because showing |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
344 * focus isn't the sole purpose of a caret.) |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
345 */ |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
346 bool showFocus() { |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
347 auto top = getTopLevel(); |
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
348 return top && (cast(Window)top).showFocus; |
0 | 349 } |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
350 |
0 | 351 /** |
49 | 352 * Gets or sets this control's tab index. The tab index of controls |
353 * decides in what order they are focused when the tab key is pressed. | |
354 * If multiple controls in a window have the same tab index, focus is | |
355 * changed based on the order they were added to the window. | |
356 * The default is 0. | |
357 */ | |
358 int tabIndex() { | |
359 return _tabIndex; | |
360 } | |
361 /// ditto | |
362 void tabIndex(int i) { | |
363 _tabIndex = i; | |
364 } | |
365 | |
366 /** | |
0 | 367 * |
368 */ | |
369 void focus() { | |
370 if(!_focusable) | |
371 return; | |
56
c2566ab82535
Edit comments and fix a typo.
Jordan Miner <jminer7@gmail.com>
parents:
55
diff
changeset
|
372 |
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
|
373 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
|
374 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
|
375 return; |
55
c138461bf845
Add focusing and other changes that are related
Jordan Miner <jminer7@gmail.com>
parents:
53
diff
changeset
|
376 if(auto win = cast(Window)top) |
0 | 377 win.focusedControl = this; |
378 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
379 |
0 | 380 /** |
381 * Returns whether this control is on the screen. A control is | |
382 * on screen if one of its ancestors is a top level window. Whether or | |
383 * not the control is visible has no bearing on this value. If a control | |
384 * has no parent, then it is clearly not on the screen. | |
385 */ | |
386 bool onScreen() { | |
387 return _parent && _parent.onScreen; | |
388 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
389 |
0 | 390 /** |
391 * Gets the location of this control in screen coordinates. An exception is | |
392 * thrown if this control is not on the screen. | |
393 */ | |
394 Point screenLocation() { | |
395 if(!_parent) | |
396 throw new Exception("control is not on screen"); | |
397 return _parent.screenLocation + location; | |
398 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
399 |
0 | 400 /** |
401 * Converts the specified point in content coordinates into screen | |
402 * coordinates. An exception is thrown if this control is not on the screen. | |
403 */ | |
404 Point contentToScreen(Point pt) { // TODO: content?? even on Window?? | |
405 if(!_parent) | |
406 throw new Exception("control is not on screen"); | |
407 return _parent.contentToScreen(pt + location); | |
408 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
409 |
0 | 410 /** |
411 * Converts the specified point in screen coordinates into content | |
412 * coordinates. An exception is thrown if this control is not on the screen. | |
413 */ | |
414 Point screenToContent(Point pt) { | |
415 if(!_parent) | |
416 throw new Exception("control is not on screen"); | |
417 return _parent.screenToContent(pt) - location; // TODO: borders | |
418 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
419 |
0 | 420 /** |
421 * Converts the specified point in this control's content coordinates | |
422 * into the specified control's content coordinates. An exception is | |
423 * thrown if this control is not on the screen. | |
424 */ | |
425 Point contentToContent(Point pt, Control c) { | |
426 return c.screenToContent(contentToScreen(pt)); | |
427 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
428 |
0 | 429 /** |
430 * Returns whether the specified point is inside this control. | |
431 */ | |
432 bool contains(Point pt) { | |
433 return pt.x >= 0 && pt.y >= 0 && pt.x < width && pt.y < height; | |
434 } | |
435 /// ditto | |
436 bool contains(real x, real y) { | |
437 return contains(Point(x, y)); | |
438 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
439 |
51 | 440 /** |
441 * Returns true if this control is a top-level control and false otherwise. | |
442 * Top-level controls do not have parents. Non-top-level controls can only | |
443 * be shown on the screen by adding them as children to a top-level control. | |
444 * Currently, the only top-level control is Window. | |
445 */ | |
0 | 446 bool topLevel() { return false; } |
447 // TODO: return NativeControl/Window? | |
51 | 448 /** |
449 * Loops over this control's ancestors, and if a top-level control is found, | |
450 * it is returned. If this control does not have a top-level ancestor, | |
451 * null is returned. | |
452 */ | |
0 | 453 Control getTopLevel() { |
454 Control c = this; | |
455 while(c.parent) | |
456 c = c.parent; | |
457 return c.topLevel ? c : null; | |
458 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
459 |
0 | 460 /** |
461 * Gets this control's parent. | |
462 */ | |
463 Container parent() { return _parent; } | |
464 package void parent(Container c) { | |
465 _parent = c; | |
53
6e33b00595e9
Fix capitalization in a couple comments.
Jordan Miner <jminer7@gmail.com>
parents:
51
diff
changeset
|
466 //parentChanged(new EventArgs); // TODO: add event |
0 | 467 } |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
468 |
0 | 469 /** |
59 | 470 * Calls the specified delegate with each of this control's ancestors, |
471 * starting with its parent and moving up. Returns the first ancestor | |
472 * that the delgate returns true for. If none are found, returns null. | |
473 */ | |
474 Container findAncestor(bool delegate(Container) dg) { | |
475 Container anc = parent; | |
476 while(anc) { | |
477 if(dg(anc)) | |
478 return anc; | |
479 anc = anc.parent; | |
480 } | |
481 return null; | |
482 } | |
483 | |
484 /** | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
485 * 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
|
486 * on top-level windows. |
0 | 487 */ |
488 //void visible(bool b) { visible = b; } | |
489 bool visible() { return _visible; } | |
490 | |
491 /** | |
492 * Gets or sets the location of this control in its parent's content | |
493 * coordinates. | |
494 * Examples: | |
495 * ----- | |
496 * control.location = [5, 35]; | |
497 * control.location = Point(50, 50); | |
498 * ----- | |
499 */ | |
500 Point location() { return _location; } | |
501 /// ditto | |
502 void location(Point pt) { | |
503 if((cast(Window)_parent) !is null) | |
504 throw new Exception("cannot set location of a window's content"); | |
505 pt.x = round(pt.x); | |
506 pt.y = round(pt.y); | |
507 repaint(); | |
508 _location = pt; | |
509 repaint(); | |
510 moved(new EventArgs); | |
511 } | |
512 /// ditto | |
513 void location(real[] pt) { | |
514 assert(pt.length == 2, "pt must be just an x and y"); | |
515 location = Point(pt[0], pt[1]); | |
516 } | |
517 | |
518 /** | |
519 * Gets or sets the size of this control. | |
520 * Examples: | |
521 * ----- | |
522 * control.size = [75, 23]; | |
523 * control.size = Size(80, 20); | |
524 * ----- | |
525 */ | |
526 Size size() { return _size; } | |
527 /// ditto | |
528 void size(Size newSize) { | |
529 if(newSize.width < 0) | |
530 newSize.width = 0; | |
531 if(newSize.height < 0) | |
532 newSize.height = 0; | |
533 newSize.width = round(newSize.width); | |
534 newSize.height = round(newSize.height); | |
535 repaint(); | |
536 _size = newSize; | |
537 repaint(); | |
538 resized(new EventArgs); | |
539 } | |
540 /// ditto | |
541 void size(real[] newSize) { | |
542 assert(newSize.length == 2, "size must be just a width and height"); | |
543 size = Size(newSize[0], newSize[1]); | |
544 } | |
545 | |
546 /** | |
547 * Gets the size at which this control looks the best. It is intended that | |
548 * the control not be made smaller than this size, and only be made larger | |
549 * if it is elastic, or if it needs to be aligned with other controls. | |
550 * | |
551 * This property should be overridden in subclasses to return a best size. | |
552 */ | |
553 Size bestSize() { return Size(100, 100); } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
554 |
0 | 555 /** |
556 * Gets the distance from the top of this control to the baseline of | |
557 * the first line of this control's text. If this control does not have | |
558 * text, 0 may be returned. | |
559 */ | |
560 int baseline() { return 0; } | |
561 | |
562 /// Same as location.x | |
563 real x() { return location.x; } | |
564 /// Same as location.y | |
565 real y() { return location.y; } | |
566 /// Same as size.width | |
567 real width() { return size.width; } | |
568 /// Same as size.height | |
569 real height() { return size.height; } | |
570 | |
571 /** | |
572 * Gets or sets whether this control is elastic horizontally or vertically. | |
573 * If a control is elastic, then it is intended to be made larger than its | |
574 * best size. | |
575 */ | |
576 bool elasticX() { return _elasticX; } | |
577 /// ditto | |
578 void elasticX(bool b) { _elasticX = b; } | |
579 /// ditto | |
580 bool elasticY() { return _elasticY; } | |
581 /// ditto | |
582 void elasticY(bool b) { _elasticY = b; } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
583 |
0 | 584 /** |
585 * Gets or sets the text that this control shows. | |
586 */ | |
587 string text() { return _text.dup; } | |
588 /// ditto | |
589 void text(string str) { | |
590 _text = str.dup; | |
591 repaint(); | |
592 //TextChanged(EventArgs e) // TODO: add event | |
593 } | |
594 | |
595 /** | |
596 * Gets or sets the background color of this control. | |
597 */ | |
598 Color backColor() { return _backColor; } | |
599 /// ditto | |
600 void backColor(Color c) { | |
601 _backColor = c; | |
602 repaint(); | |
603 } | |
604 | |
605 /** | |
606 * Gets or sets the foreground color of this control. | |
607 */ | |
608 Color foreColor() { return _foreColor; } | |
609 /// ditto | |
610 void foreColor(Color c) { | |
611 _foreColor = c; | |
612 repaint(); | |
613 } | |
614 | |
615 /** | |
616 * Gets or sets the font of this control uses to display text. A value of | |
617 * null means that the font is unset. When the font is null, the | |
618 * current theme's font is used. The default is null. | |
619 */ | |
620 Font font() { | |
621 // TODO: if font is null (unset), return from theme | |
622 //if(font is null) | |
623 // return Theme.Current.Control_Font(this); | |
624 //else | |
625 return _font; | |
626 } | |
627 /// ditto | |
628 void font(Font f) { | |
629 _font = f; | |
630 repaint(); | |
631 } | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
632 |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
633 void setCurrentCursor(Cursor cur) { |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
634 if(parent) |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
635 parent.setCurrentCursor(cur); |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
636 } |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
637 /** |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
638 * 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
|
639 * is over this control. |
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
640 */ |
0 | 641 Cursor cursor() { |
642 return _cursor; | |
643 } | |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
644 /// ditto |
0 | 645 void cursor(Cursor cur) { |
646 if(_cursor is cur) | |
647 return; | |
648 _cursor = cur; | |
649 if(getHotControl() is this) | |
23
d55b5b998412
Implement built-in mouse cursors with X.
Jordan Miner <jminer7@gmail.com>
parents:
15
diff
changeset
|
650 setCurrentCursor(_cursor); |
0 | 651 } |
652 | |
653 /** | |
654 * Causes the part of the control inside the specified | |
655 * rectangle to be repainted. The rectangle is in content coordinates. | |
656 * | |
657 * The control will not be repainted before this method returns; rather, | |
658 * the area is just marked as needing to be repainted. The next time there | |
15 | 659 * are no other system events to be processed, a painting event will |
660 * be called. | |
0 | 661 */ |
662 void repaint(Rect rect) { | |
5
4029d5af7542
Add blank lines and rewrap some comments.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
663 // 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
|
664 // not invalidated |
0 | 665 if(_parent) |
666 _parent.repaint(rect + location); | |
667 } | |
668 /// ditto | |
669 void repaint(real x, real y, real width, real height) { | |
670 repaint(Rect(x, y, width, height)); | |
671 } | |
672 /** | |
673 * Causes the entire control to be repainted. | |
674 */ | |
675 void repaint() { | |
676 repaint(Rect(0, 0, width, height)); | |
677 } | |
678 } | |
679 | |
64 | 680 /** |
681 * Sets the tabIndex of each control to be subsequent numbers. The first control | |
682 * will have an index of startIndex. | |
683 */ | |
684 void setTabOrder(Control[] controls...) { | |
685 setTabOrder(0, controls); | |
686 } | |
687 /// ditto | |
688 void setTabOrder(int startIndex, Control[] controls...) { | |
689 foreach(c; controls) | |
690 c.tabIndex = startIndex++; | |
60
cf7c5f968306
Fix crash in withGraphics() if there wasn't a Window ancestor with a handle.
Jordan Miner <jminer7@gmail.com>
parents:
59
diff
changeset
|
691 } |
0 | 692 |
64 | 693 unittest { |
694 auto c1 = new Control; | |
695 auto c2 = new Control; | |
696 auto c3 = new Control; | |
697 | |
698 // test setTabOrder() | |
699 setTabOrder(c1, c2, c3); | |
700 assert(c1.tabIndex == 0); | |
701 assert(c2.tabIndex == 1); | |
702 assert(c3.tabIndex == 2); | |
703 | |
704 c1.withGraphics((Graphics g) { g.source = Color.Blue; }); | |
705 } | |
706 |