summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/ghostregion.cc16
-rw-r--r--gtk2_ardour/ghostregion.h3
-rw-r--r--gtk2_ardour/midi_region_view.cc9
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<MidiGhostRegion::Event*> 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<GhostRegion*>::iterator j = ghosts.begin(); j != ghosts.end(); ++j) {
+ MidiGhostRegion* gr = dynamic_cast<MidiGhostRegion*> (*j);
+ if (gr) {
+ gr->remove_note (*i);
+ }
+ }
+
delete *i;
i = _events.erase (i);
+
} else {
++i;
}