basic xfade dragging
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 May 2012 00:46:22 +0000 (00:46 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 May 2012 00:46:22 +0000 (00:46 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@12236 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/audio_region_view.cc
gtk2_ardour/audio_region_view.h
gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_drag.h
gtk2_ardour/editor_mouse.cc

index 49bfd1bb0399c494b137c1bf064bedc44854a885..a50d4752f9aa9f042cab939e28a37e39f7552398 100644 (file)
@@ -1530,12 +1530,18 @@ void
 AudioRegionView::redraw_start_xfade ()
 {
        boost::shared_ptr<AudioRegion> ar (audio_region());
-       
+
        if (!ar->fade_in() || ar->fade_in()->empty()) {
                return;
        }
 
-       int32_t const npoints = trackview.editor().frame_to_pixel (ar->fade_in()->back()->when);
+       redraw_start_xfade_to (ar, ar->fade_in()->back()->when);
+}
+
+void
+AudioRegionView::redraw_start_xfade_to (boost::shared_ptr<AudioRegion> ar, framecnt_t len)
+{
+       int32_t const npoints = trackview.editor().frame_to_pixel (len);
 
        if (npoints < 3) {
                return;
@@ -1560,6 +1566,7 @@ AudioRegionView::redraw_start_xfade ()
                start_xfade_rect->property_fill_color_rgba() =  ARDOUR_UI::config()->canvasvar_ActiveCrossfade.get();
                start_xfade_rect->property_outline_pixels() = 0;
                start_xfade_rect->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_start_xfade_event), start_xfade_rect, this));
+               start_xfade_rect->set_data ("regionview", this);
        }
 
        Points* points = get_canvas_points ("xfade edit redraw", npoints);
@@ -1623,7 +1630,13 @@ AudioRegionView::redraw_end_xfade ()
                return;
        }
 
-       int32_t const npoints = trackview.editor().frame_to_pixel (ar->fade_out()->back()->when);
+       redraw_end_xfade_to (ar, ar->fade_out()->back()->when);
+}
+
+void
+AudioRegionView::redraw_end_xfade_to (boost::shared_ptr<AudioRegion> ar, framecnt_t len)
+{
+       int32_t const npoints = trackview.editor().frame_to_pixel (len);
 
        if (npoints < 3) {
                return;
@@ -1647,8 +1660,8 @@ AudioRegionView::redraw_end_xfade ()
                end_xfade_rect->property_fill() = true;;
                end_xfade_rect->property_fill_color_rgba() =  ARDOUR_UI::config()->canvasvar_ActiveCrossfade.get();
                end_xfade_rect->property_outline_pixels() = 0;
-
                end_xfade_rect->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_end_xfade_event), end_xfade_rect, this));
+               end_xfade_rect->set_data ("regionview", this);
        }
 
        Points* points = get_canvas_points ("xfade edit redraw", npoints);
@@ -1656,7 +1669,7 @@ AudioRegionView::redraw_end_xfade ()
 
        ar->fade_out()->curve().get_vector (0, ar->fade_out()->back()->when, vec.get(), npoints);
 
-       double rend = trackview.editor().frame_to_pixel (_region->length() - ar->fade_out()->back()->when);
+       double rend = trackview.editor().frame_to_pixel (_region->length() - len);
 
        for (int i = 0, pci = 0; i < npoints; ++i) {
                Gnome::Art::Point &p ((*points)[pci++]);
@@ -1706,6 +1719,7 @@ AudioRegionView::redraw_end_xfade ()
 
        delete points;
 }
+
 void
 AudioRegionView::drag_start ()
 {
@@ -1755,3 +1769,4 @@ AudioRegionView::drag_end ()
                end_xfade_rect->show ();
        }
 }
+
index 1b55a02e3cff29fc27050b0b5e88162d4ce12c6b..5c4769d412fa71c8a9375451919143bb2393406a 100644 (file)
@@ -120,6 +120,11 @@ class AudioRegionView : public RegionView
        void drag_start ();
        void drag_end ();
 
