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;
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);
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;
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);
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++]);
delete points;
}
+
void
AudioRegionView::drag_start ()
{
end_xfade_rect->show ();
}
}
+
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
void transients_changed();
- void redraw_start_xfade ();
- void redraw_end_xfade ();
-
private:
void setup_fade_handle_positions ();
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 ();
+ }
}
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;
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: