Back out big shared_ptr change. Moving to a branch. Apologies all.
[ardour.git] / gtk2_ardour / automation_streamview.cc
index 4aebcbf34ced14ec8398591760f52598af7a8085..1654e7e5a9ceac2240a11d18d2542a532a5d3feb 100644 (file)
 
 #include <gtkmm2ext/gtk_ui.h>
 
-#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/midi_events.h>
-#include <ardour/smf_source.h>
-#include <ardour/region_factory.h>
+#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<RouteTimeAxisView*>(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> region, bool wfd)
+AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region, bool wfd, bool recording)
 {
        if ( ! region) {
                cerr << "No region" << endl;
@@ -84,33 +83,37 @@ AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region
                        mr->midi_source()->load_model();
        }
 
-       const boost::shared_ptr<AutomationControl> control = region->control(_controller->controllable()->parameter());
+       const boost::shared_ptr<AutomationControl> control
+               = boost::dynamic_pointer_cast<AutomationControl>(
+                               region->control(_controller->controllable()->parameter()));
 
-       if ( ! control) {
-               cerr << "No " << _controller->controllable()->parameter().to_string()
-                       << " for " << region->name() << endl;
-               return NULL;
+       boost::shared_ptr<AutomationList> list;
+       if (control) {
+               list = boost::dynamic_pointer_cast<AutomationList>(control->list());
+               assert(!control->list() || list);
        }
 
-       const boost::shared_ptr<AutomationList> list = control->list();
-
        AutomationRegionView *region_view;
        std::list<RegionView *>::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<AutomationRegionView*>(*i);;
 
+                       if (arv->line())
+                               arv->line()->set_list (list);
                        (*i)->set_valid (true);
                        (*i)->enable_display(wfd);
-                       display_region(dynamic_cast<AutomationRegionView*>(*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<RegionView *>::iterator i;
+       for (i = region_views.begin(); i != region_views.end(); ++i) {
+               boost::shared_ptr<AutomationLine> line = ((AutomationRegionView*)(*i))->line();
+               if (line && line->the_list())
+                       line->the_list()->set_automation_state (state);
+       }
+}
+
 void
 AutomationStreamView::redisplay_diskstream ()
 {
        list<RegionView *>::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<StreamView*>(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();
 }