add convenience functions to switch meter-types.. (maybe too much?!)
[ardour.git] / gtk2_ardour / mixer_strip.cc
index 843f2ee45259289fc5deb9e4148688ed63a1bf5b..c15d3ea22125097c883fd3ac47d2a967a3926d84 100644 (file)
@@ -62,6 +62,7 @@
 #include "utils.h"
 #include "gui_thread.h"
 #include "route_group_menu.h"
+#include "meter_patterns.h"
 
 #include "i18n.h"
 
@@ -155,6 +156,7 @@ MixerStrip::init ()
 
        input_button.set_text (_("Input"));
        input_button.set_name ("mixer strip button");
+       input_button.set_size_request (-1, 20);
        input_button_box.pack_start (input_button, true, true);
 
        output_button.set_text (_("Output"));
@@ -206,7 +208,7 @@ MixerStrip::init ()
         top_button_table.attach (*monitor_disk_button, 1, 2, 0, 1);
        top_button_table.show ();
 
-       rec_solo_table.set_homogeneous (false);
+       rec_solo_table.set_homogeneous (true);
        rec_solo_table.set_row_spacings (2);
        rec_solo_table.set_col_spacings (2);
         rec_solo_table.attach (*solo_isolated_led, 1, 2, 0, 1);
@@ -241,14 +243,16 @@ MixerStrip::init ()
 
        bottom_button_table.set_spacings (2);
        bottom_button_table.set_homogeneous (true);
-       bottom_button_table.attach (group_button, 0, 1, 0, 1);
+//     bottom_button_table.attach (group_button, 0, 1, 0, 1);
+       bottom_button_table.attach (gpm.gain_automation_state_button, 0, 1, 0, 1);
 
-       name_button.set_name ("mixer strip name button");
+       name_button.set_name ("mixer strip button");
        name_button.set_text (" "); /* non empty text, forces creation of the layout */
        name_button.set_text (""); /* back to empty */
        name_button.layout()->set_ellipsize (Pango::ELLIPSIZE_END);
        name_button.signal_size_allocate().connect (sigc::mem_fun (*this, &MixerStrip::name_button_resized));
        Gtkmm2ext::set_size_request_to_display_given_text (name_button, longest_label.c_str(), 2, 2);
+       name_button.set_size_request (-1, 20);
 
        ARDOUR_UI::instance()->set_tip (&group_button, _("Mix group"), "");
        group_button.set_name ("mixer strip button");
@@ -397,6 +401,22 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 
        revert_to_default_display ();
 
+       /* unpack these from the parent and stuff them into our own
+          table
+       */
+       
+       if (gpm.peak_display.get_parent()) {
+               gpm.peak_display.get_parent()->remove (gpm.peak_display);
+       }
+       if (gpm.gain_display.get_parent()) {
+               gpm.gain_display.get_parent()->remove (gpm.gain_display);
+       }
+
+       gpm.set_type (rt->meter_type());
+       
+       middle_button_table.attach (gpm.gain_display,0,1,1,2);
+       middle_button_table.attach (gpm.peak_display,1,2,1,2);
+
        if (solo_button->get_parent()) {
                middle_button_table.remove (*solo_button);
        }
@@ -468,12 +488,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                at->FreezeChange.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::map_frozen, this), gui_context());
        }
 
-       if (has_audio_outputs ()) {
-               panners.show_all ();
-       } else {
-               panners.hide_all ();
-       }
-
        if (is_track ()) {
 
                rec_solo_table.attach (*rec_enable_button, 0, 1, 0, 2);
@@ -522,6 +536,12 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
        connect_to_pan ();
        panners.setup_pan ();
 
+       if (has_audio_outputs ()) {
+               panners.show_all ();
+       } else {
+               panners.hide_all ();
+       }
+
        update_diskstream_display ();
        update_input_display ();
        update_output_display ();
@@ -536,6 +556,8 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
        }
 
        gpm.reset_peak_display ();
+       gpm.gain_display.show ();
+       gpm.peak_display.show ();
 
        width_button.show();
        width_hide_box.show();
@@ -552,6 +574,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
        name_button.show();
        _comment_button.show();
        group_button.show();
+       gpm.gain_automation_state_button.show();
 
        parameter_changed ("mixer-strip-visibility");
 
