X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_streamview.cc;h=1654e7e5a9ceac2240a11d18d2542a532a5d3feb;hb=402cc384ced6cb152c8abe4294009fe0de0a6dea;hp=4aebcbf34ced14ec8398591760f52598af7a8085;hpb=9266d287ab359e5af07dc8bf25cf5d72ca0272db;p=ardour.git diff --git a/gtk2_ardour/automation_streamview.cc b/gtk2_ardour/automation_streamview.cc index 4aebcbf34c..1654e7e5a9 100644 --- a/gtk2_ardour/automation_streamview.cc +++ b/gtk2_ardour/automation_streamview.cc @@ -24,14 +24,13 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include +#include "ardour/midi_playlist.h" +#include "ardour/midi_region.h" +#include "ardour/midi_source.h" +#include "ardour/midi_diskstream.h" +#include "ardour/midi_track.h" +#include "ardour/smf_source.h" +#include "ardour/region_factory.h" #include "automation_streamview.h" #include "region_view.h" @@ -55,14 +54,14 @@ using namespace Editing; AutomationStreamView::AutomationStreamView (AutomationTimeAxisView& tv) : StreamView (*dynamic_cast(tv.get_parent()), - new ArdourCanvas::Group(*tv.canvas_display)) + new ArdourCanvas::Group(*tv.canvas_display())) , _controller(tv.controller()) , _automation_view(tv) { //canvas_rect->property_fill_color_rgba() = stream_base_color; canvas_rect->property_outline_color_rgba() = RGBA_BLACK; - use_rec_regions = tv.editor.show_waveforms_recording (); + use_rec_regions = tv.editor().show_waveforms_recording (); } AutomationStreamView::~AutomationStreamView () @@ -71,7 +70,7 @@ AutomationStreamView::~AutomationStreamView () RegionView* -AutomationStreamView::add_region_view_internal (boost::shared_ptr region, bool wfd) +AutomationStreamView::add_region_view_internal (boost::shared_ptr region, bool wfd, bool recording) { if ( ! region) { cerr << "No region" << endl; @@ -84,33 +83,37 @@ AutomationStreamView::add_region_view_internal (boost::shared_ptr region mr->midi_source()->load_model(); } - const boost::shared_ptr control = region->control(_controller->controllable()->parameter()); + const boost::shared_ptr control + = boost::dynamic_pointer_cast( + region->control(_controller->controllable()->parameter())); - if ( ! control) { - cerr << "No " << _controller->controllable()->parameter().to_string() - << " for " << region->name() << endl; - return NULL; + boost::shared_ptr list; + if (control) { + list = boost::dynamic_pointer_cast(control->list()); + assert(!control->list() || list); } - const boost::shared_ptr list = control->list(); - AutomationRegionView *region_view; std::list::iterator i; for (i = region_views.begin(); i != region_views.end(); ++i) { if ((*i)->region() == region) { - /* great. we already have a MidiRegionView for this Region. use it again. */ + /* great. we already have an AutomationRegionView for this Region. use it again. */ + AutomationRegionView* arv = dynamic_cast(*i);; + if (arv->line()) + arv->line()->set_list (list); (*i)->set_valid (true); (*i)->enable_display(wfd); - display_region(dynamic_cast(*i)); + display_region(arv); return NULL; } } - region_view = new AutomationRegionView (canvas_group, _automation_view, region, list, + region_view = new AutomationRegionView (canvas_group, _automation_view, region, + _controller->controllable()->parameter(), list, _samples_per_unit, region_color); region_view->init (region_color, false); @@ -139,38 +142,37 @@ AutomationStreamView::display_region(AutomationRegionView* region_view) region_view->line().reset(); } +void +AutomationStreamView::set_automation_state (AutoState state) +{ + std::list::iterator i; + for (i = region_views.begin(); i != region_views.end(); ++i) { + boost::shared_ptr line = ((AutomationRegionView*)(*i))->line(); + if (line && line->the_list()) + line->the_list()->set_automation_state (state); + } +} + void AutomationStreamView::redisplay_diskstream () { list::iterator i, tmp; - for (i = region_views.begin(); i != region_views.end(); ++i) + // Flag region views as invalid and disable drawing + for (i = region_views.begin(); i != region_views.end(); ++i) { (*i)->set_valid (false); - - if (_trackview.is_track()) { - _trackview.get_diskstream()->playlist()->foreach_region (static_cast(this), &StreamView::add_region_view); + (*i)->enable_display(false); } - 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_y_position_and_height(0, height); - } - - i = tmp; + // Add and display region views, and flag them as valid + if (_trackview.is_track()) { + _trackview.get_diskstream()->playlist()->foreach_region ( + sigc::hide_return (sigc::mem_fun (*this, &StreamView::add_region_view)) + ); } - /* 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(); }