ardour
led.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2010 Paul Davis
3 
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.
8 
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.
13 
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.
17 
18 */
19 
20 #include <iostream>
21 #include <cmath>
22 #include <algorithm>
23 
24 #include "led.h"
25 
26 using namespace Gdk;
27 using namespace Gtk;
28 using namespace Glib;
29 using namespace Gtkmm2ext;
30 
32  : _diameter (0.0)
33  , _red (0.0)
34  , _green (1.0)
35  , _blue (0.0)
36  , _fixed_diameter (false)
37 {
38 }
39 
41 {
42 }
43 
44 void
45 LED::render (cairo_t* cr, cairo_rectangle_t*)
46 {
47  if (!_fixed_diameter) {
48  _diameter = std::min (get_width(), get_height());
49  }
50 
51  //background
52 
53  Widget* parent;
54  RefPtr<Style> style;
55  Color c;
56 
57  parent = get_parent ();
58 
59  while (parent && !parent->get_has_window()) {
60  parent = parent->get_parent();
61  }
62 
63  if (parent && parent->get_has_window()) {
64  style = parent->get_style ();
65  c = style->get_bg (parent->get_state());
66  } else {
67  style = get_style ();
68  c = style->get_bg (get_state());
69  }
70 
71 #if 0
72  cairo_rectangle(cr, 0, 0, _width, _height);
73  cairo_stroke_preserve(cr);
74  cairo_set_source_rgb(cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
75  cairo_fill(cr);
76 #endif
77 
78  cairo_translate(cr, get_width()/2, get_height()/2);
79 
80  //inset
81  cairo_pattern_t *pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, _diameter);
82  cairo_pattern_add_color_stop_rgba (pat, 0, 0,0,0, 0.4);
83  cairo_pattern_add_color_stop_rgba (pat, 1, 1,1,1, 0.7);
84  cairo_arc (cr, 0, 0, _diameter/2, 0, 2 * M_PI);
85  cairo_set_source (cr, pat);
86  cairo_fill (cr);
87  cairo_pattern_destroy (pat);
88 
89  //black ring
90  cairo_set_source_rgb (cr, 0, 0, 0);
91  cairo_arc (cr, 0, 0, _diameter/2-2, 0, 2 * M_PI);
92  cairo_fill(cr);
93 
94  //knob color
95  cairo_set_source_rgba (cr, _red, _green, _blue, (active_state() == Gtkmm2ext::ExplicitActive) ? 0.8 : 0.2);
96  cairo_arc (cr, 0, 0, _diameter/2-3, 0, 2 * M_PI);
97  cairo_fill(cr);
98 
99  //reflection
100  cairo_scale(cr, 0.7, 0.7);
101  cairo_pattern_t *pat2 = cairo_pattern_create_linear (0.0, 0.0, 0.0, _diameter/2-3);
102  cairo_pattern_add_color_stop_rgba (pat2, 0, 1,1,1, active_state() ? 0.4 : 0.2);
103  cairo_pattern_add_color_stop_rgba (pat2, 1, 1,1,1, 0.0);
104  cairo_arc (cr, 0, 0, _diameter/2-3, 0, 2 * M_PI);
105  cairo_set_source (cr, pat2);
106  cairo_fill (cr);
107  cairo_pattern_destroy (pat2);
108 
109  cairo_stroke (cr);
110 }
111 
112 void
114 {
115  _diameter = (d*2) + 5.0;
116 
117  if (_diameter != 0.0) {
118  _fixed_diameter = true;
119  }
120 
121  set_dirty ();
122 }
123 
124 void
126 {
128  CairoWidget::on_realize ();
129 }
130 
131 void
132 LED::on_size_request (Gtk::Requisition* req)
133 {
134  if (_fixed_diameter) {
135  req->width = _diameter;
136  req->height = _diameter;
137  } else {
138  CairoWidget::on_size_request (req);
139  }
140 }
141 
142 void
144 {
145  RefPtr<Style> style = get_style();
146  Color c;
147 
148  switch (_visual_state) {
149  case VisualState(0):
150  c = style->get_fg (STATE_NORMAL);
151  break;
152  default:
153  c = style->get_fg (STATE_ACTIVE);
154  break;
155  }
156 
157  _red = c.get_red_p ();
158  _green = c.get_green_p ();
159  _blue = c.get_blue_p ();
160 
161  set_dirty ();
162 }
void on_realize()
Definition: led.cc:125
float _green
Definition: led.h:43
void set_colors_from_style()
Definition: led.cc:143
bool _fixed_diameter
Definition: led.h:45
Definition: ardour_ui.h:130
Gtkmm2ext::ActiveState active_state() const
Definition: cairo_widget.h:40
float _blue
Definition: led.h:44
virtual ~LED()
Definition: led.cc:40
void render(cairo_t *, cairo_rectangle_t *)
Definition: led.cc:45
void set_diameter(float)
Definition: led.cc:113
ExplicitActive
Definition: widget_state.h:13
float _red
Definition: led.h:42
void set_dirty()
Gtkmm2ext::VisualState _visual_state
Definition: cairo_widget.h:114
float _diameter
Definition: led.h:41
LED()
Definition: led.cc:31
void on_size_request(Gtk::Requisition *req)
Definition: led.cc:132