Allow markers to be glued to bar/beat time. Fixes #1815.
[ardour.git] / gtk2_ardour / crossfade_view.cc
index e03c8ed478da2cda5ae81bdb6ccfd3301160bf7c..f77f8db44283cfb906b6f84cef307afb8da6798a 100644 (file)
@@ -25,6 +25,7 @@
 #include "canvas-simplerect.h"
 #include "canvas-curve.h"
 #include "crossfade_view.h"
+#include "gui_thread.h"
 #include "rgb_macros.h"
 #include "audio_time_axis.h"
 #include "public_editor.h"
 #include "canvas_impl.h"
 #include "ardour_ui.h"
 
-using namespace sigc;
 using namespace ARDOUR;
 using namespace PBD;
 using namespace Editing;
 using namespace Gnome;
 using namespace Canvas;
 
-sigc::signal<void,CrossfadeView*> CrossfadeView::GoingAway;
+PBD::Signal1<void,CrossfadeView*> CrossfadeView::CatchDeletion;
 
 CrossfadeView::CrossfadeView (ArdourCanvas::Group *parent,
                              RouteTimeAxisView &tv,
@@ -55,8 +55,7 @@ CrossfadeView::CrossfadeView (ArdourCanvas::Group *parent,
                            xf->length(), false, TimeAxisViewItem::Visibility (TimeAxisViewItem::ShowFrame)),
          crossfade (xf),
          left_view (lview),
-         right_view (rview)
-
+         right_view (rview)    
 {
        _valid = true;
        _visible = true;
@@ -69,28 +68,29 @@ CrossfadeView::CrossfadeView (ArdourCanvas::Group *parent,
        fade_out->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeLine.get();
        fade_out->property_width_pixels() = 1;
 
-       set_height (get_time_axis_view().current_height());
-
        /* no frame around the xfade or overlap rects */
 
        frame->property_outline_what() = 0;
 
        /* never show the vestigial frame */
-
        vestigial_frame->hide();
        show_vestigial = false;
 
-       group->signal_event().connect (bind (mem_fun (tv.editor(), &PublicEditor::canvas_crossfade_view_event), group, this));
+       group->signal_event().connect (sigc::bind (sigc::mem_fun (tv.editor(), &PublicEditor::canvas_crossfade_view_event), group, this));
 
-       crossfade_changed (Change (~0));
+       PropertyChange all_crossfade_properties;
+       all_crossfade_properties.add (ARDOUR::Properties::active);
+       all_crossfade_properties.add (ARDOUR::Properties::follow_overlap);
+       crossfade_changed (all_crossfade_properties);
 
-       crossfade->StateChanged.connect (mem_fun(*this, &CrossfadeView::crossfade_changed));
-       ColorsChanged.connect (mem_fun (*this, &CrossfadeView::color_handler));
+       crossfade->PropertyChanged.connect (*this, invalidator (*this), ui_bind (&CrossfadeView::crossfade_changed, this, _1), gui_context());
+       crossfade->FadesChanged.connect (*this, invalidator (*this), ui_bind (&CrossfadeView::crossfade_fades_changed, this), gui_context());
+       ColorsChanged.connect (sigc::mem_fun (*this, &CrossfadeView::color_handler));
 }
 
 CrossfadeView::~CrossfadeView ()
 {
-        GoingAway (this) ; /* EMIT_SIGNAL */
+        CatchDeletion (this) ; /* EMIT_SIGNAL */
 }
 
 void
@@ -107,27 +107,23 @@ CrossfadeView::reset_width_dependent_items (double pixel_width)
 }
 
 void
-CrossfadeView::set_height (double height)
+CrossfadeView::set_height (double h)
 {
-       double h = 0;
-       if (height <= TimeAxisView::hSmaller) {
-               h = height - 3;
-       } else {
-               h = height - NAME_HIGHLIGHT_SIZE - 3;
+       if (h > TimeAxisView::preset_height (HeightSmall)) {
+               h -= NAME_HIGHLIGHT_SIZE;
        }
 
        TimeAxisViewItem::set_height (h);
 
-       _height = h;
        redraw_curves ();
 }
 
 void
-CrossfadeView::crossfade_changed (Change what_changed)
+CrossfadeView::crossfade_changed (const PropertyChange& what_changed)
 {
        bool need_redraw_curves = false;
 
-       if (what_changed & BoundsChanged) {
+       if (what_changed.contains (ARDOUR::bounds_change)) {
                set_position (crossfade->position(), this);
                set_duration (crossfade->length(), this);
 
@@ -136,11 +132,11 @@ CrossfadeView::crossfade_changed (Change what_changed)
                need_redraw_curves = false;
        }
 
-       if (what_changed & Crossfade::FollowOverlapChanged) {
+       if (what_changed.contains (ARDOUR::Properties::follow_overlap)) {
                need_redraw_curves = true;
        }
 
-       if (what_changed & Crossfade::ActiveChanged) {
+       if (what_changed.contains (ARDOUR::Properties::active)) {
                /* calls redraw_curves */
                active_changed ();
        } else if (need_redraw_curves) {
@@ -186,17 +182,20 @@ CrossfadeView::redraw_curves ()
 
        for (int i = 0, pci = 0; i < npoints; ++i) {
                Art::Point &p = (*points)[pci++];
-               p.set_x(i);
-               p.set_y(2.0 + _height - (_height * vec[i]));
+               p.set_x (i + 1);
+               p.set_y (_height - ((_height - 2) * vec[i]));
        }
+       
        fade_in->property_points() = *points;
 
        crossfade->fade_out().curve().get_vector (0, crossfade->length(), vec, npoints);
+
        for (int i = 0, pci = 0; i < npoints; ++i) {
                Art::Point &p = (*points)[pci++];
-               p.set_x(i);
-               p.set_y(2.0 + _height - (_height * vec[i]));
+               p.set_x (i + 1);
+               p.set_y (_height - ((_height - 2) * vec[i]));
        }
+       
        fade_out->property_points() = *points;
 
        delete [] vec;
@@ -264,3 +263,8 @@ CrossfadeView::fake_hide ()
        group->hide();
 }
 
+void
+CrossfadeView::crossfade_fades_changed ()
+{
+       redraw_curves ();
+}