Factor out duplicated track automation code.
authorDavid Robillard <d@drobilla.net>
Sun, 30 Nov 2014 21:24:18 +0000 (16:24 -0500)
committerDavid Robillard <d@drobilla.net>
Mon, 1 Dec 2014 04:56:19 +0000 (23:56 -0500)
Mute automation for MIDI tracks.

gtk2_ardour/audio_time_axis.cc
gtk2_ardour/audio_time_axis.h
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/midi_time_axis.h
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_time_axis.h

index 808f9729f04b9f933406057ba2a1fd98cd7f140c..60bcf8d6af3f753d329005c0875324e9b85d5208 100644 (file)
@@ -219,115 +219,6 @@ AudioTimeAxisView::create_automation_child (const Evoral::Parameter& param, bool
        }
 }
 
-/** Ensure that we have the appropriate AutomationTimeAxisViews for the
- *  panners that we have.
- *
- *  @param show true to show any new views that we create, otherwise false.
- */
-void
-AudioTimeAxisView::ensure_pan_views (bool show)
-{
-       bool changed = false;
-       for (list<boost::shared_ptr<AutomationTimeAxisView> >::iterator i = pan_tracks.begin(); i != pan_tracks.end(); ++i) {
-               changed = true;
-               (*i)->set_marked_for_display (false);
-       }
-       if (changed) {
-               _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
-       }
-       pan_tracks.clear();
-
-       if (!_route->panner()) {
-               return;
-       }
-
-       set<Evoral::Parameter> params = _route->panner()->what_can_be_automated();
-       set<Evoral::Parameter>::iterator p;
-
-       for (p = params.begin(); p != params.end(); ++p) {
-               boost::shared_ptr<ARDOUR::AutomationControl> pan_control = _route->pannable()->automation_control(*p);
-
-               if (pan_control->parameter().type() == NullAutomation) {
-                       error << "Pan control has NULL automation type!" << endmsg;
-                       continue;
-               }
-
-               if (automation_child (pan_control->parameter ()).get () == 0) {
-
-                       /* we don't already have an AutomationTimeAxisView for this parameter */
-
-                       std::string const name = _route->panner()->describe_parameter (pan_control->parameter ());
-
-                       boost::shared_ptr<AutomationTimeAxisView> t (
-                               new AutomationTimeAxisView (_session,
-                                                           _route,
-                                                            _route->pannable(),
-                                                            pan_control,
-                                                           pan_control->parameter (),
-                                                           _editor,
-                                                           *this,
-                                                           false,
-                                                           parent_canvas,
-                                                           name)
-                               );
-
-                       pan_tracks.push_back (t);
-                       add_automation_child (*p, t, show);
-               } else {
-                       pan_tracks.push_back (automation_child (pan_control->parameter ()));
-               }
-       }
-}
-
-void
-AudioTimeAxisView::update_gain_track_visibility ()
-{
-       bool const showit = gain_automation_item->get_active();
-
-       if (showit != string_is_affirmative (gain_track->gui_property ("visible"))) {
-               gain_track->set_marked_for_display (showit);
-
-               /* now trigger a redisplay */
-
-               if (!no_redraw) {
-                        _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
-               }
-       }
-}
-
-void
-AudioTimeAxisView::update_mute_track_visibility ()
-{
-       bool const showit = mute_automation_item->get_active();
-
-       if (showit != string_is_affirmative (mute_track->gui_property ("visible"))) {
-               mute_track->set_marked_for_display (showit);
-
-               /* now trigger a redisplay */
-
-               if (!no_redraw) {
-                        _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
-               }
-       }
-}
-
-void
-AudioTimeAxisView::update_pan_track_visibility ()
-{
-       bool const showit = pan_automation_item->get_active();
-       bool changed = false;
-
-       for (list<boost::shared_ptr<AutomationTimeAxisView> >::iterator i = pan_tracks.begin(); i != pan_tracks.end(); ++i) {
-               if ((*i)->set_marked_for_display (showit)) {
-                       changed = true;
-               }
-       }
-
-       if (changed) {
-               _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
-       }
-}
-
 void
 AudioTimeAxisView::show_all_automation (bool apply_to_selection)
 {
@@ -421,37 +312,7 @@ AudioTimeAxisView::update_control_names ()
 void
 AudioTimeAxisView::build_automation_action_menu (bool for_selection)
 {
-       using namespace Menu_Helpers;
-
        RouteTimeAxisView::build_automation_action_menu (for_selection);
-
-       MenuList& automation_items = automation_action_menu->items ();
-
-       automation_items.push_back (CheckMenuElem (_("Fader"), sigc::mem_fun (*this, &AudioTimeAxisView::update_gain_track_visibility)));
-       gain_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&automation_items.back ());
-       gain_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && 
-                                         (gain_track && string_is_affirmative (gain_track->gui_property ("visible"))));
-
-       _main_automation_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item;
-
-       automation_items.push_back (CheckMenuElem (_("Mute"), sigc::mem_fun (*this, &AudioTimeAxisView::update_mute_track_visibility)));
-       mute_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&automation_items.back ());
-       mute_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && 
-                                         (mute_track && string_is_affirmative (mute_track->gui_property ("visible"))));
-
-       _main_automation_menu_map[Evoral::Parameter(MuteAutomation)] = mute_automation_item;
-
-       if (!pan_tracks.empty()) {
-               automation_items.push_back (CheckMenuElem (_("Pan"), sigc::mem_fun (*this, &AudioTimeAxisView::update_pan_track_visibility)));
-               pan_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&automation_items.back ());
-               pan_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
-                                                (!pan_tracks.empty() && string_is_affirmative (pan_tracks.front()->gui_property ("visible"))));
-
-               set<Evoral::Parameter> const & params = _route->pannable()->what_can_be_automated ();
-               for (set<Evoral::Parameter>::const_iterator p = params.begin(); p != params.end(); ++p) {
-                       _main_automation_menu_map[*p] = pan_automation_item;
-               }
-       }
 }
 
 void
