mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
towards region-trims preserving fade duration
This commit is contained in:
parent
62e8d1a25f
commit
4843c5d5cf
9 changed files with 194 additions and 99 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
|
|
@ -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*);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -45,12 +45,14 @@ enum ItemType {
|
|||
AutomationTrackItem,
|
||||
FadeInItem,
|
||||
FadeInHandleItem,
|
||||
FadeInTrimHandleItem,
|
||||
FadeOutItem,
|
||||
FadeOutHandleItem,
|
||||
FadeOutTrimHandleItem,
|
||||
NoteItem,
|
||||
FeatureLineItem,
|
||||
LeftFrameHandle,
|
||||
RightFrameHandle,
|
||||
LeftFrameHandle,
|
||||
RightFrameHandle,
|
||||
StartCrossFadeItem,
|
||||
EndCrossFadeItem,
|
||||
CrossfadeViewItem,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue