Mercurial > projects > dynamin
comparison dynamin/gui/button.d @ 0:aa4efef0f0b1
Initial commit of code.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Mon, 15 Jun 2009 22:10:48 -0500 |
parents | |
children | ccc108b25a0a |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:aa4efef0f0b1 |
---|---|
1 // Written in the D programming language | |
2 // www.digitalmars.com/d/ | |
3 | |
4 /* | |
5 * The contents of this file are subject to the Mozilla Public License Version | |
6 * 1.1 (the "License"); you may not use this file except in compliance with | |
7 * the License. You may obtain a copy of the License at | |
8 * http://www.mozilla.org/MPL/ | |
9 * | |
10 * Software distributed under the License is distributed on an "AS IS" basis, | |
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
12 * for the specific language governing rights and limitations under the | |
13 * License. | |
14 * | |
15 * The Original Code is the Dynamin library. | |
16 * | |
17 * The Initial Developer of the Original Code is Jordan Miner. | |
18 * Portions created by the Initial Developer are Copyright (C) 2006-2009 | |
19 * the Initial Developer. All Rights Reserved. | |
20 * | |
21 * Contributor(s): | |
22 * Jordan Miner <jminer7@gmail.com> | |
23 * | |
24 */ | |
25 | |
26 module dynamin.gui.button; | |
27 | |
28 import dynamin.all_core; | |
29 import dynamin.all_gui; | |
30 import dynamin.all_painting; | |
31 import tango.io.Stdout; | |
32 import dynamin.c.cairo; // TODO: remove | |
33 | |
34 // TODO: maybe change to ControlState and add Disabled ? | |
35 enum ButtonState { | |
36 Normal, Hot, Pressed | |
37 } | |
38 // TODO: move to another file | |
39 enum TextImageRelation { | |
40 Overlay, TextBeforeImage, ImageBeforeText, TextAboveImage, ImageAboveText | |
41 } | |
42 | |
43 /** | |
44 * A button is a control that can be clicked to perform an action. | |
45 * | |
46 * The appearance of a button with Windows Classic: | |
47 * | |
48 * $(IMAGE ../web/example_button.png) | |
49 */ | |
50 class Button : Control { | |
51 protected: | |
52 ButtonState _state; | |
53 override void whenMouseDragged(MouseEventArgs e) { | |
54 if(contains(e.x, e.y)) | |
55 state = ButtonState.Pressed; | |
56 else | |
57 state = ButtonState.Normal; | |
58 } | |
59 override void whenMouseEntered(EventArgs e) { | |
60 state = ButtonState.Hot; | |
61 } | |
62 override void whenMouseLeft(EventArgs e) { | |
63 state = ButtonState.Normal; | |
64 } | |
65 override void whenMouseDown(MouseEventArgs e) { | |
66 if(e.button == MouseButton.Left) { | |
67 state = ButtonState.Pressed; | |
68 focus(); | |
69 } | |
70 } | |
71 override void whenMouseUp(MouseEventArgs e) { | |
72 if(state != ButtonState.Pressed) return; | |
73 state = ButtonState.Hot; | |
74 clicked(new EventArgs); | |
75 } | |
76 override void whenKeyDown(KeyEventArgs e) { | |
77 if(e.key == Key.Space) | |
78 state = ButtonState.Pressed; | |
79 } | |
80 override void whenKeyUp(KeyEventArgs e) { | |
81 if(e.key == Key.Space) { | |
82 if(state != ButtonState.Pressed) return; | |
83 state = ButtonState.Normal; | |
84 clicked(new EventArgs); | |
85 } | |
86 } | |
87 override void whenPainting(PaintingEventArgs e) { | |
88 Theme.current.Button_paint(this, e.graphics); | |
89 return; | |
90 // TODO: move to a theme or delete | |
91 with(e.graphics) { | |
92 if(_state == ButtonState.Hot) | |
93 source = Color(200, 0, 0); | |
94 else if(_state == ButtonState.Pressed) | |
95 source = Color(110, 0, 0); | |
96 else | |
97 source = Color(220, 80, 80); | |
98 moveTo(3, 0); | |
99 lineTo(width-3, 0); | |
100 lineTo(width, 3); | |
101 lineTo(width, height-3); | |
102 lineTo(width-3, height); | |
103 lineTo(3, height); | |
104 lineTo(0, height-3); | |
105 lineTo(0, 3); | |
106 closePath(); | |
107 fill(); | |
108 auto grad = cairo_pattern_create_linear(0, 0, 0, height/2+3); | |
109 cairo_pattern_add_color_stop_rgba(grad, 0, 1, 1, 1, .4); | |
110 cairo_pattern_add_color_stop_rgba(grad, 1, 1, 1, 1, .05); | |
111 cairo_set_source(handle, grad); | |
112 cairo_pattern_destroy(grad); | |
113 moveTo(3, 0); | |
114 lineTo(width-3, 0); | |
115 lineTo(width, 3); | |
116 lineTo(width, cast(int)height/2-3); | |
117 lineTo(width-3, cast(int)height/2); | |
118 lineTo(3, cast(int)height/2); | |
119 lineTo(0, cast(int)height/2+3); | |
120 lineTo(0, 3); | |
121 closePath(); | |
122 fill(); | |
123 | |
124 source = _state == ButtonState.Pressed ? Color.White : Color.Black; | |
125 fontSize = 13; | |
126 drawText(text, 5, height/2); | |
127 } | |
128 return; | |
129 | |
130 } | |
131 public void paintFore(Graphics g) { | |
132 auto extents = g.getTextExtents(text); | |
133 g.drawText(text, (width-extents.width)/2, (height-extents.height)/2); | |
134 } | |
135 | |
136 public: | |
137 /// Override this method in a subclass to handle the Clicked event. | |
138 protected void whenClicked(EventArgs e) { } | |
139 /// This event occurs after the button has been clicked. | |
140 Event!() clicked; | |
141 | |
142 this() { | |
143 clicked = new Event!()(&whenClicked); | |
144 _focusable = true; | |
145 } | |
146 this(string text) { | |
147 this(); | |
148 this.text = text; | |
149 } | |
150 override Size bestSize() { return Theme.current.Button_bestSize(this); } | |
151 ButtonState state() { return _state; } | |
152 void state(ButtonState s) { _state = s; repaint(); } | |
153 } |