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 }