diff options
author | David Robillard <d@drobilla.net> | 2007-08-07 00:09:22 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-08-07 00:09:22 +0000 |
commit | f92be1e34c7fa2f25f36c23974045bce22a5049f (patch) | |
tree | 5b9dad350e4dce428b518415483f00d5335a8c9b /gtk2_ardour/midi_region_view.cc | |
parent | d07f541cdf2caaf0034eef4a294f14d84c963ae8 (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.cc | 25 |
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, ¬e); + CanvasNote* ev_rect = new CanvasNote(*this, *group, ¬e); 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); + } + } +} + + |