2 Copyright (C) 2007 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include "pbd/memento_command.h"
21 #include "ardour/automation_control.h"
22 #include "ardour/event_type_map.h"
23 #include "ardour/session.h"
24 #include "ardour/source.h"
26 #include "automation_region_view.h"
27 #include "gui_thread.h"
28 #include "public_editor.h"
32 AutomationRegionView::AutomationRegionView(ArdourCanvas::Group
* parent
,
33 AutomationTimeAxisView
& time_axis
,
34 boost::shared_ptr
<ARDOUR::Region
> region
,
35 const Evoral::Parameter
& param
,
36 boost::shared_ptr
<ARDOUR::AutomationList
> list
,
38 Gdk::Color
const & basic_color
)
39 : RegionView(parent
, time_axis
, region
, spu
, basic_color
)
43 assert(list
->parameter() == param
);
47 group
->signal_event().connect (sigc::mem_fun (this, &AutomationRegionView::canvas_event
), false);
48 group
->raise_to_top();
52 AutomationRegionView::init (Gdk::Color
const & basic_color
, bool /*wfd*/)
54 _enable_display
= false;
56 RegionView::init(basic_color
, false);
58 compute_colors (basic_color
);
60 reset_width_dependent_items ((double) _region
->length() / samples_per_unit
);
62 set_height (trackview
.current_height());
64 _region
->PropertyChanged
.connect (*this, invalidator (*this), ui_bind (&RegionView::region_changed
, this, _1
), gui_context());
68 _enable_display
= true;
72 AutomationRegionView::create_line (boost::shared_ptr
<ARDOUR::AutomationList
> list
)
74 _line
= boost::shared_ptr
<AutomationLine
>(new AutomationLine(
75 ARDOUR::EventTypeMap::instance().to_symbol(list
->parameter()),
76 trackview
, *get_canvas_group(), list
, &_time_converter
));
78 _line
->set_interpolation(list
->interpolation());
79 _line
->set_height ((uint32_t)rint(trackview
.current_height() - NAME_HIGHLIGHT_SIZE
));
81 _line
->show_all_control_points();
85 AutomationRegionView::canvas_event(GdkEvent
* ev
)
87 if (ev
->type
== GDK_BUTTON_RELEASE
) {
89 double x
= ev
->button
.x
;
90 double y
= ev
->button
.y
;
92 /* convert to item coordinates in the time axis view */
93 automation_view()->canvas_display()->w2i (x
, y
);
95 add_automation_event (ev
, trackview
.editor().pixel_to_frame (x
) - _region
->position(), y
);
101 /** @param when Position in frames, where 0 is the start of the region.
102 * @param y y position, relative to our TimeAxisView.
105 AutomationRegionView::add_automation_event (GdkEvent
*, nframes_t when
, double y
)
108 boost::shared_ptr
<Evoral::Control
> c
= _region
->control(_parameter
, true);
109 boost::shared_ptr
<ARDOUR::AutomationControl
> ac
110 = boost::dynamic_pointer_cast
<ARDOUR::AutomationControl
>(c
);
112 create_line(ac
->alist());
116 AutomationTimeAxisView
* const view
= automation_view ();
118 /* compute vertical fractional position */
120 const double h
= trackview
.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE
- 2;
125 double when_d
= when
;
126 _line
->view_to_model_coord (when_d
, y
);
128 view
->session()->begin_reversible_command (_("add automation event"));
129 XMLNode
& before
= _line
->the_list()->get_state();
131 _line
->the_list()->add (when_d
, y
);
133 XMLNode
& after
= _line
->the_list()->get_state();
134 view
->session()->commit_reversible_command (new MementoCommand
<ARDOUR::AutomationList
>(
135 *_line
->the_list(), &before
, &after
));
137 view
->session()->set_dirty ();
141 AutomationRegionView::set_height (double h
)
143 RegionView::set_height(h
);
146 _line
->set_height ((uint32_t)rint(h
- NAME_HIGHLIGHT_SIZE
));
150 AutomationRegionView::set_position (nframes64_t pos
, void* src
, double* ignored
)
152 return RegionView::set_position(pos
, src
, ignored
);
157 AutomationRegionView::reset_width_dependent_items (double pixel_width
)
159 RegionView::reset_width_dependent_items(pixel_width
);
167 AutomationRegionView::region_resized (const PBD::PropertyChange
& what_changed
)
169 RegionView::region_resized(what_changed
);
177 AutomationRegionView::entered()
180 _line
->track_entered();
185 AutomationRegionView::exited()
188 _line
->track_exited();