13
0

basic xfade dragging

git-svn-id: svn://localhost/ardour2/branches/3.0@12236 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2012-05-10 00:46:22 +00:00
parent 25655e1a6d
commit e3a9576aed
5 changed files with 76 additions and 10 deletions

View File

@ -1530,12 +1530,18 @@ void
AudioRegionView::redraw_start_xfade () AudioRegionView::redraw_start_xfade ()
{ {
boost::shared_ptr<AudioRegion> ar (audio_region()); boost::shared_ptr<AudioRegion> ar (audio_region());
if (!ar->fade_in() || ar->fade_in()->empty()) { if (!ar->fade_in() || ar->fade_in()->empty()) {
return; 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) { if (npoints < 3) {
return; 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_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_ActiveCrossfade.get();
start_xfade_rect->property_outline_pixels() = 0; 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->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); Points* points = get_canvas_points ("xfade edit redraw", npoints);
@ -1623,7 +1630,13 @@ AudioRegionView::redraw_end_xfade ()
return; 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) { if (npoints < 3) {
return; return;
@ -1647,8 +1660,8 @@ AudioRegionView::redraw_end_xfade ()
end_xfade_rect->property_fill() = true;; end_xfade_rect->property_fill() = true;;
end_xfade_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_ActiveCrossfade.get(); end_xfade_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_ActiveCrossfade.get();
end_xfade_rect->property_outline_pixels() = 0; 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->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); 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); 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) { for (int i = 0, pci = 0; i < npoints; ++i) {
Gnome::Art::Point &p ((*points)[pci++]); Gnome::Art::Point &p ((*points)[pci++]);
@ -1706,6 +1719,7 @@ AudioRegionView::redraw_end_xfade ()
delete points; delete points;
} }
void void
AudioRegionView::drag_start () AudioRegionView::drag_start ()
{ {
@ -1755,3 +1769,4 @@ AudioRegionView::drag_end ()
end_xfade_rect->show (); end_xfade_rect->show ();
} }
} }

View File

@ -120,6 +120,11 @@ class AudioRegionView : public RegionView
void drag_start (); void drag_start ();
void drag_end (); 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: protected:
/* this constructor allows derived types /* this constructor allows derived types
@ -190,9 +195,6 @@ class AudioRegionView : public RegionView
void transients_changed(); void transients_changed();
void redraw_start_xfade ();
void redraw_end_xfade ();
private: private:
void setup_fade_handle_positions (); void setup_fade_handle_positions ();

View File

@ -4576,15 +4576,60 @@ CrossfadeEdgeDrag::start_grab (GdkEvent* event, Gdk::Cursor *cursor)
void void
CrossfadeEdgeDrag::motion (GdkEvent*, bool) 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 void
CrossfadeEdgeDrag::finished (GdkEvent*, bool) 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 void
CrossfadeEdgeDrag::aborted (bool) CrossfadeEdgeDrag::aborted (bool)
{ {
if (start) {
arv->redraw_start_xfade ();
} else {
arv->redraw_end_xfade ();
}
} }

View File

@ -985,10 +985,14 @@ class CrossfadeEdgeDrag : public Drag
void finished (GdkEvent*, bool); void finished (GdkEvent*, bool);
void aborted (bool); void aborted (bool);
bool x_movement_matters () const { bool y_movement_matters () const {
return false; return false;
} }
virtual std::pair<ARDOUR::framecnt_t, int> move_threshold () const {
return std::make_pair (1, 1);
}
private: private:
AudioRegionView* arv; AudioRegionView* arv;
bool start; bool start;

View File

@ -940,7 +940,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break; break;
case EndCrossFadeItem: 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; break;
case FeatureLineItem: case FeatureLineItem: