X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Faudio_region_view.cc;h=c6e42c0a4bd280a1da4a7ad14349363f6669fe8e;hb=b84e1a50a3a4508b2070fe0848085db31f8cfa69;hp=a5688b9fc1872807914ccf142b476ad5a526f1a7;hpb=392a7fd2384ef2f77742b34b3b941b37ee505449;p=ardour.git diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index a5688b9fc1..c6e42c0a4b 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -20,7 +20,7 @@ #include #include -#include +#include #include @@ -66,6 +66,7 @@ using namespace Editing; using namespace ArdourCanvas; static const int32_t sync_mark_width = 9; +static double const handle_size = 6; /* height of fade handles */ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr r, double spu, Gdk::Color const & basic_color) @@ -75,7 +76,6 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , fade_out_shape(0) , fade_in_handle(0) , fade_out_handle(0) - , fade_position_line(0) , start_xfade_in (0) , start_xfade_out (0) , start_xfade_rect (0) @@ -98,7 +98,6 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , fade_out_shape(0) , fade_in_handle(0) , fade_out_handle(0) - , fade_position_line(0) , start_xfade_in (0) , start_xfade_out (0) , start_xfade_rect (0) @@ -119,7 +118,6 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt , fade_out_shape(0) , fade_in_handle(0) , fade_out_handle(0) - , fade_position_line(0) , start_xfade_in (0) , start_xfade_out (0) , start_xfade_rect (0) @@ -167,22 +165,15 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd) if (!_recregion) { fade_in_handle = new ArdourCanvas::SimpleRect (*group); fade_in_handle->property_fill_color_rgba() = UINT_RGBA_CHANGE_A (fill_color, 0); - fade_in_handle->property_outline_pixels() = 0; + fade_in_handle->property_outline_color_rgba() = RGBA_TO_UINT (0, 0, 0, 0); fade_in_handle->set_data ("regionview", this); fade_out_handle = new ArdourCanvas::SimpleRect (*group); fade_out_handle->property_fill_color_rgba() = UINT_RGBA_CHANGE_A (fill_color, 0); - fade_out_handle->property_outline_pixels() = 0; + fade_out_handle->property_outline_color_rgba() = RGBA_TO_UINT (0, 0, 0, 0); fade_out_handle->set_data ("regionview", this); - - fade_position_line = new ArdourCanvas::SimpleLine (*group); - fade_position_line->property_color_rgba() = 0xBBBBBBAA; - fade_position_line->property_y1() = 7; - fade_position_line->property_y2() = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1; - - fade_position_line->hide(); } setup_fade_handle_positions (); @@ -266,7 +257,6 @@ void AudioRegionView::region_changed (const PropertyChange& what_changed) { ENSURE_GUI_THREAD (*this, &AudioRegionView::region_changed, what_changed); - // cerr << "AudioRegionView::region_changed() called" << endl; RegionView::region_changed (what_changed); @@ -454,17 +444,15 @@ AudioRegionView::setup_fade_handle_positions() { /* position of fade handle offset from the top of the region view */ double const handle_pos = 2; - /* height of fade handles */ - double const handle_height = 5; if (fade_in_handle) { fade_in_handle->property_y1() = handle_pos; - fade_in_handle->property_y2() = handle_pos + handle_height; + fade_in_handle->property_y2() = handle_pos + handle_size; } if (fade_out_handle) { fade_out_handle->property_y1() = handle_pos; - fade_out_handle->property_y2() = handle_pos + handle_height; + fade_out_handle->property_y2() = handle_pos + handle_size; } } @@ -518,16 +506,6 @@ AudioRegionView::set_height (gdouble height) (*l).second->property_points() = points; } - if (fade_position_line) { - - if (height < NAME_HIGHLIGHT_THRESH) { - fade_position_line->property_y2() = _height - 1; - } - else { - fade_position_line->property_y2() = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1; - } - } - if (name_pixbuf) { name_pixbuf->raise_to_top(); } @@ -543,32 +521,12 @@ AudioRegionView::reset_fade_shapes () void AudioRegionView::reset_fade_in_shape () { - reset_fade_in_shape_width ((framecnt_t) audio_region()->fade_in()->back()->when); + reset_fade_in_shape_width (audio_region(), (framecnt_t) audio_region()->fade_in()->back()->when); } void -AudioRegionView::reset_fade_in_shape_width (framecnt_t width) +AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr ar, framecnt_t width) { - if (dragging()) { - return; - } - - if (audio_region()->fade_in_is_xfade()) { - if (fade_in_handle) { - fade_in_handle->hide (); - fade_in_shape->hide (); - } - redraw_start_xfade (); - return; - } else { - if (start_xfade_in) { - start_xfade_in->hide (); - start_xfade_out->hide (); - start_xfade_rect->hide (); - _start_xfade_visible = false; - } - } - if (fade_in_handle == 0) { return; } @@ -586,19 +544,14 @@ AudioRegionView::reset_fade_in_shape_width (framecnt_t width) uint32_t npoints = std::min (gdk_screen_width(), (int) pwidth); double h; - if (_height < 5) { - fade_in_shape->hide(); - fade_in_handle->hide(); - return; - } - double const handle_center = pwidth; /* Put the fade in handle so that its left side is at the end-of-fade line */ fade_in_handle->property_x1() = handle_center; - fade_in_handle->property_x2() = handle_center + 6; + fade_in_handle->property_x2() = handle_center + handle_size; if (pwidth < 5) { + hide_start_xfade(); fade_in_shape->hide(); return; } @@ -615,7 +568,7 @@ AudioRegionView::reset_fade_in_shape_width (framecnt_t width) if (_height >= NAME_HIGHLIGHT_THRESH) { h = _height - NAME_HIGHLIGHT_SIZE - 2; } else { - h = _height; + h = _height - 2; } /* points *MUST* be in anti-clockwise order */ @@ -643,42 +596,24 @@ AudioRegionView::reset_fade_in_shape_width (framecnt_t width) fade_in_shape->property_points() = *points; delete points; + redraw_start_xfade_to ( ar, width); + /* ensure trim handle stays on top */ if (frame_handle_start) { frame_handle_start->raise_to_top(); } + } void AudioRegionView::reset_fade_out_shape () { - reset_fade_out_shape_width ((framecnt_t) audio_region()->fade_out()->back()->when); + reset_fade_out_shape_width (audio_region(), (framecnt_t) audio_region()->fade_out()->back()->when); } void -AudioRegionView::reset_fade_out_shape_width (framecnt_t width) +AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr ar, framecnt_t width) { - if (dragging() && audio_region()->fade_out_is_xfade()) { - /* we hide xfades while dragging regions */ - return; - } - - if (audio_region()->fade_out_is_xfade()) { - if (fade_out_handle) { - fade_out_handle->hide (); - fade_out_shape->hide (); - } - redraw_end_xfade (); - return; - } else { - if (end_xfade_in) { - end_xfade_in->hide (); - end_xfade_out->hide (); - end_xfade_rect->hide (); - _end_xfade_visible = false; - } - } - if (fade_out_handle == 0) { return; } @@ -696,12 +631,6 @@ AudioRegionView::reset_fade_out_shape_width (framecnt_t width) uint32_t npoints = std::min (gdk_screen_width(), (int) pwidth); double h; - if (_height < 5) { - fade_out_shape->hide(); - fade_out_handle->hide(); - return; - } - double const handle_center = (_region->length() - width) / samples_per_unit; /* Put the fade out handle so that its right side is at the end-of-fade line; @@ -713,6 +642,7 @@ AudioRegionView::reset_fade_out_shape_width (framecnt_t width) /* don't show shape if its too small */ if (pwidth < 5) { + hide_end_xfade(); fade_out_shape->hide(); return; } @@ -727,7 +657,7 @@ AudioRegionView::reset_fade_out_shape_width (framecnt_t width) if (_height >= NAME_HIGHLIGHT_THRESH) { h = _height - NAME_HIGHLIGHT_SIZE - 2; } else { - h = _height; + h = _height - 2; } /* points *MUST* be in anti-clockwise order */ @@ -757,12 +687,28 @@ AudioRegionView::reset_fade_out_shape_width (framecnt_t width) fade_out_shape->property_points() = *points; delete points; + redraw_end_xfade_to (ar, width); + /* ensure trim handle stays on top */ if (frame_handle_end) { frame_handle_end->raise_to_top(); } + +} + +framepos_t +AudioRegionView::get_fade_in_shape_width () +{ + return audio_region()->fade_in()->back()->when; } +framepos_t +AudioRegionView::get_fade_out_shape_width () +{ + return audio_region()->fade_out()->back()->when; +} + + void AudioRegionView::set_samples_per_unit (gdouble spu) { @@ -1148,7 +1094,9 @@ AudioRegionView::entered (bool internal_editing) } if (fade_in_handle && !internal_editing) { + fade_in_handle->property_outline_color_rgba() = RGBA_TO_UINT (0, 0, 0, 255); fade_in_handle->property_fill_color_rgba() = UINT_RGBA_CHANGE_A (fade_color, 255); + fade_out_handle->property_outline_color_rgba() = RGBA_TO_UINT (0, 0, 0, 255); fade_out_handle->property_fill_color_rgba() = UINT_RGBA_CHANGE_A (fade_color, 255); } } @@ -1164,7 +1112,9 @@ AudioRegionView::exited () } if (fade_in_handle) { + fade_in_handle->property_outline_color_rgba() = RGBA_TO_UINT (0, 0, 0, 0); fade_in_handle->property_fill_color_rgba() = UINT_RGBA_CHANGE_A (fade_color, 0); + fade_out_handle->property_outline_color_rgba() = RGBA_TO_UINT (0, 0, 0, 0); fade_out_handle->property_fill_color_rgba() = UINT_RGBA_CHANGE_A (fade_color, 0); } } @@ -1320,27 +1270,9 @@ AudioRegionView::show_region_editor () } editor->present (); - editor->set_position (Gtk::WIN_POS_MOUSE); editor->show_all(); } - -void -AudioRegionView::show_fade_line (framepos_t pos) -{ - fade_position_line->property_x1() = trackview.editor().frame_to_pixel (pos); - fade_position_line->property_x2() = trackview.editor().frame_to_pixel (pos); - fade_position_line->show (); - fade_position_line->raise_to_top (); -} - -void -AudioRegionView::hide_fade_line () -{ - fade_position_line->hide (); -} - - void AudioRegionView::transients_changed () { @@ -1458,15 +1390,7 @@ AudioRegionView::redraw_start_xfade () return; } - if (!ar->fade_in_is_xfade()) { - if (start_xfade_in) { - start_xfade_in->hide (); - start_xfade_out->hide (); - start_xfade_rect->hide (); - _start_xfade_visible = false; - } - return; - } + show_start_xfade(); redraw_start_xfade_to (ar, ar->fade_in()->back()->when); } @@ -1489,7 +1413,7 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, frame if (!start_xfade_out) { start_xfade_out = new ArdourCanvas::Line (*group); start_xfade_out->property_width_pixels() = 1; - uint32_t col = UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->canvasvar_GainLine.get(), 125); + uint32_t col = UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->canvasvar_GainLine.get(), 128); start_xfade_out->property_fill_color_rgba() = col; } @@ -1504,8 +1428,14 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, frame } Points* points = get_canvas_points ("xfade edit redraw", npoints); - boost::scoped_ptr vec (new float[npoints]); - double effective_height = _height - NAME_HIGHLIGHT_SIZE - 1.0; + boost::scoped_array vec (new float[npoints]); + + double effective_height; + if (_height >= NAME_HIGHLIGHT_THRESH) { + effective_height = _height - NAME_HIGHLIGHT_SIZE - 2; + } else { + effective_height = _height - 2; + } ar->fade_in()->curve().get_vector (0, ar->fade_in()->back()->when, vec.get(), npoints); @@ -1520,7 +1450,6 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, frame start_xfade_rect->property_x2() = ((*points)[npoints-1]).get_x(); start_xfade_rect->property_y2() = effective_height; start_xfade_rect->show (); - start_xfade_rect->raise_to_top (); start_xfade_in->property_points() = *points; start_xfade_in->show (); @@ -1553,7 +1482,9 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, frame start_xfade_out->show (); start_xfade_out->raise_to_top (); - _start_xfade_visible = true; + start_xfade_rect->raise_to_top (); //this needs to be topmost so the lines don't steal mouse focus + + show_start_xfade(); delete points; } @@ -1567,15 +1498,7 @@ AudioRegionView::redraw_end_xfade () return; } - if (!ar->fade_out_is_xfade()) { - if (end_xfade_in) { - end_xfade_in->hide (); - end_xfade_out->hide (); - end_xfade_rect->hide (); - _end_xfade_visible = false; - } - return; - } + show_end_xfade(); redraw_end_xfade_to (ar, ar->fade_out()->back()->when); } @@ -1598,7 +1521,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecn if (!end_xfade_out) { end_xfade_out = new ArdourCanvas::Line (*group); end_xfade_out->property_width_pixels() = 1; - uint32_t col UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->canvasvar_GainLine.get(), 125); + uint32_t col UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->canvasvar_GainLine.get(), 128); end_xfade_out->property_fill_color_rgba() = col; } @@ -1613,12 +1536,18 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecn } Points* points = get_canvas_points ("xfade edit redraw", npoints); - boost::scoped_ptr vec (new float[npoints]); + boost::scoped_array vec (new float[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() - len); - double effective_height = _height - NAME_HIGHLIGHT_SIZE - 1; + + double effective_height; + if (_height >= NAME_HIGHLIGHT_THRESH) { + effective_height = _height - NAME_HIGHLIGHT_SIZE - 2; + } else { + effective_height = _height - 2; + } for (int i = 0, pci = 0; i < npoints; ++i) { Gnome::Art::Point &p ((*points)[pci++]); @@ -1631,7 +1560,6 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecn end_xfade_rect->property_x2() = ((*points)[npoints-1]).get_x(); end_xfade_rect->property_y2() = effective_height; end_xfade_rect->show (); - end_xfade_rect->raise_to_top (); end_xfade_in->property_points() = *points; end_xfade_in->show (); @@ -1664,7 +1592,9 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecn end_xfade_out->show (); end_xfade_out->raise_to_top (); - _end_xfade_visible = true; + end_xfade_rect->raise_to_top (); //this needs to be topmost so the lines don't steal mouse focus + + show_end_xfade(); delete points; } @@ -1751,15 +1681,8 @@ void AudioRegionView::drag_start () { TimeAxisViewItem::drag_start (); - AudioTimeAxisView* atav = dynamic_cast (&trackview); - if (atav) { - AudioStreamView* av = atav->audio_view(); - if (av) { - /* this will hide our xfades too */ - _hidden_xfades = av->hide_xfades_with (audio_region()); - } - } + //we used to hide xfades here. I don't see the point with the new model, but we can re-implement if needed } void @@ -1767,16 +1690,7 @@ AudioRegionView::drag_end () { TimeAxisViewItem::drag_end (); - for (list::iterator i = _hidden_xfades.first.begin(); i != _hidden_xfades.first.end(); ++i) { - (*i)->show_start_xfade (); - } - - for (list::iterator i = _hidden_xfades.second.begin(); i != _hidden_xfades.second.end(); ++i) { - (*i)->show_end_xfade (); - } - - _hidden_xfades.first.clear (); - _hidden_xfades.second.clear (); + //see comment for drag_start } void