2 Copyright 2009 by Hans Baier
12 public class Display
: PanelDisplayBase
{
13 protected Menu contextmenu
;
14 public signal void preferences ();
16 private Jack
.Client? make_vala_include_jack_h_workaround
;
21 set_size_request (width
, height
);
22 contextmenu
= new
Menu ();
23 var item
= new MenuItem
.with_label ("Preferences");
24 item
.activate
+= (item
) => {
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;
49 ///////////////////////////// ABOVE
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
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);
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);
80 ////////////////////////////// BELOW
81 var y_status_text
= 0.5 + hline_y
+ status_text_font_size
;
85 cr
.text_extents (rt
, out ext
);
87 text (cr
, rt
, padding
, y_status_text
, status_text_font_size
);
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
;
98 string xruns_str
= "X: %u".printf (xruns
);
99 cr
.text_extents (xruns_str
, out ext
);
101 text (cr
, xruns_str
, x_after_rt
, y_status_text
, status_text_font_size
);
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
;
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
);
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
);
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 ();
145 if (jack_running
&& handle_events_for_active_items (event
)) {
147 } else if (event
.type
== EventType
.BUTTON_PRESS
&& event
.button
== 3) {
148 contextmenu
.popup (null, null, null, 3, event
.time
);
149 contextmenu
.show_all();
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);
169 if (was_in_realtime_rect) {
179 } //namespace Jackpanel