index 7a5afe4f97f8422b3cd8de660ad948c697ce2b1f..4a44905d3b253c992f4390492a9e81d88829466c 100644 (file)
@@ -98,20 +98,7 @@ class AudioTimeAxisView : public RouteTimeAxisView
 
        void hide ();
 
-       void gain_hidden ();
-       void pan_hidden ();
-
-       void ensure_pan_views (bool show = true);
        void update_control_names ();
-
-       void update_gain_track_visibility ();
-       void update_mute_track_visibility ();
-       void update_pan_track_visibility ();
-
-       Gtk::CheckMenuItem* gain_automation_item;
-       Gtk::CheckMenuItem* mute_automation_item;
-       std::list<boost::shared_ptr<AutomationTimeAxisView> > pan_tracks;
-       Gtk::CheckMenuItem* pan_automation_item;
 };
 
 #endif /* __ardour_audio_time_axis_h__ */
index 5f19e0e2a574420e1e75a99d1ce95f23b06d205d..c3e42a09684a147d9b43382ec97e48b835150f9e 100644 (file)
@@ -598,7 +598,6 @@ MidiTimeAxisView::build_automation_action_menu (bool for_selection)
 
                build_controller_menu ();
 
-               automation_items.push_back (SeparatorElem());
                automation_items.push_back (MenuElem (_("Controllers"), *controller_menu));
                automation_items.back().set_sensitive (
                        !for_selection || _editor.get_selection().tracks.size() == 1);
@@ -607,27 +606,6 @@ MidiTimeAxisView::build_automation_action_menu (bool for_selection)
                        MenuElem (string_compose ("<i>%1</i>", _("No MIDI Channels selected"))));
                dynamic_cast<Label*> (automation_items.back().get_child())->set_use_markup (true);
        }
