diff options
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/audio_region_view.cc | 133 | ||||
-rw-r--r-- | gtk2_ardour/audio_region_view.h | 9 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor_canvas_events.cc | 20 | ||||
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 86 | ||||
-rw-r--r-- | gtk2_ardour/editor_drag.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/editor_items.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 30 | ||||
-rw-r--r-- | gtk2_ardour/public_editor.h | 4 |
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; |