Prompter now prevents blank strings or unaltered names & now has a horizontal orienta...
[ardour.git] / gtk2_ardour / meter_bridge_strip.cc
1 /*
2     Copyright (C) 1999 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     $Id$
19 */
20
21 #include <cmath>
22 #include <ctime>
23 #include <sys/stat.h>
24
25 #include <pbd/pathscanner.h>
26 #include <pbd/fastlog.h>
27 #include <gtkmm2ext/utils.h>
28 #include <gtkmm2ext/selector.h>
29
30 #include <ardour/audioengine.h>
31 #include <ardour/route.h>
32 #include <ardour/port.h>
33 #include <ardour/utils.h>
34
35 #include "meter_bridge_strip.h"
36 #include "ardour_ui.h"
37 #include "prompter.h"
38 #include "logmeter.h"
39
40 #include "i18n.h"
41
42 using namespace ARDOUR;
43 using namespace Gtk;
44 using namespace Gtkmm2ext;
45
46 MeterBridgeStrip::MeterBridgeStrip (AudioEngine &eng, 
47                                     Session& s,
48                                     Route& r, 
49                                     string name,
50                                     jack_nframes_t long_over,
51                                     jack_nframes_t short_over, 
52                                     jack_nframes_t meter_hold)
53         : engine (eng),
54           session (s),
55           _route (r),
56           meter (meter_hold, 5, FastMeter::Vertical)
57 {
58         char buf[64];
59
60         label.set_text (name);
61         label.set_name ("ChannelMeterLabel");
62
63         label_ebox.set_name ("MeterBridgeWindow");
64         label_ebox.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
65         label_ebox.add (label);
66
67         label_ebox.signal_button_release_event().connect (mem_fun(*this, &MeterBridgeStrip::label_button_press_release));
68         ARDOUR_UI::instance()->tooltips().set_tip (label_ebox, _route.name());
69
70         over_long_label.set_text ("0");
71         over_long_label.set_name ("OverMeterLabel");
72         over_long_button.add (over_long_label);
73         over_long_button.set_name ("OverMeter");
74         over_long_frame.add (over_long_button);
75         over_long_frame.set_shadow_type (Gtk::SHADOW_IN);
76         over_long_frame.set_name ("BaseFrame");
77         over_long_hbox.pack_start (over_long_frame, false, false);
78
79         snprintf(buf, sizeof(buf)-1, _("# of %u-sample overs"), long_over);
80         ARDOUR_UI::instance()->tooltips().set_tip (over_long_button, buf);
81
82         set_size_request_to_display_given_text (over_long_button, "88g", 2, 2);
83
84         over_short_label.set_text ("0");
85         over_short_label.set_name ("OverMeterLabel");
86         over_short_button.add (over_short_label);
87         over_short_button.set_name ("OverMeter");
88         over_short_frame.add (over_short_button);
89         over_short_frame.set_shadow_type (Gtk::SHADOW_IN);
90         over_short_frame.set_name ("BaseFrame");
91         over_short_hbox.pack_start (over_short_frame, false, false);
92
93         snprintf(buf, sizeof(buf)-1, _("# of %u-sample overs"), short_over);
94         ARDOUR_UI::instance()->tooltips().set_tip (over_short_button, buf);
95
96         set_size_request_to_display_given_text (over_short_button, "88g", 2, 2);
97         above_meter_vbox.set_spacing (5);
98         below_meter_vbox.set_spacing (5);
99
100         above_meter_vbox.pack_start (over_long_hbox, false, false);
101         above_meter_vbox.pack_start (over_short_hbox, false, false);
102
103         below_meter_vbox.pack_start (label_ebox);
104
105         over_short_button.signal_button_release_event().connect (mem_fun(*this,&MeterBridgeStrip::gui_clear_overs));
106         over_long_button.signal_button_release_event().connect (mem_fun(*this,&MeterBridgeStrip::gui_clear_overs));
107
108         last_over_short = 0;
109         last_over_long = 0;
110
111         meter_clear_pending = false;
112         over_clear_pending = false;
113
114         meter_on = true;
115 }
116
117 void
118 MeterBridgeStrip::update ()
119 {
120         string buf;
121         Port *port;
122         guint32 over_short = 0;
123         guint32 over_long = 0;
124
125         if ((port = _route.input (0)) == 0) {
126                 meter.set (0.0);
127                 return;
128         } else {
129                 over_short = port->short_overs ();
130                 over_long = port->long_overs ();
131         }
132
133         if (meter_on) {
134                 float power = minus_infinity();
135
136                 if ((power = _route.peak_input_power (0)) != minus_infinity()) {
137                         meter.set (log_meter (power));
138
139                         if (over_short != last_over_short) {
140                                 buf = string_compose("%1", over_short);
141                                 over_short_label.set_text (buf);
142                                 last_over_short = over_short;
143                         }
144                         
145                         if (over_long != last_over_long) {
146                                 buf = string_compose("%1", over_long);
147                                 over_long_label.set_text (buf);
148                                 last_over_long = over_long;
149                         }
150                         
151                 } else {
152                         meter.set (0.0);
153                 }
154                 
155         }
156
157         if (meter_clear_pending) {
158                 meter_clear_pending = false;
159                 meter.clear ();
160         }
161
162         if (over_clear_pending) {
163                 over_clear_pending = false;
164                 port->reset_overs ();
165                 over_long_label.set_text ("0");
166                 over_short_label.set_text ("0");
167                 last_over_short = 0;
168                 last_over_long = 0;
169         }
170 }
171
172 gint
173 MeterBridgeStrip::gui_clear_overs (GdkEventButton *ev)
174 {
175         clear_overs ();
176         return FALSE;
177 }
178
179 void
180 MeterBridgeStrip::clear_meter ()
181
182 {
183         meter_clear_pending = true;
184 }
185
186 void
187 MeterBridgeStrip::clear_overs ()
188
189 {
190         over_clear_pending = true;
191 }
192
193 void
194 MeterBridgeStrip::set_meter_on (bool yn)
195 {
196         Port* port;
197         meter_on = yn;
198         
199         if (!meter_on) {
200                 meter_clear_pending = true;
201                 over_clear_pending = true;
202         }
203         
204         if (meter.is_visible()) {
205                 if ((port = _route.input (0)) != 0) {
206                         if (meter_on) {
207                                 port->enable_metering ();
208                         } else {
209                                 port->disable_metering ();
210                         }
211                 }
212         }
213 }
214
215 gint
216 MeterBridgeStrip::label_button_press_release (GdkEventButton *ev)
217 {
218         string name;
219         ArdourPrompter prompter (true);
220
221         prompter.set_prompt (_("New Name for Meter:"));
222         prompter.set_initial_text (label.get_text());
223         prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT);
224         prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
225         prompter.show_all();
226         
227         switch (prompter.run ()) {
228         case Gtk::RESPONSE_ACCEPT:
229                 
230                 prompter.get_result (name);
231                 
232                 if (name.length()) {
233                         label.set_text(name);
234                 }
235
236         default:
237                 break;
238         }
239         
240         return FALSE;
241 }
242