-
-       automation_items.push_back (SeparatorElem());
-       automation_items.push_back (CheckMenuElem (_("Fader"), sigc::mem_fun (*this, &MidiTimeAxisView::update_gain_track_visibility)));
-       gain_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&automation_items.back ());
-       gain_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && 
-                                         (gain_track && string_is_affirmative (gain_track->gui_property ("visible"))));
-
-       _main_automation_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item;
-
-       if (!pan_tracks.empty()) {
-               automation_items.push_back (CheckMenuElem (_("Pan"), sigc::mem_fun (*this, &MidiTimeAxisView::update_pan_track_visibility)));
-               pan_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&automation_items.back ());
-               pan_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
-                                                (!pan_tracks.empty() && string_is_affirmative (pan_tracks.front()->gui_property ("visible"))));
-
-               set<Evoral::Parameter> const & params = _route->pannable()->what_can_be_automated ();
-               for (set<Evoral::Parameter>::const_iterator p = params.begin(); p != params.end(); ++p) {
-                       _main_automation_menu_map[*p] = pan_automation_item;
-               }
-       }
-
 }
 
 void
@@ -1119,94 +1097,6 @@ MidiTimeAxisView::update_range()
        }
 }
 
-void
-MidiTimeAxisView::ensure_pan_views (bool show)
-{
-       bool changed = false;
-       for (list<boost::shared_ptr<AutomationTimeAxisView> >::iterator i = pan_tracks.begin(); i != pan_tracks.end(); ++i) {
-               changed = true;
-               (*i)->set_marked_for_display (false);
-       }
-       if (changed) {
-               _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
-       }
-       pan_tracks.clear();
-
-       if (!_route->panner()) {
-               return;
-       }
-
-       set<Evoral::Parameter> params = _route->panner()->what_can_be_automated();
-       set<Evoral::Parameter>::iterator p;
-
-       for (p = params.begin(); p != params.end(); ++p) {
-               boost::shared_ptr<ARDOUR::AutomationControl> pan_control = _route->pannable()->automation_control(*p);
-
-               if (pan_control->parameter().type() == NullAutomation) {
-                       error << "Pan control has NULL automation type!" << endmsg;
-                       continue;
-               }
-
-               if (automation_child (pan_control->parameter ()).get () == 0) {
-
-                       /* we don't already have an AutomationTimeAxisView for this parameter */
-
-                       std::string const name = _route->panner()->describe_parameter (pan_control->parameter ());
-
-                       boost::shared_ptr<AutomationTimeAxisView> t (
-                                       new AutomationTimeAxisView (_session,
-                                               _route,
-                                               _route->pannable(),
-                                               pan_control,
-                                               pan_control->parameter (),
-                                               _editor,
-                                               *this,
-                                               false,
-                                               parent_canvas,
-                                               name)
-                                       );
-
-                       pan_tracks.push_back (t);
-                       add_automation_child (*p, t, show);
-               } else {
-                       pan_tracks.push_back (automation_child (pan_control->parameter ()));
-               }
-       }
-}
-
-void
-MidiTimeAxisView::update_gain_track_visibility ()
-{
-       bool const showit = gain_automation_item->get_active();
-
-       if (showit != string_is_affirmative (gain_track->gui_property ("visible"))) {
-               gain_track->set_marked_for_display (showit);
-
-               /* now trigger a redisplay */
-
-               if (!no_redraw) {
-                        _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
-               }
-       }
-}
-
-void
-MidiTimeAxisView::update_pan_track_visibility ()
-{
-       bool const showit = pan_automation_item->get_active();
-       bool changed = false;
-
-       for (list<boost::shared_ptr<AutomationTimeAxisView> >::iterator i = pan_tracks.begin(); i != pan_tracks.end(); ++i) {
-               if ((*i)->set_marked_for_display (showit)) {
-                       changed = true;
-               }
-       }
-
-       if (changed) {
-               _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
-       }
-}
-
 void
 MidiTimeAxisView::show_all_automation (bool apply_to_selection)
 {
index c591b3217a266efb2872cea329e0030fe2bd300d..c99ab68851ac4cbe1d007e27acea6de431825d02 100644 (file)
@@ -177,15 +177,6 @@ class MidiTimeAxisView : public RouteTimeAxisView
 
        void capture_channel_mode_changed();
        void playback_channel_mode_changed();
-
-       void ensure_pan_views (bool show = true);
-
-       void update_gain_track_visibility ();
-       void update_pan_track_visibility ();
-
-       Gtk::CheckMenuItem* gain_automation_item;
-       std::list<boost::shared_ptr<AutomationTimeAxisView> > pan_tracks;
-       Gtk::CheckMenuItem* pan_automation_item;
 };
 
 #endif /* __ardour_midi_time_axis_h__ */
