diff options
author | David Robillard <d@drobilla.net> | 2008-05-22 23:14:19 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-05-22 23:14:19 +0000 |
commit | 8b4eea3c7714965c081e9316df7e346e6f649ec2 (patch) | |
tree | 41d65814409f2a362d41678ac55b18413dc25811 /gtk2_ardour | |
parent | f32938f38e7652c3003c049e92b8b1387180cf8c (diff) |
Make absurdly slow MIDI selection rectangle slightly less absurd.
git-svn-id: svn://localhost/ardour2/branches/3.0@3401 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index ab17acbaf7..b38067bfbf 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -967,24 +967,48 @@ MidiRegionView::update_drag_selection(double x1, double x2, double y1, double y2 const double last_y = std::min(y1, y2); const double y = std::max(y1, y2); - // FIXME: so, so, so much slower than this should be + // TODO: Make this faster by storing the last updated selection rect, and only + // adjusting things that are in the area that appears/disappeared. + // We probably need a tree to be able to find events in O(log(n)) time. + +#ifndef NDEBUG + double last_x1 = 0.0; +#endif if (x1 < x2) { for (std::vector<CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) { +#ifndef NDEBUG + // Events should always be sorted by increasing x1() here + assert((*i)->x1() >= last_x1); + last_x1 = (*i)->x1(); +#endif + // Inside rectangle if ((*i)->x1() >= x1 && (*i)->x1() <= x2 && (*i)->y1() >= last_y && (*i)->y1() <= y) { - (*i)->selected(true); - _selection.insert(*i); - } else { + if (!(*i)->selected()) { + (*i)->selected(true); + _selection.insert(*i); + } + // Not inside rectangle + } else if ((*i)->selected()) { (*i)->selected(false); _selection.erase(*i); } } } else { for (std::vector<CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) { +#ifndef NDEBUG + // Events should always be sorted by increasing x1() here + assert((*i)->x1() >= last_x1); + last_x1 = (*i)->x1(); +#endif + // Inside rectangle if ((*i)->x2() <= x1 && (*i)->x2() >= x2 && (*i)->y1() >= last_y && (*i)->y1() <= y) { - (*i)->selected(true); - _selection.insert(*i); - } else { + if (!(*i)->selected()) { + (*i)->selected(true); + _selection.insert(*i); + } + // Not inside rectangle + } else if ((*i)->selected()) { (*i)->selected(false); _selection.erase(*i); } |