X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fghostregion.cc;h=31e6de390ba23186068c8510da2bcfd80e249853;hb=0b55529ec42c7130421ba37f0762cec83e1e4df3;hp=cb4a0d95d3da0a9d09d971e6d5b00481746c9c81;hpb=ed626628b54e67dd9621c08d82a42afaed00c7ac;p=ardour.git diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc index cb4a0d95d3..31e6de390b 100644 --- a/gtk2_ardour/ghostregion.cc +++ b/gtk2_ardour/ghostregion.cc @@ -189,20 +189,15 @@ MidiGhostRegion::~MidiGhostRegion() clear_events (); } -MidiGhostRegion::Event::Event(ArdourCanvas::CanvasNoteEvent* e) - : event(e) +MidiGhostRegion::Event::Event (ArdourCanvas::CanvasNoteEvent* e, ArdourCanvas::Group* g) + : event (e) { - -} - -MidiGhostRegion::Note::Note(ArdourCanvas::CanvasNote* n, ArdourCanvas::Group* g) - : Event(n) -{ - rect = new ArdourCanvas::SimpleRect(*g, n->x1(), n->y1(), n->x2(), n->y2()); + rect = new ArdourCanvas::SimpleRect (*g, e->x1(), e->y1(), e->x2(), e->y2()); } -MidiGhostRegion::Note::~Note() +MidiGhostRegion::Event::~Event () { + /* event is not ours to delete */ delete rect; } @@ -233,16 +228,13 @@ MidiGhostRegion::set_height () void MidiGhostRegion::set_colors() { - MidiGhostRegion::Note* note; guint fill = source_track_color(200); GhostRegion::set_colors(); for (EventList::iterator it = events.begin(); it != events.end(); ++it) { - if ((note = dynamic_cast(*it)) != 0) { - note->rect->property_fill_color_rgba() = fill; - note->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackMidiOutline.get(); - } + (*it)->rect->property_fill_color_rgba() = fill; + (*it)->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackMidiOutline.get(); } } @@ -255,21 +247,18 @@ MidiGhostRegion::update_range () return; } - MidiGhostRegion::Note* note; double const h = trackview.current_height() / double (mv->contents_note_range ()); for (EventList::iterator it = events.begin(); it != events.end(); ++it) { - if ((note = dynamic_cast(*it)) != 0) { - uint8_t const note_num = note->event->note()->note(); - - if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { - note->rect->hide(); - } else { - note->rect->show(); - double const y = trackview.current_height() - (note_num + 1 - mv->lowest_note()) * h + 1; - note->rect->property_y1() = y; - note->rect->property_y2() = y + h; - } + uint8_t const note_num = (*it)->event->note()->note(); + + if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { + (*it)->rect->hide(); + } else { + (*it)->rect->show(); + double const y = trackview.current_height() - (note_num + 1 - mv->lowest_note()) * h + 1; + (*it)->rect->property_y1() = y; + (*it)->rect->property_y2() = y + h; } } } @@ -277,11 +266,11 @@ MidiGhostRegion::update_range () void MidiGhostRegion::add_note(ArdourCanvas::CanvasNote* n) { - Note* note = new Note(n, group); - events.push_back(note); + Event* event = new Event (n, group); + events.push_back (event); - note->rect->property_fill_color_rgba() = source_track_color(200); - note->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackMidiOutline.get(); + event->rect->property_fill_color_rgba() = source_track_color(200); + event->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackMidiOutline.get(); MidiStreamView* mv = midi_view(); @@ -289,11 +278,11 @@ MidiGhostRegion::add_note(ArdourCanvas::CanvasNote* n) const uint8_t note_num = n->note()->note(); if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { - note->rect->hide(); + event->rect->hide(); } else { const double y = mv->note_to_y(note_num); - note->rect->property_y1() = y; - note->rect->property_y2() = y + mv->note_height(); + event->rect->property_y1() = y; + event->rect->property_y2() = y + mv->note_height(); } } } @@ -306,6 +295,7 @@ MidiGhostRegion::clear_events() } events.clear(); + _optimization_iterator = events.end (); } /** Update the x positions of our representation of a parent's note. @@ -319,13 +309,23 @@ MidiGhostRegion::update_note (ArdourCanvas::CanvasNote* parent) return; } - Note* note = dynamic_cast (ev); - if (note) { - double const x1 = parent->property_x1 (); - double const x2 = parent->property_x2 (); - note->rect->property_x1 () = x1; - note->rect->property_x2 () = x2; + double const x1 = parent->property_x1 (); + double const x2 = parent->property_x2 (); + ev->rect->property_x1 () = x1; + ev->rect->property_x2 () = x2; +} + +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 @@ -334,7 +334,7 @@ MidiGhostRegion::update_note (ArdourCanvas::CanvasNote* parent) */ 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.