index 1d89833b79ba254b1fffd52cb51c100b89ecbb6a..d741b70501047e07dfe1ff700fee1eee360f5f20 100644 (file)
@@ -45,6 +45,8 @@
 #include "ardour/amp.h"
 #include "ardour/meter.h"
 #include "ardour/event_type_map.h"
+#include "ardour/pannable.h"
+#include "ardour/panner.h"
 #include "ardour/processor.h"
 #include "ardour/profile.h"
 #include "ardour/route_group.h"
@@ -108,6 +110,9 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan
        , color_mode_menu (0)
        , gm (sess, true, 75, 14)
        , _ignore_set_layer_display (false)
+       , gain_automation_item(NULL)
+       , mute_automation_item(NULL)
+       , pan_automation_item(NULL)
 {
        number_label.set_name("tracknumber label");
        number_label.set_elements((ArdourButton::Element)(ArdourButton::Edge|ArdourButton::Body|ArdourButton::Text|ArdourButton::Inactive));
@@ -506,6 +511,38 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection)
                items.push_back (MenuElem (_("Processor automation"), subplugin_menu));
                items.back().set_sensitive (!for_selection || _editor.get_selection().tracks.size() == 1);;
        }
+
+       /* Add any route automation */
+
+       if (gain_track) {
+               items.push_back (CheckMenuElem (_("Fader"), sigc::mem_fun (*this, &RouteTimeAxisView::update_gain_track_visibility)));
+               gain_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+               gain_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && 
+                                                 (gain_track && string_is_affirmative (gain_track->gui_property ("visible"))));
+
+               _main_automation_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item;
+       }
+
+       if (mute_track) {
+               items.push_back (CheckMenuElem (_("Mute"), sigc::mem_fun (*this, &RouteTimeAxisView::update_mute_track_visibility)));
+               mute_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+               mute_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && 
+                                                 (mute_track && string_is_affirmative (mute_track->gui_property ("visible"))));
+
+               _main_automation_menu_map[Evoral::Parameter(MuteAutomation)] = mute_automation_item;
+       }
+
+       if (!pan_tracks.empty()) {
+               items.push_back (CheckMenuElem (_("Pan"), sigc::mem_fun (*this, &RouteTimeAxisView::update_pan_track_visibility)));
+               pan_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+               pan_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
+                                                (!pan_tracks.empty() && string_is_affirmative (pan_tracks.front()->gui_property ("visible"))));
+
+               set<Evoral::Parameter> const & params = _route->pannable()->what_can_be_automated ();
+               for (set<Evoral::Parameter>::const_iterator p = params.begin(); p != params.end(); ++p) {
+                       _main_automation_menu_map[*p] = pan_automation_item;
+               }
+       }
 }
 
 void
@@ -1839,6 +1876,110 @@ RouteTimeAxisView::automation_track_hidden (Evoral::Parameter param)
        }
 }
 
