X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Faudio_time_axis.cc;h=416a86c1a5a14e676201671d493dc19e1e837a42;hb=fc7a2e9ee1616cdcb78d6b60804baff336ad07ee;hp=2be25f76aabed687c8f5ce1e83dce3a89ce6f956;hpb=aef6bdba1c9a9d01556bbed7bb21d2c297694ed1;p=ardour.git diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index 2be25f76aa..416a86c1a5 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -30,7 +29,6 @@ #include #include -#include #include #include @@ -41,7 +39,7 @@ #include #include -#include +#include #include #include #include @@ -85,46 +83,44 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh assert(!is_track() || is_audio_track()); subplugin_menu.set_name ("ArdourContextMenu"); - gain_track = 0; - pan_track = 0; waveform_item = 0; - pan_automation_item = 0; - gain_automation_item = 0; _view = new AudioStreamView (*this); - add_gain_automation_child (); - add_pan_automation_child (); + create_automation_child (GainAutomation); + create_automation_child (PanAutomation); ignore_toggle = false; + mute_button->set_active (false); + solo_button->set_active (false); + if (is_audio_track()) controls_ebox.set_name ("AudioTimeAxisViewControlsBaseUnselected"); else // bus controls_ebox.set_name ("AudioBusControlsBaseUnselected"); + /* map current state of the route */ + + processors_changed (); + reset_processor_automation_curves (); + ensure_xml_node (); set_state (*xml_node); _route->panner().Changed.connect (mem_fun(*this, &AudioTimeAxisView::update_pans)); - if (is_audio_track()) { + update_control_names (); - controls_ebox.set_name ("AudioTrackControlsBaseUnselected"); - controls_base_selected_name = "AudioTrackControlsBaseSelected"; - controls_base_unselected_name = "AudioTrackControlsBaseUnselected"; + if (is_audio_track()) { /* ask for notifications of any new RegionViews */ _view->RegionViewAdded.connect (mem_fun(*this, &AudioTimeAxisView::region_view_added)); _view->attach (); - - } else { /* bus */ - - controls_ebox.set_name ("AudioBusControlsBaseUnselected"); - controls_base_selected_name = "AudioBusControlsBaseSelected"; - controls_base_unselected_name = "AudioBusControlsBaseUnselected"; } + + post_construct (); } AudioTimeAxisView::~AudioTimeAxisView () @@ -155,81 +151,6 @@ AudioTimeAxisView::hide () TimeAxisView::hide (); } -void -AudioTimeAxisView::set_state (const XMLNode& node) -{ - const XMLProperty *prop; - - TimeAxisView::set_state (node); - - if ((prop = node.property ("shown_editor")) != 0) { - if (prop->value() == "no") { - _marked_for_display = false; - } else { - _marked_for_display = true; - } - } else { - _marked_for_display = true; - } - - XMLNodeList nlist = node.children(); - XMLNodeConstIterator niter; - XMLNode *child_node; - - - show_gain_automation = false; - show_pan_automation = false; - - for (niter = nlist.begin(); niter != nlist.end(); ++niter) { - child_node = *niter; - - if (child_node->name() == "gain") { - XMLProperty *prop=child_node->property ("shown"); - - if (prop != 0) { - if (prop->value() == "yes") { - show_gain_automation = true; - } - } - continue; - } - - if (child_node->name() == "pan") { - XMLProperty *prop=child_node->property ("shown"); - - if (prop != 0) { - if (prop->value() == "yes") { - show_pan_automation = true; - } - } - continue; - } - } -} - -void -AudioTimeAxisView::build_automation_action_menu () -{ - using namespace Menu_Helpers; - - RouteTimeAxisView::build_automation_action_menu (); - - MenuList& automation_items = automation_action_menu->items(); - - automation_items.push_back (SeparatorElem()); - - automation_items.push_back (CheckMenuElem (_("Fader"), - mem_fun(*this, &AudioTimeAxisView::toggle_gain_track))); - gain_automation_item = static_cast (&automation_items.back()); - gain_automation_item->set_active(show_gain_automation); - - automation_items.push_back (CheckMenuElem (_("Pan"), - mem_fun(*this, &AudioTimeAxisView::toggle_pan_track))); - pan_automation_item = static_cast (&automation_items.back()); - pan_automation_item->set_active(show_pan_automation); - -} - void AudioTimeAxisView::append_extra_display_menu_items () { @@ -252,15 +173,53 @@ AudioTimeAxisView::append_extra_display_menu_items () waveform_item->set_active (editor.show_waveforms()); ignore_toggle = false; + waveform_items.push_back (SeparatorElem()); + RadioMenuItem::Group group; - + waveform_items.push_back (RadioMenuElem (group, _("Traditional"), bind (mem_fun(*this, &AudioTimeAxisView::set_waveform_shape), Traditional))); traditional_item = static_cast (&waveform_items.back()); waveform_items.push_back (RadioMenuElem (group, _("Rectified"), bind (mem_fun(*this, &AudioTimeAxisView::set_waveform_shape), Rectified))); rectified_item = static_cast (&waveform_items.back()); + waveform_items.push_back (SeparatorElem()); + + RadioMenuItem::Group group2; + + waveform_items.push_back (RadioMenuElem (group2, _("Linear"), bind (mem_fun(*this, &AudioTimeAxisView::set_waveform_scale), LinearWaveform))); + linearscale_item = static_cast (&waveform_items.back()); + + waveform_items.push_back (RadioMenuElem (group2, _("Logarithmic"), bind (mem_fun(*this, &AudioTimeAxisView::set_waveform_scale), LogWaveform))); + logscale_item = static_cast (&waveform_items.back()); + + // setting initial item state + AudioStreamView* asv = audio_view(); + if (asv) { + ignore_toggle = true; + if (asv->get_waveform_shape() == Rectified) + rectified_item->set_active(true); + else traditional_item->set_active(true); + + if (asv->get_waveform_scale() == LogWaveform) + logscale_item->set_active(true); + else linearscale_item->set_active(true); + ignore_toggle = false; + } + items.push_back (MenuElem (_("Waveform"), *waveform_menu)); + + + Menu *layers_menu = manage(new Menu); + MenuList &layers_items = layers_menu->items(); + layers_menu->set_name("ArdourContextMenu"); + + RadioMenuItem::Group layers_group; + + layers_items.push_back(RadioMenuElem (layers_group, _("Overlaid"), bind (mem_fun (*this, &AudioTimeAxisView::set_layer_display), Overlaid))); + layers_items.push_back(RadioMenuElem (layers_group, _("Stacked"), bind (mem_fun (*this, &AudioTimeAxisView::set_layer_display), Stacked))); + + items.push_back (MenuElem (_("Layers"), *layers_menu)); } void @@ -302,7 +261,7 @@ AudioTimeAxisView::set_waveform_shape (WaveformShape shape) { AudioStreamView* asv = audio_view(); - if (asv) { + if (asv && !ignore_toggle) { asv->set_waveform_shape (shape); } @@ -310,79 +269,57 @@ AudioTimeAxisView::set_waveform_shape (WaveformShape shape) } void -AudioTimeAxisView::add_gain_automation_child () +AudioTimeAxisView::set_waveform_scale (WaveformScale scale) { - XMLProperty* prop; - AutomationLine* line; - - gain_track = new GainAutomationTimeAxisView (_session, - _route, - editor, - *this, - parent_canvas, - _("gain"), - _route->gain_automation_curve()); - - line = new AutomationGainLine ("automation gain", - _session, - *gain_track, - *gain_track->canvas_display, - _route->gain_automation_curve()); + AudioStreamView* asv = audio_view(); - line->set_line_color (color_map[cAutomationLine]); - + if (asv && !ignore_toggle) { + asv->set_waveform_scale (scale); + } - gain_track->add_line (*line); + map_frozen (); +} - add_child (gain_track); +void +AudioTimeAxisView::create_automation_child (ParamID param) +{ + if (param.type() == GainAutomation) { + GainAutomationTimeAxisView* gain_track = new GainAutomationTimeAxisView (_session, + _route, + editor, + *this, + parent_canvas, + _route->describe_parameter(param), + _route->gain_automation()); - gain_track->Hiding.connect (mem_fun(*this, &AudioTimeAxisView::gain_hidden)); + AutomationLine* line = new AutomationGainLine ("automation gain", + *gain_track, + *gain_track->canvas_display, + _route->gain_automation()); - bool hideit = true; - - XMLNode* node; - - if ((node = gain_track->get_state_node()) != 0) { - if ((prop = node->property ("shown")) != 0) { - if (prop->value() == "yes") { - hideit = false; - } - } - } + line->set_line_color (Config->canvasvar_AutomationLine.get()); - if (hideit) { - gain_track->hide (); - } -} + gain_track->add_line (*line); -void -AudioTimeAxisView::add_pan_automation_child () -{ - XMLProperty* prop; + add_automation_child(ParamID(GainAutomation), gain_track); - pan_track = new PanAutomationTimeAxisView (_session, _route, editor, *this, parent_canvas, _("pan")); + } else if (param.type() == PanAutomation) { - update_pans (); - - add_child (pan_track); + PanAutomationTimeAxisView* pan_track = new PanAutomationTimeAxisView (_session, + _route, + editor, + *this, + parent_canvas, + _route->describe_parameter(param)); - pan_track->Hiding.connect (mem_fun(*this, &AudioTimeAxisView::pan_hidden)); + ensure_xml_node (); - ensure_xml_node (); - bool hideit = true; - - XMLNode* node; - - if ((node = pan_track->get_state_node()) != 0) { - if ((prop = node->property ("shown")) != 0) { - if (prop->value() == "yes") { - hideit = false; - } - } - } + add_automation_child(ParamID(PanAutomation), pan_track); + + update_pans (); - if (hideit) { - pan_track->hide (); + } else { + error << "AudioTimeAxisView: unknown automation child " << param.to_string() << endmsg; } } @@ -391,12 +328,20 @@ AudioTimeAxisView::update_pans () { Panner::iterator p; + RouteAutomationNode* ran = automation_track(PanAutomation); + if (!ran) { + warning << _route << " has no pan automation track" << endmsg; + return; + } + + AutomationTimeAxisView* pan_track = ran->track; + pan_track->clear_lines (); /* we don't draw lines for "greater than stereo" panning. */ - if (_route->n_outputs() > 2) { + if (_route->n_outputs().n_audio() > 2) { return; } @@ -404,95 +349,22 @@ AudioTimeAxisView::update_pans () AutomationLine* line; - line = new AutomationPanLine ("automation pan", _session, *pan_track, + line = new AutomationPanLine ("automation pan", *pan_track, *pan_track->canvas_display, (*p)->automation()); if (p == _route->panner().begin()) { /* first line is a nice orange */ - line->set_line_color (color_map[cLeftPanAutomationLine]); + line->set_line_color (Config->canvasvar_AutomationLine.get()); } else { /* second line is a nice blue */ - line->set_line_color (color_map[cRightPanAutomationLine]); + line->set_line_color (Config->canvasvar_AutomationLine.get()); } pan_track->add_line (*line); } } -void -AudioTimeAxisView::toggle_gain_track () -{ - - bool showit = gain_automation_item->get_active(); - - if (showit != gain_track->marked_for_display()) { - if (showit) { - gain_track->set_marked_for_display (true); - gain_track->canvas_display->show(); - gain_track->get_state_node()->add_property ("shown", X_("yes")); - } else { - gain_track->set_marked_for_display (false); - gain_track->hide (); - gain_track->get_state_node()->add_property ("shown", X_("no")); - } - - /* now trigger a redisplay */ - - if (!no_redraw) { - _route->gui_changed (X_("track_height"), (void *) 0); /* EMIT_SIGNAL */ - } - } -} - -void -AudioTimeAxisView::gain_hidden () -{ - gain_track->get_state_node()->add_property (X_("shown"), X_("no")); - - if (gain_automation_item && !_hidden) { - gain_automation_item->set_active (false); - } - - _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */ -} - -void -AudioTimeAxisView::toggle_pan_track () -{ - bool showit = pan_automation_item->get_active(); - - if (showit != pan_track->marked_for_display()) { - if (showit) { - pan_track->set_marked_for_display (true); - pan_track->canvas_display->show(); - pan_track->get_state_node()->add_property ("shown", X_("yes")); - } else { - pan_track->set_marked_for_display (false); - pan_track->hide (); - pan_track->get_state_node()->add_property ("shown", X_("no")); - } - - /* now trigger a redisplay */ - - if (!no_redraw) { - _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */ - } - } -} - -void -AudioTimeAxisView::pan_hidden () -{ - pan_track->get_state_node()->add_property ("shown", "no"); - - if (pan_automation_item && !_hidden) { - pan_automation_item->set_active (false); - } - - _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */ -} - void AudioTimeAxisView::show_all_automation () { @@ -583,7 +455,19 @@ void AudioTimeAxisView::route_active_changed () { RouteTimeAxisView::route_active_changed (); + update_control_names (); +} + +/** + * Set up the names of the controls so that they are coloured + * correctly depending on whether this route is inactive or + * selected. + */ + +void +AudioTimeAxisView::update_control_names () +{ if (is_audio_track()) { if (_route->active()) { controls_ebox.set_name ("AudioTrackControlsBaseUnselected"); @@ -607,9 +491,11 @@ AudioTimeAxisView::route_active_changed () } } -XMLNode* -AudioTimeAxisView::get_child_xml_node (const string & childname) +void +AudioTimeAxisView::set_layer_display (LayerDisplay d) { - return RouteUI::get_child_xml_node (childname); + AudioStreamView* asv = audio_view (); + if (asv) { + asv->set_layer_display (d); + } } -