Move CC/Automation regions with parent correctly.
[ardour.git] / gtk2_ardour / region_view.cc
index 24e476704ab2036e6e91ea04fc070fecf7c36a84..0554cc41413d6f92322947ebf0875c4ebc00a4b4 100644 (file)
 #include <ardour/audiosource.h>
 #include <ardour/audio_diskstream.h>
 
+#include "ardour_ui.h"
 #include "streamview.h"
 #include "region_view.h"
+#include "automation_region_view.h"
 #include "route_time_axis.h"
 #include "simplerect.h"
 #include "simpleline.h"
@@ -57,11 +59,11 @@ static const int32_t sync_mark_width = 9;
 
 sigc::signal<void,RegionView*> RegionView::RegionViewGoingAway;
 
-RegionView::RegionView (ArdourCanvas::Group* parent, 
-                        TimeAxisView&        tv,
+RegionView::RegionView (ArdourCanvas::Group*              parent, 
+                        TimeAxisView&                     tv,
                         boost::shared_ptr<ARDOUR::Region> r,
-                        double               spu,
-                        Gdk::Color&          basic_color)
+                        double                            spu,
+                        Gdk::Color&                       basic_color)
        : TimeAxisViewItem (r->name(), *parent, tv, spu, basic_color, r->position(), r->length(),
                            TimeAxisViewItem::Visibility (TimeAxisViewItem::ShowNameText|
                                                          TimeAxisViewItem::ShowNameHighlight|
@@ -71,8 +73,8 @@ RegionView::RegionView (ArdourCanvas::Group* parent,
          , editor(0)
          , current_visible_sync_position(0.0)
          , valid(false)
+         , _enable_display(false)
          , _pixel_width(1.0)
-         , _height(1.0)
          , in_destructor(false)
          , wait_for_data(false)
 {
@@ -87,8 +89,8 @@ RegionView::RegionView (const RegionView& other)
        editor = other.editor;
        current_visible_sync_position = other.current_visible_sync_position;
        valid = false;
+       _enable_display = false;
        _pixel_width = other._pixel_width;
-       _height = other._height;
 }
 
 RegionView::RegionView (ArdourCanvas::Group*         parent, 
@@ -103,8 +105,8 @@ RegionView::RegionView (ArdourCanvas::Group*         parent,
        , editor(0)
        , current_visible_sync_position(0.0)
        , valid(false)
+       , _enable_display(false)
        , _pixel_width(1.0)
-       , _height(1.0)
        , in_destructor(false)
        , wait_for_data(false)
 {
@@ -113,10 +115,10 @@ RegionView::RegionView (ArdourCanvas::Group*         parent,
 void
 RegionView::init (Gdk::Color& basic_color, bool wfd)
 {
-       valid         = true;
-       in_destructor = false;
-       _height       = 0;
-       wait_for_data = wfd;
+       valid           = true;
+       _enable_display = false;
+       in_destructor   = false;
+       wait_for_data   = wfd;
 
        compute_colors (basic_color);
 
@@ -141,7 +143,10 @@ RegionView::init (Gdk::Color& basic_color, bool wfd)
 
        reset_width_dependent_items ((double) _region->length() / samples_per_unit);
 
-       set_height (trackview.height);
+       if (wfd)
+               _enable_display = true;
+
+       set_y_position_and_height (0, trackview.height - 2);
 
        _region->StateChanged.connect (mem_fun(*this, &RegionView::region_changed));
 
@@ -150,7 +155,7 @@ RegionView::init (Gdk::Color& basic_color, bool wfd)
 
        set_colors ();
 
-       ColorChanged.connect (mem_fun (*this, &RegionView::color_handler));
+       ColorsChanged.connect (mem_fun (*this, &RegionView::color_handler));
 
        /* XXX sync mark drag? */
 }
@@ -252,14 +257,11 @@ RegionView::reset_width_dependent_items (double pixel_width)
 {
        TimeAxisViewItem::reset_width_dependent_items (pixel_width);
        _pixel_width = pixel_width;
-}
 
-void
-RegionView::set_height (gdouble height)
-{
-       TimeAxisViewItem::set_height (height - 2);
-       
-       _height = height;
+       for (AutomationChildren::iterator i = _automation_children.begin();
+                       i != _automation_children.end(); ++i) {
+               i->second->reset_width_dependent_items(pixel_width);
+       }
 }
 
 void
@@ -283,24 +285,12 @@ RegionView::region_opacity ()
        set_frame_color ();
 }
 
-void
-RegionView::raise ()
-{
-       _region->raise ();
-}
-
 void
 RegionView::raise_to_top ()
 {
        _region->raise_to_top ();
 }
 
-void
-RegionView::lower ()
-{
-       _region->lower ();
-}
-
 void
 RegionView::lower_to_bottom ()
 {
@@ -325,6 +315,11 @@ RegionView::set_position (nframes_t pos, void* src, double* ignored)
                for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
                        (*i)->group->move (delta, 0.0);
                }
+       
+               for (AutomationChildren::iterator i = _automation_children.begin();
+                               i != _automation_children.end(); ++i) {
+                       i->second->get_canvas_group()->move(delta, 0.0);
+               }
        }
 
        return ret;
@@ -405,26 +400,37 @@ RegionView::hide_region_editor()
        }
 }
 
-void
-RegionView::region_renamed ()
+Glib::ustring
+RegionView::make_name () const
 {
-       string str;
+       Glib::ustring str;
+
+       // XXX nice to have some good icons for this
 
        if (_region->locked()) {
                str += '>';
                str += _region->name();
                str += '<';
+       } else if (_region->position_locked()) {
+               str += '{';
+               str += _region->name();
+               str += '}';
        } else {
                str = _region->name();
        }
 
-       // speed mismatch handled in audio_region_view.cc
-       // FIXME: come up with more elegant solution for this
-       
        if (_region->muted()) {
                str = string ("!") + str;
        }
 
+       return str;
+}
+
+void
+RegionView::region_renamed ()
+{
+       Glib::ustring str = make_name ();
+
        set_item_name (str, this);
        set_name_text (str);
        reset_width_dependent_items (_pixel_width);
@@ -483,7 +489,7 @@ RegionView::region_sync_changed ()
 void
 RegionView::move (double x_delta, double y_delta)
 {
-       if (_region->locked() || (x_delta == 0 && y_delta == 0)) {
+       if (!_region->can_move() || (x_delta == 0 && y_delta == 0)) {
                return;
        }
 
@@ -494,6 +500,11 @@ RegionView::move (double x_delta, double y_delta)
        for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
                (*i)->group->move (x_delta, 0.0);
        }
+               
+       for (AutomationChildren::iterator i = _automation_children.begin();
+                       i != _automation_children.end(); ++i) {
+               i->second->get_canvas_group()->move(x_delta, 0.0);
+       }
 }
 
 void