* Display: remove debugging output
[jackpanel.git] / jackpanel / Display.vala
blob8bedafb84427ccc3812c14a6cdc891aeed232b9a
1 using Gtk;
2 using Gdk;
3 using Prolooks;
5 namespace Jackpanel {
7 public class Display : PanelDisplayBase {
8 private double realtime_x;
9 private double realtime_y;
10 private double realtime_w;
11 private double realtime_h;
13 public signal void toggle_realtime_requested (bool new_state);
14 public bool realtime { get; set; }
16 static jack_nframes_t[] sample_rates = { 22050, 32000, 44100, 48000, 96000, 192000 };
17 private jack_nframes_t _sample_rate;
18 public jack_nframes_t sample_rate {
19 get {
20 return _sample_rate;
22 set {
23 if (_sample_rate != value) {
24 _sample_rate = value;
25 queue_draw ();
29 public signal void sample_rate_changed (jack_nframes_t new_sample_rate);
30 private double sample_rate_x;
31 private double sample_rate_y;
32 private double sample_rate_w;
33 private double sample_rate_h;
34 private Menu sample_rate_menu;
36 private jack_nframes_t _buffer_size;
37 public jack_nframes_t buffer_size {
38 get {
39 return _buffer_size;
41 set {
42 if (_buffer_size != value) {
43 _buffer_size = value;
44 queue_draw ();
49 static uint[] buffer_sizes = { 16, 32, 64, 128, 256, 512, 1024, 2048 };
50 public signal void buffer_size_changed (jack_nframes_t new_buffer_size);
51 private double buffer_size_x;
52 private double buffer_size_y;
53 private double buffer_size_w;
54 private double buffer_size_h;
55 private Menu buffer_size_menu;
58 public Display () {
59 base ();
60 width = 182;
61 height = 49;
62 set_size_request (width, height);
66 private double popup_triangle_width () { return 7.0; }
68 public void draw_popup_triangle (Cairo.Context cr, double x, double y) {
69 cr.save ();
70 set_source_from_color_string (cr, "#b3b6af");
71 cr.new_path ();
72 cr.move_to (x, y);
73 cr.line_to (x + popup_triangle_width (), y);
74 cr.line_to (x + popup_triangle_width () / 2.0, y + 4);
75 cr.close_path ();
76 cr.fill ();
77 cr.restore ();
80 protected override bool draw_contents (Cairo.Context cr, Gdk.EventExpose event) {
81 double padding = 3;
82 double font_size = 16;
83 double smaller_font_size = font_size - 4;
84 double x = 0;
85 double y = font_size;
87 ///////////////////////////// ABOVE
88 // show time text
89 text (cr, time, padding + x, y, font_size);
91 Cairo.TextExtents ext = Cairo.TextExtents();
92 cr.text_extents (time_alt, ref ext);
94 // show alt text right justified
95 text (cr, time_alt, inner_width - ext.x_advance - ext.x_bearing - padding, y, font_size);
97 ////////////////////////////// LINES
98 // draw lines
99 Color line_color;
100 Color.parse (text_color_default, out line_color);
101 set_source_from_color (cr, line_color, 0.5);
103 /* shows text boundaries for visual debugging: left bound
104 cr.move_to (x, y + ext.y_bearing);
105 cr.rel_line_to (0, ext.height);
106 cr.stroke();
109 cr.text_extents (time, ref ext);
110 // clock time separator line
111 var vline_x = padding + x + ext.x_advance + ext.x_bearing + padding + 1;
113 cr.move_to (vline_x, padding);
114 cr.rel_line_to (0, inner_height - 2 * padding + 1);
115 cr.stroke();
117 var hline_y = padding + ext.height + padding + 2;
119 // vertical separator line
120 cr.move_to (padding, hline_y);
121 cr.rel_line_to (width - 20, 0);
122 cr.stroke();
124 ////////////////////////////// BELOW
125 var y_text_below = 0.5 + hline_y + smaller_font_size;
127 // Realtime
128 string rt = "RT";
129 cr.text_extents (rt, ref ext);
130 if (realtime) {
131 text (cr, rt, padding, y_text_below, smaller_font_size);
134 realtime_x = padding;
135 realtime_y = y_text_below - ext.height;
136 realtime_w = ext.x_advance;
137 realtime_h = ext.height + ext.y_bearing;
140 var x_after_rt = padding + ext.x_advance;
142 // Xruns
143 string xruns_str = "X: %u".printf (xruns);
144 cr.text_extents (xruns_str, ref ext);
145 if (xruns == 0) {
146 text (cr, xruns_str, x_after_rt, y_text_below, smaller_font_size);
147 } else {
148 text (cr, xruns_str, x_after_rt, y_text_below, smaller_font_size, "#ff0000");
151 xruns_x = x_after_rt;
152 xruns_y = y_text_below - ext.height;
153 xruns_w = vline_x - x_after_rt;
154 xruns_h = ext.height;
156 /* debug rect
157 set_source_from_color_string (cr, "#ff0000");
158 cr.rectangle (xruns_x, xruns_y, xruns_w, xruns_h);
159 cr.stroke ();
162 // buffer size
163 string buffer_size_str = "%2.1fms".printf (buffer_size*1000.0/(double)sample_rate);
165 cr.text_extents (buffer_size_str, ref ext);
166 var y_popup_triangle = y_text_below - ext.height + 1.0;
168 buffer_size_x = vline_x + padding;
169 buffer_size_y = y_popup_triangle;
170 buffer_size_w = ext.x_advance + ext.x_bearing + popup_triangle_width ();
171 buffer_size_h = ext.height;
172 text (cr, buffer_size_str, buffer_size_x, y_text_below, smaller_font_size);
173 draw_popup_triangle (cr, buffer_size_x + ext.x_advance + ext.x_bearing + 1.0, y_popup_triangle);
175 // sample_rate
176 string sample_rate_str = "%u".printf (sample_rate);
177 cr.text_extents (sample_rate_str, ref ext);
179 sample_rate_x = inner_width - ext.x_advance - ext.x_bearing - padding - 1 - popup_triangle_width ();
180 sample_rate_y = y_popup_triangle;
181 sample_rate_w = ext.x_advance + ext.x_bearing + popup_triangle_width ();
182 sample_rate_h = ext.height;
183 text (cr, sample_rate_str, sample_rate_x, y_text_below, smaller_font_size);
184 draw_popup_triangle (cr, inner_width - popup_triangle_width () - padding, y_popup_triangle);
186 return false;
189 public override bool button_press_event (Gdk.EventButton event) {
190 if (event.type == EventType.BUTTON_PRESS) {
191 if (is_in_rect (event.x, event.y, sample_rate_x, sample_rate_y, sample_rate_w, sample_rate_h)) {
192 sample_rate_menu = new Menu();
193 for (int i = 0; i < sample_rates.length; i++) {
194 var item = new MenuItem.with_label ("%u".printf (sample_rates[i]));
195 item.activate += (item) => {
196 string rate_str = ((Gtk.Label)((Gtk.Item)item).get_child ()).get_text();
197 var new_rate = (jack_nframes_t) rate_str.to_ulong ();
198 if (new_rate != sample_rate) {
199 sample_rate_changed (new_rate);
202 sample_rate_menu.append (item);
205 sample_rate_menu.popup (null, null, null, 3, event.time);
206 sample_rate_menu.show_all();
207 return true;
209 if (is_in_rect (event.x, event.y, buffer_size_x, buffer_size_y, buffer_size_w, buffer_size_h)) {
210 buffer_size_menu = new Menu ();
211 for (int i = 0; i < buffer_sizes.length; i++) {
212 var item = new MenuItem.with_label ("%2.1fms".printf (buffer_sizes[i]*1000.0/(double)sample_rate));
213 item.user_data = &buffer_sizes[i];
214 item.activate += (item) => {
215 buffer_size_changed (*((jack_nframes_t *)item.user_data));
217 buffer_size_menu.append (item);
220 buffer_size_menu.popup (null, null, null, 3, event.time);
221 buffer_size_menu.show_all();
222 return true;
226 if (event.type == EventType.BUTTON_PRESS && event.button == 1) {
227 if (is_in_rect (event.x, event.y, realtime_x, realtime_y, realtime_w, realtime_h)) {
228 toggle_realtime_requested (!realtime);
231 if (is_in_rect (event.x, event.y, xruns_x, xruns_y, xruns_w, xruns_h)) {
232 reset_xruns_requested ();
235 return false;
238 private bool was_in_realtime_rect;
240 /* Mouse pointer moved over widget */
241 public override bool motion_notify_event (Gdk.EventMotion event) {
243 var cr = Gdk.cairo_create (this.window);
245 if (is_in_rect (event.x, event.y, realtime_x, realtime_y, realtime_w, realtime_h)) {
246 was_in_realtime_rect = true;
247 set_source_from_color_string (cr, text_color_default, 0.1);
248 cr.rectangle (realtime_x, realtime_y, realtime_w, realtime_h);
249 cr.fill ();
250 } else {
251 if (was_in_realtime_rect) {
252 queue_draw ();
256 return false;
261 } //namespace Jackpanel