diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index c6606502f6..b6900f59f0 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -593,6 +593,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourCanvas::Container* add_new_location_internal (ARDOUR::Location *); void location_gone (ARDOUR::Location *); void remove_selected_markers (); + void remove_selected_range_markers (); void remove_marker (ArdourCanvas::Item&, GdkEvent*); gint really_remove_marker (ARDOUR::Location* loc, bool begin_reversible_command, bool commit_reversible_command); void goto_nth_marker (int nth); @@ -1556,6 +1557,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void marker_menu_edit (); void marker_menu_remove (); + void range_marker_menu_remove (); void marker_menu_rename (); void rename_marker (Marker *marker); void finish_rename_marker (std::string, Marker *marker); diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index be1f726e1b..edb51408c5 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -458,32 +458,61 @@ Editor::mouse_add_new_range (framepos_t where) void Editor::remove_selected_markers () { - MeterMarker* mm; - TempoMarker* tm; - bool begin_command = true; - for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) { - dynamic_cast_marker_object (*x, &mm, &tm); - - if (mm) { - remove_meter_marker (marker_menu_item); - } else if (tm) { - remove_tempo_marker (marker_menu_item); - } else { - bool is_start; + if (_session) { + bool is_start; + std::vector markers; + for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) { Location* loc = find_location_from_marker (*x, is_start); - // loop range cannot be removed in TracksLive if (loc->is_auto_loop() ) { - return; + continue; } - if (_session && loc) { - Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::really_remove_marker), loc, begin_command, (*x == selection->markers.back ()))); + Marker *marker = reinterpret_cast(*x); + if (marker && !dynamic_cast (marker)) { + markers.push_back (marker); } + } + + MeterMarker* mm; + TempoMarker* tm; + bool begin_command = true; + for (std::vector::iterator x = markers.begin(); x != markers.end(); ++x) { + Location* loc = find_location_from_marker (*x, is_start); + bool commit_command = (*x == markers.back ()); + Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::really_remove_marker), loc, begin_command, commit_command)); begin_command = false; } } } +void +Editor::remove_selected_range_markers () +{ + bool is_start; + if (_session) { + std::vector markers; + for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) { + Location* loc = find_location_from_marker (*x, is_start); + // loop range cannot be removed in TracksLive + if (loc->is_auto_loop() ) { + continue; + } + RangeMarker *marker = dynamic_cast(*x); + if (marker) { + markers.push_back (marker); + } + } + + bool begin_command = true; + + for (std::vector::iterator x = markers.begin(); x != markers.end(); ++x) { + bool commit_command = (*x == markers.back ()); + Location* loc = find_location_from_marker (*x, is_start); + Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::really_remove_marker), loc, begin_command, commit_command)); + begin_command = false; + } + } +} void Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent*) @@ -688,7 +717,7 @@ Editor::build_range_marker_menu (bool loop_or_punch, bool session) markerMenu->set_name ("ArdourContextMenu"); if (!session) { - items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::marker_menu_remove))); + items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::range_marker_menu_remove))); } } @@ -1071,6 +1100,19 @@ Editor::marker_menu_remove () } } +void +Editor::range_marker_menu_remove () +{ + RangeMarker *marker = dynamic_cast((Marker*)marker_menu_item->get_data ("marker")); + if (marker) { + if (std::find (selection->markers.begin (), selection->markers.end (), marker) == selection->markers.end ()) { + remove_marker (*marker_menu_item, (GdkEvent*) 0); + } else { + remove_selected_range_markers (); + } + } +} + void Editor::toggle_marker_menu_lock () {