remove debianization from main repo
[jackpanel.git] / jackpanel / Display.vala
blob5ee93aeee1699be79fea9d19deb7fda446b1207e
1 /*
2 Copyright 2009 by Hans Baier
3 License: GPLv2+
4 */
6 using Gtk;
7 using Gdk;
8 using Prolooks;
10 namespace Jackpanel {
12 public class Display : PanelDisplayBase {
13 protected Menu contextmenu;
14 public signal void preferences ();
16 private Jack.Client? make_vala_include_jack_h_workaround;
18 construct {
19 _width = 182;
20 _height = 49;
21 set_size_request (width, height);
22 contextmenu = new Menu ();
23 var item = new MenuItem.with_label ("Preferences");
24 item.activate += (item) => {
25 preferences ();
28 contextmenu.append (item);
31 public bool jack_running { get; set; }
33 private const double padding = 3;
34 private const double font_size = 16;
35 private double vline_x;
37 protected override void redraw_time () {
38 queue_draw_area ((int)padding + (int)inner_x, (int)padding + (int)inner_y, (int) vline_x + (int)padding - (int)inner_x, (int)font_size);
41 protected override void redraw_time_alt () {
42 queue_draw_area ((int)vline_x + 2*(int)padding, (int)inner_y + (int)padding, (int)inner_width - (int)vline_x, (int)font_size);
45 protected override bool draw_contents (Cairo.Context cr, Gdk.EventExpose event) {
46 double status_text_font_size = font_size - 4;
47 double x = 0;
48 double y = font_size;
49 ///////////////////////////// ABOVE
50 // show time text
51 text (cr, time, padding + x, y, font_size);
53 Cairo.TextExtents ext = Cairo.TextExtents();
54 cr.text_extents (time_alt, out ext);
56 // show alt text right justified
57 text (cr, time_alt, inner_width - ext.x_advance - ext.x_bearing - padding, y, font_size);
59 ////////////////////////////// LINES
60 // draw lines
61 Color line_color;
62 Color.parse (text_color_default, out line_color);
63 set_source_color (cr, line_color, 0.5);
65 cr.text_extents (time, out ext);
66 // clock time separator line
67 vline_x = padding + x + ext.x_advance + ext.x_bearing + padding + 1;
69 cr.move_to (vline_x, padding);
70 cr.rel_line_to (0, inner_height - 2 * padding + 1);
71 cr.stroke();
73 var hline_y = padding + ext.height + padding + 2;
75 // vertical separator line
76 cr.move_to (padding, hline_y);
77 cr.rel_line_to (width - 20, 0);
78 cr.stroke();
80 ////////////////////////////// BELOW
81 var y_status_text = 0.5 + hline_y + status_text_font_size;
83 // Realtime
84 string rt = "RT";
85 cr.text_extents (rt, out ext);
86 if (realtime) {
87 text (cr, rt, padding, y_status_text, status_text_font_size);
90 realtime_x = padding;
91 realtime_y = y_status_text - ext.height;
92 realtime_w = ext.x_advance;
93 realtime_h = ext.height;
95 var x_after_rt = padding + ext.x_advance;
97 // Xruns
98 string xruns_str = "X: %u".printf (xruns);
99 cr.text_extents (xruns_str, out ext);
100 if (xruns == 0) {
101 text (cr, xruns_str, x_after_rt, y_status_text, status_text_font_size);
102 } else {
103 text (cr, xruns_str, x_after_rt, y_status_text, status_text_font_size, "#ff0000");
106 xruns_x = x_after_rt;
107 xruns_y = y_status_text - ext.height;
108 xruns_w = vline_x - x_after_rt;
109 xruns_h = ext.height;
111 // buffer size
112 string buffer_size_str = "%2.1fms".printf (buffer_size * 1000.0 / (double)sample_rate);
114 cr.text_extents (buffer_size_str, out ext);
115 var y_popup_triangle = y_status_text - ext.height + 1.0;
117 buffer_size_x = vline_x + padding;
118 buffer_size_y = y_popup_triangle;
119 buffer_size_w = ext.x_advance + ext.x_bearing + popup_triangle_width ();
120 buffer_size_h = ext.height;
121 text (cr, buffer_size_str, buffer_size_x, y_status_text, status_text_font_size);
122 draw_popup_triangle (cr, buffer_size_x + ext.x_advance + ext.x_bearing + 1.0, y_popup_triangle);
124 // sample_rate
125 string sample_rate_str = "%u".printf (sample_rate);
126 cr.text_extents (sample_rate_str, out ext);
128 sample_rate_x = inner_width - ext.x_advance - ext.x_bearing - padding - 1 - popup_triangle_width ();
129 sample_rate_y = y_popup_triangle;
130 sample_rate_w = ext.x_advance + ext.x_bearing + popup_triangle_width ();
131 sample_rate_h = ext.height;
132 text (cr, sample_rate_str, sample_rate_x, y_status_text, status_text_font_size);
133 draw_popup_triangle (cr, inner_width - popup_triangle_width () - padding, y_popup_triangle);
135 return false;
138 public override bool button_press_event (Gdk.EventButton event) {
139 if (jack_running && event.type == EventType.BUTTON_PRESS && event.button == 1) {
140 if (is_in_rect (event.x, event.y, xruns_x, xruns_y, xruns_w, xruns_h)) {
141 reset_xruns_requested ();
142 return true;
145 if (jack_running && handle_events_for_active_items (event)) {
146 return true;
147 } else if (event.type == EventType.BUTTON_PRESS && event.button == 3) {
148 contextmenu.popup (null, null, null, 3, event.time);
149 contextmenu.show_all();
150 return true;
153 return false;
156 private bool was_in_realtime_rect;
158 public override bool motion_notify_event (Gdk.EventMotion event) {
159 /* This should highlight the sensitive areas the mouse is over
160 * but isn't quite ready yet
161 var cr = Gdk.cairo_create (this.window);
163 if (is_in_rect (event.x, event.y, realtime_x, realtime_y, realtime_w, realtime_h)) {
164 was_in_realtime_rect = true;
165 set_source_color_string (cr, text_color_default, 0.1);
166 cr.rectangle (realtime_x, realtime_y, realtime_w, realtime_h);
167 cr.fill ();
168 } else {
169 if (was_in_realtime_rect) {
170 queue_draw ();
174 return false;
179 } //namespace Jackpanel