diff options
author | David Robillard <d@drobilla.net> | 2009-02-15 20:31:05 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-02-15 20:31:05 +0000 |
commit | 59972b5550b0dbfb738a1acfd46c5764f96a3da5 (patch) | |
tree | a33e3212899947c83b5f59d6c5e549e923d0f914 /gtk2_ardour | |
parent | 9c89a93e4f96826bec6ed519f8f435e4fc73bfa5 (diff) |
Factor out region layering.
Correctly layer automation regions to match the stacking of their 'real' counterparts.
git-svn-id: svn://localhost/ardour2/branches/3.0@4585 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/audio_streamview.cc | 63 | ||||
-rw-r--r-- | gtk2_ardour/automation_streamview.cc | 27 | ||||
-rw-r--r-- | gtk2_ardour/midi_streamview.cc | 55 | ||||
-rw-r--r-- | gtk2_ardour/streamview.cc | 61 | ||||
-rw-r--r-- | gtk2_ardour/streamview.h | 1 |
5 files changed, 79 insertions, 128 deletions
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 4ea7269f40..320bc1f195 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -365,13 +365,16 @@ AudioStreamView::remove_crossfade (boost::shared_ptr<Region> r) void AudioStreamView::redisplay_diskstream () { - list<RegionView *>::iterator i, tmp; + list<RegionView *>::iterator i; list<CrossfadeView*>::iterator xi, tmpx; + // Flag region views as invalid and disable drawing for (i = region_views.begin(); i != region_views.end(); ++i) { (*i)->set_valid (false); + (*i)->enable_display (false); } + // Flag crossfade views as invalid for (xi = crossfade_views.begin(); xi != crossfade_views.end(); ++xi) { (*xi)->set_valid (false); if ((*xi)->visible() && _layer_display != Stacked) { @@ -379,6 +382,7 @@ AudioStreamView::redisplay_diskstream () } } + // Add and display region and crossfade views, and flag them as valid if (_trackview.is_audio_track()) { _trackview.get_diskstream()->playlist()->foreach_region( static_cast<StreamView*>(this), @@ -389,53 +393,8 @@ AudioStreamView::redisplay_diskstream () if (apl) apl->foreach_crossfade (this, &AudioStreamView::add_crossfade); } - - RegionViewList copy; - - // Build a list of region views sorted by layer, and remove invalids - for (i = region_views.begin(); i != region_views.end(); ) { - tmp = i; - tmp++; - - if (!(*i)->is_valid()) { - delete *i; - region_views.erase (i); - i = tmp; - continue; - } else { - (*i)->enable_display(true); - } - - if (copy.size() == 0) { - copy.push_front((*i)); - i = tmp; - continue; - } - - RegionViewList::iterator k = copy.begin(); - RegionViewList::iterator l = copy.end(); - l--; - - if ((*i)->region()->layer() <= (*k)->region()->layer()) { - copy.push_front((*i)); - i = tmp; - continue; - } else if ((*i)->region()->layer() >= (*l)->region()->layer()) { - copy.push_back((*i)); - i = tmp; - continue; - } - - for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { - if ((*j)->region()->layer() >= (*i)->region()->layer()) { - copy.insert(j, (*i)); - break; - } - } - - i = tmp; - } - + + // Remove invalid crossfade views for (xi = crossfade_views.begin(); xi != crossfade_views.end();) { tmpx = xi; tmpx++; @@ -447,11 +406,9 @@ AudioStreamView::redisplay_diskstream () xi = tmpx; } - - // Fix canvas layering by raising each in the sorted list order - for (RegionViewList::iterator i = copy.begin(); i != copy.end(); ++i) { - region_layered (*i); - } + + // Stack regions by layer, and remove invalid regions + layer_regions(); } void diff --git a/gtk2_ardour/automation_streamview.cc b/gtk2_ardour/automation_streamview.cc index e7ab760709..2769ab846d 100644 --- a/gtk2_ardour/automation_streamview.cc +++ b/gtk2_ardour/automation_streamview.cc @@ -158,35 +158,20 @@ AutomationStreamView::redisplay_diskstream () { list<RegionView *>::iterator i, tmp; + // Flag region views as invalid and disable drawing for (i = region_views.begin(); i != region_views.end(); ++i) { (*i)->set_valid (false); + (*i)->enable_display(false); } - + + // Add and display region views, and flag them as valid if (_trackview.is_track()) { _trackview.get_diskstream()->playlist()->foreach_region ( static_cast<StreamView*>(this), &StreamView::add_region_view); } - - for (i = region_views.begin(); i != region_views.end(); ) { - tmp = i; - tmp++; - - if (!(*i)->is_valid()) { - delete *i; - region_views.erase (i); - } else { - (*i)->enable_display(true); - (*i)->set_height(height); - } - - i = tmp; - } - /* now fix layering */ - - for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) { - region_layered (*i); - } + // Stack regions by layer, and remove invalid regions + layer_regions(); } diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 178919a32c..5bb232bded 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -236,7 +236,7 @@ MidiStreamView::redisplay_diskstream () return; } - list<RegionView*>::iterator i, tmp; + list<RegionView*>::iterator i; // Load models if necessary, and find note range of all our contents _range_dirty = false; @@ -264,60 +264,15 @@ MidiStreamView::redisplay_diskstream () (*i)->enable_display(false); } - // Add and display region views, and flag existing ones as valid + // Add and display region views, and flag them as valid _trackview.get_diskstream()->playlist()->foreach_region( static_cast<StreamView*>(this), &StreamView::add_region_view); - // Build a list of region views sorted by layer, and remove invalids - RegionViewList copy; - for (i = region_views.begin(); i != region_views.end(); ) { - tmp = i; - tmp++; - - if (!(*i)->is_valid()) { - delete *i; - region_views.erase (i); - i = tmp; - continue; - } - - if (copy.size() == 0) { - copy.push_front((*i)); - i = tmp; - continue; - } - - RegionViewList::iterator k = copy.begin(); - RegionViewList::iterator l = copy.end(); - l--; - - if ((*i)->region()->layer() <= (*k)->region()->layer()) { - copy.push_front((*i)); - i = tmp; - continue; - } else if ((*i)->region()->layer() >= (*l)->region()->layer()) { - copy.push_back((*i)); - i = tmp; - continue; - } - - for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { - if ((*j)->region()->layer() >= (*i)->region()->layer()) { - copy.insert(j, (*i)); - break; - } - } + // Stack regions by layer, and remove invalid regions + layer_regions(); - i = tmp; - } - - // Fix canvas layering by raising each in the sorted list order - for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { - region_layered (*j); - } - - // Update note range (not to regions which are already good) and draw note lines + // Update note range (not regions which are correct) and draw note lines apply_note_range(_lowest_note, _highest_note, false); } diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index ab61338d2d..5810d10eaf 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -70,11 +70,7 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group) canvas_rect->property_y2() = (double) tv.current_height(); canvas_rect->raise(1); // raise above tempo lines - // DR-way canvas_rect->property_outline_what() = (guint32) (0x2|0x8); // outline RHS and bottom - // 2.0 way - //canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8); // outline ends and bottom - // (Fill/Outline colours set in derived classes) canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor(), &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview)); @@ -226,6 +222,63 @@ StreamView::playlist_modified_weak (boost::weak_ptr<Diskstream> ds) } void +StreamView::layer_regions() +{ + // In one traversal of the region view list: + // - Build a list of region views sorted by layer + // - Remove invalid views from the actual region view list + RegionViewList copy; + list<RegionView*>::iterator i, tmp; + for (i = region_views.begin(); i != region_views.end(); ) { + tmp = i; + tmp++; + + if (!(*i)->is_valid()) { + delete *i; + region_views.erase (i); + i = tmp; + continue; + } else { + (*i)->enable_display(true); + } + + if (copy.size() == 0) { + copy.push_front((*i)); + i = tmp; + continue; + } + + RegionViewList::iterator k = copy.begin(); + RegionViewList::iterator l = copy.end(); + l--; + + if ((*i)->region()->layer() <= (*k)->region()->layer()) { + copy.push_front((*i)); + i = tmp; + continue; + } else if ((*i)->region()->layer() >= (*l)->region()->layer()) { + copy.push_back((*i)); + i = tmp; + continue; + } + + for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { + if ((*j)->region()->layer() >= (*i)->region()->layer()) { + copy.insert(j, (*i)); + break; + } + } + + i = tmp; + } + + // Fix canvas layering by raising each in the sorted list order + for (RegionViewList::iterator i = copy.begin(); i != copy.end(); ++i) { + region_layered (*i); + } +} + +void StreamView::playlist_modified (boost::shared_ptr<Diskstream> ds) { /* we do not allow shared_ptr<T> to be bound to slots */ diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h index 932e919cee..0cbb4447d5 100644 --- a/gtk2_ardour/streamview.h +++ b/gtk2_ardour/streamview.h @@ -124,6 +124,7 @@ protected: void display_diskstream (boost::shared_ptr<ARDOUR::Diskstream>); virtual void undisplay_diskstream (); void diskstream_changed (); + void layer_regions (); virtual void playlist_changed (boost::shared_ptr<ARDOUR::Diskstream>); virtual void playlist_modified_weak (boost::weak_ptr<ARDOUR::Diskstream>); |