Fix visibility of automation tracks on reloading sessions.
authorCarl Hetherington <carl@carlh.net>
Fri, 19 Dec 2008 18:08:35 +0000 (18:08 +0000)
committerCarl Hetherington <carl@carlh.net>
Fri, 19 Dec 2008 18:08:35 +0000 (18:08 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@4334 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/audio_time_axis.cc
gtk2_ardour/audio_time_axis.h
gtk2_ardour/automation_time_axis.cc
gtk2_ardour/route_time_axis.cc

index aa029775810ae49adcfb90268ff7bc7accf7bc5f..2c03a451d889cf63d841f9dc0950f3963e56d0f5 100644 (file)
@@ -85,8 +85,6 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
 
        _view = new AudioStreamView (*this);
 
-       create_automation_child (GainAutomation, false);
-
        ignore_toggle = false;
 
        mute_button->set_active (false);
@@ -101,14 +99,19 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
        ensure_xml_node ();
 
        set_state (*xml_node);
+
+       /* if set_state above didn't create a gain automation child, we need to make one */
+       if (automation_track (GainAutomation) == 0) {
+               create_automation_child (GainAutomation, false);
+       }
        
-       _route->panner().Changed.connect (bind (mem_fun(*this, &AudioTimeAxisView::update_pans), false));
+       _route->panner().Changed.connect (bind (mem_fun(*this, &AudioTimeAxisView::ensure_pan_views), false));
 
        /* map current state of the route */
 
        processors_changed ();
        reset_processor_automation_curves ();
-       update_pans (false);
+       ensure_pan_views (false);
        update_control_names ();
 
        if (is_audio_track()) {
@@ -342,20 +345,24 @@ AudioTimeAxisView::create_automation_child (const Evoral::Parameter& param, bool
        } else if (param.type() == PanAutomation) {
 
                ensure_xml_node ();
-               update_pans (show);
+               ensure_pan_views (show);
 
        } else {
                error << "AudioTimeAxisView: unknown automation child " << EventTypeMap::instance().to_symbol(param) << endmsg;
        }
 }
 
+/** 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::update_pans (bool show)
+AudioTimeAxisView::ensure_pan_views (bool show)
 {
        const set<Evoral::Parameter>& params = _route->panner().what_can_be_automated();
        set<Evoral::Parameter>::iterator p;
 
-       uint32_t i = 0;
        for (p = params.begin(); p != params.end(); ++p) {
                boost::shared_ptr<ARDOUR::AutomationControl> pan_control
                        = boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
@@ -366,15 +373,25 @@ AudioTimeAxisView::update_pans (bool show)
                        continue;
                }
 
-               boost::shared_ptr<AutomationTimeAxisView> pan_track(new AutomationTimeAxisView (_session,
-                                       _route, _route, pan_control, 
-                                       editor,
-                                       *this,
-                                       false,
-                                       parent_canvas,
-                                       _route->describe_parameter(pan_control->parameter())));
-               add_automation_child(*p, pan_track, show);
-               ++i;
+               if (automation_child (pan_control->parameter ()).get () == 0) {
+
+                       /* we don't already have an AutomationTimeAxisView for this parameter */
+
+                       std::string const name = _route->describe_parameter (pan_control->parameter ());
+
+                       boost::shared_ptr<AutomationTimeAxisView> pan_track (
+                               new AutomationTimeAxisView (_session,
+                                                           _route, _route, pan_control, 
+                                                           editor,
+                                                           *this,
+                                                           false,
+                                                           parent_canvas,
+                                                           name)
+                               
+                               );
+                       
+                       add_automation_child (*p, pan_track, show);
+               }
        }
 }
 #if 0
index 133a84e590a92569317893a87c37a71871ab79ef..f3bdbd3fb68840fb3fe9ecbe14898825d62a64ee 100644 (file)
@@ -110,7 +110,7 @@ class AudioTimeAxisView : public RouteTimeAxisView
        void gain_hidden ();
        void pan_hidden ();
 
-       void update_pans (bool show=true);
+       void ensure_pan_views (bool show = true);
        void update_control_names ();
 
        Gtk::CheckMenuItem* waveform_item;
