2 Copyright 2009 by Hans Baier
9 // template for new widgets
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")]
20 if (value
!= null & value
!= "") {
21 base_color
= color_from_string (value
);
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
) {
51 public new
virtual void get_preferred_height_for_width (int width
, out int minimum_height
, out int natural_height
) {
56 public new
virtual void get_preferred_height (out int minimum_height
, out int natural_height
) {
61 public new
virtual void get_preferred_width_for_height (int height
, out int minimum_width
, out int natural_width
) {
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) {
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 ();
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 ();
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 ();
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 ();
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 ();
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 ();
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 ();
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 ();
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 ();
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 ();
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 ();
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 ();
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
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 ();
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 ();
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 ();
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 ();
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 ();
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
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 ();
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 ();
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
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 ();
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
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
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);
240 /////////////////////////// bottom border smooth effect
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 ();
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
;
257 //Gdk.Color test_color = color_from_string ("#ff0000");
259 /////////////////////////// outside highlight
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);
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);
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 ();
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
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 ();
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 ();
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 ();
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 ();
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 ();
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
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 ();
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
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);
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
) {
374 button_bg_pressed (cr
, base_color
, style
.bg
[(int)Gtk
.StateType
.NORMAL
], width
, height
);
378 button_bg (cr
, base_color
, style
.bg
[(int)Gtk
.StateType
.NORMAL
], width
, height
, prelighted ?
1.1 : 1.0);
386 } // namespace Prolooks