diff options
author | nick_m <mainsbridge@gmail.com> | 2017-01-30 01:46:38 +1100 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2017-01-30 01:46:38 +1100 |
commit | ab052d056591b200851f86436f3e3ef671a5e504 (patch) | |
tree | 759429b555c325c6bacb4972ffc7a140809fdf1f /gtk2_ardour | |
parent | d29f6bde5ef1477a36e1e550ef5a548c5b0b1580 (diff) |
speed up midi ghost region update
- as MRV removes invalid notes from the GR, we
can simply update all events after checking vertical visibility.
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ghostregion.cc | 97 | ||||
-rw-r--r-- | gtk2_ardour/ghostregion.h | 11 | ||||
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 19 | ||||
-rw-r--r-- | gtk2_ardour/midi_region_view.h | 1 |
4 files changed, 66 insertions, 62 deletions
diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc index ac5cf6c34b..799e53d3ca 100644 --- a/gtk2_ardour/ghostregion.cc +++ b/gtk2_ardour/ghostregion.cc @@ -31,6 +31,7 @@ #include "midi_streamview.h" #include "midi_time_axis.h" #include "region_view.h" +#include "midi_region_view.h" #include "rgb_macros.h" #include "note.h" #include "hit.h" @@ -174,12 +175,13 @@ AudioGhostRegion::set_colors () * @param tv TimeAxisView that this ghost region is on. * @param source_tv TimeAxisView that we are the ghost for. */ -MidiGhostRegion::MidiGhostRegion(RegionView& rv, +MidiGhostRegion::MidiGhostRegion(MidiRegionView& rv, TimeAxisView& tv, TimeAxisView& source_tv, double initial_unit_pos) : GhostRegion(rv, tv.ghost_group(), tv, source_tv, initial_unit_pos) , _note_group (new ArdourCanvas::Container (group)) + , parent_mrv (rv) , _optimization_iterator(events.end()) { _outline = UIConfiguration::instance().color ("ghost track midi outline"); @@ -192,7 +194,7 @@ MidiGhostRegion::MidiGhostRegion(RegionView& rv, * @param msv MidiStreamView that this ghost region is on. * @param source_tv TimeAxisView that we are the ghost for. */ -MidiGhostRegion::MidiGhostRegion(RegionView& rv, +MidiGhostRegion::MidiGhostRegion(MidiRegionView& rv, MidiStreamView& msv, TimeAxisView& source_tv, double initial_unit_pos) @@ -202,6 +204,7 @@ MidiGhostRegion::MidiGhostRegion(RegionView& rv, source_tv, initial_unit_pos) , _note_group (new ArdourCanvas::Container (group)) + , parent_mrv (rv) , _optimization_iterator(events.end()) { _outline = UIConfiguration::instance().color ("ghost track midi outline"); @@ -369,11 +372,11 @@ MidiGhostRegion::clear_events() _optimization_iterator = events.end(); } -/** Update the x positions of our representation of a parent's note. - * @param parent The CanvasNote from the parent MidiRegionView. +/** Update the positions of our representation of a note. + * @param ev The GhostEvent from the parent MidiRegionView. */ void -MidiGhostRegion::update_note (Note* note, bool hide) +MidiGhostRegion::update_note (GhostEvent* ev) { MidiStreamView* mv = midi_view(); @@ -381,32 +384,20 @@ MidiGhostRegion::update_note (Note* note, bool hide) return; } - GhostEvent* ev = find_event (note->note()); + _tmp_rect = static_cast<ArdourCanvas::Rectangle*>(ev->item); - if (!ev) { - return; - } - - if (hide) { - ev->item->hide(); - } else if (!ev->is_hit) { - _tmp_rect = static_cast<ArdourCanvas::Rectangle*>(ev->item); - - uint8_t const note_num = note->note()->note(); - double const y = note_y(trackview, mv, note_num); - double const h = note_height(trackview, mv); - - _tmp_rect->set (ArdourCanvas::Rect (note->x0(), y, note->x1(), y + h)); + uint8_t const note_num = ev->event->note()->note(); + double const y = note_y(trackview, mv, note_num); + double const h = note_height(trackview, mv); - ev->item->show(); - } + _tmp_rect->set (ArdourCanvas::Rect (ev->event->x0(), y, ev->event->x1(), y + h)); } -/** Update the x positions of our representation of a parent's hit. - * @param hit The CanvasHit from the parent MidiRegionView. +/** Update the positions of our representation of a parent's hit. + * @param ev The GhostEvent from the parent MidiRegionView. */ void -MidiGhostRegion::update_hit (Hit* hit, bool hide) +MidiGhostRegion::update_hit (GhostEvent* ev) { MidiStreamView* mv = midi_view(); @@ -414,30 +405,19 @@ MidiGhostRegion::update_hit (Hit* hit, bool hide) return; } - GhostEvent* ev = find_event (hit->note()); - - if (!ev) { - return; - } - - if (hide) { - ev->item->hide(); - } else if (ev->is_hit) { - _tmp_poly = static_cast<ArdourCanvas::Polygon*>(ev->item); + _tmp_poly = static_cast<ArdourCanvas::Polygon*>(ev->item); - uint8_t const note_num = ev->event->note()->note(); - double const h = note_height(trackview, mv); - double const y = note_y(trackview, mv, note_num); + uint8_t const note_num = ev->event->note()->note(); + double const h = note_height(trackview, mv); + double const y = note_y(trackview, mv, note_num); - ArdourCanvas::Duple ppos = hit->position(); - ArdourCanvas::Duple gpos = _tmp_poly->position(); - gpos.x = ppos.x; - gpos.y = y; - _tmp_poly->set_position(gpos); - _tmp_poly->set(Hit::points(h)); + ArdourCanvas::Duple ppos = ev->item->position(); + ArdourCanvas::Duple gpos = _tmp_poly->position(); + gpos.x = ppos.x; + gpos.y = y; - ev->item->show(); - } + _tmp_poly->set_position(gpos); + _tmp_poly->set(Hit::points(h)); } void @@ -453,6 +433,31 @@ MidiGhostRegion::remove_note (NoteBase* note) _optimization_iterator = events.end (); } +void +MidiGhostRegion::redisplay_model () +{ + /* we rely on the parent MRV having removed notes not in the model */ + for (EventList::iterator i = events.begin(); i != events.end(); ) { + + boost::shared_ptr<NoteType> note = i->first; + GhostEvent* cne = i->second; + const bool visible = (note->note() >= parent_mrv._current_range_min) && + (note->note() <= parent_mrv._current_range_max); + + if (visible) { + if (cne->is_hit) { + update_hit (cne); + } else { + update_note (cne); + } + cne->item->show (); + } else { + cne->item->hide (); + } + + ++i; + } +} /** Given a note in our parent region (ie the actual MidiRegionView), find our * representation of it. diff --git a/gtk2_ardour/ghostregion.h b/gtk2_ardour/ghostregion.h index aa4ec8b2f3..1b2fb700c1 100644 --- a/gtk2_ardour/ghostregion.h +++ b/gtk2_ardour/ghostregion.h @@ -34,6 +34,7 @@ class Hit; class MidiStreamView; class TimeAxisView; class RegionView; +class MidiRegionView; class GhostRegion : public sigc::trackable { @@ -90,12 +91,12 @@ public: bool is_hit; }; - MidiGhostRegion(RegionView& rv, + MidiGhostRegion(MidiRegionView& rv, TimeAxisView& tv, TimeAxisView& source_tv, double initial_unit_pos); - MidiGhostRegion(RegionView& rv, + MidiGhostRegion(MidiRegionView& rv, MidiStreamView& msv, TimeAxisView& source_tv, double initial_unit_pos); @@ -111,10 +112,11 @@ public: void update_contents_height(); void add_note(NoteBase*); - void update_note (Note* note, bool hide); - void update_hit (Hit* hit, bool hide); + void update_note (GhostEvent* note); + void update_hit (GhostEvent* hit); void remove_note (NoteBase*); + void redisplay_model(); void clear_events(); private: @@ -123,6 +125,7 @@ private: ArdourCanvas::Rectangle* _tmp_rect; ArdourCanvas::Polygon* _tmp_poly; + MidiRegionView& parent_mrv; typedef Evoral::Note<Evoral::Beats> NoteType; MidiGhostRegion::GhostEvent* find_event (boost::shared_ptr<NoteType>); diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 6686abb9b5..397ee66cf5 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1243,24 +1243,12 @@ MidiRegionView::redisplay_model() update_sustained (sus); } - for (std::vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) { - MidiGhostRegion* gr = dynamic_cast<MidiGhostRegion*> (*i); - if (gr) { - gr->update_note (sus, !visible || gr->trackview.hidden()); - } - } } else if ((hit = dynamic_cast<Hit*>(cne))) { if (visible) { update_hit (hit); } - for (std::vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) { - MidiGhostRegion* gr = dynamic_cast<MidiGhostRegion*> (*i); - if (gr) { - gr->update_hit (hit, !visible || gr->trackview.hidden()); - } - } } ++i; } @@ -1289,6 +1277,13 @@ MidiRegionView::redisplay_model() } } + for (vector<GhostRegion*>::iterator j = ghosts.begin(); j != ghosts.end(); ++j) { + MidiGhostRegion* gr = dynamic_cast<MidiGhostRegion*> (*j); + if (gr && !gr->trackview.hidden()) { + gr->redisplay_model (); + } + } + _sys_exes.clear(); display_sysexes(); diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index fd62312693..635307d4dd 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -361,6 +361,7 @@ private: friend class NoteDrag; friend class NoteCreateDrag; friend class HitCreateDrag; + friend class MidiGhostRegion; friend class EditNoteDialog; |