Implement range selecting for MIDI notes (#4087).

git-svn-id: svn://localhost/ardour2/branches/3.0@10199 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
David Robillard 2011-10-07 21:11:19 +00:00
parent 1567d362ad
commit 8be2e11c65
3 changed files with 50 additions and 4 deletions

View File

@ -1521,12 +1521,10 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after)
list<Selectable *> 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<MidiRegionView*>(*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<Selectable *> 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<MidiRegionView*>(*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<MidiRegionView*>(*i);
mrv->select_range (start, end);
}
return;
}
TrackViewList* ts;
if (selection->tracks.empty()) {

View File

@ -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 ()
{

View 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 select_range(framepos_t start, framepos_t end);
void invert_selection ();
void move_selection(double dx, double dy, double cumulative_dy);