, playlist_button (_("p"))
, automation_button (_("a"))
, gm (sess, slider, true, 115)
- , _ignore_track_mode_change (false)
{
gm.set_controls (_route, _route->shared_peak_meter(), _route->amp());
gm.get_level_meter().set_no_show_all();
timestretch_rect = 0;
no_redraw = false;
- destructive_track_mode_item = 0;
- normal_track_mode_item = 0;
- non_layered_track_mode_item = 0;
ignore_toggle = false;
if (is_track()) {
- 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()->SpeedChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::speed_changed, this), gui_context());
plist->add (ARDOUR::Properties::solo, true);
route_group_menu = new RouteGroupMenu (_session, plist);
- route_group_menu->GroupSelected.connect (sigc::mem_fun (*this, &RouteTimeAxisView::set_route_group_from_menu));
gm.get_gain_slider().signal_scroll_event().connect(sigc::mem_fun(*this, &RouteTimeAxisView::controls_ebox_scroll), false);
gm.get_gain_slider().set_name ("TrackGainFader");
+
+ show_name_entry ();
+ hide_name_label ();
}
RouteTimeAxisView::~RouteTimeAxisView ()
return false;
}
- route_group_menu->build (_route->route_group ());
+ WeakRouteList r;
+ r.push_back (route ());
+
+ route_group_menu->build (r);
route_group_menu->menu()->popup (ev->button, ev->time);
return false;
}
-void
-RouteTimeAxisView::set_route_group_from_menu (RouteGroup *eg)
-{
- if (eg) {
- eg->add (_route);
- } else {
- if (_route->route_group()) {
- _route->route_group()->remove (_route);
- }
- }
-}
-
void
RouteTimeAxisView::playlist_changed ()
{
RouteTimeAxisView::automation_click ()
{
conditionally_add_to_selection ();
- build_automation_action_menu ();
+ build_automation_action_menu (false);
automation_action_menu->popup (1, gtk_get_current_event_time());
}
}
void
-RouteTimeAxisView::build_automation_action_menu ()
+RouteTimeAxisView::build_automation_action_menu (bool for_selection)
{
using namespace Menu_Helpers;
automation_action_menu->set_name ("ArdourContextMenu");
items.push_back (MenuElem (_("Show All Automation"),
- sigc::mem_fun(*this, &RouteTimeAxisView::show_all_automation)));
+ sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection)));
items.push_back (MenuElem (_("Show Existing Automation"),
- sigc::mem_fun(*this, &RouteTimeAxisView::show_existing_automation)));
+ sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection)));
items.push_back (MenuElem (_("Hide All Automation"),
- sigc::mem_fun(*this, &RouteTimeAxisView::hide_all_automation)));
+ sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection)));
items.push_back (SeparatorElem ());
so it was detached above */
items.push_back (MenuElem (_("Plugins"), subplugin_menu));
- items.back().set_sensitive (!subplugin_menu.items().empty());
+ items.back().set_sensitive (!subplugin_menu.items().empty() && (!for_selection || _editor.get_selection().tracks.size() == 1));;
}
void
int existing = 0;
int capture = 0;
+ int automatic = 0;
+ int styles = 0;
+ boost::shared_ptr<Track> first_track;
+
TrackSelection const & s = _editor.get_selection().tracks;
for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
- if (!r) {
+ if (!r || !r->is_track ()) {
continue;
}
-
- switch (r->track()->alignment_style()) {
- case ExistingMaterial:
- ++existing;
- break;
- case CaptureTime:
- ++capture;
- break;
- }
+
+ if (!first_track) {
+ first_track = r->track();
+ }
+
+ switch (r->track()->alignment_choice()) {
+ case Automatic:
+ ++automatic;
+ styles |= 0x1;
+ switch (r->track()->alignment_style()) {
+ case ExistingMaterial:
+ ++existing;
+ break;
+ case CaptureTime:
+ ++capture;
+ break;
+ }
+ break;
+ case UseExistingMaterial:
+ ++existing;
+ styles |= 0x2;
+ break;
+ case UseCaptureTime:
+ ++capture;
+ styles |= 0x4;
+ break;
+ }
}
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material")));
- RadioMenuItem* i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_style), ExistingMaterial, true));
- i->set_active (existing != 0 && capture == 0);
- i->set_inconsistent (existing != 0 && capture != 0);
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time")));
- i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_style), CaptureTime, true));
- i->set_active (existing == 0 && capture != 0);
- i->set_inconsistent (existing != 0 && capture != 0);
-
- items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+
+ bool inconsistent;
+ switch (styles) {
+ case 1:
+ case 2:
+ case 4:
+ inconsistent = false;
+ break;
+ default:
+ inconsistent = true;
+ break;
+ }
+
+ RadioMenuItem* i;
+
+ if (!inconsistent && first_track) {
+
+ alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (automatic != 0 && existing == 0 && capture == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, Automatic, true));
+
+ switch (first_track->alignment_choice()) {
+ case Automatic:
+ switch (first_track->alignment_style()) {
+ case ExistingMaterial:
+ alignment_items.push_back (MenuElem (_("(Currently: Existing Material)")));
+ break;
+ case CaptureTime:
+ alignment_items.push_back (MenuElem (_("(Currently: Capture Time)")));
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (existing != 0 && capture == 0 && automatic == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true));
+
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (existing == 0 && capture != 0 && automatic == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true));
+
+ items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+
+ } else {
+ /* show nothing */
+ }
Menu* mode_menu = manage (new Menu);
MenuList& mode_items = mode_menu->items ();
RadioMenuItem::Group mode_group;
- mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode"), sigc::bind (
- sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode),
- ARDOUR::Normal)));
- normal_track_mode_item = dynamic_cast<RadioMenuItem*>(&mode_items.back());
+ int normal = 0;
+ int tape = 0;
+ int non_layered = 0;
- mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode"), sigc::bind (
- sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode),
- ARDOUR::Destructive)));
- destructive_track_mode_item = dynamic_cast<RadioMenuItem*>(&mode_items.back());
+ for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
+ RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
+ 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, _("Non-Layered Mode"),
- sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered)));
- non_layered_track_mode_item = dynamic_cast<RadioMenuItem*>(&mode_items.back());
+ mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&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<RadioMenuItem*> (&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));
- _ignore_track_mode_change = true;
-
- switch (track()->mode()) {
- case ARDOUR::Destructive:
- destructive_track_mode_item->set_active ();
- break;
- case ARDOUR::Normal:
- normal_track_mode_item->set_active ();
- break;
- case ARDOUR::NonLayered:
- non_layered_track_mode_item->set_active ();
- break;
- }
-
- _ignore_track_mode_change = false;
+ mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&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 (_("Mode"), *mode_menu));
}
build_playlist_menu ();
items.push_back (MenuElem (_("Playlist"), *playlist_action_menu));
+ items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1);
route_group_menu->detach ();
- route_group_menu->build (_route->route_group ());
+
+ WeakRouteList r;
+ for (TrackSelection::iterator i = _editor.get_selection().tracks.begin(); i != _editor.get_selection().tracks.end(); ++i) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+ if (rtv) {
+ r.push_back (rtv->route ());
+ }
+ }
+
+ if (r.empty ()) {
+ r.push_back (route ());
+ }
+
+ route_group_menu->build (r);
items.push_back (MenuElem (_("Route Group"), *route_group_menu->menu ()));
- build_automation_action_menu ();
+ build_automation_action_menu (true);
items.push_back (MenuElem (_("Automation"), *automation_action_menu));
items.push_back (SeparatorElem());
}
- items.push_back (CheckMenuElem (_("Active"), sigc::mem_fun(*this, &RouteUI::toggle_route_active)));
- route_active_menu_item = dynamic_cast<CheckMenuItem *> (&items.back());
- route_active_menu_item->set_active (_route->active());
+ int active = 0;
+ int inactive = 0;
+ TrackSelection const & s = _editor.get_selection().tracks;
+ for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
+ RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
+ if (!r) {
+ continue;
+ }
- items.push_back (SeparatorElem());
- 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 {
- items.push_front (SeparatorElem());
- items.push_front (MenuElem (_("Delete"), sigc::mem_fun(*this, &RouteUI::remove_this_route)));
+ if (r->route()->active()) {
+ ++active;
+ } else {
+ ++inactive;
+ }
}
-}
-static bool __reset_item (RadioMenuItem* item, RadioMenuItem* item_2)
-{
- item->set_active ();
- item_2->set_active ();
- return false;
-}
-
-void
-RouteTimeAxisView::set_track_mode (TrackMode mode)
-{
- if (_ignore_track_mode_change) {
- return;
- }
-
- RadioMenuItem* item;
- RadioMenuItem* other_item;
- RadioMenuItem* other_item_2;
-
- switch (mode) {
- case ARDOUR::Normal:
- item = normal_track_mode_item;
- other_item = non_layered_track_mode_item;
- other_item_2 = destructive_track_mode_item;
- break;
- case ARDOUR::NonLayered:
- item = non_layered_track_mode_item;
- other_item = normal_track_mode_item;
- other_item_2 = destructive_track_mode_item;
- break;
- case ARDOUR::Destructive:
- item = destructive_track_mode_item;
- other_item = normal_track_mode_item;
- other_item_2 = non_layered_track_mode_item;
- break;
- default:
- fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", mode) << endmsg;
- /*NOTREACHED*/
- return;
+ items.push_back (CheckMenuElem (_("Active")));
+ CheckMenuItem* i = dynamic_cast<CheckMenuItem *> (&items.back());
+ bool click_sets_active = true;
+ if (active > 0 && inactive == 0) {
+ i->set_active (true);
+ click_sets_active = false;
+ } else if (active > 0 && inactive > 0) {
+ i->set_inconsistent (true);
}
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::set_route_active), click_sets_active, true));
- if (item && other_item && other_item_2 && track()->mode() != mode) {
- _set_track_mode (track().get(), mode, other_item, other_item_2);
+ 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)));
}
}
void
-RouteTimeAxisView::_set_track_mode (Track* track, TrackMode mode, RadioMenuItem* reset_item, RadioMenuItem* reset_item_2)
+RouteTimeAxisView::set_track_mode (TrackMode mode, bool apply_to_selection)
{
- bool needs_bounce;
+ if (apply_to_selection) {
+ _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::set_track_mode, _1, mode, false));
+ } else {
- if (!track->can_use_mode (mode, needs_bounce)) {
+ bool needs_bounce;
- if (!needs_bounce) {
- /* cannot be done */
- Glib::signal_idle().connect (sigc::bind (sigc::ptr_fun (__reset_item), reset_item, reset_item_2));
- return;
- } else {
- cerr << "would bounce this one\n";
- /* XXX: radio menu item becomes inconsistent with track state in this case */
- return;
+ 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);
+
+ rec_enable_button->remove ();
+
+ switch (mode) {
+ case ARDOUR::NonLayered:
+ case ARDOUR::Normal:
+ rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red"))))));
+ break;
+ case ARDOUR::Destructive:
+ rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red"))))));
+ break;
+ }
+
+ rec_enable_button->show_all ();
}
-
- track->set_mode (mode);
-
- rec_enable_button->remove ();
-
- switch (mode) {
- case ARDOUR::NonLayered:
- case ARDOUR::Normal:
- rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red"))))));
- break;
- case ARDOUR::Destructive:
- rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red"))))));
- break;
- }
-
- rec_enable_button->show_all ();
-}
-
-void
-RouteTimeAxisView::track_mode_changed ()
-{
- RadioMenuItem* item;
-
- switch (track()->mode()) {
- case ARDOUR::Normal:
- item = normal_track_mode_item;
- break;
- case ARDOUR::NonLayered:
- item = non_layered_track_mode_item;
- break;
- case ARDOUR::Destructive:
- item = destructive_track_mode_item;
- break;
- default:
- fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", track()->mode()) << endmsg;
- /*NOTREACHED*/
- return;
- }
-
- item->set_active ();
}
void
xml_node->add_property ("height", buf);
if (height >= preset_height (HeightNormal)) {
+
+ _controls_padding_table.set_row_spacings (2);
+
reset_meter();
- show_name_entry ();
- hide_name_label ();
gm.get_gain_slider().show();
mute_button->show();
} else if (height >= preset_height (HeightSmaller)) {
+ _controls_padding_table.set_row_spacings (2);
+
reset_meter();
- show_name_entry ();
- hide_name_label ();
gm.get_gain_slider().hide();
mute_button->show();
} else {
-
- /* don't allow name_entry to be hidden while
- it has focus, otherwise the GUI becomes unusable.
- */
-
- if (name_entry.has_focus()) {
- if (name_entry.get_text() != _route->name()) {
- name_entry_changed ();
- }
- controls_ebox.grab_focus ();
- }
-
- hide_name_entry ();
- show_name_label ();
-
- gm.get_gain_slider().hide();
- mute_button->hide();
- solo_button->hide();
- if (rec_enable_button)
- rec_enable_button->hide();
-
- route_group_button.hide ();
- automation_button.hide ();
- playlist_button.hide ();
- name_label.set_text (_route->name());
+ _controls_padding_table.set_row_spacings (0);
+
}
if (height_changed && !no_redraw) {
}
void
-RouteTimeAxisView::set_align_style (AlignStyle style, bool apply_to_selection)
+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 (apply_to_selection) {
- _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::set_align_style, _1, style, false));
+ _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::set_align_choice, _1, mitem, choice, false));
} else {
- track()->set_align_style (style);
+ if (track ()) {
+ track()->set_align_choice (choice);
+ }
}
}
name = pl->name();
- if (route_group() && route_group()->is_active()) {
+ if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::edit.property_id)) {
name = resolve_new_group_playlist_name(name, playlists_before_op);
}
name = pl->name();
- if (route_group() && route_group()->is_active()) {
+ if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::edit.property_id)) {
name = resolve_new_group_playlist_name(name,playlists_before_op);
}
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()) {
+ if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::edit.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)));
}
track()->use_playlist (apl);
- if (route_group() && route_group()->is_active()) {
- std::string group_string = "."+route_group()->name()+".";
+ RouteGroup* rg = route_group();
+
+ if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::edit.property_id)) {
+ std::string group_string = "." + rg->name() + ".";
std::string take_name = apl->name();
std::string::size_type idx = take_name.find(group_string);
take_name = take_name.substr(idx + group_string.length()); // find the bit containing the take number / name
- boost::shared_ptr<RouteList> rl (route_group()->route_list());
+ boost::shared_ptr<RouteList> rl (rg->route_list());
for (RouteList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
if ( (*i) == this->route()) {
boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track>(*i);
if (!track) {
- std::cerr << "route " << (*i)->name() << " is not a Track" << std::endl;
continue;
}
void
-RouteTimeAxisView::show_all_automation ()
+RouteTimeAxisView::show_all_automation (bool apply_to_selection)
{
- 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);
- 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 (apply_to_selection) {
+ _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::show_all_automation, _1, false));
+ } else {
+ no_redraw = true;
- if (menu) {
- menu->set_active(true);
- }
- }
-
-
- /* Show processor automation */
-
- for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
- for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
- if ((*ii)->view == 0) {
- add_processor_automation_curve ((*i)->processor, (*ii)->what);
- }
-
- (*ii)->menu_item->set_active (true);
- }
- }
-
- no_redraw = false;
-
- /* Redraw */
-
- _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
-}
-
-void
-RouteTimeAxisView::show_existing_automation ()
-{
- no_redraw = true;
-
- /* Show our automation */
-
- for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
- if (i->second->has_automation()) {
+ /* Show our automation */
+
+ 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);
}
}
- }
-
-
- /* Show processor automation */
-
- for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
- for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
- if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) {
+
+
+ /* Show processor automation */
+
+ for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
+ for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
+ if ((*ii)->view == 0) {
+ add_processor_automation_curve ((*i)->processor, (*ii)->what);
+ }
+
(*ii)->menu_item->set_active (true);
}
}
+
+ no_redraw = false;
+
+ /* Redraw */
+
+ _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
}
-
- no_redraw = false;
-
- _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
}
-
+
void
-RouteTimeAxisView::hide_all_automation ()
+RouteTimeAxisView::show_existing_automation (bool apply_to_selection)
{
- 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);
- i->second->hide ();
- i->second->get_state_node()->add_property ("shown", X_("no"));
-
- Gtk::CheckMenuItem* menu = automation_child_menu_item (i->first);
+ if (apply_to_selection) {
+ _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::show_existing_automation, _1, false));
+ } 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);
+ 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);
+ }
+ }
+ }
- if (menu) {
- menu->set_active (false);
+
+ /* Show processor automation */
+
+ for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
+ for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
+ if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) {
+ (*ii)->menu_item->set_active (true);
+ }
+ }
}
+
+ no_redraw = false;
+
+ _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
}
+}
- /* Hide processor automation */
+void
+RouteTimeAxisView::hide_all_automation (bool apply_to_selection)
+{
+ if (apply_to_selection) {
+ _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::hide_all_automation, _1, false));
+ } else {
+ no_redraw = true;
- for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
- for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
- (*ii)->menu_item->set_active (false);
+ /* Hide our automation */
+
+ 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);
+ }
+ }
+
+ /* Hide processor automation */
+
+ for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
+ for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
+ (*ii)->menu_item->set_active (false);
+ }
}
+
+ no_redraw = false;
+ _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
}
-
- no_redraw = false;
- _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
}
false,
parent_canvas,
_route->amp()->describe_parameter(param)));
+
+ if (_view) {
+ _view->foreach_regionview (sigc::mem_fun (*gain_track.get(), &TimeAxisView::add_ghost));
+ }
add_automation_child (Evoral::Parameter(GainAutomation), gain_track, show);
}