changeset 62:60832e1eef04

Implement default buttons.
author Jordan Miner <jminer7@gmail.com>
date Sat, 08 Aug 2009 20:35:20 -0500
parents f8f5d6244795
children 84beb40c1665
files dynamin/gui/button.d dynamin/gui/container.d dynamin/gui/windows_theme.d
diffstat 3 files changed, 70 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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; }
 }
--- 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) {
--- 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)