From 331de3dc38e4f8b94fc1ddf224349a4afb91cc75 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 19 Dec 2008 18:08:35 +0000 Subject: [PATCH] Fix visibility of automation tracks on reloading sessions. git-svn-id: svn://localhost/ardour2/branches/3.0@4334 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_time_axis.cc | 49 +++++++++++++++++++---------- gtk2_ardour/audio_time_axis.h | 2 +- gtk2_ardour/automation_time_axis.cc | 31 ++++++------------ gtk2_ardour/route_time_axis.cc | 19 ++++++----- 4 files changed, 55 insertions(+), 46 deletions(-) diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index aa02977581..2c03a451d8 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -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& params = _route->panner().what_can_be_automated(); set::iterator p; - uint32_t i = 0; for (p = params.begin(); p != params.end(); ++p) { boost::shared_ptr pan_control = boost::dynamic_pointer_cast( @@ -366,15 +373,25 @@ AudioTimeAxisView::update_pans (bool show) continue; } - boost::shared_ptr 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 pan_track ( + new AutomationTimeAxisView (_session, + _route, _route, pan_control, + editor, + *this, + false, + parent_canvas, + name) + + ); + + add_automation_child (*p, pan_track, show); + } } } #if 0 diff --git a/gtk2_ardour/audio_time_axis.h b/gtk2_ardour/audio_time_axis.h index 133a84e590..f3bdbd3fb6 100644 --- a/gtk2_ardour/audio_time_axis.h +++ b/gtk2_ardour/audio_time_axis.h @@ -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; diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index f0bcaa30ba..b838931cd1 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -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; } diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 09683f314c..37ad45bbfc 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -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::iterator i = _automation_tracks.find(param); + map::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*