Mercurial > projects > dynamin
annotate dynamin/gui/text_box.d @ 113:4636a64afabc default tip
Add reverse() function.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Sat, 19 Jan 2013 21:08:52 -0600 |
parents | 73060bc3f004 |
children |
rev | line source |
---|---|
0 | 1 |
2 /* | |
103
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
78
diff
changeset
|
3 * Copyright Jordan Miner |
0 | 4 * |
103
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
78
diff
changeset
|
5 * This Source Code Form is subject to the terms of the Mozilla Public |
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
78
diff
changeset
|
6 * License, v. 2.0. If a copy of the MPL was not distributed with this |
73060bc3f004
Change license to Boost 1.0 and MPL 2.0.
Jordan Miner <jminer7@gmail.com>
parents:
78
diff
changeset
|
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
0 | 8 * |
9 */ | |
10 | |
11 module dynamin.gui.text_box; | |
12 | |
13 import dynamin.all_painting; | |
14 import dynamin.all_core; | |
15 import dynamin.all_gui; | |
16 | |
17 /** | |
18 * A control that allows text to be entered and edited. | |
19 * | |
20 * The appearance of a text box with Windows Classic: | |
21 * | |
22 * $(IMAGE ../web/example_text_box.png) | |
23 */ | |
24 class TextBox : Scrollable { | |
25 protected: | |
26 string _text; | |
27 int _caret = 0; | |
28 override Size contentBestSize() { | |
29 return Size(0, 0); | |
30 } | |
31 override void whenContentPainting(PaintingEventArgs e) { | |
32 with(e.graphics) { | |
33 source = Color.White; | |
34 paint(); | |
35 source = Color.Black; | |
36 drawText(_text, 1, 1); | |
37 if(focused) { | |
38 Size ex = getTextExtents(_text[0.._caret]); | |
39 moveTo(1+ex.width+0.5, 1); | |
40 lineTo(1+ex.width+0.5, 14); | |
41 stroke(); | |
42 } | |
43 } | |
44 } | |
45 override void whenContentMouseDown(MouseEventArgs e) { | |
46 focus(); | |
47 repaint(); | |
48 } | |
49 override void whenKeyDown(KeyEventArgs e) { | |
50 switch(e.key) { | |
51 case Key.Backspace: | |
52 if(_caret > 0) | |
53 _text = _text[0.._caret-1] ~ _text[_caret..$]; | |
54 if(_caret > 0) | |
55 _caret--; | |
56 break; | |
57 case Key.Delete: | |
58 if(_text.length > _caret) | |
59 _text = _text[0.._caret] ~ _text[_caret+1..$]; | |
60 break; | |
61 case Key.Right: | |
62 if(_caret < _text.length) | |
63 _caret++; | |
64 break; | |
65 case Key.Left: | |
66 if(_caret > 0) | |
67 _caret--; | |
68 break; | |
69 case Key.Home: | |
70 _caret = 0; | |
71 break; | |
72 case Key.End: | |
73 _caret = _text.length; | |
74 break; | |
75 default: | |
76 return; | |
77 } | |
78 repaint(); | |
79 } | |
80 override void whenKeyTyped(KeyTypedEventArgs e) { | |
81 _text = format("{}{}{}", _text[0.._caret], e.character, _text[_caret..$]); | |
82 _caret++; | |
83 repaint(); | |
84 } | |
85 override void whenMouseDown(MouseEventArgs e) { | |
86 focus(); | |
87 } | |
88 public: | |
89 override Size bestSize() { | |
90 // TODO: columns and rows | |
91 return Size(100, 20); | |
92 } | |
93 override int baseline() { return 14; } | |
94 | |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
95 /// Override this method in a subclass to handle the selectionChanged event. |
8
b621b528823d
whenXX methods have to come before the event if switched to template mixins.
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
96 protected void whenSelectionChanged(EventArgs e) { } |
0 | 97 /// This event occurs after the selection has changed. |
10
ccc108b25a0a
Convert to using a struct for events. Fix some comments too.
Jordan Miner <jminer7@gmail.com>
parents:
8
diff
changeset
|
98 Event!(whenSelectionChanged) selectionChanged; |
0 | 99 |
100 this() { | |
78
651082a9b364
Add Event.setUp() and use in place of mainHandler and dispatcher.
Jordan Miner <jminer7@gmail.com>
parents:
10
diff
changeset
|
101 selectionChanged.setUp(&whenSelectionChanged); |
0 | 102 |
103 super(); | |
104 _focusable = true; | |
105 content.cursor = Cursor.Text; | |
106 | |
107 // TODO: change if Multiline is added | |
108 visibleScrollBars = VisibleScrollBars.None; | |
109 elasticX = true; | |
110 elasticY = false; | |
111 } | |
112 } | |
113 |