diff options
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index c3d8a1ddd5..afae96bf22 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -2135,32 +2135,39 @@ MidiRegionView::invert_selection () void MidiRegionView::select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend) { + bool have_selection = !_selection.empty(); uint8_t low_note = 127; uint8_t high_note = 0; MidiModel::Notes& notes (_model->notes()); _optimization_iterator = _events.begin(); + + if (extend && !have_selection) { + extend = false; + } + /* scan existing selection to get note range */ + + for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { + if ((*i)->note()->note() < low_note) { + low_note = (*i)->note()->note(); + } + if ((*i)->note()->note() > high_note) { + high_note = (*i)->note()->note(); + } + } + if (!add) { clear_selection (); - } - if (extend && _selection.empty()) { - extend = false; + if (!extend && (low_note == high_note) && (high_note == notenum)) { + /* only note previously selected is the one we are + * reselecting. treat this as cancelling the selection. + */ + return; + } } if (extend) { - - /* scan existing selection to get note range */ - - for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { - if ((*i)->note()->note() < low_note) { - low_note = (*i)->note()->note(); - } - if ((*i)->note()->note() > high_note) { - high_note = (*i)->note()->note(); - } - } - low_note = min (low_note, notenum); high_note = max (high_note, notenum); } |