+       void redraw_start_xfade_to (boost::shared_ptr<ARDOUR::AudioRegion>, framecnt_t);
+       void redraw_end_xfade_to (boost::shared_ptr<ARDOUR::AudioRegion>, framecnt_t);
+       void redraw_start_xfade ();
+       void redraw_end_xfade ();
+
   protected:
 
        /* this constructor allows derived types
@@ -190,9 +195,6 @@ class AudioRegionView : public RegionView
 
        void transients_changed();
 
-       void redraw_start_xfade ();
-       void redraw_end_xfade ();
-
 private:
        void setup_fade_handle_positions ();
 
index 24891149820a8dedeb38d42d12d68eb334ed54bb..697122b1015b9d12cb7b696ed486e2859d58c1c4 100644 (file)
@@ -4576,15 +4576,60 @@ CrossfadeEdgeDrag::start_grab (GdkEvent* event, Gdk::Cursor *cursor)
 void
 CrossfadeEdgeDrag::motion (GdkEvent*, bool)
 {
+       double distance = _drags->current_pointer_x() - grab_x();
+       double new_length;
+       framecnt_t len;
+
+       boost::shared_ptr<AudioRegion> ar (arv->audio_region());
+
+       if (start) {
+               len = ar->fade_in()->back()->when;
+       } else {
+               len = ar->fade_out()->back()->when;
+       }
+
+       new_length = len + _editor->unit_to_frame (distance);
+       
+       if (start) {
+               arv->redraw_start_xfade_to (ar, new_length);
+       } else {
+               arv->redraw_end_xfade_to (ar, new_length);
+       }
+
+       // _editor->update_canvas_now ();
 }
 
 void
 CrossfadeEdgeDrag::finished (GdkEvent*, bool)
 {
+       double distance = _drags->current_pointer_x() - grab_x();
+       double new_length;
+       framecnt_t len;
+
+       boost::shared_ptr<AudioRegion> ar (arv->audio_region());
+
+       if (start) {
+               len = ar->fade_in()->back()->when;
+       } else {
+               len = ar->fade_out()->back()->when;
+       }
+
+       new_length = len + _editor->unit_to_frame (distance);
+       
+       if (start) {
+               ar->set_fade_in_length (new_length);
+       } else {
+               ar->set_fade_out_length (new_length);
+       }
 }
 
 void
 CrossfadeEdgeDrag::aborted (bool)
 {
+       if (start) {
+               arv->redraw_start_xfade ();
+       } else {
+               arv->redraw_end_xfade ();
+       }
 }
 
index 3c33e4de4854e4307928a017dd792ac16b5345f7..70ec45ac9925c7434dbb517be9947918d2ec0872 100644 (file)
@@ -985,10 +985,14 @@ class CrossfadeEdgeDrag : public Drag
        void finished (GdkEvent*, bool);
        void aborted (bool);
        
-       bool x_movement_matters () const {
+       bool y_movement_matters () const {
                return false;
        }
 
+       virtual std::pair<ARDOUR::framecnt_t, int> move_threshold () const {
+               return std::make_pair (1, 1);
+       }
+
   private:
        AudioRegionView* arv;
        bool start;
index a36e4a5df66734b7040679d2903084d51cfdb1b7..302387efc709bb41c359da9f7c9abbf17cc6a704 100644 (file)
@@ -940,7 +940,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                break;
 
                        case EndCrossFadeItem:
-                               _drags->set (new CrossfadeEdgeDrag (this, reinterpret_cast<AudioRegionView*>(item->get_data("regionview")), item, true), event, 0);
+                               _drags->set (new CrossfadeEdgeDrag (this, reinterpret_cast<AudioRegionView*>(item->get_data("regionview")), item, false), event, 0);
                                break;
 
                        case FeatureLineItem: