X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_region_view.cc;h=45bd5d770bd89e4c4999f61f792d0fa58ce9cfac;hb=a8e019c9e0a0fcbbe9aa75f25dba90ca1a5eda2b;hp=200a1e2fb29e5841b64d2dd2a1057c6b5f3f9027;hpb=aaa91db6d9592684258267981e619b44cc2b7c40;p=ardour.git diff --git a/gtk2_ardour/automation_region_view.cc b/gtk2_ardour/automation_region_view.cc index 200a1e2fb2..45bd5d770b 100644 --- a/gtk2_ardour/automation_region_view.cc +++ b/gtk2_ardour/automation_region_view.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2007 Paul Davis + Copyright (C) 2007 Paul Davis Author: Dave Robillard This program is free software; you can redistribute it and/or modify @@ -17,10 +17,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include -#include -#include +#include "pbd/memento_command.h" +#include "ardour/automation_control.h" +#include "ardour/event_type_map.h" +#include "ardour/session.h" +#include "ardour/source.h" + #include "automation_region_view.h" +#include "gui_thread.h" #include "public_editor.h" #include "i18n.h" @@ -31,23 +35,24 @@ AutomationRegionView::AutomationRegionView(ArdourCanvas::Group* const Evoral::Parameter& param, boost::shared_ptr list, double spu, - Gdk::Color& basic_color) + Gdk::Color const & basic_color) : RegionView(parent, time_axis, region, spu, basic_color) , _parameter(param) -{ +{ if (list) { assert(list->parameter() == param); create_line(list); } - - group->signal_event().connect (mem_fun (this, &AutomationRegionView::canvas_event), false); + + group->signal_event().connect (sigc::mem_fun (this, &AutomationRegionView::canvas_event), false); + group->raise_to_top(); } void -AutomationRegionView::init (Gdk::Color& basic_color, bool wfd) +AutomationRegionView::init (Gdk::Color const & basic_color, bool /*wfd*/) { _enable_display = false; - + RegionView::init(basic_color, false); compute_colors (basic_color); @@ -56,7 +61,7 @@ AutomationRegionView::init (Gdk::Color& basic_color, bool wfd) set_height (trackview.current_height()); - _region->StateChanged.connect (mem_fun(*this, &AutomationRegionView::region_changed)); + _region->PropertyChanged.connect (*this, invalidator (*this), ui_bind (&RegionView::region_changed, this, _1), gui_context()); set_colors (); @@ -68,12 +73,12 @@ AutomationRegionView::create_line (boost::shared_ptr lis { _line = boost::shared_ptr(new AutomationLine( ARDOUR::EventTypeMap::instance().to_symbol(list->parameter()), - trackview, *get_canvas_group(), list)); + trackview, *get_canvas_group(), list, &_time_converter)); _line->set_colors(); _line->set_interpolation(list->interpolation()); + _line->set_height ((uint32_t)rint(trackview.current_height() - NAME_HIGHLIGHT_SIZE)); _line->show(); _line->show_all_control_points(); - _line->set_height ((uint32_t)rint(trackview.current_height() - NAME_HIGHLIGHT_SIZE)); } bool @@ -81,16 +86,23 @@ AutomationRegionView::canvas_event(GdkEvent* ev) { if (ev->type == GDK_BUTTON_RELEASE) { - const nframes_t when = trackview.editor().pixel_to_frame((nframes_t)ev->button.x) - - _region->position(); - add_automation_event(ev, when, ev->button.y); + double x = ev->button.x; + double y = ev->button.y; + + /* convert to item coordinates in the time axis view */ + automation_view()->canvas_display()->w2i (x, y); + + add_automation_event (ev, trackview.editor().pixel_to_frame (x) - _region->position(), y); } return false; } +/** @param when Position in frames, where 0 is the start of the region. + * @param y y position, relative to our TimeAxisView. + */ void -AutomationRegionView::add_automation_event (GdkEvent* event, nframes_t when, double y) +AutomationRegionView::add_automation_event (GdkEvent *, nframes_t when, double y) { if (!_line) { boost::shared_ptr c = _region->control(_parameter, true); @@ -101,11 +113,8 @@ AutomationRegionView::add_automation_event (GdkEvent* event, nframes_t when, dou } assert(_line); - double x = 0; - AutomationTimeAxisView* const view = automation_view(); - - view->canvas_display()->w2i (x, y); - + AutomationTimeAxisView* const view = automation_view (); + /* compute vertical fractional position */ const double h = trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 2; @@ -113,18 +122,19 @@ AutomationRegionView::add_automation_event (GdkEvent* event, nframes_t when, dou /* map using line */ - _line->view_to_model_y (y); + double when_d = when; + _line->view_to_model_coord (when_d, y); - view->session().begin_reversible_command (_("add automation event")); + view->session()->begin_reversible_command (_("add automation event")); XMLNode& before = _line->the_list()->get_state(); - _line->the_list()->add (when, y); + _line->the_list()->add (when_d, y); XMLNode& after = _line->the_list()->get_state(); - view->session().commit_reversible_command (new MementoCommand( + view->session()->commit_reversible_command (new MementoCommand( *_line->the_list(), &before, &after)); - view->session().set_dirty (); + view->session()->set_dirty (); } void @@ -137,12 +147,9 @@ AutomationRegionView::set_height (double h) } bool -AutomationRegionView::set_position (nframes_t pos, void* src, double* ignored) +AutomationRegionView::set_position (nframes64_t pos, void* src, double* ignored) { - // Do nothing, region parent will move us - //return false; - - return RegionView::set_position(pos, src, ignored); // FIXME: eventually... + return RegionView::set_position(pos, src, ignored); } @@ -150,14 +157,14 @@ void AutomationRegionView::reset_width_dependent_items (double pixel_width) { RegionView::reset_width_dependent_items(pixel_width); - + if (_line) _line->reset(); } void -AutomationRegionView::region_resized (ARDOUR::Change what_changed) +AutomationRegionView::region_resized (const PBD::PropertyChange& what_changed) { RegionView::region_resized(what_changed);