@@ -591,14 +614,15 @@ MixerStrip::set_width_enum (Width w, void* owner)
 
        switch (w) {
        case Wide:
+
                if (show_sends_button)  {
                        show_sends_button->set_text (_("Aux\nSends"));
                        show_sends_button->layout()->set_alignment (Pango::ALIGN_CENTER);
                }
 
-               ((Gtk::Label*)gpm.gain_automation_style_button.get_child())->set_text (
+               gpm.gain_automation_style_button.set_text (
                                gpm.astyle_string(gain_automation->automation_style()));
-               ((Gtk::Label*)gpm.gain_automation_state_button.get_child())->set_text (
+               gpm.gain_automation_state_button.set_text (
                                gpm.astate_string(gain_automation->automation_state()));
 
                if (_route->panner()) {
@@ -608,21 +632,20 @@ MixerStrip::set_width_enum (Width w, void* owner)
                                        panners.astate_string(_route->panner()->automation_state()));
                }
 
-               solo_isolated_led->set_text (_("iso"));
-               solo_safe_led->set_text (_("lock"));
 
                Gtkmm2ext::set_size_request_to_display_given_text (name_button, longest_label.c_str(), 2, 2);
                set_size_request (-1, -1);
                break;
 
        case Narrow:
+
                if (show_sends_button) {
                        show_sends_button->set_text (_("Snd"));
                }
 
-               ((Gtk::Label*)gpm.gain_automation_style_button.get_child())->set_text (
+               gpm.gain_automation_style_button.set_text (
                                gpm.short_astyle_string(gain_automation->automation_style()));
-               ((Gtk::Label*)gpm.gain_automation_state_button.get_child())->set_text (
+               gpm.gain_automation_state_button.set_text (
                                gpm.short_astate_string(gain_automation->automation_state()));
 
                if (_route->panner()) {
@@ -631,9 +654,6 @@ MixerStrip::set_width_enum (Width w, void* owner)
                        ((Gtk::Label*)panners.pan_automation_state_button.get_child())->set_text (
                        panners.short_astate_string(_route->panner()->automation_state()));
                }
-               
-               solo_isolated_led->set_text (_("iso"));
-               solo_safe_led->set_text (_("Lck"));
 
                Gtkmm2ext::set_size_request_to_display_given_text (name_button, "long", 2, 2);
                set_size_request (max (50, gpm.get_gm_width()), -1);
@@ -906,7 +926,7 @@ MixerStrip::bundle_output_chosen (boost::shared_ptr<ARDOUR::Bundle> c)
 }
 
 void
-MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR::BundleList const & current)
+MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR::BundleList const& /*current*/)
 {
        using namespace Menu_Helpers;
 
@@ -934,7 +954,7 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR:
 }
 
 void
-MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR::BundleList const & current)
+MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR::BundleList const& /*current*/)
 {
        using namespace Menu_Helpers;
 
@@ -1213,6 +1233,13 @@ MixerStrip::update_input_display ()
 {
        update_io_button (_route, _width, true);
        panners.setup_pan ();
+
+       if (has_audio_outputs ()) {
+               panners.show_all ();
+       } else {
+               panners.hide_all ();
+       }
+
 }
 
 void
@@ -1221,6 +1248,12 @@ MixerStrip::update_output_display ()
        update_io_button (_route, _width, false);
        gpm.setup_meters ();
        panners.setup_pan ();
+
+       if (has_audio_outputs ()) {
+               panners.show_all ();
+       } else {
+               panners.hide_all ();
+       }
 }
 
 void
@@ -1328,7 +1361,6 @@ void
 MixerStrip::setup_comment_editor ()
 {
        comment_window = new ArdourWindow (""); // title will be reset to show route
-       comment_window->set_position (Gtk::WIN_POS_MOUSE);
        comment_window->set_skip_taskbar_hint (true);
        comment_window->signal_hide().connect (sigc::mem_fun(*this, &MixerStrip::comment_editor_done_editing));
        comment_window->set_default_size (400, 200);
@@ -1636,28 +1668,22 @@ MixerStrip::reset_strip_style ()
                if (is_midi_track()) {
                        if (_route->active()) {
                                set_name ("MidiTrackStripBase");
-                               gpm.set_meter_strip_name ("MidiTrackMetrics");
                        } else {
                                set_name ("MidiTrackStripBaseInactive");
-                               gpm.set_meter_strip_name ("MidiTrackMetricsInactive");
                        }
                        gpm.set_fader_name ("MidiTrackFader");
                } else if (is_audio_track()) {
                        if (_route->active()) {
                                set_name ("AudioTrackStripBase");
-                               gpm.set_meter_strip_name ("AudioTrackMetrics");
                        } else {
                                set_name ("AudioTrackStripBaseInactive");
-                               gpm.set_meter_strip_name ("AudioTrackMetricsInactive");
                        }
                        gpm.set_fader_name ("AudioTrackFader");
                } else {
                        if (_route->active()) {
                                set_name ("AudioBusStripBase");
-                               gpm.set_meter_strip_name ("AudioBusMetrics");
                        } else {
                                set_name ("AudioBusStripBaseInactive");
-                               gpm.set_meter_strip_name ("AudioBusMetricsInactive");
                        }
                        gpm.set_fader_name ("AudioBusFader");
 
@@ -1815,6 +1841,14 @@ MixerStrip::show_send (boost::shared_ptr<Send> send)
        panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner());
        panner_ui().setup_pan ();
 
+       /* make sure the send has audio output */
+
+       if (_current_delivery->output() && _current_delivery->output()->n_ports().n_audio() > 0) {
+               panners.show_all ();
+       } else {
+               panners.hide_all ();
+       }
+
        input_button.set_sensitive (false);
        group_button.set_sensitive (false);
        set_invert_sensitive (false);
@@ -1848,6 +1882,12 @@ MixerStrip::revert_to_default_display ()
        panner_ui().set_panner (_route->main_outs()->panner_shell(), _route->main_outs()->panner());
        panner_ui().setup_pan ();
 
+       if (has_audio_outputs ()) {
+               panners.show_all ();
+       } else {
+               panners.hide_all ();
+       }
+
        reset_strip_style ();
 }
 
