2 Copyright (C) 2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
34 , _fixed_diameter (false)
47 LED::render (cairo_t
* cr
)
49 if (!_fixed_diameter
) {
50 _diameter
= std::min (_width
, _height
);
59 parent
= get_parent ();
61 while (parent
&& !parent
->get_has_window()) {
62 parent
= parent
->get_parent();
65 if (parent
&& parent
->get_has_window()) {
66 style
= parent
->get_style ();
67 c
= style
->get_bg (parent
->get_state());
70 c
= style
->get_bg (get_state());
74 cairo_rectangle(cr
, 0, 0, _width
, _height
);
75 cairo_stroke_preserve(cr
);
76 cairo_set_source_rgb(cr
, c
.get_red_p(), c
.get_green_p(), c
.get_blue_p());
79 cairo_translate(cr
, _width
/2, _height
/2);
83 cairo_pattern_t
*pat
= cairo_pattern_create_linear (0.0, 0.0, 0.0, _diameter
);
84 cairo_pattern_add_color_stop_rgba (pat
, 0, 0,0,0, 0.4);
85 cairo_pattern_add_color_stop_rgba (pat
, 1, 1,1,1, 0.7);
86 cairo_arc (cr
, 0, 0, _diameter
/2, 0, 2 * M_PI
);
87 cairo_set_source (cr
, pat
);
89 cairo_pattern_destroy (pat
);
92 cairo_set_source_rgb (cr
, 0, 0, 0);
93 cairo_arc (cr
, 0, 0, _diameter
/2-2, 0, 2 * M_PI
);
97 cairo_set_source_rgba (cr
, _red
, _green
, _blue
, _active
? 0.8 : 0.2);
98 cairo_arc (cr
, 0, 0, _diameter
/2-3, 0, 2 * M_PI
);
102 cairo_scale(cr
, 0.7, 0.7);
103 cairo_pattern_t
*pat2
= cairo_pattern_create_linear (0.0, 0.0, 0.0, _diameter
/2-3);
104 cairo_pattern_add_color_stop_rgba (pat2
, 0, 1,1,1, _active
? 0.4 : 0.2);
105 cairo_pattern_add_color_stop_rgba (pat2
, 1, 1,1,1, 0.0);
106 cairo_arc (cr
, 0, 0, _diameter
/2-3, 0, 2 * M_PI
);
107 cairo_set_source (cr
, pat2
);
109 cairo_pattern_destroy (pat2
);
112 cairo_set_source_rgba (cr
, _red
, _green
, _blue
, 1.0);
113 cairo_arc (cr
, 0, 0, _diameter
/2-5, 0, 2 * M_PI
);
120 LED::set_visual_state (int32_t s
)
122 if (s
!= _visual_state
) {
125 set_colors_from_style ();
130 LED::set_diameter (float d
)
132 _diameter
= (d
*2) + 5.0;
134 if (_diameter
!= 0.0) {
135 _fixed_diameter
= true;
144 set_colors_from_style ();
145 CairoWidget::on_realize ();
149 LED::on_size_request (Gtk::Requisition
* req
)
151 if (_fixed_diameter
) {
152 req
->width
= _diameter
;
153 req
->height
= _diameter
;
155 CairoWidget::on_size_request (req
);
160 LED::set_colors_from_style ()
162 RefPtr
<Style
> style
= get_style();
165 switch (_visual_state
) {
167 c
= style
->get_fg (STATE_NORMAL
);
170 c
= style
->get_fg (STATE_ACTIVE
);
174 _red
= c
.get_red_p ();
175 _green
= c
.get_green_p ();
176 _blue
= c
.get_blue_p ();