From fecf120f1e778f1a2344e0adcaf3aed0b0c4e5e3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 17 Nov 2011 22:15:50 +0000 Subject: [PATCH] Remove ghost notes when actual notes are deleted, and ensure the _optimization_iterator is valid even after things have been removed from the list (should fix #4483). git-svn-id: svn://localhost/ardour2/branches/3.0@10659 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ghostregion.cc | 16 +++++++++++++++- gtk2_ardour/ghostregion.h | 3 ++- gtk2_ardour/midi_region_view.cc | 9 +++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc index cb4a0d95d3..61f0ffcbff 100644 --- a/gtk2_ardour/ghostregion.cc +++ b/gtk2_ardour/ghostregion.cc @@ -306,6 +306,7 @@ MidiGhostRegion::clear_events() } events.clear(); + _optimization_iterator = events.end (); } /** Update the x positions of our representation of a parent's note. @@ -328,13 +329,26 @@ MidiGhostRegion::update_note (ArdourCanvas::CanvasNote* parent) } } +void +MidiGhostRegion::remove_note (ArdourCanvas::CanvasNoteEvent* note) +{ + Event* ev = find_event (note); + if (!ev) { + return; + } + + events.remove (ev); + delete ev; + _optimization_iterator = events.end (); +} + /** Given a note in our parent region (ie the actual MidiRegionView), find our * representation of it. * @return Our Event, or 0 if not found. */ MidiGhostRegion::Event * -MidiGhostRegion::find_event (ArdourCanvas::CanvasNote* parent) +MidiGhostRegion::find_event (ArdourCanvas::CanvasNoteEvent* parent) { /* we are using _optimization_iterator to speed up the common case where a caller is going through our notes in order. diff --git a/gtk2_ardour/ghostregion.h b/gtk2_ardour/ghostregion.h index 103d7ecf97..50924619ff 100644 --- a/gtk2_ardour/ghostregion.h +++ b/gtk2_ardour/ghostregion.h @@ -105,12 +105,13 @@ public: void add_note(ArdourCanvas::CanvasNote*); void update_note (ArdourCanvas::CanvasNote *); + void remove_note (ArdourCanvas::CanvasNoteEvent *); void clear_events(); private: - MidiGhostRegion::Event* find_event (ArdourCanvas::CanvasNote *); + MidiGhostRegion::Event* find_event (ArdourCanvas::CanvasNoteEvent *); typedef std::list EventList; EventList events; diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 6bb1eb98e7..00bdb94dce 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1156,8 +1156,17 @@ MidiRegionView::redisplay_model() for (Events::iterator i = _events.begin(); i != _events.end(); ) { if (!(*i)->valid ()) { + + for (vector::iterator j = ghosts.begin(); j != ghosts.end(); ++j) { + MidiGhostRegion* gr = dynamic_cast (*j); + if (gr) { + gr->remove_note (*i); + } + } + delete *i; i = _events.erase (i); + } else { ++i; } -- 2.30.2