Implement invert selection for MIDI notes (#4087).
authorDavid Robillard <d@drobilla.net>
Fri, 7 Oct 2011 20:27:12 +0000 (20:27 +0000)
committerDavid Robillard <d@drobilla.net>
Fri, 7 Oct 2011 20:27:12 +0000 (20:27 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@10198 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_selection.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h

index 5875fffbfacf77d6c986feab43e05936b4578bba..6e37868aa3c59acb23751b6457fb2610444fbeb4 100644 (file)
@@ -1231,8 +1231,6 @@ Editor::select_all_in_track (Selection::Operation op)
 void
 Editor::select_all_internal_edit (Selection::Operation)
 {
-       /* currently limited to MIDI only */
-
        for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
                MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
                if (mrv) {
@@ -1274,6 +1272,7 @@ Editor::select_all (Selection::Operation op)
        }
        commit_reversible_command ();
 }
+
 void
 Editor::invert_selection_in_track ()
 {
@@ -1292,6 +1291,16 @@ Editor::invert_selection ()
 {
        list<Selectable *> touched;
 
+       if (_internal_editing) {
+               for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+                       MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
+                       if (mrv) {
+                               mrv->invert_selection ();
+                       }
+               }
+               return;
+       }
+
        for (TrackViewList::iterator iter = track_views.begin(); iter != track_views.end(); ++iter) {
                if ((*iter)->hidden()) {
                        continue;
index b79d97d746024a20d01f8ccb5b73e3dc06e0269c..50eda1023b7469a3eabc6fa7377a700896ccd85f 100644 (file)
@@ -2027,6 +2027,18 @@ MidiRegionView::select_all_notes ()
        }
 }
 
+void
+MidiRegionView::invert_selection ()
+{
+       for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
+               if ((*i)->selected()) {
+                       remove_from_selection(*i);
+               } else {
+                       add_to_selection (*i);
+               }
+       }
+}
+
 void
 MidiRegionView::select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend)
 {
index a878aa13dddcbfacb24b02d70511059f2b5de5bc..38cd703a984cf8ae4e9b06ee1e610fcbff80c4d0 100644 (file)
@@ -192,6 +192,7 @@ public:
        void   delete_note (boost::shared_ptr<NoteType>);
        size_t selection_size() { return _selection.size(); }
        void   select_all_notes ();
+       void   invert_selection ();
 
        void move_selection(double dx, double dy, double cumulative_dy);
        void note_dropped (ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::frameoffset_t, int8_t d_note);