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"
25 #include "automation_region_view.h"
26 #include "public_editor.h"
30 AutomationRegionView::AutomationRegionView(ArdourCanvas::Group
* parent
,
31 AutomationTimeAxisView
& time_axis
,
32 boost::shared_ptr
<ARDOUR::Region
> region
,
33 const Evoral::Parameter
& param
,
34 boost::shared_ptr
<ARDOUR::AutomationList
> list
,
36 Gdk::Color
const & basic_color
)
37 : RegionView(parent
, time_axis
, region
, spu
, basic_color
)
41 assert(list
->parameter() == param
);
45 group
->signal_event().connect (mem_fun (this, &AutomationRegionView::canvas_event
), false);
46 group
->raise_to_top();
50 AutomationRegionView::init (Gdk::Color
const & basic_color
, bool /*wfd*/)
52 _enable_display
= false;
54 RegionView::init(basic_color
, false);
56 compute_colors (basic_color
);
58 reset_width_dependent_items ((double) _region
->length() / samples_per_unit
);
60 set_height (trackview
.current_height());
62 _region
->StateChanged
.connect (mem_fun(*this, &AutomationRegionView::region_changed
));
66 _enable_display
= true;
70 AutomationRegionView::create_line (boost::shared_ptr
<ARDOUR::AutomationList
> list
)
72 _line
= boost::shared_ptr
<AutomationLine
>(new AutomationLine(
73 ARDOUR::EventTypeMap::instance().to_symbol(list
->parameter()),
74 trackview
, *get_canvas_group(), list
, &_time_converter
));
76 _line
->set_interpolation(list
->interpolation());
77 _line
->set_height ((uint32_t)rint(trackview
.current_height() - NAME_HIGHLIGHT_SIZE
));
79 _line
->show_all_control_points();
83 AutomationRegionView::canvas_event(GdkEvent
* ev
)
85 if (ev
->type
== GDK_BUTTON_RELEASE
) {
87 const nframes_t when
= trackview
.editor().pixel_to_frame((nframes_t
)ev
->button
.x
)
88 - _region
->position();
89 add_automation_event(ev
, when
, ev
->button
.y
);
96 AutomationRegionView::add_automation_event (GdkEvent
* /*event*/, nframes_t when
, double y
)
99 boost::shared_ptr
<Evoral::Control
> c
= _region
->control(_parameter
, true);
100 boost::shared_ptr
<ARDOUR::AutomationControl
> ac
101 = boost::dynamic_pointer_cast
<ARDOUR::AutomationControl
>(c
);
103 create_line(ac
->alist());
108 AutomationTimeAxisView
* const view
= automation_view();
110 view
->canvas_display()->w2i (x
, y
);
112 /* compute vertical fractional position */
114 const double h
= trackview
.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE
- 2;
119 _line
->view_to_model_coord (x
, y
);
121 view
->session().begin_reversible_command (_("add automation event"));
122 XMLNode
& before
= _line
->the_list()->get_state();
124 _line
->the_list()->add (when
, y
);
126 XMLNode
& after
= _line
->the_list()->get_state();
127 view
->session().commit_reversible_command (new MementoCommand
<ARDOUR::AutomationList
>(
128 *_line
->the_list(), &before
, &after
));
130 view
->session().set_dirty ();
134 AutomationRegionView::set_height (double h
)
136 RegionView::set_height(h
);
139 _line
->set_height ((uint32_t)rint(h
- NAME_HIGHLIGHT_SIZE
));
143 AutomationRegionView::set_position (nframes64_t pos
, void* src
, double* ignored
)
145 return RegionView::set_position(pos
, src
, ignored
);
150 AutomationRegionView::reset_width_dependent_items (double pixel_width
)
152 RegionView::reset_width_dependent_items(pixel_width
);
160 AutomationRegionView::region_resized (ARDOUR::Change what_changed
)
162 RegionView::region_resized(what_changed
);
170 AutomationRegionView::entered()
173 _line
->track_entered();
178 AutomationRegionView::exited()
181 _line
->track_exited();