+void
+RouteTimeAxisView::update_gain_track_visibility ()
+{
+       bool const showit = gain_automation_item->get_active();
+
+       if (showit != string_is_affirmative (gain_track->gui_property ("visible"))) {
+               gain_track->set_marked_for_display (showit);
+
+               /* now trigger a redisplay */
+
+               if (!no_redraw) {
+                        _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
+               }
+       }
+}
+
+void
+RouteTimeAxisView::update_mute_track_visibility ()
+{
+       bool const showit = mute_automation_item->get_active();
+
+       if (showit != string_is_affirmative (mute_track->gui_property ("visible"))) {
+               mute_track->set_marked_for_display (showit);
+
+               /* now trigger a redisplay */
+
+               if (!no_redraw) {
+                        _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
+               }
+       }
+}
+
+void
+RouteTimeAxisView::update_pan_track_visibility ()
+{
+       bool const showit = pan_automation_item->get_active();
+       bool changed = false;
+
+       for (list<boost::shared_ptr<AutomationTimeAxisView> >::iterator i = pan_tracks.begin(); i != pan_tracks.end(); ++i) {
+               if ((*i)->set_marked_for_display (showit)) {
+                       changed = true;
+               }
+       }
+
+       if (changed) {
+               _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
+       }
+}
+
+void
+RouteTimeAxisView::ensure_pan_views (bool show)
+{
+       bool changed = false;
+       for (list<boost::shared_ptr<AutomationTimeAxisView> >::iterator i = pan_tracks.begin(); i != pan_tracks.end(); ++i) {
+               changed = true;
+               (*i)->set_marked_for_display (false);
+       }
+       if (changed) {
+               _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
+       }
+       pan_tracks.clear();
+
+       if (!_route->panner()) {
+               return;
+       }
+
+       set<Evoral::Parameter> params = _route->panner()->what_can_be_automated();
+       set<Evoral::Parameter>::iterator p;
+
+       for (p = params.begin(); p != params.end(); ++p) {
+               boost::shared_ptr<ARDOUR::AutomationControl> pan_control = _route->pannable()->automation_control(*p);
+
+               if (pan_control->parameter().type() == NullAutomation) {
+                       error << "Pan control has NULL automation type!" << endmsg;
+                       continue;
+               }
+
+               if (automation_child (pan_control->parameter ()).get () == 0) {
+
+                       /* we don't already have an AutomationTimeAxisView for this parameter */
+
+                       std::string const name = _route->panner()->describe_parameter (pan_control->parameter ());
+
+                       boost::shared_ptr<AutomationTimeAxisView> t (
+                                       new AutomationTimeAxisView (_session,
+                                               _route,
+                                               _route->pannable(),
+                                               pan_control,
+                                               pan_control->parameter (),
+                                               _editor,
+                                               *this,
+                                               false,
+                                               parent_canvas,
+                                               name)
+                                       );
+
+                       pan_tracks.push_back (t);
+                       add_automation_child (*p, t, show);
+               } else {
+                       pan_tracks.push_back (automation_child (pan_control->parameter ()));
+               }
+       }
+}
+
 
 void
 RouteTimeAxisView::show_all_automation (bool apply_to_selection)
index 03060c702f1ac77eb9b774693843ac7a25df5e81..008ed932de2c0bc4b105919218f10f5e2e5ae4a3 100644 (file)
@@ -304,6 +304,22 @@ protected:
 
        bool _ignore_set_layer_display;
 
+protected:
+       void update_gain_track_visibility ();
+       void update_mute_track_visibility ();
+       void update_pan_track_visibility ();
+
+       /** Ensure that we have the appropriate automation lanes for panners.
+        *
+        *  @param show true to show any new views that we create, otherwise false.
+        */
+       void ensure_pan_views (bool show = true);
+
+       Gtk::CheckMenuItem* gain_automation_item;
+       Gtk::CheckMenuItem* mute_automation_item;
+       std::list<boost::shared_ptr<AutomationTimeAxisView> > pan_tracks;
+       Gtk::CheckMenuItem* pan_automation_item;
+
 private:
 
        void remove_child (boost::shared_ptr<TimeAxisView>);