Fix can_focus / remove deprecated HBox/VBox
[libprolooks.git] / src / SmallButton.vala
blobefe403fc16db118e589c5b939788cea5cb749cd0
1 /*
2 Copyright 2009 by Hans Baier
3 License: LGPLv2+
4 */
6 using Gtk;
7 using Gdk;
9 // template for new widgets
11 namespace Prolooks {
13 public class SmallButton : ButtonBase {
14 private Color base_color;
16 [Description(nick="button color", blurb="color as a string as accepted by gdk_color_parse (), eg: #a0b1c2")]
17 public string color {
18 set {
19 lock (base_color) {
20 if (value != null & value != "") {
21 base_color = color_from_string (value);
22 } else {
23 base_color = style.bg[(int)Gtk.StateType.NORMAL];
29 public SmallButton () {
31 // Enable the events you wish to get notified about.
32 // The 'expose' event is already enabled by the DrawingArea.
33 add_events (Gdk.EventMask.BUTTON_PRESS_MASK
34 | Gdk.EventMask.BUTTON_RELEASE_MASK
35 | Gdk.EventMask.ENTER_NOTIFY_MASK
36 | Gdk.EventMask.LEAVE_NOTIFY_MASK);
38 base_color = style.bg[(int)Gtk.StateType.NORMAL];
40 // Set favored widget size
41 set_size_request (20, 20);
43 draw.connect(on_draw);
46 public new virtual void get_preferred_width (out int minimum_width, out int natural_width) {
47 minimum_width = 20;
48 natural_width = 20;
51 public new virtual void get_preferred_height_for_width (int width, out int minimum_height, out int natural_height) {
52 minimum_height = 20;
53 natural_height = 20;
56 public new virtual void get_preferred_height (out int minimum_height, out int natural_height) {
57 minimum_height = 20;
58 natural_height = 20;
61 public new virtual void get_preferred_width_for_height (int height, out int minimum_width, out int natural_width) {
62 minimum_width = 20;
63 natural_width = 20;
67 public static void button_bg (Cairo.Context cr, Gdk.Color base_color, Gdk.Color outside_color, double width, double height, double shade_inside = 1.0) {
68 Gdk.Color color;
70 // line
72 color = outside_color; color = shade_color (color, 1.06); set_source_color (cr, color);
74 cr.move_to (2, 0); cr.line_to (width - 3, 0); cr.stroke ();
76 // line
78 color = outside_color; color = shade_color (color, 1.05); set_source_color (cr, color);
80 cr.move_to (1, 1); cr.line_to (width - 2, 1); cr.stroke ();
82 // line
84 color = outside_color; color = shade_color (color, 1.05); set_source_color (cr, color);
86 cr.move_to (0, 2); cr.line_to (width - 1, 2); cr.stroke ();
87 // line
89 color = outside_color; color = shade_color (color, 1.04); set_source_color (cr, color);
91 cr.move_to (3, 0); cr.line_to (width - 4, 0); cr.stroke ();
94 // line
96 color = outside_color; color = shade_color (color, 0.97); set_source_color (cr, color);
98 cr.move_to (2, 1); cr.line_to (width - 3, 1); cr.stroke ();
100 // line
102 color = outside_color; color = shade_color (color, 0.96); set_source_color (cr, color);
104 cr.move_to (1, 2); cr.line_to (width - 2, 2); cr.stroke ();
106 // missing line
108 color = outside_color; color = shade_color (color, 0.96); set_source_color (cr, color);
110 cr.move_to (0, 3); cr.line_to (width - 1, 3); cr.stroke ();
114 // line
116 color = outside_color; color = shade_color (color, 1.13); set_source_color (cr, color);
118 cr.move_to (2, height - 1); cr.line_to (width - 3, height - 1); cr.stroke ();
120 // line
122 color = outside_color; color = shade_color (color, 1.09); set_source_color (cr, color);
124 cr.move_to (1, height - 2); cr.line_to (width - 2, height - 2); cr.stroke ();
126 // line
128 color = outside_color; color = shade_color (color, 1.10); set_source_color (cr, color);
130 cr.move_to (0, height - 3); cr.line_to (width - 1, height - 3); cr.stroke ();
132 // line
134 color = outside_color; color = shade_color (color, 1.15); set_source_color (cr, color);
136 cr.move_to (3, height - 1); cr.line_to (width - 4, height - 1); cr.stroke ();
139 // line
141 color = outside_color; color = shade_color (color, 1.12); set_source_color (cr, color);
143 cr.move_to (2, height - 2); cr.line_to (width - 3, height - 2); cr.stroke ();
145 // line
147 color = outside_color; color = shade_color (color, 1.13); set_source_color (cr, color);
149 cr.move_to (1, height - 3); cr.line_to (width - 2, height - 3); cr.stroke ();
151 /////////////////////////// border outline
152 // line
154 color = base_color; color = shade_color (color, 0.6); set_source_color (cr, color);
156 cr.move_to (3, 1); cr.line_to (width - 4, 1); cr.stroke ();
158 // line
160 color = base_color; color = shade_color (color, 0.6); set_source_color (cr, color);
162 cr.move_to (3, height - 2); cr.line_to (width - 4, height - 2); cr.stroke ();
164 // line
166 color = base_color; color = shade_color (color, 0.6); set_source_color (cr, color);
168 cr.move_to (1, 3); cr.line_to (1, height - 4); cr.stroke ();
170 // line
172 color = base_color; color = shade_color (color, 0.6); set_source_color (cr, color);
174 cr.move_to (width - 2, 3); cr.line_to (width - 2, height - 4); cr.stroke ();
176 // line
178 color = base_color; color = shade_color (color, 0.6); set_source_color (cr, color);
180 cr.move_to (2, 2); cr.line_to (width - 3, 2); cr.stroke ();
182 // line
184 color = base_color; color = shade_color (color, 0.6); set_source_color (cr, color);
186 cr.move_to (2, height - 3); cr.line_to (width - 3, height - 3); cr.stroke ();
189 /////////////////////////// border smooth effect
190 // line
192 color = base_color; color = shade_color (color, 1.02); set_source_color (cr, color);
194 cr.move_to (3, 2); cr.line_to (width - 4, 2); cr.stroke ();
196 // line
198 color = base_color; color = shade_color (color, 1.00); set_source_color (cr, color);
200 cr.move_to (2, 3); cr.line_to (2, height - 4); cr.stroke ();
202 // line
204 color = base_color; color = shade_color (color, 0.94); set_source_color (cr, color);
206 cr.move_to (width - 3, 3); cr.line_to (width - 3, height - 4); cr.stroke ();
209 /////////////////////////// inside highlight
210 // line
212 color = base_color; color = shade_color (color, 1.2); set_source_color (cr, color);
214 cr.move_to (4, 2); cr.line_to (width - 5, 2); cr.stroke ();
216 // line
218 color = base_color; color = shade_color (color, 1.1); set_source_color (cr, color);
220 cr.move_to (2, 4); cr.line_to (2, height - 5); cr.stroke ();
222 /////////////////////////// inside shadow
223 // line
225 color = base_color; color = shade_color (color, 1.04); set_source_color (cr, color);
227 cr.move_to (width - 3, 4); cr.line_to (width - 3, height - 5); cr.stroke ();
230 /////////////////////////// fill gradient
231 // gradient
233 Cairo.Pattern gloss_gradient = gloss_gradient_pattern(0.0, 0.0, 0.0, height, gdk_color_to_cairo(shade_color(base_color, shade_inside)));
235 cr.set_source (gloss_gradient);
236 cr.rectangle (1.0, 2, width - 4, height - 5);
237 cr.fill ();
240 /////////////////////////// bottom border smooth effect
241 // line
243 color = base_color; color = shade_color (color, 1.00); set_source_color (cr, color);
245 cr.move_to (3, height - 3); cr.line_to (width - 4, height - 3); cr.stroke ();
247 // line
249 color = base_color; color = shade_color (color, 1.1); set_source_color (cr, color);
251 cr.move_to (4, height - 3); cr.line_to (width - 5, height - 3); cr.stroke ();
254 public static void button_bg_pressed (Cairo.Context cr, Gdk.Color base_color, Gdk.Color outside_color, double width, double height) {
255 Cairo.Pattern gradient;
256 Gdk.Color color;
257 //Gdk.Color test_color = color_from_string ("#ff0000");
259 /////////////////////////// outside highlight
260 // gradient
262 gradient = create_gradient (0, 0, 0, height - 4, shade_color (outside_color, 1.2), shade_color (outside_color, 1.0));
264 cr.set_source (gradient);
265 cr.rectangle (width - 2 - 0.5, 2, 1, height - 4);
266 cr.fill ();
268 // gradient
270 gradient = create_gradient (0, 0, 0, height - 6, shade_color (outside_color, 1.2), shade_color (outside_color, 1.0));
272 cr.set_source (gradient);
273 cr.rectangle (width - 1 - 0.5, 3, 1, height - 6);
274 cr.fill ();
276 // line
279 color = outside_color; color = shade_color (color, 1.0); set_source_color (cr, color);
281 cr.move_to (2, height - 2); cr.line_to (width - 3, height - 2); cr.stroke ();
283 // line
285 color = outside_color; color = shade_color (color, 1.0); set_source_color (cr, color);
287 cr.move_to (3, height - 1); cr.line_to (width - 4, height - 1); cr.stroke ();
289 /////////////////////////// border outline
290 // line
292 color = base_color; color = shade_color (color, 0.55); set_source_color (cr, color);
294 cr.move_to (3, 1); cr.line_to (width - 4, 1); cr.stroke ();
296 // line
298 color = base_color; color = shade_color (color, 0.55); set_source_color (cr, color);
300 cr.move_to (3, height - 2); cr.line_to (width - 4, height - 2); cr.stroke ();
302 // line
304 color = base_color; color = shade_color (color, 0.55); set_source_color (cr, color);
306 cr.move_to (1, 3); cr.line_to (1, height - 4); cr.stroke ();
308 // line
310 color = base_color; color = shade_color (color, 0.55); set_source_color (cr, color);
312 cr.move_to (width - 2, 3); cr.line_to (width - 2, height - 4); cr.stroke ();
315 // line
317 color = base_color; color = shade_color (color, 0.55); set_source_color (cr, color);
319 cr.move_to (2, 2); cr.line_to (width - 3, 2); cr.stroke ();
321 // line
323 color = base_color; color = shade_color (color, 0.55); set_source_color (cr, color);
325 cr.move_to (2, height - 3); cr.line_to (width - 3, height - 3); cr.stroke ();
328 /////////////////////////// inside shadow
329 // line
331 color = base_color; color = shade_color (color, 0.9); set_source_color (cr, color);
333 cr.move_to (3, 2); cr.line_to (width - 4, 2); cr.stroke ();
335 // line
337 color = base_color; color = shade_color (color, 0.85); set_source_color (cr, color);
339 cr.move_to (2, 3); cr.line_to (2, height - 4); cr.stroke ();
342 /////////////////////////// fill gradient
343 // gradient
345 gradient = create_gradient (0, 0, 0, height - 6, shade_color (base_color, 0.95), shade_color (base_color, 0.9));
347 cr.set_source (gradient);
348 cr.rectangle (3 - 0.5, 2, width - 5, height - 5.5);
349 cr.fill ();
350 // line
352 color = base_color; color = shade_color (color, 0.9); set_source_color (cr, color);
354 cr.move_to (3, height - 3); cr.line_to (width - 5, height - 3); cr.stroke ();
359 /* Widget is asked to draw itself */
360 public bool on_draw (Cairo.Context cr) {
361 Gtk.Allocation allocation;
362 get_allocation(out allocation);
364 double width = allocation.width - 2;
365 double height = allocation.height - 2;
367 cr.set_line_width (1);
368 cr.set_line_cap (Cairo.LineCap.SQUARE);
370 cr.translate (1.5,1.5);
372 if (button_state == ButtonState.PRESSED) {
373 lock (base_color) {
374 button_bg_pressed (cr, base_color, style.bg[(int)Gtk.StateType.NORMAL], width, height);
376 } else {
377 lock (base_color) {
378 button_bg (cr, base_color, style.bg[(int)Gtk.StateType.NORMAL], width, height, prelighted ? 1.1 : 1.0);
381 return false;
386 } // namespace Prolooks