index f0bcaa30ba07b313d186de498813a44f591c7e16..b838931cd1d27ed0c624d8b4dbff3fd228a8ed78 100644 (file)
@@ -49,6 +49,7 @@ Pango::FontDescription* AutomationTimeAxisView::name_font = 0;
 bool AutomationTimeAxisView::have_name_font = false;
 const string AutomationTimeAxisView::state_node_name = "AutomationChild";
 
+
 /** \a a the automatable object this time axis is to display data for.
  * For route/track automation (e.g. gain) pass the route for both \r and \a.
  * For route child (e.g. plugin) automation, pass the child for \a.
@@ -862,31 +863,19 @@ int
 AutomationTimeAxisView::set_state (const XMLNode& node)
 {
        TimeAxisView::set_state (node);
-       
-       XMLNodeList kids;
-       XMLNodeConstIterator iter;
-
-       kids = node.children ();
-
-       for (iter = kids.begin(); iter != kids.end(); ++iter) {
-               
-               if ((*iter)->name() == state_node_name) {
-                       XMLProperty* type = (*iter)->property("automation-id");
-
-                       if (type && type->value() == ARDOUR::EventTypeMap::instance().to_symbol(_control->parameter())) {
-                               XMLProperty *shown = (*iter)->property("shown-editor");
 
-                               if (shown && shown->value() == "yes") {
-                                       set_marked_for_display(true);
-                                       canvas_display->show(); /* FIXME: necessary? show_at? */
-                               }
-                               break;
-                       }
+       XMLProperty const * type = node.property ("automation-id");
+       if (type && type->value () == ARDOUR::EventTypeMap::instance().to_symbol (_control->parameter())) {
+               XMLProperty const * shown = node.property ("shown");
+               if (shown && shown->value () == "yes") {
+                       set_marked_for_display (true);
+                       canvas_display->show (); /* FIXME: necessary? show_at? */
                }
        }
-
-       if (!_marked_for_display)
+       
+       if (!_marked_for_display) {
                hide();
+       }
 
        return 0;
 }
index 09683f314c6bdad4c93b98ee2503f6b947ec8f8d..37ad45bbfc0ff53acb153c99ac13187bead33ba9 100644 (file)
@@ -426,6 +426,7 @@ RouteTimeAxisView::set_state (const XMLNode& node)
        for (iter = kids.begin(); iter != kids.end(); ++iter) {
                if ((*iter)->name() == AutomationTimeAxisView::state_node_name) {
                        if ((prop = (*iter)->property ("automation-id")) != 0) {
+
                                Evoral::Parameter param = ARDOUR::EventTypeMap::instance().new_parameter(prop->value());
                                bool show = ((prop = (*iter)->property ("shown")) != 0) && prop->value() == "yes";
                                create_automation_child(param, show);
@@ -434,6 +435,7 @@ RouteTimeAxisView::set_state (const XMLNode& node)
                        }
                }
        }
+
        return 0;
 }
 
@@ -1249,25 +1251,26 @@ RouteTimeAxisView::show_automation(Evoral::Parameter param)
        return (_show_automation.find(param) != _show_automation.end());
 }
 
-/** Retuns NULL if track for \a param doesn't exist.
+/** Retuns 0 if track for \a param doesn't exist.
  */
 RouteTimeAxisView::RouteAutomationNode*
-RouteTimeAxisView::automation_track(Evoral::Parameter param)
+RouteTimeAxisView::automation_track (Evoral::Parameter param)
 {
-       map<Evoral::Parameter, RouteAutomationNode*>::iterator i = _automation_tracks.find(param);
+       map<Evoral::Parameter, RouteAutomationNode*>::iterator i = _automation_tracks.find (param);
 
-       if (i != _automation_tracks.end())
+       if (i != _automation_tracks.end()) {
                return i->second;
-       else
-               return NULL;
+       } else {
+               return 0;
+       }
 }
 
 /** Shorthand for GainAutomation, etc.
  */    
 RouteTimeAxisView::RouteAutomationNode*
-RouteTimeAxisView::automation_track(AutomationType type)
+RouteTimeAxisView::automation_track (AutomationType type)
 {
-       return automation_track(Evoral::Parameter(type));
+       return automation_track (Evoral::Parameter(type));
 }
 
 RouteGroup*