X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_time_axis.cc;h=7614093e02af6c6056b9193c700b5f447141a77c;hb=69777d600fe2e1e034d24551ac9faec2c2481584;hp=faf57129050d850f9ad97f1f90e8ce36341b2e25;hpb=384d05dd35191077f3c2e6a5b6547f627aa0b68f;p=ardour.git diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index faf5712905..7614093e02 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -28,6 +28,10 @@ #include +#include +#include +#include + #include "pbd/error.h" #include "pbd/stl_delete.h" #include "pbd/whitespace.h" @@ -35,32 +39,34 @@ #include "pbd/enumwriter.h" #include "pbd/stateful_diff_command.h" -#include -#include -#include -#include -#include -#include +#include "evoral/Parameter.hpp" #include "ardour/amp.h" #include "ardour/meter.h" #include "ardour/event_type_map.h" #include "ardour/pannable.h" #include "ardour/panner.h" +#include "ardour/plugin_insert.h" #include "ardour/processor.h" #include "ardour/profile.h" #include "ardour/route_group.h" #include "ardour/session.h" #include "ardour/session_playlists.h" - -#include "evoral/Parameter.hpp" +#include "ardour/track.h" #include "canvas/debug.h" +#include "gtkmm2ext/gtk_ui.h" +#include "gtkmm2ext/utils.h" + +#include "widgets/ardour_button.h" +#include "widgets/prompter.h" +#include "widgets/tooltips.h" + #include "ardour_ui.h" -#include "ardour_button.h" #include "audio_streamview.h" #include "debug.h" +#include "enums_convert.h" #include "route_time_axis.h" #include "automation_time_axis.h" #include "enums.h" @@ -68,25 +74,22 @@ #include "item_counts.h" #include "keyboard.h" #include "paste_context.h" +#include "patch_change_widget.h" #include "playlist_selector.h" #include "point_selection.h" -#include "prompter.h" #include "public_editor.h" #include "region_view.h" #include "rgb_macros.h" #include "selection.h" #include "streamview.h" -#include "tooltips.h" #include "ui_config.h" #include "utils.h" #include "route_group_menu.h" -#include "ardour/track.h" - -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; -using namespace ARDOUR_UI_UTILS; +using namespace ArdourWidgets; using namespace PBD; using namespace Gtkmm2ext; using namespace Gtk; @@ -95,12 +98,9 @@ using namespace std; using std::list; RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas) - : AxisView(sess) - , RouteUI(sess) - , TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas) + : RouteUI(sess) + , StripableTimeAxisView(ed, sess, canvas) , _view (0) - , parent_canvas (canvas) - , no_redraw (false) , button_table (3, 3) , route_group_button (S_("RTAV|G")) , playlist_button (S_("RTAV|P")) @@ -113,9 +113,6 @@ 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) - , trim_automation_item(NULL) - , mute_automation_item(NULL) , pan_automation_item(NULL) { number_label.set_name("tracknumber label"); @@ -129,10 +126,19 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan parameter_changed ("editor-stereo-only-meters"); } +void +RouteTimeAxisView::route_property_changed (const PBD::PropertyChange& what_changed) +{ + if (what_changed.contains (ARDOUR::Properties::name)) { + label_view (); + } +} + void RouteTimeAxisView::set_route (boost::shared_ptr rt) { RouteUI::set_route (rt); + StripableTimeAxisView::set_stripable (rt); CANVAS_DEBUG_NAME (_canvas_display, string_compose ("main for %1", rt->name())); CANVAS_DEBUG_NAME (selection_group, string_compose ("selections for %1", rt->name())); @@ -147,9 +153,9 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) gm.get_level_meter().setup_meters(50, meter_width); gm.update_gain_sensitive (); - string str = gui_property ("height"); - if (!str.empty()) { - set_height (atoi (str)); + uint32_t height; + if (get_gui_property ("height", height)) { + set_height (height); } else { set_height (preset_height (HeightNormal)); } @@ -171,9 +177,9 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) playlist_button.set_name ("route button"); automation_button.set_name ("route button"); - route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false); - playlist_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click)); - automation_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click)); + route_group_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false); + playlist_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click), false); + automation_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click), false); if (is_track()) { @@ -183,13 +189,13 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) controls_table.attach (*rec_enable_button, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); } - if (is_midi_track()) { - set_tooltip(*rec_enable_button, _("Record (Right-click for Step Edit)")); + if (is_midi_track()) { + set_tooltip(*rec_enable_button, _("Record (Right-click for Step Edit)")); gm.set_fader_name ("MidiTrackFader"); - } else { - set_tooltip(*rec_enable_button, _("Record")); + } else { + set_tooltip(*rec_enable_button, _("Record")); gm.set_fader_name ("AudioTrackFader"); - } + } /* set playlist button tip to the current playlist, and make it update when it changes */ update_playlist_tip (); @@ -213,6 +219,10 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) controls_meters_size_group->add_widget (gm.get_level_meter()); } + if (_route->is_master()) { + route_group_button.set_sensitive(false); + } + _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()); @@ -292,13 +302,12 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) _y_position = -1; _route->processors_changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context()); - _route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::route_property_changed, this, _1), gui_context()); if (is_track()) { - str = gui_property ("layer-display"); - if (!str.empty()) { - set_layer_display (LayerDisplay (string_2_enum (str, _view->layer_display ()))); + LayerDisplay layer_display; + if (get_gui_property ("layer-display", layer_display)) { + set_layer_display (layer_display); } track()->FreezeChange.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::map_frozen, this), gui_context()); @@ -309,13 +318,12 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) } - _editor.ZoomChanged.connect (sigc::mem_fun(*this, &RouteTimeAxisView::reset_samples_per_pixel)); UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::color_handler)); PropertyList* plist = new PropertyList(); - plist->add (ARDOUR::Properties::mute, true); - plist->add (ARDOUR::Properties::solo, true); + plist->add (ARDOUR::Properties::group_mute, true); + plist->add (ARDOUR::Properties::group_solo, true); route_group_menu = new RouteGroupMenu (_session, plist); @@ -373,7 +381,7 @@ RouteTimeAxisView::setup_processor_menu_and_curves () _route->foreach_processor (sigc::mem_fun (*this, &RouteTimeAxisView::add_existing_processor_automation_curves)); } -gint +bool RouteTimeAxisView::route_group_click (GdkEventButton *ev) { if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { @@ -387,9 +395,15 @@ RouteTimeAxisView::route_group_click (GdkEventButton *ev) r.push_back (route ()); route_group_menu->build (r); - route_group_menu->menu()->popup (ev->button, ev->time); + if (ev->button == 1) { + Gtkmm2ext::anchored_menu_popup(route_group_menu->menu(), + &route_group_button, + "", 1, ev->time); + } else { + route_group_menu->menu()->popup (ev->button, ev->time); + } - return false; + return true; } void @@ -409,7 +423,7 @@ RouteTimeAxisView::label_view () if (track_number == 0) { number_label.set_text (""); } else { - number_label.set_text (PBD::to_string (abs(_route->track_number ()), std::dec)); + number_label.set_text (PBD::to_string (abs(_route->track_number ()))); } } @@ -458,14 +472,6 @@ RouteTimeAxisView::parameter_changed (string const & p) } } -void -RouteTimeAxisView::route_property_changed (const PropertyChange& what_changed) -{ - if (what_changed.contains (ARDOUR::Properties::name)) { - label_view (); - } -} - void RouteTimeAxisView::take_name_changed (void *src) { @@ -474,20 +480,32 @@ RouteTimeAxisView::take_name_changed (void *src) } } -void -RouteTimeAxisView::playlist_click () +bool +RouteTimeAxisView::playlist_click (GdkEventButton *ev) { + if (ev->button != 1) { + return true; + } + build_playlist_menu (); conditionally_add_to_selection (); - playlist_action_menu->popup (1, gtk_get_current_event_time()); + Gtkmm2ext::anchored_menu_popup(playlist_action_menu, &playlist_button, + "", 1, ev->time); + return true; } -void -RouteTimeAxisView::automation_click () +bool +RouteTimeAxisView::automation_click (GdkEventButton *ev) { + if (ev->button != 1) { + return true; + } + conditionally_add_to_selection (); build_automation_action_menu (false); - automation_action_menu->popup (1, gtk_get_current_event_time()); + Gtkmm2ext::anchored_menu_popup(automation_action_menu, &automation_button, + "", 1, ev->time); + return true; } void @@ -510,22 +528,24 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) automation_action_menu->set_name ("ArdourContextMenu"); items.push_back (MenuElem (_("Show All Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection))); items.push_back (MenuElem (_("Show Existing Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection))); items.push_back (MenuElem (_("Hide All Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection))); /* Attach the plugin submenu. It may have previously been used elsewhere, so it was detached above */ + bool single_track_selected = (!for_selection || _editor.get_selection().tracks.size() == 1); + if (!subplugin_menu.items().empty()) { items.push_back (SeparatorElem ()); items.push_back (MenuElem (_("Processor automation"), subplugin_menu)); - items.back().set_sensitive (!for_selection || _editor.get_selection().tracks.size() == 1);; + items.back().set_sensitive (single_track_selected); } /* Add any route automation */ @@ -533,8 +553,8 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) 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")))); + gain_automation_item->set_active (single_track_selected && + string_to(gain_track->gui_property ("visible"))); _main_automation_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item; } @@ -542,8 +562,8 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) if (trim_track) { items.push_back (CheckMenuElem (_("Trim"), sigc::mem_fun (*this, &RouteTimeAxisView::update_trim_track_visibility))); trim_automation_item = dynamic_cast (&items.back ()); - trim_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && - (trim_track && string_is_affirmative (trim_track->gui_property ("visible")))); + trim_automation_item->set_active (single_track_selected && + string_to(trim_track->gui_property ("visible"))); _main_automation_menu_map[Evoral::Parameter(TrimAutomation)] = trim_automation_item; } @@ -551,17 +571,17 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) 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")))); + mute_automation_item->set_active (single_track_selected && + string_to(mute_track->gui_property ("visible"))); _main_automation_menu_map[Evoral::Parameter(MuteAutomation)] = mute_automation_item; } - if (!pan_tracks.empty()) { + if (!pan_tracks.empty() && !ARDOUR::Profile->get_mixbus()) { 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")))); + pan_automation_item->set_active (single_track_selected && + string_to(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) { @@ -616,21 +636,27 @@ RouteTimeAxisView::build_display_menu () int overlaid = 0; int stacked = 0; + int unchangeable = 0; TrackSelection const & s = _editor.get_selection().tracks; + for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) { StreamView* v = (*i)->view (); if (!v) { continue; } - switch (v->layer_display ()) { - case Overlaid: - ++overlaid; - break; - case Stacked: - case Expanded: - ++stacked; - break; + if (v->can_change_layer_display()) { + switch (v->layer_display ()) { + case Overlaid: + ++overlaid; + break; + case Stacked: + case Expanded: + ++stacked; + break; + } + } else { + unchangeable++; } } @@ -648,12 +674,20 @@ RouteTimeAxisView::build_display_menu () i->set_inconsistent (overlaid != 0 && stacked != 0); i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_layer_display), Overlaid, true)); + if (unchangeable) { + i->set_sensitive (false); + } + layers_items.push_back (RadioMenuElem (layers_group, _("Stacked"))); i = dynamic_cast (&layers_items.back ()); i->set_active (overlaid == 0 && stacked != 0); i->set_inconsistent (overlaid != 0 && stacked != 0); i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_layer_display), Stacked, true)); + if (unchangeable) { + i->set_sensitive (false); + } + _ignore_set_layer_display = false; items.push_back (MenuElem (_("Layers"), *layers_menu)); @@ -756,55 +790,6 @@ RouteTimeAxisView::build_display_menu () /* show nothing */ } - Menu* mode_menu = manage (new Menu); - MenuList& mode_items = mode_menu->items (); - mode_menu->set_name ("ArdourContextMenu"); - - RadioMenuItem::Group mode_group; - - int normal = 0; - int tape = 0; - int non_layered = 0; - - for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) { - RouteTimeAxisView* r = dynamic_cast (*t); - if (!r || !r->is_track ()) { - continue; - } - - switch (r->track()->mode()) { - case Normal: - ++normal; - break; - case Destructive: - ++tape; - break; - case NonLayered: - ++non_layered; - break; - } - } - - mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode"))); - i = dynamic_cast (&mode_items.back ()); - i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal, true)); - i->set_active (normal != 0 && tape == 0 && non_layered == 0); - i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0)); - - mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode"))); - i = dynamic_cast (&mode_items.back ()); - i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive, true)); - i->set_active (normal == 0 && tape != 0 && non_layered == 0); - i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0)); - - mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode"))); - i = dynamic_cast (&mode_items.back ()); - i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered, true)); - i->set_active (normal == 0 && tape == 0 && non_layered != 0); - i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0)); - - items.push_back (MenuElem (_("Record Mode"), *mode_menu)); - items.push_back (SeparatorElem()); build_playlist_menu (); @@ -812,6 +797,13 @@ RouteTimeAxisView::build_display_menu () items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1); } + if (!is_midi_track () && _route->the_instrument ()) { + /* MIDI Bus */ + items.push_back (MenuElem (_("Patch Selector..."), + sigc::mem_fun(*this, &RouteUI::select_midi_patch))); + items.push_back (SeparatorElem()); + } + route_group_menu->detach (); WeakRouteList r; @@ -826,8 +818,10 @@ RouteTimeAxisView::build_display_menu () r.push_back (route ()); } - route_group_menu->build (r); - items.push_back (MenuElem (_("Group"), *route_group_menu->menu ())); + if (!_route->is_master()) { + route_group_menu->build (r); + items.push_back (MenuElem (_("Group"), *route_group_menu->menu ())); + } build_automation_action_menu (true); items.push_back (MenuElem (_("Automation"), *automation_action_menu)); @@ -873,31 +867,7 @@ RouteTimeAxisView::build_display_menu () } void -RouteTimeAxisView::set_track_mode (TrackMode mode, bool apply_to_selection) -{ - if (apply_to_selection) { - _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::set_track_mode, _1, mode, false)); - } else { - - bool needs_bounce = false; - - if (!track()->can_use_mode (mode, needs_bounce)) { - - if (!needs_bounce) { - /* cannot be done */ - return; - } else { - cerr << "would bounce this one\n"; - return; - } - } - - track()->set_mode (mode); - } -} - -void -RouteTimeAxisView::show_timestretch (framepos_t start, framepos_t end, int layers, int layer) +RouteTimeAxisView::show_timestretch (samplepos_t start, samplepos_t end, int layers, int layer) { TimeAxisView::show_timestretch (start, end, layers, layer); @@ -927,7 +897,7 @@ 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 (ArdourCanvas::HSV (UIConfiguration::instance().color ("time stretch fill")).mod (UIConfiguration::instance().modifier ("time stretch fill")).color()); + timestretch_rect->set_fill_color (Gtkmm2ext::HSV (UIConfiguration::instance().color ("time stretch fill")).mod (UIConfiguration::instance().modifier ("time stretch fill")).color()); timestretch_rect->set_outline_color (UIConfiguration::instance().color ("time stretch outline")); } @@ -1042,44 +1012,32 @@ RouteTimeAxisView::set_height (uint32_t h, TrackHeightMode m) void RouteTimeAxisView::route_color_changed () { + using namespace ARDOUR_UI_UTILS; if (_view) { _view->apply_color (color(), StreamView::RegionColor); } - number_label.set_fixed_colors (gdk_color_to_rgba (color()), gdk_color_to_rgba (color())); } -void -RouteTimeAxisView::reset_samples_per_pixel () -{ - set_samples_per_pixel (_editor.get_current_zoom()); -} - void RouteTimeAxisView::set_samples_per_pixel (double fpp) { - double speed = 1.0; - - if (track()) { - speed = track()->speed(); - } - if (_view) { - _view->set_samples_per_pixel (fpp * speed); + _view->set_samples_per_pixel (fpp); } - TimeAxisView::set_samples_per_pixel (fpp * speed); + StripableTimeAxisView::set_samples_per_pixel (fpp); } void RouteTimeAxisView::set_align_choice (RadioMenuItem* mitem, AlignChoice choice, bool apply_to_selection) { - if (!mitem->get_active()) { - /* this is one of the two calls made when these radio menu items change status. this one - is for the item that became inactive, and we want to ignore it. - */ - return; - } + if (!mitem->get_active()) { + /* this is one of the two calls made when these radio menu items change status. this one + is for the item that became inactive, and we want to ignore it. + */ + return; + } if (apply_to_selection) { _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::set_align_choice, _1, mitem, choice, false)); @@ -1093,7 +1051,7 @@ RouteTimeAxisView::set_align_choice (RadioMenuItem* mitem, AlignChoice choice, b void RouteTimeAxisView::rename_current_playlist () { - ArdourPrompter prompter (true); + Prompter prompter (true); string name; boost::shared_ptr tr = track(); @@ -1108,20 +1066,25 @@ RouteTimeAxisView::rename_current_playlist () prompter.set_title (_("Rename Playlist")); prompter.set_prompt (_("New name for playlist:")); - prompter.set_initial_text (pl->name()); prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + prompter.set_initial_text (pl->name()); prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: + while (true) { + if (prompter.run () != Gtk::RESPONSE_ACCEPT) { + break; + } prompter.get_result (name); if (name.length()) { - pl->set_name (name); + if (_session->playlists->by_name (name)) { + MessageDialog msg (_("Given playlist name is not unique.")); + msg.run (); + prompter.set_initial_text (Playlist::bump_name (name, *_session)); + } else { + pl->set_name (name); + break; + } } - break; - - default: - break; } } @@ -1161,7 +1124,7 @@ RouteTimeAxisView::resolve_new_group_playlist_name(std::string &basename, vector } void -RouteTimeAxisView::use_copy_playlist (bool prompt, vector > const & playlists_before_op) +RouteTimeAxisView::use_new_playlist (bool prompt, vector > const & playlists_before_op, bool copy) { string name; @@ -1177,92 +1140,55 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vectorname(); - if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { - name = resolve_new_group_playlist_name(name, playlists_before_op); + if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) { + name = resolve_new_group_playlist_name(name,playlists_before_op); } while (_session->playlists->by_name(name)) { name = Playlist::bump_name (name, *_session); } - // TODO: The prompter "new" button should be de-activated if the user - // specifies a playlist name which already exists in the session. - if (prompt) { + // TODO: The prompter "new" button should be de-activated if the user + // specifies a playlist name which already exists in the session. - ArdourPrompter prompter (true); + Prompter prompter (true); - prompter.set_title (_("New Copy Playlist")); - prompter.set_prompt (_("Name for new playlist:")); + if (copy) { + prompter.set_title (_("New Copy Playlist")); + prompter.set_prompt (_("Name for playlist copy:")); + } else { + prompter.set_title (_("New Playlist")); + prompter.set_prompt (_("Name for new playlist:")); + } prompter.set_initial_text (name); prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true); prompter.show_all (); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: + while (true) { + if (prompter.run () != Gtk::RESPONSE_ACCEPT) { + return; + } prompter.get_result (name); - break; - - default: - return; + if (name.length()) { + if (_session->playlists->by_name (name)) { + MessageDialog msg (_("Given playlist name is not unique.")); + msg.run (); + prompter.set_initial_text (Playlist::bump_name (name, *_session)); + } else { + break; + } + } } } if (name.length()) { - tr->use_copy_playlist (); - tr->playlist()->set_name (name); - } -} - -void -RouteTimeAxisView::use_new_playlist (bool prompt, vector > const & playlists_before_op) -{ - string name; - - boost::shared_ptr tr = track (); - if (!tr || tr->destructive()) { - return; - } - - boost::shared_ptr pl = tr->playlist(); - if (!pl) { - return; - } - - name = pl->name(); - - if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { - name = resolve_new_group_playlist_name(name,playlists_before_op); - } - - while (_session->playlists->by_name(name)) { - name = Playlist::bump_name (name, *_session); - } - - - if (prompt) { - - ArdourPrompter prompter (true); - - prompter.set_title (_("New Playlist")); - prompter.set_prompt (_("Name for new playlist:")); - prompter.set_initial_text (name); - prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); - prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true); - - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: - prompter.get_result (name); - break; - - default: - return; + if (copy) { + tr->use_copy_playlist (); + } else { + tr->use_default_new_playlist (); } - } - - if (name.length()) { - tr->use_new_playlist (); tr->playlist()->set_name (name); } } @@ -1340,14 +1266,14 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev) } _editor.commit_reversible_selection_op (); + + _editor.set_selected_mixer_strip (*this); } void RouteTimeAxisView::set_selected_points (PointSelection& points) { - for (Children::iterator i = children.begin(); i != children.end(); ++i) { - (*i)->set_selected_points (points); - } + StripableTimeAxisView::set_selected_points (points); AudioStreamView* asv = dynamic_cast(_view); if (asv) { asv->set_selected_points (points); @@ -1366,26 +1292,16 @@ 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, bool within) +RouteTimeAxisView::get_selectables (samplepos_t start, samplepos_t end, double top, double bot, list& results, bool within) { - double speed = 1.0; - - if (track() != 0) { - speed = track()->speed(); - } - - framepos_t const start_adjusted = session_frame_to_track_frame(start, speed); - 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, within); + _view->get_selectables (start, end, 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, within); + (*i)->get_selectables (start, end, top, bot, results, within); } } } @@ -1396,14 +1312,7 @@ RouteTimeAxisView::get_inverted_selectables (Selection& sel, list& if (_view) { _view->get_inverted_selectables (sel, results); } - - for (Children::iterator i = children.begin(); i != children.end(); ++i) { - if (!(*i)->hidden()) { - (*i)->get_inverted_selectables (sel, results); - } - } - - return; + StripableTimeAxisView::get_inverted_selectables (sel, results); } RouteGroup* @@ -1412,12 +1321,6 @@ RouteTimeAxisView::route_group () const return _route->route_group(); } -string -RouteTimeAxisView::name() const -{ - return _route->name(); -} - boost::shared_ptr RouteTimeAxisView::playlist () const { @@ -1438,7 +1341,7 @@ RouteTimeAxisView::name_entry_changed (string const& str) } string x = str; - + strip_whitespace_edges (x); if (x.empty()) { @@ -1457,7 +1360,7 @@ RouteTimeAxisView::name_entry_changed (string const& str) } boost::shared_ptr -RouteTimeAxisView::find_next_region (framepos_t pos, RegionPoint point, int32_t dir) +RouteTimeAxisView::find_next_region (samplepos_t pos, RegionPoint point, int32_t dir) { boost::shared_ptr pl = playlist (); @@ -1468,8 +1371,8 @@ RouteTimeAxisView::find_next_region (framepos_t pos, RegionPoint point, int32_t return boost::shared_ptr (); } -framepos_t -RouteTimeAxisView::find_next_region_boundary (framepos_t pos, int32_t dir) +samplepos_t +RouteTimeAxisView::find_next_region_boundary (samplepos_t pos, int32_t dir) { boost::shared_ptr pl = playlist (); @@ -1495,16 +1398,9 @@ RouteTimeAxisView::fade_range (TimeSelection& selection) playlist = tr->playlist(); TimeSelection time (selection); - float const speed = tr->speed(); - if (speed != 1.0f) { - for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) { - (*i).start = session_frame_to_track_frame((*i).start, speed); - (*i).end = session_frame_to_track_frame((*i).end, speed); - } - } - playlist->clear_changes (); - playlist->clear_owned_changes (); + playlist->clear_changes (); + playlist->clear_owned_changes (); playlist->fade_range (time); @@ -1530,44 +1426,39 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) playlist = tr->playlist(); TimeSelection time (selection.time); - float const speed = tr->speed(); - if (speed != 1.0f) { - for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) { - (*i).start = session_frame_to_track_frame((*i).start, speed); - (*i).end = session_frame_to_track_frame((*i).end, speed); - } - } - playlist->clear_changes (); - playlist->clear_owned_changes (); + playlist->clear_changes (); + playlist->clear_owned_changes (); switch (op) { case Delete: if (playlist->cut (time) != 0) { - if (Config->get_edit_mode() == Ripple) + if (Config->get_edit_mode() == Ripple) { playlist->ripple(time.start(), -time.length(), NULL); - // no need to exclude any regions from rippling here + } + // no need to exclude any regions from rippling here - vector cmds; - playlist->rdiff (cmds); - _session->add_commands (cmds); + vector cmds; + playlist->rdiff (cmds); + _session->add_commands (cmds); - _session->add_command (new StatefulDiffCommand (playlist)); + _session->add_command (new StatefulDiffCommand (playlist)); } break; case Cut: if ((what_we_got = playlist->cut (time)) != 0) { _editor.get_cut_buffer().add (what_we_got); - if (Config->get_edit_mode() == Ripple) + if (Config->get_edit_mode() == Ripple) { playlist->ripple(time.start(), -time.length(), NULL); - // no need to exclude any regions from rippling here + } + // no need to exclude any regions from rippling here - vector cmds; - playlist->rdiff (cmds); - _session->add_commands (cmds); + vector cmds; + playlist->rdiff (cmds); + _session->add_commands (cmds); - _session->add_command (new StatefulDiffCommand (playlist)); + _session->add_command (new StatefulDiffCommand (playlist)); } break; case Copy: @@ -1578,14 +1469,15 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) case Clear: if ((what_we_got = playlist->cut (time)) != 0) { - if (Config->get_edit_mode() == Ripple) + if (Config->get_edit_mode() == Ripple) { playlist->ripple(time.start(), -time.length(), NULL); - // no need to exclude any regions from rippling here + } + // no need to exclude any regions from rippling here - vector cmds; - playlist->rdiff (cmds); + vector cmds; + playlist->rdiff (cmds); _session->add_commands (cmds); - _session->add_command (new StatefulDiffCommand (playlist)); + _session->add_command (new StatefulDiffCommand (playlist)); what_we_got->release (); } break; @@ -1593,7 +1485,7 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) } bool -RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx) +RouteTimeAxisView::paste (samplepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num) { if (!is_track()) { return false; @@ -1608,26 +1500,21 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte } ctx.counts.increase_n_playlists(type); - DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("paste to %1\n", pos)); - - if (track()->speed() != 1.0f) { - pos = session_frame_to_track_frame (pos, track()->speed()); - DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("modified paste to %1\n", pos)); - } + DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("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; + std::pair extent = (*p)->get_extent(); + const samplecnt_t duration = extent.second - extent.first; pos += _editor.get_paste_offset(pos, ctx.count, duration); pl->clear_changes (); pl->clear_owned_changes (); if (Config->get_edit_mode() == Ripple) { - std::pair extent = (*p)->get_extent_with_endspace(); - framecnt_t amount = extent.second - extent.first; + std::pair extent = (*p)->get_extent_with_endspace(); + samplecnt_t amount = extent.second - extent.first; pl->ripple(pos, amount * ctx.times, boost::shared_ptr()); } - pl->paste (*p, pos, ctx.times); + pl->paste (*p, pos, ctx.times, sub_num); vector cmds; pl->rdiff (cmds); @@ -1640,9 +1527,9 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte struct PlaylistSorter { - bool operator() (boost::shared_ptr a, boost::shared_ptr b) const { - return a->sort_id() < b->sort_id(); - } + bool operator() (boost::shared_ptr a, boost::shared_ptr b) const { + return a->sort_id() < b->sort_id(); + } }; void @@ -1665,21 +1552,20 @@ RouteTimeAxisView::build_playlist_menu () RadioMenuItem::Group playlist_group; boost::shared_ptr tr = track (); - vector > playlists_tr = _session->playlists->playlists_for_track (tr); - - /* sort the playlists */ - PlaylistSorter cmp; - sort (playlists_tr.begin(), playlists_tr.end(), cmp); + vector > playlists_tr = _session->playlists->playlists_for_track (tr); - /* add the playlists to the menu */ - for (vector >::iterator i = playlists_tr.begin(); i != playlists_tr.end(); ++i) { - playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name())); - RadioMenuItem *item = static_cast(&playlist_items.back()); - item->signal_toggled().connect(sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::use_playlist), item, boost::weak_ptr (*i))); + /* sort the playlists */ + PlaylistSorter cmp; + sort (playlists_tr.begin(), playlists_tr.end(), cmp); - if (tr->playlist()->id() == (*i)->id()) { - item->set_active(); + /* add the playlists to the menu */ + for (vector >::iterator i = playlists_tr.begin(); i != playlists_tr.end(); ++i) { + playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name())); + RadioMenuItem *item = static_cast(&playlist_items.back()); + item->signal_toggled().connect(sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::use_playlist), item, boost::weak_ptr (*i))); + if (tr->playlist()->id() == (*i)->id()) { + item->set_active(); } } @@ -1687,7 +1573,7 @@ RouteTimeAxisView::build_playlist_menu () playlist_items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteTimeAxisView::rename_current_playlist))); playlist_items.push_back (SeparatorElem()); - if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { + if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) { playlist_items.push_back (MenuElem (_("New..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::new_playlists), this))); playlist_items.push_back (MenuElem (_("New Copy..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::copy_playlists), this))); @@ -1710,10 +1596,10 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr { assert (is_track()); - // exit if we were triggered by deactivating the old playlist - if (!item->get_active()) { - return; - } + // exit if we were triggered by deactivating the old playlist + if (!item->get_active()) { + return; + } boost::shared_ptr pl (wpl.lock()); @@ -1727,11 +1613,11 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr return; } - track()->use_playlist (pl); + track()->use_playlist (track()->data_type(), pl); RouteGroup* rg = route_group(); - if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { + if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) { std::string group_string = "." + rg->name() + "."; std::string take_name = pl->name(); @@ -1764,10 +1650,10 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr boost::shared_ptr ipl = session()->playlists->by_name(playlist_name); if (!ipl) { // No playlist for this track for this take yet, make it - track->use_new_playlist(); + track->use_default_new_playlist(); track->playlist()->set_name(playlist_name); } else { - track->use_playlist(ipl); + track->use_playlist(track->data_type(), ipl); } } } @@ -1777,7 +1663,7 @@ void RouteTimeAxisView::update_playlist_tip () { RouteGroup* rg = route_group (); - if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { + if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) { string group_string = "." + rg->name() + "."; string take_name = track()->playlist()->name(); @@ -1875,76 +1761,6 @@ RouteTimeAxisView::toggle_automation_track (const Evoral::Parameter& param) } } -void -RouteTimeAxisView::automation_track_hidden (Evoral::Parameter param) -{ - boost::shared_ptr track = automation_child (param); - - if (!track) { - return; - } - - Gtk::CheckMenuItem* menu = automation_child_menu_item (param); - - if (menu && !_hidden) { - ignore_toggle = true; - menu->set_active (false); - ignore_toggle = false; - } - - if (_route && !no_redraw) { - request_redraw (); - } -} - -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_trim_track_visibility () -{ - bool const showit = trim_automation_item->get_active(); - - if (showit != string_is_affirmative (trim_track->gui_property ("visible"))) { - trim_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 () { @@ -2026,18 +1842,7 @@ RouteTimeAxisView::show_all_automation (bool apply_to_selection) } else { no_redraw = true; - /* Show our automation */ - - for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { - i->second->set_marked_for_display (true); - - Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first); - - if (menu) { - menu->set_active(true); - } - } - + StripableTimeAxisView::show_all_automation (); /* Show processor automation */ @@ -2067,21 +1872,9 @@ RouteTimeAxisView::show_existing_automation (bool apply_to_selection) } else { no_redraw = true; - /* Show our automation */ - - for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { - if (i->second->has_automation()) { - i->second->set_marked_for_display (true); - - Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first); - if (menu) { - menu->set_active(true); - } - } - } + StripableTimeAxisView::show_existing_automation (); /* Show processor automation */ - for (list::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) { for (vector::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) { if ((*i)->processor->control((*ii)->what)->list()->size() > 0) { @@ -2091,7 +1884,6 @@ RouteTimeAxisView::show_existing_automation (bool apply_to_selection) } no_redraw = false; - request_redraw (); } } @@ -2103,21 +1895,9 @@ RouteTimeAxisView::hide_all_automation (bool apply_to_selection) _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::hide_all_automation, _1, false)); } else { no_redraw = true; - - /* Hide our automation */ - - for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { - i->second->set_marked_for_display (false); - - Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first); - - if (menu) { - menu->set_active (false); - } - } + StripableTimeAxisView::hide_all_automation (); /* Hide processor automation */ - for (list::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) { for (vector::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) { (*ii)->menu_item->set_active (false); @@ -2129,7 +1909,6 @@ RouteTimeAxisView::hide_all_automation (bool apply_to_selection) } } - void RouteTimeAxisView::region_view_added (RegionView* rv) { @@ -2194,10 +1973,10 @@ RouteTimeAxisView::add_processor_automation_curve (boost::shared_ptr ProcessorAutomationNode* pan; if ((pan = find_processor_automation_node (processor, what)) == 0) { - /* session state may never have been saved with new plugin */ - error << _("programming error: ") + /* session state may never have been saved with new plugin */ + error << _("programming error: ") << string_compose (X_("processor automation curve for %1:%2/%3/%4 not registered with track!"), - processor->name(), what.type(), (int) what.channel(), what.id() ) + processor->name(), what.type(), (int) what.channel(), what.id() ) << endmsg; abort(); /*NOTREACHED*/ return; @@ -2263,41 +2042,6 @@ RouteTimeAxisView::add_existing_processor_automation_curves (boost::weak_ptr track, bool show) -{ - using namespace Menu_Helpers; - - add_child (track); - - track->Hiding.connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::automation_track_hidden), param)); - - _automation_tracks[param] = track; - - /* existing state overrides "show" argument */ - string s = track->gui_property ("visible"); - if (!s.empty()) { - show = string_is_affirmative (s); - } - - /* this might or might not change the visibility status, so don't rely on it */ - track->set_marked_for_display (show); - - if (show && !no_redraw) { - request_redraw (); - } - - 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 - lane, then we need to invalidate the display menu. - */ - delete display_menu; - display_menu = 0; - } -} - void RouteTimeAxisView::add_processor_to_subplugin_menu (boost::weak_ptr p) { @@ -2424,9 +2168,43 @@ RouteTimeAxisView::processor_menu_item_toggled (RouteTimeAxisView::ProcessorAuto } } +void +RouteTimeAxisView::reread_midnam () +{ + boost::shared_ptr pi = boost::dynamic_pointer_cast (_route->the_instrument ()); + assert (pi); + bool rv = pi->plugin ()->read_midnam(); + + if (rv && patch_change_dialog ()) { + patch_change_dialog ()->refresh (); + } +} + +void +RouteTimeAxisView::drop_instrument_ref () +{ + midnam_connection.drop_connections (); +} + void RouteTimeAxisView::processors_changed (RouteProcessorChange c) { + if (_route) { + boost::shared_ptr the_instrument (_route->the_instrument()); + boost::shared_ptr pi = boost::dynamic_pointer_cast (the_instrument); + if (pi && pi->plugin ()->has_midnam ()) { + midnam_connection.drop_connections (); + the_instrument->DropReferences.connect (midnam_connection, invalidator (*this), + boost::bind (&RouteTimeAxisView::drop_instrument_ref, this), + gui_context()); + pi->plugin()->UpdateMidnam.connect (midnam_connection, invalidator (*this), + boost::bind (&RouteTimeAxisView::reread_midnam, this), + gui_context()); + + reread_midnam (); + } + } + if (c.type == RouteProcessorChange::MeterPointChange) { /* nothing to do if only the meter point has changed */ return; @@ -2520,7 +2298,7 @@ RouteTimeAxisView::set_layer_display (LayerDisplay d, bool apply_to_selection) _view->set_layer_display (d); } - set_gui_property (X_("layer-display"), enum_2_string (d)); + set_gui_property (X_("layer-display"), d); } } @@ -2535,19 +2313,6 @@ RouteTimeAxisView::layer_display () const return Overlaid; } - - -boost::shared_ptr -RouteTimeAxisView::automation_child(Evoral::Parameter param) -{ - AutomationTracks::iterator i = _automation_tracks.find(param); - if (i != _automation_tracks.end()) { - return i->second; - } else { - return boost::shared_ptr(); - } -} - void RouteTimeAxisView::fast_update () { @@ -2650,7 +2415,7 @@ RouteTimeAxisView::set_underlay_state() if (prop) { PBD::ID id (prop->value()); - RouteTimeAxisView* v = _editor.get_route_view_by_route_id (id); + StripableTimeAxisView* v = _editor.get_stripable_time_axis_by_id (id); if (v) { add_underlay(v->view(), false); @@ -2753,12 +2518,12 @@ RouteTimeAxisView::set_button_names () Gtk::CheckMenuItem* RouteTimeAxisView::automation_child_menu_item (Evoral::Parameter param) { - ParameterMenuMap::iterator i = _main_automation_menu_map.find (param); - if (i != _main_automation_menu_map.end()) { - return i->second; + Gtk::CheckMenuItem* rv = StripableTimeAxisView::automation_child_menu_item (param); + if (rv) { + return rv; } - i = _subplugin_menu_map.find (param); + ParameterMenuMap::iterator i = _subplugin_menu_map.find (param); if (i != _subplugin_menu_map.end()) { return i->second; } @@ -2929,18 +2694,6 @@ RouteTimeAxisView::remove_child (boost::shared_ptr c) } } -PresentationInfo const & -RouteTimeAxisView::presentation_info () const -{ - return _route->presentation_info(); -} - -boost::shared_ptr -RouteTimeAxisView::stripable () const -{ - return _route; -} - Gdk::Color RouteTimeAxisView::color () const {