From e3a9576aed924c40a1ac2c9b698433a84ced79aa Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 May 2012 00:46:22 +0000 Subject: basic xfade dragging git-svn-id: svn://localhost/ardour2/branches/3.0@12236 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_region_view.cc | 25 +++++++++++++++++----- gtk2_ardour/audio_region_view.h | 8 ++++--- gtk2_ardour/editor_drag.cc | 45 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/editor_drag.h | 6 +++++- gtk2_ardour/editor_mouse.cc | 2 +- 5 files changed, 76 insertions(+), 10 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 49bfd1bb03..a50d4752f9 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -1530,12 +1530,18 @@ void AudioRegionView::redraw_start_xfade () { boost::shared_ptr 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 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 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 (); } } + diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index 1b55a02e3c..5c4769d412 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -120,6 +120,11 @@ class AudioRegionView : public RegionView void drag_start (); void drag_end (); + void redraw_start_xfade_to (boost::shared_ptr, framecnt_t); + void redraw_end_xfade_to (boost::shared_ptr, 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 (); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 2489114982..697122b101 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -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 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 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 (); + } } diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 3c33e4de48..70ec45ac99 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -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 move_threshold () const { + return std::make_pair (1, 1); + } + private: AudioRegionView* arv; bool start; diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index a36e4a5df6..302387efc7 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -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(item->get_data("regionview")), item, true), event, 0); + _drags->set (new CrossfadeEdgeDrag (this, reinterpret_cast(item->get_data("regionview")), item, false), event, 0); break; case FeatureLineItem: -- cgit v1.2.3