@@ -1882,6 +1922,8 @@ MixerStrip::set_button_names ()
                                }
                        }
                }
+               solo_isolated_led->set_text (_("iso"));
+               solo_safe_led->set_text (_("lock"));
                break;
 
        default:
@@ -1911,8 +1953,9 @@ MixerStrip::set_button_names ()
                                }
                        }
                }
+               solo_isolated_led->set_text (_("i"));
+               solo_safe_led->set_text (_("L"));
                break;
-
        }
 
        if (_route) {
@@ -2083,17 +2126,50 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
 
        RadioMenuItem::Group group;
 
-       add_level_meter_item (items, group, _("Input"), MeterInput);
-       add_level_meter_item (items, group, _("Pre-fader"), MeterPreFader);
-       add_level_meter_item (items, group, _("Post-fader"), MeterPostFader);
-       add_level_meter_item (items, group, _("Output"), MeterOutput);
-       add_level_meter_item (items, group, _("Custom"), MeterCustom);
+       _suspend_menu_callbacks = true;
+       add_level_meter_item_point (items, group, _("Input"), MeterInput);
+       add_level_meter_item_point (items, group, _("Pre-fader"), MeterPreFader);
+       add_level_meter_item_point (items, group, _("Post-fader"), MeterPostFader);
+       add_level_meter_item_point (items, group, _("Output"), MeterOutput);
+       add_level_meter_item_point (items, group, _("Custom"), MeterCustom);
+
+       RadioMenuItem::Group tgroup;
+       items.push_back (SeparatorElem());
+
+       add_level_meter_item_type (items, tgroup, _("Peak"), MeterPeak);
+       add_level_meter_item_type (items, tgroup, _("RMS + Peak"), MeterKrms);
+
+       int _strip_type;
+       if (_route->is_master()) {
+               _strip_type = 4;
+       }
+       else if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0
+                       && boost::dynamic_pointer_cast<MidiTrack>(_route) == 0) {
+               /* non-master bus */
+               _strip_type = 3;
+       }
+       else if (boost::dynamic_pointer_cast<MidiTrack>(_route)) {
+               _strip_type = 2;
+       }
+       else {
+               _strip_type = 1;
+       }
+
+       items.push_back (SeparatorElem());
+       items.push_back (MenuElem (_("Change all in Group to Peak"), sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), MeterPeak)));
+       items.push_back (MenuElem (_("Change all in Group to RMS + Peak"), sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), MeterKrms)));
+       items.push_back (MenuElem (_("Change all to Peak"), sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), MeterPeak)));
+       items.push_back (MenuElem (_("Change all to RMS + Peak"), sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), MeterKrms)));
+       items.push_back (MenuElem (_("Change same track-type to Peak"), sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), MeterPeak)));
+       items.push_back (MenuElem (_("Change same track-type to RMS + Peak"), sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), MeterKrms)));
 
        m->popup (ev->button, ev->time);
+       _suspend_menu_callbacks = false;
 }
 
 void
-MixerStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterPoint point)
+MixerStrip::add_level_meter_item_point (Menu_Helpers::MenuList& items,
+               RadioMenuItem::Group& group, string const & name, MeterPoint point)
 {
        using namespace Menu_Helpers;
        
@@ -2105,5 +2181,24 @@ MixerStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::
 void
 MixerStrip::set_meter_point (MeterPoint p)
 {
+       if (_suspend_menu_callbacks) return;
        _route->set_meter_point (p);
 }
+
+void
+MixerStrip::add_level_meter_item_type (Menu_Helpers::MenuList& items,
+               RadioMenuItem::Group& group, string const & name, MeterType type)
+{
+       using namespace Menu_Helpers;
+       
+       items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MixerStrip::set_meter_type), type)));
+       RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
+       i->set_active (_route->meter_type() == type);
+}
+
+void
+MixerStrip::set_meter_type (MeterType t)
+{
+       if (_suspend_menu_callbacks) return;
+       gpm.set_type (t);
+}