Mercurial > projects > dynamin
comparison dynamin/gui/button.d @ 62:60832e1eef04
Implement default buttons.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Sat, 08 Aug 2009 20:35:20 -0500 |
parents | ccc108b25a0a |
children | 84beb40c1665 |
comparison
equal
deleted
inserted
replaced
61:f8f5d6244795 | 62:60832e1eef04 |
---|---|
26 module dynamin.gui.button; | 26 module dynamin.gui.button; |
27 | 27 |
28 import dynamin.all_core; | 28 import dynamin.all_core; |
29 import dynamin.all_gui; | 29 import dynamin.all_gui; |
30 import dynamin.all_painting; | 30 import dynamin.all_painting; |
31 import dynamin.gui.control; | |
32 import dynamin.gui.events; | |
31 import tango.io.Stdout; | 33 import tango.io.Stdout; |
32 import dynamin.c.cairo; // TODO: remove | 34 import dynamin.c.cairo; // TODO: remove |
33 | 35 |
34 // TODO: maybe change to ControlState and add Disabled ? | 36 // TODO: maybe change to ControlState and add Disabled ? |
35 enum ButtonState { | 37 enum ButtonState { |
47 * | 49 * |
48 * $(IMAGE ../web/example_button.png) | 50 * $(IMAGE ../web/example_button.png) |
49 */ | 51 */ |
50 class Button : Control { | 52 class Button : Control { |
51 protected: | 53 protected: |
54 package bool _isDefault; | |
52 ButtonState _state; | 55 ButtonState _state; |
56 override void whenFocusGained(EventArgs e) { | |
57 super.whenFocusGained(e); | |
58 auto anc = findAncestor((Container c) { | |
59 return c.defaultButton !is null; | |
60 }); | |
61 if(anc) { | |
62 foreach(d; &anc.descendants) { | |
63 if(auto b = cast(Button)d) | |
64 b._isDefault = false; | |
65 } | |
66 } | |
67 _isDefault = true; | |
68 } | |
69 override void whenFocusLost(EventArgs e) { | |
70 super.whenFocusLost(e); | |
71 _isDefault = false; | |
72 auto anc = findAncestor((Container c) { | |
73 return c.defaultButton !is null; | |
74 }); | |
75 if(anc) | |
76 anc.defaultButton._isDefault = true; | |
77 } | |
53 override void whenMouseDragged(MouseEventArgs e) { | 78 override void whenMouseDragged(MouseEventArgs e) { |
54 if(contains(e.x, e.y)) | 79 if(contains(e.x, e.y)) |
55 state = ButtonState.Pressed; | 80 state = ButtonState.Pressed; |
56 else | 81 else |
57 state = ButtonState.Normal; | 82 state = ButtonState.Normal; |
72 if(state != ButtonState.Pressed) return; | 97 if(state != ButtonState.Pressed) return; |
73 state = ButtonState.Hot; | 98 state = ButtonState.Hot; |
74 clicked(new EventArgs); | 99 clicked(new EventArgs); |
75 } | 100 } |
76 override void whenKeyDown(KeyEventArgs e) { | 101 override void whenKeyDown(KeyEventArgs e) { |
77 if(e.key == Key.Space) | 102 if(e.key == Key.Space) { |
78 state = ButtonState.Pressed; | 103 state = ButtonState.Pressed; |
104 e.stopped = true; | |
105 } else if(e.key == Key.Enter) { // being default is implied in keyDown | |
106 scope e2 = new EventArgs; | |
107 clicked(e2); | |
108 e.stopped = true; | |
109 } | |
79 } | 110 } |
80 override void whenKeyUp(KeyEventArgs e) { | 111 override void whenKeyUp(KeyEventArgs e) { |
81 if(e.key == Key.Space) { | 112 if(e.key == Key.Space) { |
82 if(state != ButtonState.Pressed) return; | 113 if(state != ButtonState.Pressed) return; |
83 state = ButtonState.Normal; | 114 state = ButtonState.Normal; |
84 clicked(new EventArgs); | 115 scope e2 = new EventArgs; |
116 clicked(e2); | |
117 e.stopped = true; | |
85 } | 118 } |
86 } | 119 } |
87 override void whenPainting(PaintingEventArgs e) { | 120 override void whenPainting(PaintingEventArgs e) { |
88 Theme.current.Button_paint(this, e.graphics); | 121 Theme.current.Button_paint(this, e.graphics); |
89 return; | 122 return; |
148 this.text = text; | 181 this.text = text; |
149 } | 182 } |
150 override Size bestSize() { return Theme.current.Button_bestSize(this); } | 183 override Size bestSize() { return Theme.current.Button_bestSize(this); } |
151 ButtonState state() { return _state; } | 184 ButtonState state() { return _state; } |
152 void state(ButtonState s) { _state = s; repaint(); } | 185 void state(ButtonState s) { _state = s; repaint(); } |
186 /** | |
187 * Returns true if this button should be painted as being default. | |
188 * Mainly for themes. | |
189 */ | |
190 bool isDefault() { return _isDefault; } | |
153 } | 191 } |