X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_time_axis.cc;h=9ec6048de53ba2044643e826826c6e1fb66b0bd5;hb=265e26c2db45314ebaaa4801a9cc0101697fbe8f;hp=cee28fc5c1018d179d786f55a68cc6d092898fba;hpb=cf77196698a395e4174037f36f755b401de679f3;p=ardour.git diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index cee28fc5c1..9ec6048de5 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -110,9 +109,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh , button_table (3, 3) , route_group_button (_("g")) , playlist_button (_("p")) - , size_button (_("h")) , automation_button (_("a")) - , visual_button (_("v")) , gm (sess, slider, true, 115) , _ignore_track_mode_change (false) { @@ -133,7 +130,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh } mute_changed (0); - solo_changed (0); + update_solo_display (); timestretch_rect = 0; no_redraw = false; @@ -146,26 +143,14 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh route_group_button.set_name ("TrackGroupButton"); playlist_button.set_name ("TrackPlaylistButton"); automation_button.set_name ("TrackAutomationButton"); - size_button.set_name ("TrackSizeButton"); - visual_button.set_name ("TrackVisualButton"); - hide_button.set_name ("TrackRemoveButton"); route_group_button.unset_flags (Gtk::CAN_FOCUS); playlist_button.unset_flags (Gtk::CAN_FOCUS); automation_button.unset_flags (Gtk::CAN_FOCUS); - size_button.unset_flags (Gtk::CAN_FOCUS); - visual_button.unset_flags (Gtk::CAN_FOCUS); - hide_button.unset_flags (Gtk::CAN_FOCUS); - - hide_button.add (*(manage (new Image (::get_icon("hide"))))); - hide_button.show_all (); route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::edit_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)); - size_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::size_click), false); - visual_button.signal_clicked().connect (sigc::mem_fun(*this, &RouteTimeAxisView::visual_click)); - hide_button.signal_clicked().connect (sigc::mem_fun(*this, &RouteTimeAxisView::hide_click)); if (is_track()) { @@ -207,27 +192,12 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh 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")); - ARDOUR_UI::instance()->set_tip(size_button,_("Display Height")); ARDOUR_UI::instance()->set_tip(playlist_button,_("Playlist")); ARDOUR_UI::instance()->set_tip(automation_button, _("Automation")); - ARDOUR_UI::instance()->set_tip(visual_button, _("Visual options")); - ARDOUR_UI::instance()->set_tip(hide_button, _("Hide this track")); label_view (); - if (0) { - - /* old school - when we used to put an extra row of buttons in place */ - - controls_table.attach (hide_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); - controls_table.attach (visual_button, 1, 2, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); - controls_table.attach (size_button, 2, 3, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); - controls_table.attach (automation_button, 3, 4, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); - - } else { - - controls_table.attach (automation_button, 6, 7, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); - } + controls_table.attach (automation_button, 6, 7, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); if (is_track() && track()->mode() == ARDOUR::Normal) { controls_table.attach (playlist_button, 5, 6, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); @@ -242,8 +212,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh track()->TrackModeChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::track_mode_changed, this), gui_context()); track()->FreezeChange.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::map_frozen, this), gui_context()); - track()->DiskstreamChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::diskstream_changed, this), gui_context()); - get_diskstream()->SpeedChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::speed_changed, this), gui_context()); + track()->SpeedChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::speed_changed, this), gui_context()); /* pick up the correct freeze state */ map_frozen (); @@ -283,10 +252,6 @@ RouteTimeAxisView::~RouteTimeAxisView () delete _view; _view = 0; - for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { - delete i->second; - } - _automation_tracks.clear (); delete route_group_menu; @@ -426,6 +391,12 @@ RouteTimeAxisView::build_automation_action_menu () { using namespace Menu_Helpers; + /* detach subplugin_menu from automation_action_menu before we delete automation_action_menu, + otherwise bad things happen (see comment for similar case in MidiTimeAxisView::build_automation_action_menu) + */ + + detach_menu (subplugin_menu); + delete automation_action_menu; automation_action_menu = new Menu; @@ -441,11 +412,13 @@ RouteTimeAxisView::build_automation_action_menu () items.push_back (MenuElem (_("Hide All Automation"), sigc::mem_fun(*this, &RouteTimeAxisView::hide_all_automation))); + + items.push_back (SeparatorElem ()); - /* attach the plugin submenu. It may have previously been used elsewhere, so we detach it first. */ + /* Attach the plugin submenu. It may have previously been used elsewhere, + so it was detached above */ - detach_menu (subplugin_menu); - items.push_back (MenuElem (_("Plugins"), subplugin_menu)); + items.push_back (MenuElem (_("Plugins"), subplugin_menu)); items.back().set_sensitive (!subplugin_menu.items().empty()); } @@ -454,10 +427,6 @@ RouteTimeAxisView::build_display_menu () { using namespace Menu_Helpers; - /* get the size menu ready */ - - build_size_menu (); - /* prepare it */ TimeAxisView::build_display_menu (); @@ -467,7 +436,6 @@ RouteTimeAxisView::build_display_menu () MenuList& items = display_menu->items(); display_menu->set_name ("ArdourContextMenu"); - items.push_back (MenuElem (_("Height"), *size_menu)); items.push_back (MenuElem (_("Color"), sigc::mem_fun(*this, &RouteTimeAxisView::select_track_color))); items.push_back (SeparatorElem()); @@ -509,19 +477,21 @@ RouteTimeAxisView::build_display_menu () alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material"), sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_style), ExistingMaterial))); align_existing_item = dynamic_cast(&alignment_items.back()); - if (get_diskstream()->alignment_style() == ExistingMaterial) + if (track()->alignment_style() == ExistingMaterial) { align_existing_item->set_active(); + } alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time"), sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_style), CaptureTime))); align_capture_item = dynamic_cast(&alignment_items.back()); - if (get_diskstream()->alignment_style() == CaptureTime) + if (track()->alignment_style() == CaptureTime) { align_capture_item->set_active(); + } if (!Profile->get_sae()) { items.push_back (MenuElem (_("Alignment"), *alignment_menu)); - get_diskstream()->AlignmentStyleChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteTimeAxisView::align_style_changed, this), gui_context()); + track()->AlignmentStyleChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteTimeAxisView::align_style_changed, this), gui_context()); RadioMenuItem::Group mode_group; items.push_back (RadioMenuElem (mode_group, _("Normal Mode"), sigc::bind ( @@ -556,7 +526,7 @@ RouteTimeAxisView::build_display_menu () _ignore_track_mode_change = false; } - get_diskstream()->AlignmentStyleChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteTimeAxisView::align_style_changed, this), gui_context()); + track()->AlignmentStyleChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteTimeAxisView::align_style_changed, this), gui_context()); color_mode_menu = build_color_mode_menu(); if (color_mode_menu) { @@ -571,7 +541,7 @@ RouteTimeAxisView::build_display_menu () route_active_menu_item->set_active (_route->active()); items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Hide"), sigc::mem_fun(*this, &RouteTimeAxisView::hide_click))); + items.push_back (MenuElem (_("Hide"), sigc::bind (sigc::mem_fun(_editor, &PublicEditor::hide_track_in_display), this, false))); if (!Profile->get_sae()) { items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &RouteUI::remove_this_route))); } else { @@ -789,7 +759,7 @@ RouteTimeAxisView::set_height (uint32_t h) snprintf (buf, sizeof (buf), "%u", height); xml_node->add_property ("height", buf); - if (height >= hNormal) { + if (height >= preset_height (HeightNormal)) { reset_meter(); show_name_entry (); hide_name_label (); @@ -805,16 +775,13 @@ RouteTimeAxisView::set_height (uint32_t h) rec_enable_button->show(); route_group_button.show(); - hide_button.show(); - visual_button.show(); - size_button.show(); automation_button.show(); if (is_track() && track()->mode() == ARDOUR::Normal) { playlist_button.show(); } - } else if (height >= hSmaller) { + } else if (height >= preset_height (HeightSmaller)) { reset_meter(); show_name_entry (); @@ -831,9 +798,6 @@ RouteTimeAxisView::set_height (uint32_t h) rec_enable_button->show(); route_group_button.hide (); - hide_button.hide (); - visual_button.hide (); - size_button.hide (); automation_button.hide (); if (is_track() && track()->mode() == ARDOUR::Normal) { @@ -864,9 +828,6 @@ RouteTimeAxisView::set_height (uint32_t h) rec_enable_button->hide(); route_group_button.hide (); - hide_button.hide (); - visual_button.hide (); - size_button.hide (); automation_button.hide (); playlist_button.hide (); name_label.set_text (_route->name()); @@ -900,8 +861,8 @@ RouteTimeAxisView::set_samples_per_unit (double spu) { double speed = 1.0; - if (get_diskstream() != 0) { - speed = get_diskstream()->speed(); + if (track()) { + speed = track()->speed(); } if (_view) { @@ -914,7 +875,7 @@ RouteTimeAxisView::set_samples_per_unit (double spu) void RouteTimeAxisView::align_style_changed () { - switch (get_diskstream()->alignment_style()) { + switch (track()->alignment_style()) { case ExistingMaterial: if (!align_existing_item->get_active()) { align_existing_item->set_active(); @@ -947,7 +908,7 @@ RouteTimeAxisView::set_align_style (AlignStyle style) } if (item->get_active()) { - get_diskstream()->set_align_style (style); + track()->set_align_style (style); } } @@ -957,15 +918,18 @@ RouteTimeAxisView::rename_current_playlist () ArdourPrompter prompter (true); string name; - boost::shared_ptr ds = get_diskstream(); - if (!ds || ds->destructive()) + boost::shared_ptr tr = track(); + if (!tr || tr->destructive()) { return; + } - boost::shared_ptr pl = ds->playlist(); - if (!pl) + boost::shared_ptr pl = tr->playlist(); + if (!pl) { return; + } - prompter.set_prompt (_("Name for 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_response_sensitive (Gtk::RESPONSE_ACCEPT, false); @@ -1023,13 +987,15 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vector ds = get_diskstream(); - if (!ds || ds->destructive()) + boost::shared_ptr tr = track (); + if (!tr || tr->destructive()) { return; + } - boost::shared_ptr pl = ds->playlist(); - if (!pl) + boost::shared_ptr pl = tr->playlist(); + if (!pl) { return; + } name = pl->name(); @@ -1048,7 +1014,8 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vectoruse_copy_playlist (); - ds->playlist()->set_name (name); + tr->use_copy_playlist (); + tr->playlist()->set_name (name); } } @@ -1075,13 +1042,15 @@ RouteTimeAxisView::use_new_playlist (bool prompt, vector ds = get_diskstream(); - if (!ds || ds->destructive()) + boost::shared_ptr tr = track (); + if (!tr || tr->destructive()) { return; + } - boost::shared_ptr pl = ds->playlist(); - if (!pl) + boost::shared_ptr pl = tr->playlist(); + if (!pl) { return; + } name = pl->name(); @@ -1098,7 +1067,8 @@ RouteTimeAxisView::use_new_playlist (bool prompt, vectoruse_new_playlist (); - ds->playlist()->set_name (name); + tr->use_new_playlist (); + tr->playlist()->set_name (name); } } void RouteTimeAxisView::clear_playlist () { - boost::shared_ptr ds = get_diskstream(); - if (!ds || ds->destructive()) + boost::shared_ptr tr = track (); + if (!tr || tr->destructive()) { return; + } - boost::shared_ptr pl = ds->playlist(); - if (!pl) + boost::shared_ptr pl = tr->playlist(); + if (!pl) { return; + } _editor.clear_playlist (pl); } @@ -1139,17 +1111,12 @@ RouteTimeAxisView::speed_changed () Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&RouteTimeAxisView::reset_samples_per_unit, this)); } -void -RouteTimeAxisView::diskstream_changed () -{ - Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&RouteTimeAxisView::update_diskstream_display, this)); -} - void RouteTimeAxisView::update_diskstream_display () { - if (!get_diskstream()) // bus + if (!track()) { return; + } map_frozen (); } @@ -1212,8 +1179,8 @@ RouteTimeAxisView::get_selectables (nframes_t start, nframes_t end, double top, { double speed = 1.0; - if (get_diskstream() != 0) { - speed = get_diskstream()->speed(); + if (track() != 0) { + speed = track()->speed(); } nframes_t start_adjusted = session_frame_to_track_frame(start, speed); @@ -1248,34 +1215,6 @@ RouteTimeAxisView::get_inverted_selectables (Selection& sel, list& return; } -bool -RouteTimeAxisView::show_automation(Evoral::Parameter param) -{ - return (_show_automation.find(param) != _show_automation.end()); -} - -/** Retuns 0 if track for \a param doesn't exist. - */ -RouteTimeAxisView::RouteAutomationNode* -RouteTimeAxisView::automation_track (Evoral::Parameter param) -{ - map::iterator i = _automation_tracks.find (param); - - if (i != _automation_tracks.end()) { - return i->second; - } else { - return 0; - } -} - -/** Shorthand for GainAutomation, etc. - */ -RouteTimeAxisView::RouteAutomationNode* -RouteTimeAxisView::automation_track (AutomationType type) -{ - return automation_track (Evoral::Parameter(type)); -} - RouteGroup* RouteTimeAxisView::route_group () const { @@ -1291,10 +1230,10 @@ RouteTimeAxisView::name() const boost::shared_ptr RouteTimeAxisView::playlist () const { - boost::shared_ptr ds; + boost::shared_ptr tr; - if ((ds = get_diskstream()) != 0) { - return ds->playlist(); + if ((tr = track()) != 0) { + return tr->playlist(); } else { return boost::shared_ptr (); } @@ -1329,31 +1268,13 @@ RouteTimeAxisView::name_entry_changed () } } -void -RouteTimeAxisView::visual_click () -{ - popup_display_menu (0); -} - -void -RouteTimeAxisView::hide_click () -{ - // LAME fix for hide_button refresh fix - hide_button.set_sensitive(false); - - _editor.hide_track_in_display (*this); - - hide_button.set_sensitive(true); -} - boost::shared_ptr RouteTimeAxisView::find_next_region (nframes_t pos, RegionPoint point, int32_t dir) { - boost::shared_ptr stream; - boost::shared_ptr playlist; + boost::shared_ptr pl = playlist (); - if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) { - return playlist->find_next_region (pos, point, dir); + if (pl) { + return pl->find_next_region (pos, point, dir); } return boost::shared_ptr (); @@ -1362,11 +1283,10 @@ RouteTimeAxisView::find_next_region (nframes_t pos, RegionPoint point, int32_t d nframes64_t RouteTimeAxisView::find_next_region_boundary (nframes64_t pos, int32_t dir) { - boost::shared_ptr stream; - boost::shared_ptr playlist; + boost::shared_ptr pl = playlist (); - if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) { - return playlist->find_next_region_boundary (pos, dir); + if (pl) { + return pl->find_next_region_boundary (pos, dir); } return -1; @@ -1376,19 +1296,19 @@ bool RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) { boost::shared_ptr what_we_got; - boost::shared_ptr ds = get_diskstream(); + boost::shared_ptr tr = track (); boost::shared_ptr playlist; bool ret = false; - if (ds == 0) { + if (tr == 0) { /* route is a bus, not a track */ return false; } - playlist = ds->playlist(); + playlist = tr->playlist(); TimeSelection time (selection.time); - float speed = ds->speed(); + 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); @@ -1447,7 +1367,7 @@ RouteTimeAxisView::paste (nframes_t pos, float times, Selection& selection, size return false; } - boost::shared_ptr playlist = get_diskstream()->playlist(); + boost::shared_ptr pl = playlist (); PlaylistSelection::iterator p; for (p = selection.playlists.begin(); p != selection.playlists.end() && nth; ++p, --nth) {} @@ -1456,13 +1376,13 @@ RouteTimeAxisView::paste (nframes_t pos, float times, Selection& selection, size return false; } - if (get_diskstream()->speed() != 1.0f) { - pos = session_frame_to_track_frame(pos, get_diskstream()->speed() ); + if (track()->speed() != 1.0f) { + pos = session_frame_to_track_frame (pos, track()->speed()); } - playlist->clear_history (); - playlist->paste (*p, pos, times); - _session->add_command (new StatefulDiffCommand (playlist)); + pl->clear_history (); + pl->paste (*p, pos, times); + _session->add_command (new StatefulDiffCommand (pl)); return true; } @@ -1504,42 +1424,42 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu) delete playlist_menu; - vector > playlists, playlists_ds; - boost::shared_ptr ds = get_diskstream(); + vector > playlists, playlists_tr; + boost::shared_ptr tr = track(); RadioMenuItem::Group playlist_group; _session->playlists->get (playlists); /* find the playlists for this diskstream */ for (vector >::iterator i = playlists.begin(); i != playlists.end(); ++i) { - if (((*i)->get_orig_diskstream_id() == ds->id()) || (ds->playlist()->id() == (*i)->id())) { - playlists_ds.push_back(*i); + if (((*i)->get_orig_diskstream_id() == tr->diskstream_id()) || (tr->playlist()->id() == (*i)->id())) { + playlists_tr.push_back(*i); } } /* sort the playlists */ PlaylistSorter cmp; - sort(playlists_ds.begin(), playlists_ds.end(), cmp); + sort (playlists_tr.begin(), playlists_tr.end(), cmp); /* add the playlists to the menu */ - for (vector >::iterator i = playlists_ds.begin(); i != playlists_ds.end(); ++i) { + 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 (ds->playlist()->id() == (*i)->id()) { + if (tr->playlist()->id() == (*i)->id()) { item->set_active(); } } playlist_items.push_back (SeparatorElem()); - playlist_items.push_back (MenuElem (_("Rename"), sigc::mem_fun(*this, &RouteTimeAxisView::rename_current_playlist))); + 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()) { - 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))); + 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))); } else { // Use a label which tells the user what is happening @@ -1552,7 +1472,7 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu) playlist_items.push_back (MenuElem (_("Clear Current"), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::clear_playlists), this))); playlist_items.push_back (SeparatorElem()); - playlist_items.push_back (MenuElem(_("Select from all ..."), sigc::mem_fun(*this, &RouteTimeAxisView::show_playlist_selector))); + playlist_items.push_back (MenuElem(_("Select from all..."), sigc::mem_fun(*this, &RouteTimeAxisView::show_playlist_selector))); } void @@ -1574,13 +1494,12 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr boost::shared_ptr apl = boost::dynamic_pointer_cast (pl); if (apl) { - if (get_diskstream()->playlist() == apl) { + if (track()->playlist() == apl) { // exit when use_playlist is called by the creation of the playlist menu // or the playlist choice is unchanged return; } - get_diskstream()->use_playlist (apl); - + track()->use_playlist (apl); if (route_group() && route_group()->is_active()) { std::string group_string = "."+route_group()->name()+"."; @@ -1611,10 +1530,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->diskstream()->use_new_playlist(); - track->diskstream()->playlist()->set_name(playlist_name); + track->use_new_playlist(); + track->playlist()->set_name(playlist_name); } else { - track->diskstream()->use_playlist(ipl); + track->use_playlist(ipl); } } } @@ -1669,14 +1588,16 @@ RouteTimeAxisView::color_handler () void RouteTimeAxisView::toggle_automation_track (const Evoral::Parameter& param) { - RouteAutomationNode* node = automation_track(param); + boost::shared_ptr track = automation_child (param); + Gtk::CheckMenuItem* menu = automation_child_menu_item (param); - if (!node) { + if (!track) { /* it doesn't exist yet, so we don't care about the button state: just add it */ create_automation_child (param, true); } else { - bool yn = node->menu_item->get_active(); - if (node->track->set_visibility (node->menu_item->get_active()) && yn) { + assert (menu); + bool yn = menu->get_active(); + if (track->set_visibility (menu->get_active()) && yn) { /* we made it visible, now trigger a redisplay. if it was hidden, then automation_track_hidden() will have done that for us. @@ -1692,19 +1613,20 @@ RouteTimeAxisView::toggle_automation_track (const Evoral::Parameter& param) void RouteTimeAxisView::automation_track_hidden (Evoral::Parameter param) { - RouteAutomationNode* ran = automation_track(param); + boost::shared_ptr track = automation_child (param); - if (!ran) { + if (!track) { return; } + Gtk::CheckMenuItem* menu = automation_child_menu_item (param); + // if Evoral::Parameter::operator< doesn't obey strict weak ordering, we may crash here.... - _show_automation.erase (param); - ran->track->get_state_node()->add_property (X_("shown"), X_("no")); + track->get_state_node()->add_property (X_("shown"), X_("no")); - if (ran->menu_item && !_hidden) { + if (menu && !_hidden) { ignore_toggle = true; - ran->menu_item->set_active (false); + menu->set_active (false); ignore_toggle = false; } @@ -1721,13 +1643,15 @@ RouteTimeAxisView::show_all_automation () /* Show our automation */ - map::iterator i; - for (i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { - i->second->track->set_marked_for_display (true); - i->second->track->canvas_display()->show(); - i->second->track->get_state_node()->add_property ("shown", X_("yes")); - if (i->second->menu_item) { - i->second->menu_item->set_active(true); + for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { + i->second->set_marked_for_display (true); + i->second->canvas_display()->show(); + i->second->get_state_node()->add_property ("shown", X_("yes")); + + Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first); + + if (menu) { + menu->set_active(true); } } @@ -1758,13 +1682,15 @@ RouteTimeAxisView::show_existing_automation () /* Show our automation */ - map::iterator i; - for (i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { - if (i->second->track->line() && i->second->track->line()->npoints() > 0) { - i->second->track->set_marked_for_display (true); - i->second->track->canvas_display()->show(); - i->second->track->get_state_node()->add_property ("shown", X_("yes")); - i->second->menu_item->set_active(true); + for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { + if (i->second->has_automation()) { + i->second->set_marked_for_display (true); + i->second->canvas_display()->show(); + i->second->get_state_node()->add_property ("shown", X_("yes")); + + Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first); + assert (menu); + menu->set_active(true); } } @@ -1791,12 +1717,15 @@ RouteTimeAxisView::hide_all_automation () /* Hide our automation */ - for (map::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { - i->second->track->set_marked_for_display (false); - i->second->track->hide (); - i->second->track->get_state_node()->add_property ("shown", X_("no")); - if (i->second->menu_item) { - i->second->menu_item->set_active (false); + for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) { + i->second->set_marked_for_display (false); + i->second->hide (); + i->second->get_state_node()->add_property ("shown", X_("no")); + + Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first); + + if (menu) { + menu->set_active (false); } } @@ -1808,8 +1737,6 @@ RouteTimeAxisView::hide_all_automation () } } - _show_automation.clear(); - no_redraw = false; _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */ } @@ -2003,14 +1930,10 @@ RouteTimeAxisView::add_automation_child (Evoral::Parameter param, boost::shared_ } } - _automation_tracks.insert (std::make_pair (param, new RouteAutomationNode(param, NULL, track))); + _automation_tracks[param] = track; track->set_visibility (!hideit); - if (!hideit) { - _show_automation.insert (param); - } - if (!no_redraw) { _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */ } @@ -2085,6 +2008,8 @@ RouteTimeAxisView::add_processor_to_subplugin_menu (boost::weak_ptr p items.push_back (CheckMenuElem (name)); mitem = dynamic_cast (&items.back()); + _parameter_menu_map[*i] = mitem; + if (has_visible_automation.find((*i)) != has_visible_automation.end()) { mitem->set_active(true); } @@ -2252,7 +2177,7 @@ RouteTimeAxisView::automation_child(Evoral::Parameter param) { AutomationTracks::iterator i = _automation_tracks.find(param); if (i != _automation_tracks.end()) { - return i->second->track; + return i->second; } else { return boost::shared_ptr(); } @@ -2444,3 +2369,14 @@ RouteTimeAxisView::set_button_names () } mute_button_label.set_text (_("m")); } + +Gtk::CheckMenuItem* +RouteTimeAxisView::automation_child_menu_item (Evoral::Parameter param) +{ + ParameterMenuMap::iterator i = _parameter_menu_map.find (param); + if (i == _parameter_menu_map.end()) { + return 0; + } + + return i->second; +}