summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/audio_region_view.cc133
-rw-r--r--gtk2_ardour/audio_region_view.h9
-rw-r--r--gtk2_ardour/editor.h4
-rw-r--r--gtk2_ardour/editor_canvas_events.cc20
-rw-r--r--gtk2_ardour/editor_drag.cc86
-rw-r--r--gtk2_ardour/editor_drag.h1
-rw-r--r--gtk2_ardour/editor_items.h6
-rw-r--r--gtk2_ardour/editor_mouse.cc30
-rw-r--r--gtk2_ardour/public_editor.h4
9 files changed, 194 insertions, 99 deletions
diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc
index 076e961c76..917b80be63 100644
--- a/gtk2_ardour/audio_region_view.cc
+++ b/gtk2_ardour/audio_region_view.cc
@@ -81,6 +81,8 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView
, sync_mark(0)
, fade_in_handle(0)
, fade_out_handle(0)
+ , fade_in_trim_handle(0)
+ , fade_out_trim_handle(0)
, start_xfade_curve (0)
, start_xfade_rect (0)
, _start_xfade_visible (false)
@@ -99,6 +101,8 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView
, sync_mark(0)
, fade_in_handle(0)
, fade_out_handle(0)
+ , fade_in_trim_handle(0)
+ , fade_out_trim_handle(0)
, start_xfade_curve (0)
, start_xfade_rect (0)
, _start_xfade_visible (false)
@@ -115,6 +119,8 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt
: RegionView (other, boost::shared_ptr<Region> (other_region))
, fade_in_handle(0)
, fade_out_handle(0)
+ , fade_in_trim_handle(0)
+ , fade_out_trim_handle(0)
, start_xfade_curve (0)
, start_xfade_rect (0)
, _start_xfade_visible (false)
@@ -163,6 +169,20 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd)
fade_out_handle->set_fill_color (ARDOUR_UI::config()->get_canvasvar_InactiveFadeHandle());
fade_out_handle->set_data ("regionview", this);
fade_out_handle->hide ();
+
+ fade_in_trim_handle = new ArdourCanvas::Rectangle (group);
+ CANVAS_DEBUG_NAME (fade_in_handle, string_compose ("fade in trim handle for %1", region()->name()));
+ fade_in_trim_handle->set_outline_color (RGBA_TO_UINT (0, 0, 0, 255));
+ fade_in_trim_handle->set_fill_color (ARDOUR_UI::config()->get_canvasvar_InactiveFadeHandle());
+ fade_in_trim_handle->set_data ("regionview", this);
+ fade_in_trim_handle->hide ();
+
+ fade_out_trim_handle = new ArdourCanvas::Rectangle (group);
+ CANVAS_DEBUG_NAME (fade_out_handle, string_compose ("fade out trim handle for %1", region()->name()));
+ fade_out_trim_handle->set_outline_color (RGBA_TO_UINT (0, 0, 0, 255));
+ fade_out_trim_handle->set_fill_color (ARDOUR_UI::config()->get_canvasvar_InactiveFadeHandle());
+ fade_out_trim_handle->set_data ("regionview", this);
+ fade_out_trim_handle->hide ();
}
setup_fade_handle_positions ();
@@ -199,11 +219,19 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd)
reset_width_dependent_items (_pixel_width);
if (fade_in_handle) {
- fade_in_handle->Event.connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_in_handle_event), fade_in_handle, this));
+ fade_in_handle->Event.connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_in_handle_event), fade_in_handle, this, false));
}
if (fade_out_handle) {
- fade_out_handle->Event.connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_out_handle_event), fade_out_handle, this));
+ fade_out_handle->Event.connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_out_handle_event), fade_out_handle, this, false));
+ }
+
+ if (fade_in_trim_handle) {
+ fade_in_trim_handle->Event.connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_in_handle_event), fade_in_trim_handle, this, true));
+ }
+
+ if (fade_out_trim_handle) {
+ fade_out_trim_handle->Event.connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_out_handle_event), fade_out_trim_handle, this, true));
}
set_colors ();
@@ -384,14 +412,11 @@ AudioRegionView::reset_width_dependent_items (double pixel_width)
RegionView::reset_width_dependent_items(pixel_width);
assert(_pixel_width == pixel_width);
- if (fade_in_handle) {
- if (pixel_width <= 6.0 || _height < 5.0 || !trackview.session()->config.get_show_region_fades()) {
- fade_in_handle->hide();
- fade_out_handle->hide();
- } else {
- //fade_in_handle->show();
- //fade_out_handle->show();
- }
+ if (pixel_width <= 6.0 || _height < 5.0 || !trackview.session()->config.get_show_region_fades()) {
+ if (fade_in_handle) { fade_in_handle->hide(); }
+ if (fade_out_handle) { fade_out_handle->hide(); }
+ if (fade_in_trim_handle) { fade_in_trim_handle->hide(); }
+ if (fade_out_trim_handle) { fade_out_trim_handle->hide(); }
}
AnalysisFeatureList analysis_features = _region->transients();
@@ -437,6 +462,16 @@ AudioRegionView::setup_fade_handle_positions()
fade_out_handle->set_y0 (handle_pos);
fade_out_handle->set_y1 (handle_pos + handle_size);
}
+
+ if (fade_in_trim_handle) {
+ fade_in_trim_handle->set_y0 (_height - handle_size);
+ fade_in_trim_handle->set_y1 (_height);
+ }
+
+ if (fade_out_trim_handle) {
+ fade_out_trim_handle->set_y0 (_height - handle_size );
+ fade_out_trim_handle->set_y1 (_height);
+ }
}
void
@@ -498,8 +533,8 @@ AudioRegionView::set_height (gdouble height)
void
AudioRegionView::reset_fade_shapes ()
{
- reset_fade_in_shape ();
- reset_fade_out_shape ();
+ if (!trim_fade_in_drag_active) { reset_fade_in_shape (); }
+ if (!trim_fade_out_drag_active) { reset_fade_out_shape (); }
}
void
@@ -509,8 +544,9 @@ AudioRegionView::reset_fade_in_shape ()
}
void
-AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr<AudioRegion> ar, framecnt_t width)
+AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr<AudioRegion> ar, framecnt_t width, bool drag_active)
{
+ trim_fade_in_drag_active = drag_active;
if (fade_in_handle == 0) {
return;
}
@@ -527,6 +563,11 @@ AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr<AudioRegion> ar, f
fade_in_handle->set_x0 (handle_left);
fade_in_handle->set_x1 (handle_left + handle_size);
+ if (fade_in_trim_handle) {
+ fade_in_trim_handle->set_x0 (0);
+ fade_in_trim_handle->set_x1 (handle_size);
+ }
+
if (pwidth < 5) {
hide_start_xfade();
return;
@@ -579,8 +620,9 @@ AudioRegionView::reset_fade_out_shape ()
}
void
-AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr<AudioRegion> ar, framecnt_t width)
+AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr<AudioRegion> ar, framecnt_t width, bool drag_active)
{
+ trim_fade_out_drag_active = drag_active;
if (fade_out_handle == 0) {
return;
}
@@ -596,11 +638,16 @@ AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr<AudioRegion> ar,
*/
double const handle_right = rint(trackview.editor().sample_to_pixel (_region->length()) + TimeAxisViewItem::RIGHT_EDGE_SHIFT - pwidth);
+ double const trim_handle_right = rint(trackview.editor().sample_to_pixel (_region->length()) + TimeAxisViewItem::RIGHT_EDGE_SHIFT);
/* Put the fade out handle so that its right side is at the end-of-fade line;
*/
fade_out_handle->set_x0 (1 + handle_right - handle_size);
fade_out_handle->set_x1 (1 + handle_right);
+ if (fade_out_trim_handle) {
+ fade_out_trim_handle->set_x0 (1 + trim_handle_right - handle_size);
+ fade_out_trim_handle->set_x1 (1 + trim_handle_right);
+ }
/* don't show shape if its too small */
@@ -1262,11 +1309,23 @@ AudioRegionView::entered (bool internal_editing)
gain_line->add_visibility (AutomationLine::ControlPoints);
}
- if (fade_in_handle && !internal_editing) {
- fade_in_handle->show ();
- fade_out_handle->show ();
- fade_out_handle->raise_to_top ();
- fade_in_handle->raise_to_top ();
+ if (!internal_editing) {
+ if (fade_in_handle) {
+ fade_in_handle->show ();
+ fade_in_handle->raise_to_top ();
+ }
+ if (fade_out_handle) {
+ fade_out_handle->show ();
+ fade_out_handle->raise_to_top ();
+ }
+ if (fade_in_trim_handle) {
+ fade_in_trim_handle->show ();
+ fade_in_trim_handle->raise_to_top ();
+ }
+ if (fade_out_trim_handle) {
+ fade_out_trim_handle->show ();
+ fade_out_trim_handle->raise_to_top ();
+ }
}
}
@@ -1280,10 +1339,10 @@ AudioRegionView::exited ()
gain_line->remove_visibility (AutomationLine::ControlPoints);
}
- if (fade_in_handle) {
- fade_in_handle->hide ();
- fade_out_handle->hide ();
- }
+ if (fade_in_handle) { fade_in_handle->hide(); }
+ if (fade_out_handle) { fade_out_handle->hide(); }
+ if (fade_in_trim_handle) { fade_in_trim_handle->hide(); }
+ if (fade_out_trim_handle) { fade_out_trim_handle->hide(); }
}
void
@@ -1397,19 +1456,15 @@ void
AudioRegionView::set_fade_visibility (bool yn)
{
if (yn) {
- if (fade_in_handle) {
- fade_in_handle->show ();
- }
- if (fade_out_handle) {
- fade_out_handle->show ();
- }
+ if (fade_in_handle) { fade_in_handle->show(); }
+ if (fade_out_handle) { fade_out_handle->show(); }
+ if (fade_in_trim_handle) { fade_in_trim_handle->show(); }
+ if (fade_out_trim_handle) { fade_out_trim_handle->show(); }
} else {
- if (fade_in_handle) {
- fade_in_handle->hide ();
- }
- if (fade_out_handle) {
- fade_out_handle->hide ();
- }
+ if (fade_in_handle) { fade_in_handle->hide(); }
+ if (fade_out_handle) { fade_out_handle->hide(); }
+ if (fade_in_trim_handle) { fade_in_trim_handle->hide(); }
+ if (fade_out_trim_handle) { fade_out_trim_handle->hide(); }
}
}
@@ -1418,10 +1473,10 @@ AudioRegionView::update_coverage_frames (LayerDisplay d)
{
RegionView::update_coverage_frames (d);
- if (fade_in_handle) {
- fade_in_handle->raise_to_top ();
- fade_out_handle->raise_to_top ();
- }
+ if (fade_in_handle) { fade_in_handle->raise_to_top (); }
+ if (fade_out_handle) { fade_out_handle->raise_to_top (); }
+ if (fade_in_trim_handle) { fade_in_trim_handle->raise_to_top (); }
+ if (fade_out_trim_handle) { fade_out_trim_handle->raise_to_top (); }
}
void
diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h
index eeb5a37b5b..550632dc67 100644
--- a/gtk2_ardour/audio_region_view.h
+++ b/gtk2_ardour/audio_region_view.h
@@ -95,8 +95,8 @@ class AudioRegionView : public RegionView
GhostRegion* add_ghost (TimeAxisView&);
- void reset_fade_in_shape_width (boost::shared_ptr<ARDOUR::AudioRegion> ar, framecnt_t);
- void reset_fade_out_shape_width (boost::shared_ptr<ARDOUR::AudioRegion> ar, framecnt_t);
+ void reset_fade_in_shape_width (boost::shared_ptr<ARDOUR::AudioRegion> ar, framecnt_t, bool drag_active = false);
+ void reset_fade_out_shape_width (boost::shared_ptr<ARDOUR::AudioRegion> ar, framecnt_t, bool drag_active = false);
framepos_t get_fade_in_shape_width ();
framepos_t get_fade_out_shape_width ();
@@ -158,6 +158,8 @@ class AudioRegionView : public RegionView
ArdourCanvas::Polygon* sync_mark; ///< polgyon for sync position
ArdourCanvas::Rectangle* fade_in_handle; ///< fade in handle, or 0
ArdourCanvas::Rectangle* fade_out_handle; ///< fade out handle, or 0
+ ArdourCanvas::Rectangle* fade_in_trim_handle; ///< fade in trim handle, or 0
+ ArdourCanvas::Rectangle* fade_out_trim_handle; ///< fade out trim handle, or 0
ArdourCanvas::XFadeCurve* start_xfade_curve;
ArdourCanvas::Rectangle* start_xfade_rect;
@@ -217,6 +219,9 @@ private:
* first list is for start xfades, second list is for end xfades.
*/
std::pair<std::list<AudioRegionView*>, std::list<AudioRegionView*> > _hidden_xfades;
+
+ bool trim_fade_in_drag_active;
+ bool trim_fade_out_drag_active;
};
#endif /* __gtk_ardour_audio_region_view_h__ */
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 829a2866d2..4653ccc6b4 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -1400,9 +1400,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool canvas_start_xfade_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
bool canvas_end_xfade_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
bool canvas_fade_in_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
- bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
+ bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*, bool trim = false);
bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
- bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
+ bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*, bool trim = false);
bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
bool canvas_frame_handle_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc
index 864624a690..36d9ee98ea 100644
--- a/gtk2_ardour/editor_canvas_events.cc
+++ b/gtk2_ardour/editor_canvas_events.cc
@@ -477,7 +477,7 @@ Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRe
}
bool
-Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
+Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv, bool trim)
{
bool ret = false;
@@ -493,11 +493,11 @@ Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item,
clicked_control_point = 0;
clicked_axisview = &rv->get_time_axis_view();
clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
- ret = button_press_handler (item, event, FadeInHandleItem);
+ ret = button_press_handler (item, event, trim ? FadeInTrimHandleItem : FadeInHandleItem);
break;
case GDK_BUTTON_RELEASE:
- ret = button_release_handler (item, event, FadeInHandleItem);
+ ret = button_release_handler (item, event, trim ? FadeInTrimHandleItem : FadeInHandleItem);
maybe_locate_with_edit_preroll ( rv->region()->position() );
break;
@@ -506,11 +506,11 @@ Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item,
break;
case GDK_ENTER_NOTIFY:
- ret = enter_handler (item, event, FadeInHandleItem);
+ ret = enter_handler (item, event, trim ? FadeInTrimHandleItem : FadeInHandleItem);
break;
case GDK_LEAVE_NOTIFY:
- ret = leave_handler (item, event, FadeInHandleItem);
+ ret = leave_handler (item, event, trim ? FadeInTrimHandleItem : FadeInHandleItem);
break;
default:
@@ -561,7 +561,7 @@ Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioR
}
bool
-Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
+Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv, bool trim)
{
bool ret = false;
@@ -577,11 +577,11 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item,
clicked_control_point = 0;
clicked_axisview = &rv->get_time_axis_view();
clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
- ret = button_press_handler (item, event, FadeOutHandleItem);
+ ret = button_press_handler (item, event, trim ? FadeOutTrimHandleItem : FadeOutHandleItem);
break;
case GDK_BUTTON_RELEASE:
- ret = button_release_handler (item, event, FadeOutHandleItem);
+ ret = button_release_handler (item, event, trim ? FadeOutTrimHandleItem : FadeOutHandleItem);
maybe_locate_with_edit_preroll ( rv->region()->last_frame() - rv->get_fade_out_shape_width() );
break;
@@ -590,11 +590,11 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item,
break;
case GDK_ENTER_NOTIFY:
- ret = enter_handler (item, event, FadeOutHandleItem);
+ ret = enter_handler (item, event, trim ? FadeOutTrimHandleItem : FadeOutHandleItem);
break;
case GDK_LEAVE_NOTIFY:
- ret = leave_handler (item, event, FadeOutHandleItem);
+ ret = leave_handler (item, event, trim ? FadeOutTrimHandleItem : FadeOutHandleItem);
break;
default:
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 8869df8cfb..7fee5d25ac 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -1925,7 +1925,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
speed = tv->track()->speed();
}
- framecnt_t const dt = adjusted_current_frame (event) - raw_grab_frame () + _pointer_frame_offset;
+ framecnt_t dt = adjusted_current_frame (event) - raw_grab_frame () + _pointer_frame_offset;
if (first_move) {
@@ -1941,6 +1941,9 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
case ContentsTrim:
trim_type = "Region content trim";
break;
+ default:
+ assert(0);
+ break;
}
_editor->begin_reversible_command (trim_type);
@@ -1973,42 +1976,65 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
non_overlap_trim = true;
}
+ /* contstrain trim to fade length */
+ if (_preserve_fade_anchor) {
+ switch (_operation) {
+ case StartTrim:
+ for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
+ if (!arv) continue;
+ boost::shared_ptr<AudioRegion> ar (arv->audio_region());
+ if (ar->locked()) continue;
+ framecnt_t len = ar->fade_in()->back()->when;
+ if (len < dt) dt = min(dt, len);
+ }
+ break;
+ case EndTrim:
+ for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
+ if (!arv) continue;
+ boost::shared_ptr<AudioRegion> ar (arv->audio_region());
+ if (ar->locked()) continue;
+ framecnt_t len = ar->fade_out()->back()->when;
+ if (len < -dt) dt = max(dt, -len);
+ }
+ break;
+ case ContentsTrim:
+ break;
+ }
+ }
+
+
switch (_operation) {
case StartTrim:
- for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
bool changed = i->view->trim_front (i->initial_position + dt, non_overlap_trim);
if (changed && _preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
if (arv) {
- double distance;
- double new_length;
- framecnt_t len;
boost::shared_ptr<AudioRegion> ar (arv->audio_region());
- distance = _drags->current_pointer_x() - grab_x();
- len = ar->fade_in()->back()->when;
- new_length = len - _editor->pixel_to_sample (distance);
- new_length = ar->verify_xfade_bounds (new_length, true /*START*/ );
- arv->reset_fade_in_shape_width (ar, new_length); //the grey shape
+ framecnt_t len = ar->fade_in()->back()->when;
+ framecnt_t diff = ar->first_frame() - i->initial_position;
+ double new_length = len - diff;
+ i->anchored_fade_length = ar->verify_xfade_bounds (new_length, true /*START*/ );
+ arv->reset_fade_in_shape_width (ar, i->anchored_fade_length, true);
}
}
}
break;
case EndTrim:
- for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
+ for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
bool changed = i->view->trim_end (i->initial_end + dt, non_overlap_trim);
if (changed && _preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
if (arv) {
- double distance;
- double new_length;
- framecnt_t len;
boost::shared_ptr<AudioRegion> ar (arv->audio_region());
- distance = grab_x() - _drags->current_pointer_x();
- len = ar->fade_out()->back()->when;
- new_length = len - _editor->pixel_to_sample (distance);
- new_length = ar->verify_xfade_bounds (new_length, false /*END*/ );
- arv->reset_fade_out_shape_width (ar, new_length); //the grey shape
+ framecnt_t len = ar->fade_out()->back()->when;
+ framecnt_t diff = 1 + ar->last_frame() - i->initial_end;
+ double new_length = len + diff;
+ i->anchored_fade_length = ar->verify_xfade_bounds (new_length, false /*END*/ );
+ arv->reset_fade_out_shape_width (ar, i->anchored_fade_length, true);
}
}
}
@@ -2057,15 +2083,10 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred)
if (_preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
if (arv) {
- double distance;
- double new_length;
- framecnt_t len;
boost::shared_ptr<AudioRegion> ar (arv->audio_region());
- distance = _drags->current_pointer_x() - grab_x();
- len = ar->fade_in()->back()->when;
- new_length = len - _editor->pixel_to_sample (distance);
- new_length = ar->verify_xfade_bounds (new_length, true /*START*/ );
- ar->set_fade_in_length(new_length);
+ arv->reset_fade_in_shape_width (ar, i->anchored_fade_length);
+ ar->set_fade_in_length(i->anchored_fade_length);
+ ar->set_fade_in_active(true);
}
}
if (_jump_position_when_done) {
@@ -2077,15 +2098,10 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred)
if (_preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
if (arv) {
- double distance;
- double new_length;
- framecnt_t len;
boost::shared_ptr<AudioRegion> ar (arv->audio_region());
- distance = _drags->current_pointer_x() - grab_x();
- len = ar->fade_out()->back()->when;
- new_length = len - _editor->pixel_to_sample (distance);
- new_length = ar->verify_xfade_bounds (new_length, false /*END*/ );
- ar->set_fade_out_length(new_length);
+ arv->reset_fade_out_shape_width (ar, i->anchored_fade_length);
+ ar->set_fade_out_length(i->anchored_fade_length);
+ ar->set_fade_out_active(true);
}
}
if (_jump_position_when_done) {
diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h
index 7907701e63..b67c7ae5f6 100644
--- a/gtk2_ardour/editor_drag.h
+++ b/gtk2_ardour/editor_drag.h
@@ -261,6 +261,7 @@ public:
double initial_y; ///< the initial y position of the view before any reparenting
framepos_t initial_position; ///< initial position of the region
framepos_t initial_end; ///< initial end position of the region
+ double anchored_fade_length; ///< fade_length when anchored during drag
boost::shared_ptr<ARDOUR::Playlist> initial_playlist;
};
diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h
index fb1995659c..0e5f367d51 100644
--- a/gtk2_ardour/editor_items.h
+++ b/gtk2_ardour/editor_items.h
@@ -45,12 +45,14 @@ enum ItemType {
AutomationTrackItem,
FadeInItem,
FadeInHandleItem,
+ FadeInTrimHandleItem,
FadeOutItem,
FadeOutHandleItem,
+ FadeOutTrimHandleItem,
NoteItem,
FeatureLineItem,
- LeftFrameHandle,
- RightFrameHandle,
+ LeftFrameHandle,
+ RightFrameHandle,
StartCrossFadeItem,
EndCrossFadeItem,
CrossfadeViewItem,
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index 68f859299e..7f237c7017 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -692,8 +692,10 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
break;
case FadeInHandleItem:
+ case FadeInTrimHandleItem:
case FadeInItem:
case FadeOutHandleItem:
+ case FadeOutTrimHandleItem:
case FadeOutItem:
case StartCrossFadeItem:
case EndCrossFadeItem:
@@ -1046,13 +1048,21 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case RegionViewNameHighlight:
case LeftFrameHandle:
- case RightFrameHandle:
+ case RightFrameHandle:
if (!clicked_regionview->region()->locked()) {
_drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
return true;
}
break;
+ case FadeInTrimHandleItem:
+ case FadeOutTrimHandleItem:
+ if (!clicked_regionview->region()->locked()) {
+ _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer(), true), event);
+ return true;
+ }
+ break;
+
case RegionViewName:
{
/* rename happens on edit clicks */
@@ -1272,12 +1282,12 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
switch (item_type) {
case RegionViewNameHighlight:
- _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
- return true;
- break;
+ _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
+ return true;
+ break;
- case LeftFrameHandle:
- case RightFrameHandle:
+ case LeftFrameHandle:
+ case RightFrameHandle:
if (!internal_editing ()) {
_drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
}
@@ -1558,12 +1568,14 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
switch (item_type) {
case FadeInItem:
case FadeInHandleItem:
+ case FadeInTrimHandleItem:
case StartCrossFadeItem:
popup_xfade_in_context_menu (1, event->button.time, item, item_type);
break;
case FadeOutItem:
case FadeOutHandleItem:
+ case FadeOutTrimHandleItem:
case EndCrossFadeItem:
popup_xfade_out_context_menu (1, event->button.time, item, item_type);
break;
@@ -1898,7 +1910,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
if (is_drawable() && effective_mouse_mode() == MouseObject && !internal_editing() && entered_regionview) {
set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
}
- break;
+ break;
case RegionItem:
switch (effective_mouse_mode()) {
@@ -1999,6 +2011,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
}
break;
+ case FadeInTrimHandleItem:
case FadeInHandleItem:
if (mouse_mode == MouseObject && !internal_editing()) {
ArdourCanvas::Rectangle *rect = dynamic_cast<ArdourCanvas::Rectangle *> (item);
@@ -2010,6 +2023,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
}
break;
+ case FadeOutTrimHandleItem:
case FadeOutHandleItem:
if (mouse_mode == MouseObject && !internal_editing()) {
ArdourCanvas::Rectangle *rect = dynamic_cast<ArdourCanvas::Rectangle *> (item);
@@ -2085,6 +2099,8 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
case StartSelectionTrimItem:
case EndSelectionTrimItem:
case PlayheadCursorItem:
+ case FadeInTrimHandleItem:
+ case FadeOutTrimHandleItem:
_over_region_trim_target = false;
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index f3b76e9310..84e913b74b 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -326,9 +326,9 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual bool canvas_start_xfade_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
virtual bool canvas_end_xfade_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
virtual bool canvas_fade_in_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
- virtual bool canvas_fade_in_handle_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
+ virtual bool canvas_fade_in_handle_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*, bool) = 0;
virtual bool canvas_fade_out_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
- virtual bool canvas_fade_out_handle_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
+ virtual bool canvas_fade_out_handle_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*, bool) = 0;
virtual bool canvas_region_view_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
virtual bool canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
virtual bool canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;