add convenience functions to switch meter-types.. (maybe too much?!)
[ardour.git] / gtk2_ardour / mixer_strip.cc
index 90d2a2912af334746fe771cf31e0df33b3204b4e..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"
 
@@ -410,6 +411,8 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
        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);
@@ -1358,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);
@@ -1666,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");
 
@@ -2130,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;
        
@@ -2152,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);
+}