diff options
author | nick_m <mainsbridge@gmail.com> | 2017-02-02 03:34:21 +1100 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2017-02-04 22:57:36 +1100 |
commit | 3e4eaf39914df18dc4ef9fa188defd24c3000c90 (patch) | |
tree | f6ec1a47e880cf25914e17cc79da3d3434ab1aeb /gtk2_ardour/midi_region_view.cc | |
parent | 52d3c2216d469f0b8898442e8622bba2a2cbff87 (diff) |
improve sysex data display.
- don't add a new SysEx canvas item every time we zoom or drag.
- speed up redisplay generally using PatchChange-like method
for finding items (find_canvas_sys_ex() in boost::unordered_map).
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 195cc6f828..a427424614 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1144,6 +1144,18 @@ MidiRegionView::find_canvas_patch_change (MidiModel::PatchChangePtr p) return boost::shared_ptr<PatchChange>(); } +boost::shared_ptr<SysEx> +MidiRegionView::find_canvas_sys_ex (MidiModel::SysExPtr s) +{ + SysExes::const_iterator f = _sys_exes.find (s); + + if (f != _sys_exes.end()) { + return f->second; + } + + return 0; +} + void MidiRegionView::get_events (Events& e, Evoral::Sequence<Evoral::Beats>::NoteOperator op, uint8_t val, int chan_mask) { @@ -1284,8 +1296,6 @@ MidiRegionView::redisplay_model() } } - _sys_exes.clear(); - display_sysexes(); display_patch_changes (); @@ -1377,7 +1387,8 @@ MidiRegionView::display_sysexes() } for (MidiModel::SysExes::const_iterator i = _model->sysexes().begin(); i != _model->sysexes().end(); ++i) { - Evoral::Beats time = (*i)->time(); + MidiModel::SysExPtr sysex_ptr = *i; + Evoral::Beats time = sysex_ptr->time(); if ((*i)->is_spp() || (*i)->is_mtc_quarter() || (*i)->is_mtc_full()) { if (!display_periodic_messages) { @@ -1401,9 +1412,13 @@ MidiRegionView::display_sysexes() // CAIROCANVAS: no longer passing *i (the sysex event) to the // SysEx canvas object!!! + boost::shared_ptr<SysEx> sysex = find_canvas_sys_ex (sysex_ptr); - boost::shared_ptr<SysEx> sysex = boost::shared_ptr<SysEx>( - new SysEx (*this, _note_group, text, height, x, 1.0)); + if (!sysex) { + sysex = boost::shared_ptr<SysEx>( + new SysEx (*this, _note_group, text, height, x, 1.0, sysex_ptr)); + _sys_exes.insert (make_pair (sysex_ptr, sysex)); + } // Show unless message is beyond the region bounds if (time - _region->start() >= _region->length() || time < _region->start()) { @@ -1411,8 +1426,6 @@ MidiRegionView::display_sysexes() } else { sysex->show(); } - - _sys_exes.push_back(sysex); } } |