diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 6fbc931c72..23c72e9821 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -671,9 +671,18 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) } else { if (button_release_can_deselect) { - /* just remove this one region, but only on a permitted button release */ + /* just remove this one region + * (or all equivalent regions + * for RippleAll, but only on a + * permitted button release + */ - selection->remove (clicked_regionview); + if (Config->get_edit_mode() == RippleAll) { + get_all_equivalent_regions (clicked_regionview, all_equivalent_regions); + selection->remove (all_equivalent_regions); + } else { + selection->remove (clicked_regionview); + } commit = true; /* no more deselect action on button release till a new press diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc index 3e0591eaf6..93a46938ce 100644 --- a/gtk2_ardour/region_selection.cc +++ b/gtk2_ardour/region_selection.cc @@ -162,6 +162,26 @@ RegionSelection::remove (RegionView* rv) return false; } +bool +RegionSelection::remove (vector rv) +{ + RegionSelection::iterator r; + bool removed_at_least_one = false; + + for (vector::iterator rx = rv.begin(); rx != rv.end(); ++rx) { + if ((r = find (begin(), end(), *rx)) != end()) { + + // remove from layer sorted list + _bylayer.remove (*rx); + pending.remove ((*rx)->region()->id()); + erase (r); + removed_at_least_one = true; + } + } + + return removed_at_least_one; +} + /** Add a region to the list sorted by layer. * @param rv Region to add. */ diff --git a/gtk2_ardour/region_selection.h b/gtk2_ardour/region_selection.h index c9cee181ac..4a3b633b87 100644 --- a/gtk2_ardour/region_selection.h +++ b/gtk2_ardour/region_selection.h @@ -48,6 +48,7 @@ public: bool add (RegionView*); bool remove (RegionView*); + bool remove (std::vector); void sort_by_position_and_track (); bool contains (RegionView*) const; diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index 7da91ec905..ee048c62db 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -591,6 +591,14 @@ Selection::remove (RegionView* r) } } +void +Selection::remove (vector rv) +{ + if (regions.remove (rv)) { + RegionsChanged (); + } +} + void Selection::remove (uint32_t selection_id) { diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h index f7f3980f50..318bb717af 100644 --- a/gtk2_ardour/selection.h +++ b/gtk2_ardour/selection.h @@ -179,6 +179,7 @@ public: void remove (const TrackViewList&); void remove (const MidiNoteSelection&); void remove (RegionView*); + void remove (std::vector); void remove (MidiCutBuffer*); void remove (uint32_t selection_id); void remove (samplepos_t, samplepos_t);