region list patch #2 from chris g, slightly reworked by me; sv_se po changes, possibl...
[ardour.git] / gtk2_ardour / automation_streamview.cc
index 2ede053c7b7a2062de85ae3a394957e9a9ff4bca..d3419e8bb84ade63922457cc344169c5258780e5 100644 (file)
@@ -29,7 +29,6 @@
 #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>
 
@@ -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,11 +83,15 @@ 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()));
 
        boost::shared_ptr<AutomationList> list;
-       if (control)
-               list = control->list();
+       if (control) {
+               list = boost::dynamic_pointer_cast<AutomationList>(control->list());
+               assert(!control->list() || list);
+       }
 
        AutomationRegionView *region_view;
        std::list<RegionView *>::iterator i;
@@ -96,17 +99,21 @@ AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region
        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);
@@ -135,6 +142,17 @@ 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 ()
 {
@@ -156,7 +174,7 @@ AutomationStreamView::redisplay_diskstream ()
                        region_views.erase (i);
                } else {
                        (*i)->enable_display(true);
-                       (*i)->set_y_position_and_height(0, height);
+                       (*i)->set_height(height);
                }
 
                i = tmp;