summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_region_view.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-08-07 00:09:22 +0000
committerDavid Robillard <d@drobilla.net>2007-08-07 00:09:22 +0000
commitf92be1e34c7fa2f25f36c23974045bce22a5049f (patch)
tree5b9dad350e4dce428b518415483f00d5335a8c9b /gtk2_ardour/midi_region_view.cc
parentd07f541cdf2caaf0034eef4a294f14d84c963ae8 (diff)
Ridiculously CPU-chewey rect select (for sustained notes only ATM).
git-svn-id: svn://localhost/ardour2/trunk@2261 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r--gtk2_ardour/midi_region_view.cc25
1 files changed, 22 insertions, 3 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 64693c7e6f..49817a35a0 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -241,9 +241,12 @@ MidiRegionView::canvas_event(GdkEvent* ev)
if (drag_rect)
drag_rect->property_x2() = event_x;
- if (drag_rect && _state == SelectDragging)
+ if (drag_rect && _state == SelectDragging) {
drag_rect->property_y2() = event_y;
+ update_drag_selection(drag_start_x, event_x, drag_start_y, event_y);
+ }
+
last_x = event_x;
last_y = event_y;
@@ -335,7 +338,7 @@ MidiRegionView::create_note_at(double x, double y, double dur)
void
MidiRegionView::clear_events()
{
- for (std::vector<ArdourCanvas::Item*>::iterator i = _events.begin(); i != _events.end(); ++i)
+ for (std::vector<CanvasMidiEvent*>::iterator i = _events.begin(); i != _events.end(); ++i)
delete *i;
_events.clear();
@@ -558,7 +561,7 @@ MidiRegionView::add_note (const MidiModel::Note& note)
if (midi_view()->note_mode() == Sustained) {
const double y1 = midi_stream_view()->note_to_y(note.note());
- ArdourCanvas::SimpleRect * ev_rect = new CanvasNote(*this, *group, &note);
+ CanvasNote* ev_rect = new CanvasNote(*this, *group, &note);
ev_rect->property_x1() = trackview.editor.frame_to_pixel((nframes_t)note.time());
ev_rect->property_y1() = y1;
ev_rect->property_x2() = trackview.editor.frame_to_pixel((nframes_t)(note.end_time()));
@@ -641,3 +644,19 @@ MidiRegionView::note_deselected(ArdourCanvas::CanvasMidiEvent* ev, bool add)
}
+void
+MidiRegionView::update_drag_selection(double last_x, double x, double last_y, double y)
+{
+ // FIXME: so, so, so much slower than this should be
+ for (std::vector<CanvasMidiEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+ if ((*i)->x1() >= last_x && (*i)->x1() <= x && (*i)->y1() >= last_y && (*i)->y1() <= y) {
+ (*i)->selected(true);
+ _selection.insert(*i);
+ } else {
+ (*i)->selected(false);
+ _selection.erase(*i);
+ }
+ }
+}
+
+