From 8be2e11c653031f2a367cf7c7b6f2320d935684c Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 7 Oct 2011 21:11:19 +0000 Subject: [PATCH] Implement range selecting for MIDI notes (#4087). git-svn-id: svn://localhost/ardour2/branches/3.0@10199 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_selection.cc | 40 +++++++++++++++++++++++++++++---- gtk2_ardour/midi_region_view.cc | 13 +++++++++++ gtk2_ardour/midi_region_view.h | 1 + 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 6e37868aa3..c598116bad 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -1521,12 +1521,10 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after) list touched; if (after) { - begin_reversible_command (_("select all after cursor")); start = cursor->current_frame; end = _session->current_end_frame(); } else { if (cursor->current_frame > 0) { - begin_reversible_command (_("select all before cursor")); start = 0; end = cursor->current_frame - 1; } else { @@ -1534,6 +1532,21 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after) } } + if (_internal_editing) { + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + MidiRegionView* mrv = dynamic_cast(*i); + if (mrv) { + mrv->select_range (start, end); + } + } + return; + } + + if (after) { + begin_reversible_command (_("select all after cursor")); + } else { + begin_reversible_command (_("select all before cursor")); + } TrackViewList* ts; @@ -1561,12 +1574,10 @@ Editor::select_all_selectables_using_edit (bool after) list touched; if (after) { - begin_reversible_command (_("select all after edit")); start = get_preferred_edit_position(); end = _session->current_end_frame(); } else { if ((end = get_preferred_edit_position()) > 1) { - begin_reversible_command (_("select all before edit")); start = 0; end -= 1; } else { @@ -1574,6 +1585,19 @@ Editor::select_all_selectables_using_edit (bool after) } } + if (_internal_editing) { + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + MidiRegionView* mrv = dynamic_cast(*i); + mrv->select_range (start, end); + } + return; + } + + if (after) { + begin_reversible_command (_("select all after edit")); + } else { + begin_reversible_command (_("select all before edit")); + } TrackViewList* ts; @@ -1604,6 +1628,14 @@ Editor::select_all_selectables_between (bool /*within*/) return; } + if (_internal_editing) { + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + MidiRegionView* mrv = dynamic_cast(*i); + mrv->select_range (start, end); + } + return; + } + TrackViewList* ts; if (selection->tracks.empty()) { diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 50eda1023b..474db10eb3 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -2027,6 +2027,19 @@ MidiRegionView::select_all_notes () } } +void +MidiRegionView::select_range (framepos_t start, framepos_t end) +{ + clear_selection (); + + for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { + framepos_t t = source_beats_to_absolute_frames((*i)->note()->time()); + if (t >= start && t <= end) { + add_to_selection (*i); + } + } +} + void MidiRegionView::invert_selection () { diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 38cd703a98..c4c483892b 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -192,6 +192,7 @@ public: void delete_note (boost::shared_ptr); size_t selection_size() { return _selection.size(); } void select_all_notes (); + void select_range(framepos_t start, framepos_t end); void invert_selection (); void move_selection(double dx, double dy, double cumulative_dy); -- 2.30.2