X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_time_axis.cc;h=c0dedb895bfbcd10b3fef558940b439ea6e47757;hb=5afc5272b62df0a21bb7561ffa5ab9ad24ae64d5;hp=a1acb0749b309df524d74d56842f91a9b1114921;hpb=39610179219928e9b5c39e0955c0566c3e655cbf;p=ardour.git diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index a1acb0749b..c0dedb895b 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -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" @@ -63,7 +65,9 @@ #include "automation_time_axis.h" #include "enums.h" #include "gui_thread.h" +#include "item_counts.h" #include "keyboard.h" +#include "paste_context.h" #include "playlist_selector.h" #include "point_selection.h" #include "prompter.h" @@ -96,20 +100,25 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan , parent_canvas (canvas) , no_redraw (false) , button_table (3, 3) - , route_group_button (_("g")) - , playlist_button (_("p")) - , automation_button (_("a")) + , route_group_button (S_("RTAV|G")) + , playlist_button (S_("RTAV|P")) + , automation_button (S_("RTAV|A")) , automation_action_menu (0) , plugins_submenu_item (0) , route_group_menu (0) , playlist_action_menu (0) , mode_menu (0) , color_mode_menu (0) - , gm (sess, true, 125, 18) + , 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)); number_label.set_alignment(.5, .5); + number_label.set_fallthrough_to_parent (true); sess->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::parameter_changed, this, _1), gui_context()); } @@ -147,10 +156,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) set_gui_property ("visible", false); } - mute_changed (0); - update_solo_display (); - route_color_changed(); - timestretch_rect = 0; no_redraw = false; @@ -166,20 +171,12 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) if (is_track()) { - /* use icon */ - - switch (track()->mode()) { - case ARDOUR::Normal: - case ARDOUR::NonLayered: - rec_enable_button->set_image (::get_icon (X_("record_normal_red"))); - break; - case ARDOUR::Destructive: - rec_enable_button->set_image (::get_icon (X_("record_tape_red"))); - break; + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (*rec_enable_button, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } else { + controls_table.attach (*rec_enable_button, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); } - controls_table.attach (*rec_enable_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); - if (is_midi_track()) { ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record (Right-click for Step Edit)")); gm.set_fader_name ("MidiTrackFader"); @@ -196,33 +193,73 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) } else { gm.set_fader_name ("AudioBusFader"); + Gtk::Fixed *blank = manage(new Gtk::Fixed()); + controls_button_size_group->add_widget(*blank); + if (ARDOUR::Profile->get_mixbus() ) { + controls_table.attach (*blank, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } else { + controls_table.attach (*blank, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } + blank->show(); } - Gtk::VBox *mtrbox = manage(new Gtk::VBox()); - mtrbox->pack_start(gm.get_level_meter(), false, false, 2); - controls_hbox.pack_start(*mtrbox, false, false, 4); - mtrbox->show(); + top_hbox.pack_end(gm.get_level_meter(), false, false, 2); + + if (!ARDOUR::Profile->get_mixbus()) { + controls_meters_size_group->add_widget (gm.get_level_meter()); + } _route->meter_change.connect (*this, invalidator (*this), bind (&RouteTimeAxisView::meter_changed, this), gui_context()); _route->input()->changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::io_changed, this, _1, _2), gui_context()); _route->output()->changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::io_changed, this, _1, _2), gui_context()); _route->track_number_changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::label_view, this), gui_context()); - controls_table.attach (*mute_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); - - if (!_route->is_master()) { - controls_table.attach (*solo_button, 7, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); - } + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (*mute_button, 1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } else { + controls_table.attach (*mute_button, 3, 4, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } + // mute button is always present, it is used to + // force the 'blank' placeholders to the proper size + controls_button_size_group->add_widget(*mute_button); - if (!ARDOUR::Profile->get_trx()) { - controls_table.attach (route_group_button, 7, 8, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); - controls_table.attach (gm.get_gain_slider(), 0, 5, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::AttachOptions (0), 3, 0); + if (!_route->is_master()) { + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (*solo_button, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } else { + controls_table.attach (*solo_button, 4, 5, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } + } else { + Gtk::Fixed *blank = manage(new Gtk::Fixed()); + controls_button_size_group->add_widget(*blank); + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (*blank, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } else { + controls_table.attach (*blank, 4, 5, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + } + blank->show(); } + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (route_group_button, 2, 3, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + controls_table.attach (gm.get_gain_slider(), 3, 5, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 1, 0); + } + else if (!ARDOUR::Profile->get_trx()) { + controls_table.attach (route_group_button, 4, 5, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0); + controls_table.attach (gm.get_gain_slider(), 0, 2, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 1, 0); + } + ARDOUR_UI::instance()->set_tip(*solo_button,_("Solo")); ARDOUR_UI::instance()->set_tip(*mute_button,_("Mute")); ARDOUR_UI::instance()->set_tip(route_group_button, _("Route Group")); + mute_button->set_tweaks(ArdourButton::TrackHeader); + solo_button->set_tweaks(ArdourButton::TrackHeader); + rec_enable_button->set_tweaks(ArdourButton::TrackHeader); + playlist_button.set_tweaks(ArdourButton::TrackHeader); + automation_button.set_tweaks(ArdourButton::TrackHeader); + route_group_button.set_tweaks(ArdourButton::TrackHeader); + if (is_midi_track()) { ARDOUR_UI::instance()->set_tip(automation_button, _("MIDI Controllers and Automation")); } else { @@ -232,12 +269,20 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) update_track_number_visibility(); label_view (); - if (!ARDOUR::Profile->get_trx()) { - controls_table.attach (automation_button, 6, 7, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (automation_button, 1, 2, 2, 3, Gtk::SHRINK, Gtk::SHRINK); + } + else if (!ARDOUR::Profile->get_trx()) { + controls_table.attach (automation_button, 3, 4, 2, 3, Gtk::SHRINK, Gtk::SHRINK); } - if (!ARDOUR::Profile->get_trx() && is_track() && track()->mode() == ARDOUR::Normal) { - controls_table.attach (playlist_button, 5, 6, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); + if (is_track() && track()->mode() == ARDOUR::Normal) { + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (playlist_button, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK); + } + else if (!ARDOUR::Profile->get_trx()) { + controls_table.attach (playlist_button, 2, 3, 2, 3, Gtk::SHRINK, Gtk::SHRINK); + } } _y_position = -1; @@ -270,15 +315,13 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) route_group_menu = new RouteGroupMenu (_session, plist); - gm.get_gain_slider().signal_scroll_event().connect(sigc::mem_fun(*this, &RouteTimeAxisView::controls_ebox_scroll), false); - gm.get_level_meter().signal_scroll_event().connect (sigc::mem_fun (*this, &RouteTimeAxisView::controls_ebox_scroll), false); } RouteTimeAxisView::~RouteTimeAxisView () { - CatchDeletion (this); - + cleanup_gui_properties (); + for (list::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) { delete *i; } @@ -292,6 +335,7 @@ RouteTimeAxisView::~RouteTimeAxisView () _automation_tracks.clear (); delete route_group_menu; + CatchDeletion (this); } void @@ -359,6 +403,7 @@ RouteTimeAxisView::label_view () void RouteTimeAxisView::update_track_number_visibility () { + DisplaySuspender ds; bool show_label = _session->config.get_track_name_number(); if (_route && _route->is_master()) { @@ -368,19 +413,23 @@ RouteTimeAxisView::update_track_number_visibility () if (number_label.get_parent()) { controls_table.remove (number_label); } - if (name_hbox.get_parent()) { - controls_table.remove (name_hbox); - } if (show_label) { - controls_table.attach (number_label, 0, 1, 0, 1, Gtk::SHRINK, Gtk::FILL|Gtk::EXPAND, 3, 0); - controls_table.attach (name_hbox, 1, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 3, 0); - number_label.set_size_request(3 + _session->track_number_decimals() * 8, -1); - name_hbox.show (); + if (ARDOUR::Profile->get_mixbus()) { + controls_table.attach (number_label, 3, 4, 0, 1, Gtk::SHRINK, Gtk::EXPAND|Gtk::FILL, 1, 0); + } else { + controls_table.attach (number_label, 0, 1, 0, 1, Gtk::SHRINK, Gtk::EXPAND|Gtk::FILL, 1, 0); + } + // see ArdourButton::on_size_request(), we should probably use a global size-group here instead. + // except the width of the number label is subtracted from the name-hbox, so we + // need to explictly calculate it anyway until the name-label & entry become ArdourWidgets. + int tnw = (2 + std::max(2u, _session->track_number_decimals())) * number_label.char_pixel_width(); + if (tnw & 1) --tnw; + number_label.set_size_request(tnw, -1); number_label.show (); + name_hbox.set_size_request(TimeAxisView::name_width_px - 2 - tnw, -1); // -2 = cellspacing } else { - controls_table.attach (name_hbox, 0, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 3, 0); - name_hbox.show (); number_label.hide (); + name_hbox.set_size_request(TimeAxisView::name_width_px, -1); } } @@ -461,6 +510,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 (&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 (&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 (&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 const & params = _route->pannable()->what_can_be_automated (); + for (set::const_iterator p = params.begin(); p != params.end(); ++p) { + _main_automation_menu_map[*p] = pan_automation_item; + } + } } void @@ -708,7 +789,7 @@ RouteTimeAxisView::build_display_menu () i->set_active (normal == 0 && tape == 0 && non_layered != 0); i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0)); - items.push_back (MenuElem (_("Mode"), *mode_menu)); + items.push_back (MenuElem (_("Record Mode"), *mode_menu)); } @@ -771,12 +852,8 @@ RouteTimeAxisView::build_display_menu () items.push_back (SeparatorElem()); items.push_back (MenuElem (_("Hide"), sigc::bind (sigc::mem_fun(_editor, &PublicEditor::hide_track_in_display), this, true))); - if (!Profile->get_sae()) { - items.push_back (MenuElem (_("Remove"), sigc::bind (sigc::mem_fun(*this, &RouteUI::remove_this_route), true))); - } else { - items.push_front (SeparatorElem()); - items.push_front (MenuElem (_("Delete"), sigc::bind (sigc::mem_fun(*this, &RouteUI::remove_this_route), true))); - } + items.push_front (SeparatorElem()); + items.push_front (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks))); } void @@ -800,22 +877,6 @@ RouteTimeAxisView::set_track_mode (TrackMode mode, bool apply_to_selection) } track()->set_mode (mode); - - rec_enable_button->remove (); - - switch (mode) { - case ARDOUR::NonLayered: - case ARDOUR::Normal: - rec_enable_button->set_image (::get_icon (X_("record_normal_red"))); - rec_enable_button->set_text (string()); - break; - case ARDOUR::Destructive: - rec_enable_button->set_image (::get_icon (X_("record_tape_red"))); - rec_enable_button->set_text (string()); - break; - } - - rec_enable_button->show_all (); } } @@ -850,8 +911,8 @@ RouteTimeAxisView::show_timestretch (framepos_t start, framepos_t end, int layer if (timestretch_rect == 0) { timestretch_rect = new ArdourCanvas::Rectangle (canvas_display ()); - timestretch_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_TimeStretchFill()); - timestretch_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_TimeStretchOutline()); + timestretch_rect->set_fill_color (ArdourCanvas::HSV (ARDOUR_UI::config()->color ("time stretch fill")).mod (ARDOUR_UI::config()->modifier ("time stretch fill")).color()); + timestretch_rect->set_outline_color (ARDOUR_UI::config()->color ("time stretch outline")); } timestretch_rect->show (); @@ -895,7 +956,7 @@ RouteTimeAxisView::show_selection (TimeSelection& ts) } void -RouteTimeAxisView::set_height (uint32_t h) +RouteTimeAxisView::set_height (uint32_t h, TrackHeightMode m) { int gmlen = h - 9; bool height_changed = (height == 0) || (h != height); @@ -906,7 +967,7 @@ RouteTimeAxisView::set_height (uint32_t h) } gm.get_level_meter().setup_meters (gmlen, meter_width); - TimeAxisView::set_height (h); + TimeAxisView::set_height (h, m); if (_view) { _view->set_height ((double) current_height()); @@ -1228,15 +1289,22 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev) if (Keyboard::modifier_state_equals (ev->state, (Keyboard::TertiaryModifier|Keyboard::PrimaryModifier))) { /* special case: select/deselect all tracks */ + + _editor.begin_reversible_selection_op (X_("Selection Click")); + if (_editor.get_selection().selected (this)) { _editor.get_selection().clear_tracks (); } else { _editor.select_all_tracks (); } + _editor.commit_reversible_selection_op (); + return; } + _editor.begin_reversible_selection_op (X_("Selection Click")); + switch (ArdourKeyboard::selection_type (ev->state)) { case Selection::Toggle: _editor.get_selection().toggle (this); @@ -1254,6 +1322,8 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev) _editor.get_selection().add (this); break; } + + _editor.commit_reversible_selection_op (); } void @@ -1276,7 +1346,7 @@ RouteTimeAxisView::set_selected_regionviews (RegionSelection& regions) * @param results List to add things to. */ void -RouteTimeAxisView::get_selectables (framepos_t start, framepos_t end, double top, double bot, list& results) +RouteTimeAxisView::get_selectables (framepos_t start, framepos_t end, double top, double bot, list& results, bool within) { double speed = 1.0; @@ -1288,14 +1358,14 @@ RouteTimeAxisView::get_selectables (framepos_t start, framepos_t end, double top framepos_t const end_adjusted = session_frame_to_track_frame(end, speed); if ((_view && ((top < 0.0 && bot < 0.0))) || touched (top, bot)) { - _view->get_selectables (start_adjusted, end_adjusted, top, bot, results); + _view->get_selectables (start_adjusted, end_adjusted, top, bot, results, within); } /* pick up visible automation tracks */ for (Children::iterator i = children.begin(); i != children.end(); ++i) { if (!(*i)->hidden()) { - (*i)->get_selectables (start_adjusted, end_adjusted, top, bot, results); + (*i)->get_selectables (start_adjusted, end_adjusted, top, bot, results, within); } } } @@ -1506,20 +1576,20 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) } bool -RouteTimeAxisView::paste (framepos_t pos, float times, Selection& selection, size_t nth) +RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx) { if (!is_track()) { return false; } - boost::shared_ptr pl = playlist (); - PlaylistSelection::iterator p; - - for (p = selection.playlists.begin(); p != selection.playlists.end() && nth; ++p, --nth) {} + boost::shared_ptr pl = playlist (); + const ARDOUR::DataType type = pl->data_type(); + PlaylistSelection::const_iterator p = selection.playlists.get_nth(type, ctx.counts.n_playlists(type)); if (p == selection.playlists.end()) { return false; } + ctx.counts.increase_n_playlists(type); DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("paste to %1\n", pos)); @@ -1528,13 +1598,18 @@ RouteTimeAxisView::paste (framepos_t pos, float times, Selection& selection, siz DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("modified paste to %1\n", pos)); } + /* add multi-paste offset if applicable */ + std::pair extent = (*p)->get_extent(); + const framecnt_t duration = extent.second - extent.first; + pos += _editor.get_paste_offset(pos, ctx.count, duration); + pl->clear_changes (); if (Config->get_edit_mode() == Ripple) { std::pair extent = (*p)->get_extent_with_endspace(); framecnt_t amount = extent.second - extent.first; - pl->ripple(pos, amount * times, boost::shared_ptr()); + pl->ripple(pos, amount * ctx.times, boost::shared_ptr()); } - pl->paste (*p, pos, times); + pl->paste (*p, pos, ctx.times); vector cmds; pl->rdiff (cmds); @@ -1743,11 +1818,11 @@ RouteTimeAxisView::color_handler () { //case cTimeStretchOutline: if (timestretch_rect) { - timestretch_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_TimeStretchOutline()); + timestretch_rect->set_outline_color (ARDOUR_UI::config()->color ("time stretch outline")); } //case cTimeStretchFill: if (timestretch_rect) { - timestretch_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_TimeStretchFill()); + timestretch_rect->set_fill_color (ARDOUR_UI::config()->color ("time stretch fill")); } reset_meter(); @@ -1805,6 +1880,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 >::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 >::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 params = _route->panner()->what_can_be_automated(); + set::iterator p; + + for (p = params.begin(); p != params.end(); ++p) { + boost::shared_ptr 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 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) @@ -1987,7 +2166,7 @@ RouteTimeAxisView::add_processor_automation_curve (boost::shared_ptr << string_compose (X_("processor automation curve for %1:%2/%3/%4 not registered with track!"), processor->name(), what.type(), (int) what.channel(), what.id() ) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return; } @@ -2075,7 +2254,7 @@ RouteTimeAxisView::add_automation_child (Evoral::Parameter param, boost::shared_ request_redraw (); } - if (!EventTypeMap::instance().is_midi_parameter(param)) { + if (!ARDOUR::parameter_is_midi((AutomationType)param.type())) { /* MIDI-related parameters are always in the menu, there's no reason to rebuild the menu just because we added a automation lane for one of them. But if we add a non-MIDI automation @@ -2280,9 +2459,9 @@ RouteTimeAxisView::can_edit_name () const } void -RouteTimeAxisView::update_rec_display () +RouteTimeAxisView::blink_rec_display (bool onoff) { - RouteUI::update_rec_display (); + RouteUI::blink_rec_display (onoff); } void @@ -2350,7 +2529,7 @@ RouteTimeAxisView::show_meter () void RouteTimeAxisView::reset_meter () { - if (Config->get_show_track_meters()) { + if (ARDOUR_UI::config()->get_show_track_meters()) { int meter_width = 3; if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { meter_width = 6; @@ -2453,7 +2632,7 @@ RouteTimeAxisView::add_underlay (StreamView* v, bool /*update_xml*/) if (find(_underlay_streams.begin(), _underlay_streams.end(), v) == _underlay_streams.end()) { if (find(other._underlay_mirrors.begin(), other._underlay_mirrors.end(), this) != other._underlay_mirrors.end()) { fatal << _("programming error: underlay reference pointer pairs are inconsistent!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } _underlay_streams.push_back(v); @@ -2490,7 +2669,7 @@ RouteTimeAxisView::remove_underlay (StreamView* v) if (gm == other._underlay_mirrors.end()) { fatal << _("programming error: underlay reference pointer pairs are inconsistent!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } v->foreach_regionview(sigc::mem_fun(*this, &RouteTimeAxisView::remove_ghost)); @@ -2515,19 +2694,19 @@ RouteTimeAxisView::set_button_names () if (Config->get_solo_control_is_listen_control()) { switch (Config->get_listen_position()) { case AfterFaderListen: - solo_button->set_text (_("A")); + solo_button->set_text (S_("AfterFader|A")); ARDOUR_UI::instance()->set_tip (*solo_button, _("After-fade listen (AFL)")); break; case PreFaderListen: - solo_button->set_text (_("P")); + solo_button->set_text (S_("PreFader|P")); ARDOUR_UI::instance()->set_tip (*solo_button, _("Pre-fade listen (PFL)")); break; } } else { - solo_button->set_text (_("s")); + solo_button->set_text (S_("Solo|S")); ARDOUR_UI::instance()->set_tip (*solo_button, _("Solo")); } - mute_button->set_text (_("m")); + mute_button->set_text (S_("Mute|M")); } Gtk::CheckMenuItem*