Fix restore of track visibility from state files (#3245)
[ardour.git] / gtk2_ardour / automation_region_view.cc
index a891feb2e194d162adedf7b43b13dc159547505c..45bd5d770bd89e4c4999f61f792d0fa58ce9cfac 100644 (file)
@@ -22,7 +22,9 @@
 #include "ardour/event_type_map.h"
 #include "ardour/session.h"
 #include "ardour/source.h"
+
 #include "automation_region_view.h"
+#include "gui_thread.h"
 #include "public_editor.h"
 
 #include "i18n.h"
@@ -59,7 +61,7 @@ AutomationRegionView::init (Gdk::Color const & basic_color, bool /*wfd*/)
 
        set_height (trackview.current_height());
 
-       _region->StateChanged.connect (sigc::mem_fun(*this, &AutomationRegionView::region_changed));
+       _region->PropertyChanged.connect (*this, invalidator (*this), ui_bind (&RegionView::region_changed, this, _1), gui_context());
 
        set_colors ();
 
@@ -83,16 +85,24 @@ bool
 AutomationRegionView::canvas_event(GdkEvent* ev)
 {
        if (ev->type == GDK_BUTTON_RELEASE) {
-               const nframes_t when = trackview.editor().pixel_to_frame((nframes_t)ev->button.x)
-                       - _region->position();
-               add_automation_event(ev, when, ev->button.y);
+
+               double x = ev->button.x;
+               double y = ev->button.y;
+
+               /* convert to item coordinates in the time axis view */
+               automation_view()->canvas_display()->w2i (x, y);
+
+               add_automation_event (ev, trackview.editor().pixel_to_frame (x) - _region->position(), y);
        }
 
        return false;
 }
 
+/** @param when Position in frames, where 0 is the start of the region.
+ *  @param y y position, relative to our TimeAxisView.
+ */
 void
-AutomationRegionView::add_automation_event (GdkEvent* /*event*/, nframes_t when, double y)
+AutomationRegionView::add_automation_event (GdkEvent *, nframes_t when, double y)
 {
        if (!_line) {
                boost::shared_ptr<Evoral::Control> c = _region->control(_parameter, true);
@@ -103,11 +113,8 @@ AutomationRegionView::add_automation_event (GdkEvent* /*event*/, nframes_t when,
        }
        assert(_line);
 
-       double x = when;
-       AutomationTimeAxisView* const view = automation_view();
-
-       view->canvas_display()->w2i (x, y);
-
+       AutomationTimeAxisView* const view = automation_view ();
+       
        /* compute vertical fractional position */
 
        const double h = trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 2;
@@ -115,18 +122,19 @@ AutomationRegionView::add_automation_event (GdkEvent* /*event*/, nframes_t when,
 
        /* map using line */
 
-       _line->view_to_model_coord (x, y);
+       double when_d = when;
+       _line->view_to_model_coord (when_d, y);
 
-       view->session().begin_reversible_command (_("add automation event"));
+       view->session()->begin_reversible_command (_("add automation event"));
        XMLNode& before = _line->the_list()->get_state();
 
-       _line->the_list()->add (x, y);
+       _line->the_list()->add (when_d, y);
 
        XMLNode& after = _line->the_list()->get_state();
-       view->session().commit_reversible_command (new MementoCommand<ARDOUR::AutomationList>(
+       view->session()->commit_reversible_command (new MementoCommand<ARDOUR::AutomationList>(
                        *_line->the_list(), &before, &after));
 
-       view->session().set_dirty ();
+       view->session()->set_dirty ();
 }
 
 void
@@ -156,7 +164,7 @@ AutomationRegionView::reset_width_dependent_items (double pixel_width)
 
 
 void
-AutomationRegionView::region_resized (ARDOUR::Change what_changed)
+AutomationRegionView::region_resized (const PBD::PropertyChange& what_changed)
 {
        RegionView::region_resized(what_changed);