X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_time_axis.cc;h=a92ac3853077f70de8bb4cb3d261ed341557575b;hb=b15e1cba3b11f73f3155c5dbd8a162c2512f5641;hp=4a4045f82303aef5ea717499d51d8b513e1d5a1c;hpb=e7587ea0fbaf6aab5db7387b9c12a0fd956c8ec3;p=ardour.git diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index 4a4045f823..a92ac38530 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -28,6 +28,7 @@ #include "ardour_ui.h" #include "automation_time_axis.h" #include "automation_streamview.h" +#include "global_signals.h" #include "gui_thread.h" #include "route_time_axis.h" #include "automation_line.h" @@ -58,26 +59,39 @@ const string AutomationTimeAxisView::state_node_name = "AutomationChild"; * For route child (e.g. plugin) automation, pass the child for \a. * For region automation (e.g. MIDI CC), pass null for \a. */ -AutomationTimeAxisView::AutomationTimeAxisView (Session* s, boost::shared_ptr r, - boost::shared_ptr a, boost::shared_ptr c, - PublicEditor& e, TimeAxisView& parent, bool show_regions, - ArdourCanvas::Canvas& canvas, const string & nom, const string & nomparent) - : AxisView (s), - TimeAxisView (s, e, &parent, canvas), - _route (r), - _control (c), - _automatable (a), - _controller(AutomationController::create(a, c->parameter(), c)), - _base_rect (0), - _view (show_regions ? new AutomationStreamView(*this) : NULL), - _name (nom), - auto_button (X_("")) /* force addition of a label */ +AutomationTimeAxisView::AutomationTimeAxisView ( + Session* s, + boost::shared_ptr r, + boost::shared_ptr a, + boost::shared_ptr c, + Evoral::Parameter p, + PublicEditor& e, + TimeAxisView& parent, + bool show_regions, + ArdourCanvas::Canvas& canvas, + const string & nom, + const string & nomparent + ) + : AxisView (s) + , TimeAxisView (s, e, &parent, canvas) + , _route (r) + , _control (c) + , _automatable (a) + , _parameter (p) + , _base_rect (0) + , _view (show_regions ? new AutomationStreamView (*this) : 0) + , _name (nom) + , auto_button (X_("")) /* force addition of a label */ { if (!have_name_font) { name_font = get_font_for_style (X_("AutomationTrackName")); have_name_font = true; } + if (_automatable && _control) { + _controller = AutomationController::create (_automatable, _control->parameter(), _control); + } + automation_menu = 0; auto_off_item = 0; auto_touch_item = 0; @@ -92,7 +106,10 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session* s, boost::shared_ptrproperty_x1() = 0.0; _base_rect->property_y1() = 0.0; - _base_rect->property_x2() = LONG_MAX - 2; + /** gnomecanvas sometimes converts this value to int or adds 2 to it, so it must be + set correctly to avoid overflow. + */ + _base_rect->property_x2() = INT_MAX - 2; _base_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_AutomationTrackOutline.get(); /* outline ends and bottom */ @@ -144,6 +161,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session* s, boost::shared_ptrset_name (X_("TrackPlugName")); plugname->show(); - name_label.set_name (X_("TrackParameterName")); controls_table.remove (name_hbox); controls_table.attach (*plugname, 1, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); plugname_packed = true; @@ -181,8 +198,10 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session* s, boost::shared_ptrget_automation_child_xml_node ( - _control->parameter()); + XMLNode* xml_node = get_parent_with_state()->get_automation_child_xml_node (_parameter); if (xml_node) { set_state (*xml_node, Stateful::loading_state_version); @@ -206,13 +224,17 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session* s, boost::shared_ptrattach (); - /* no regions, just a single line for the entire track (e.g. bus gain) */ } else { - boost::shared_ptr line(new AutomationLine ( - ARDOUR::EventTypeMap::instance().to_symbol(_control->parameter()), - *this, - *_canvas_display, - _control->alist())); + /* no regions, just a single line for the entire track (e.g. bus gain) */ + + boost::shared_ptr line ( + new AutomationLine ( + ARDOUR::EventTypeMap::instance().to_symbol(_parameter), + *this, + *_canvas_display, + _control->alist() + ) + ); line->set_line_color (ARDOUR_UI::config()->canvasvar_ProcessorAutomationLine.get()); line->queue_reset (); @@ -260,11 +282,11 @@ AutomationTimeAxisView::set_automation_state (AutoState state) } if (_automatable) { - _automatable->set_parameter_automation_state (_control->parameter(), state); + _automatable->set_parameter_automation_state (_parameter, state); } #if 0 if (_route == _automatable) { // This is a time axis for route (not region) automation - _route->set_parameter_automation_state (_control->parameter(), state); + _route->set_parameter_automation_state (_parameter, state); } if (_control->list()) { @@ -403,7 +425,7 @@ AutomationTimeAxisView::set_height (uint32_t h) TimeAxisView* state_parent = get_parent_with_state (); assert(state_parent); - XMLNode* xml_node = state_parent->get_automation_child_xml_node (_control->parameter()); + XMLNode* xml_node = state_parent->get_automation_child_xml_node (_parameter); TimeAxisView::set_height (h); _base_rect->property_y2() = h; @@ -554,7 +576,7 @@ AutomationTimeAxisView::build_display_menu () /* current interpolation state */ AutomationList::InterpolationStyle const s = _view ? _view->interpolation() : _control->list()->interpolation (); - if (EventTypeMap::instance().is_midi_parameter(_control->parameter())) { + if (EventTypeMap::instance().is_midi_parameter(_parameter)) { Menu* auto_mode_menu = manage (new Menu); auto_mode_menu->set_name ("ArdourContextMenu"); @@ -584,10 +606,11 @@ AutomationTimeAxisView::build_display_menu () } void -AutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* /*item*/, GdkEvent* /*event*/, nframes_t when, double y) +AutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* /*item*/, GdkEvent* /*event*/, framepos_t when, double y) { - if (!_line) + if (!_line) { return; + } double x = 0; @@ -636,7 +659,7 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel XMLNode &before = alist->get_state(); /* convert time selection to automation list model coordinates */ - const Evoral::TimeConverter& tc = line.time_converter (); + const Evoral::TimeConverter& tc = line.time_converter (); double const start = tc.from (selection.time.front().start - tc.origin_b ()); double const end = tc.from (selection.time.front().end - tc.origin_b ()); @@ -926,15 +949,17 @@ AutomationTimeAxisView::add_line (boost::shared_ptr line) void AutomationTimeAxisView::entered() { - if (_line) + if (_line) { _line->track_entered(); + } } void AutomationTimeAxisView::exited () { - if (_line) + if (_line) { _line->track_exited(); + } } void @@ -950,8 +975,12 @@ AutomationTimeAxisView::set_state (const XMLNode& node, int version) { TimeAxisView::set_state (node, version); + if (version < 3000) { + return set_state_2X (node, version); + } + XMLProperty const * type = node.property ("automation-id"); - if (type && type->value () == ARDOUR::EventTypeMap::instance().to_symbol (_control->parameter())) { + if (type && type->value () == ARDOUR::EventTypeMap::instance().to_symbol (_parameter)) { XMLProperty const * shown = node.property ("shown"); if (shown && shown->value () == "yes") { set_marked_for_display (true); @@ -966,13 +995,32 @@ AutomationTimeAxisView::set_state (const XMLNode& node, int version) return 0; } +int + +AutomationTimeAxisView::set_state_2X (const XMLNode& node, int /*version*/) +{ + if (node.name() == X_("gain") && _parameter == Evoral::Parameter (GainAutomation)) { + XMLProperty const * shown = node.property (X_("shown")); + if (shown && string_is_affirmative (shown->value ())) { + set_marked_for_display (true); + _canvas_display->show (); /* FIXME: necessary? show_at? */ + } + } + + if (!_marked_for_display) { + hide (); + } + + return 0; +} + XMLNode* AutomationTimeAxisView::get_state_node () { TimeAxisView* state_parent = get_parent_with_state (); if (state_parent) { - return state_parent->get_automation_child_xml_node (_control->parameter()); + return state_parent->get_automation_child_xml_node (_parameter); } else { return 0; } @@ -1021,3 +1069,17 @@ AutomationTimeAxisView::has_automation () const { return ( (_line && _line->npoints() > 0) || (_view && _view->has_automation()) ); } + +list > +AutomationTimeAxisView::lines () const +{ + list > lines; + + if (_line) { + lines.push_back (_line); + } else if (_view) { + lines = _view->get_lines (); + } + + return lines; +}