# HG changeset patch # User Jordan Miner # Date 1249781720 18000 # Node ID 60832e1eef04d2ec35d84ff9f92224632d9d4c25 # Parent f8f5d624479533f671a488a50b7b496c7d87aab4 Implement default buttons. diff -r f8f5d6244795 -r 60832e1eef04 dynamin/gui/button.d --- a/dynamin/gui/button.d Sat Aug 08 20:20:35 2009 -0500 +++ b/dynamin/gui/button.d Sat Aug 08 20:35:20 2009 -0500 @@ -28,6 +28,8 @@ import dynamin.all_core; import dynamin.all_gui; import dynamin.all_painting; +import dynamin.gui.control; +import dynamin.gui.events; import tango.io.Stdout; import dynamin.c.cairo; // TODO: remove @@ -49,7 +51,30 @@ */ class Button : Control { protected: + package bool _isDefault; ButtonState _state; + override void whenFocusGained(EventArgs e) { + super.whenFocusGained(e); + auto anc = findAncestor((Container c) { + return c.defaultButton !is null; + }); + if(anc) { + foreach(d; &anc.descendants) { + if(auto b = cast(Button)d) + b._isDefault = false; + } + } + _isDefault = true; + } + override void whenFocusLost(EventArgs e) { + super.whenFocusLost(e); + _isDefault = false; + auto anc = findAncestor((Container c) { + return c.defaultButton !is null; + }); + if(anc) + anc.defaultButton._isDefault = true; + } override void whenMouseDragged(MouseEventArgs e) { if(contains(e.x, e.y)) state = ButtonState.Pressed; @@ -74,14 +99,22 @@ clicked(new EventArgs); } override void whenKeyDown(KeyEventArgs e) { - if(e.key == Key.Space) + if(e.key == Key.Space) { state = ButtonState.Pressed; + e.stopped = true; + } else if(e.key == Key.Enter) { // being default is implied in keyDown + scope e2 = new EventArgs; + clicked(e2); + e.stopped = true; + } } override void whenKeyUp(KeyEventArgs e) { if(e.key == Key.Space) { if(state != ButtonState.Pressed) return; state = ButtonState.Normal; - clicked(new EventArgs); + scope e2 = new EventArgs; + clicked(e2); + e.stopped = true; } } override void whenPainting(PaintingEventArgs e) { @@ -150,4 +183,9 @@ override Size bestSize() { return Theme.current.Button_bestSize(this); } ButtonState state() { return _state; } void state(ButtonState s) { _state = s; repaint(); } + /** + * Returns true if this button should be painted as being default. + * Mainly for themes. + */ + bool isDefault() { return _isDefault; } } diff -r f8f5d6244795 -r 60832e1eef04 dynamin/gui/container.d --- a/dynamin/gui/container.d Sat Aug 08 20:20:35 2009 -0500 +++ b/dynamin/gui/container.d Sat Aug 08 20:35:20 2009 -0500 @@ -30,6 +30,7 @@ import dynamin.all_gui; import dynamin.gui.control; import dynamin.gui.events; +import dynamin.gui.button; import tango.io.Stdout; alias List!(Control, true) ControlList; @@ -40,6 +41,7 @@ ControlList _children; Size _minSize; Size _maxSize; + Button _defaultButton; override void whenResized(EventArgs e) { layout(); @@ -125,6 +127,9 @@ } void dispatchDescendantAdded(HierarchyEventArgs e) { + if(e.descendant is defaultButton) + (cast(Button)e.descendant)._isDefault = true; + descendantAdded.callHandlers(e); descendantAdded.callMainHandler(e); e.levels = e.levels + 1; @@ -138,6 +143,15 @@ if(_parent) _parent.descendantRemoved(e); } + + override void whenKeyDown(KeyEventArgs e) { + if(e.key == Key.Enter && defaultButton) { + scope e2 = new EventArgs; + defaultButton.clicked(e2); + e.stopped = true; + } + } + public: /// Override this method in a subclass to handle the minSizeChanged event. protected void whenMinSizeChanged(EventArgs e) { } @@ -172,6 +186,20 @@ elasticX = true; elasticY = true; } + + /** + * Gets or sets the default button in this container. + */ + Button defaultButton() { return _defaultButton; } + /// ditto + void defaultButton(Button b) { + _defaultButton = b; + foreach(d; &descendants) { + if(b == d) + b._isDefault = true; + } + } + override void dispatchPainting(PaintingEventArgs e) { super.dispatchPainting(e); foreach(c; _children) { diff -r f8f5d6244795 -r 60832e1eef04 dynamin/gui/windows_theme.d --- a/dynamin/gui/windows_theme.d Sat Aug 08 20:20:35 2009 -0500 +++ b/dynamin/gui/windows_theme.d Sat Aug 08 20:35:20 2009 -0500 @@ -214,6 +214,8 @@ version(Windows) { if(Ux.isThemeActive()) { auto uxState = findUxState(c, PBS_DISABLED, PBS_NORMAL, PBS_HOT, PBS_PRESSED); + if(uxState == PBS_NORMAL && c.isDefault) + uxState = PBS_DEFAULTED; Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "BUTTON", BP_PUSHBUTTON, uxState); if(c.focused && c.showFocus)