/*
- Copyright (C) 2000-2007 Paul Davis
+ Copyright (C) 2000-2007 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "ardour/automation_control.h"
#include "ardour/event_type_map.h"
#include "ardour/route.h"
+#include "ardour/session.h"
#include "ardour_ui.h"
#include "automation_time_axis.h"
boost::shared_ptr<Automatable> a, boost::shared_ptr<AutomationControl> c,
PublicEditor& e, TimeAxisView& parent, bool show_regions,
ArdourCanvas::Canvas& canvas, const string & nom, const string & nomparent)
- : AxisView (s),
+ : AxisView (s),
TimeAxisView (s, e, &parent, canvas),
_route (r),
_control (c),
ignore_state_request = false;
first_call_to_set_height = true;
-
+
_base_rect = new SimpleRect(*_canvas_display);
_base_rect->property_x1() = 0.0;
_base_rect->property_y1() = 0.0;
_base_rect->property_x2() = LONG_MAX - 2;
_base_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_AutomationTrackOutline.get();
-
+
/* outline ends and bottom */
_base_rect->property_outline_what() = (guint32) (0x1|0x2|0x8);
_base_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AutomationTrackFill.get();
-
+
_base_rect->set_data ("trackview", this);
_base_rect->signal_event().connect (bind (
mem_fun (_editor, &PublicEditor::canvas_automation_track_event),
_base_rect, this));
- _base_rect->lower_to_bottom();
+ if (!a) {
+ _base_rect->lower_to_bottom();
+ }
hide_button.add (*(manage (new Gtk::Image (::get_icon("hide")))));
shortened = true;
}
- plugname = new Label (pname);
+ plugname = new Label (pname);
plugname->set_name (X_("TrackPlugName"));
plugname->show();
name_label.set_name (X_("TrackParameterName"));
tipname += _name;
ARDOUR_UI::instance()->tooltips().set_tip(controls_ebox, tipname);
}
-
+
/* add the buttons */
controls_table.attach (hide_button, 0, 1, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
controls_table.attach (auto_button, 5, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
-
+
/* add bar controller */
controls_table.attach (*_controller.get(), 0, 8, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
controls_base_unselected_name = X_("AutomationTrackControlsBase");
controls_ebox.set_name (controls_base_unselected_name);
- controls_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
-
XMLNode* xml_node = get_parent_with_state()->get_automation_child_xml_node (
_control->parameter());
if (xml_node) {
- set_state (*xml_node);
- }
-
+ set_state (*xml_node, Stateful::loading_state_version);
+ }
+
/* ask for notifications of any new RegionViews */
if (show_regions) {
assert(_view);
_view->attach ();
-
+
/* no regions, just a single line for the entire track (e.g. bus gain) */
} else {
boost::shared_ptr<AutomationLine> line(new AutomationLine (
AutomationTimeAxisView::set_automation_state (AutoState state)
{
if (!ignore_state_request) {
- _automatable->set_parameter_automation_state (_control->parameter(), state);
+ if (_automatable) {
+ _automatable->set_parameter_automation_state (_control->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);
} else {
state = _control->alist()->automation_state ();
}
-
+
switch (state & (Off|Play|Touch|Write)) {
case Off:
auto_button.set_label (_("Manual"));
void
AutomationTimeAxisView::interpolation_changed ()
-{
+{
AutomationList::InterpolationStyle style = _control->list()->interpolation();
-
+
if (mode_line_item && mode_discrete_item) {
if (style == AutomationList::Discrete) {
mode_discrete_item->set_active(true);
mode_discrete_item->set_active(false);
}
}
-
+
if (_line) {
_line->set_interpolation(style);
}
AutomationTimeAxisView::set_height (uint32_t h)
{
bool changed = (height != (uint32_t) h) || first_call_to_set_height;
- bool changed_between_small_and_normal = (
+ bool changed_between_small_and_normal = (
(height < hNormal && h >= hNormal)
|| (height >= hNormal || h < hNormal) );
TimeAxisView::set_height (h);
_base_rect->property_y2() = h;
-
+
if (_line)
_line->set_height(h);
-
+
if (_view) {
_view->set_height(h);
_view->update_contents_height();
if (h >= hNormal) {
controls_table.remove (name_hbox);
-
+
if (plugname) {
if (plugname_packed) {
controls_table.remove (*plugname);
hide_name_entry ();
show_name_label ();
name_hbox.show_all ();
-
+
auto_button.show();
hide_button.show_all();
hide_name_entry ();
show_name_label ();
name_hbox.show_all ();
-
+
auto_button.hide();
hide_button.hide();
}
if (_line)
_line->reset ();
-
+
if (_view)
_view->set_samples_per_unit (spu);
}
-
+
void
AutomationTimeAxisView::hide_clicked ()
{
// LAME fix for refreshing the hide button
hide_button.set_sensitive(false);
-
+
set_marked_for_display (false);
hide ();
-
+
hide_button.set_sensitive(true);
}
Menu* auto_state_menu = manage (new Menu);
auto_state_menu->set_name ("ArdourContextMenu");
MenuList& as_items = auto_state_menu->items();
-
+
as_items.push_back (CheckMenuElem (_("Manual"), bind (
mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
(AutoState) Off)));
auto_touch_item = dynamic_cast<CheckMenuItem*>(&as_items.back());
items.push_back (MenuElem (_("State"), *auto_state_menu));
-
+
/* mode menu */
- if ( EventTypeMap::instance().is_midi_parameter(_control->parameter()) ) {
-
+ if (EventTypeMap::instance().is_midi_parameter(_control->parameter())) {
+
Menu* auto_mode_menu = manage (new Menu);
auto_mode_menu->set_name ("ArdourContextMenu");
MenuList& am_items = auto_mode_menu->items();
-
+
RadioMenuItem::Group group;
-
+
am_items.push_back (RadioMenuElem (group, _("Discrete"), bind (
- mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
- AutomationList::Discrete)));
+ mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
+ AutomationList::Discrete)));
mode_discrete_item = dynamic_cast<CheckMenuItem*>(&am_items.back());
mode_discrete_item->set_active(_control->list()->interpolation() == AutomationList::Discrete);
- // For discrete types we dont allow the linear option since it makes no sense for those Controls
+ am_items.push_back (RadioMenuElem (group, _("Linear"), bind (
+ mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
+ AutomationList::Linear)));
+ mode_line_item = dynamic_cast<CheckMenuItem*>(&am_items.back());
+
+ // Set default interpolation type to linear if this isn't a (usually) discrete controller
if (EventTypeMap::instance().interpolation_of(_control->parameter()) == Evoral::ControlList::Linear) {
- am_items.push_back (RadioMenuElem (group, _("Line"), bind (
- mem_fun(*this, &AutomationTimeAxisView::set_interpolation),
- AutomationList::Linear)));
- mode_line_item = dynamic_cast<CheckMenuItem*>(&am_items.back());
mode_line_item->set_active(_control->list()->interpolation() == AutomationList::Linear);
}
}
void
-AutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* item, GdkEvent* event, nframes_t when, double y)
+AutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* /*item*/, GdkEvent* /*event*/, nframes_t when, double y)
{
if (!_line)
return;
_session.set_dirty ();
}
-
bool
AutomationTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
{
if (&(*i).track != this) {
continue;
}
-
+
alist->reset_range ((*i).start, (*i).end);
}
}
_editor.get_cut_buffer().add (what_we_got);
}
break;
-
+
case Clear:
if ((what_we_got = alist->cut ((*i).start, (*i).end)) != 0) {
_session.add_command (new MementoCommand<AutomationList>(*alist.get(), new XMLNode (before), &alist->get_state()));
{
AutomationSelection::iterator p;
boost::shared_ptr<AutomationList> alist(line.the_list());
-
+
for (p = selection.lines.begin(); p != selection.lines.end() && nth; ++p, --nth) {}
if (p == selection.lines.end()) {
values from view coordinates to model coordinates, and we're
not supposed to modify the points in the selection.
*/
-
+
AutomationList copy (**p);
for (AutomationList::iterator x = copy.begin(); x != copy.end(); ++x) {
}
void
-AutomationTimeAxisView::color_handler ()
+AutomationTimeAxisView::color_handler ()
{
if (_line) {
_line->set_colors();
}
int
-AutomationTimeAxisView::set_state (const XMLNode& node)
+AutomationTimeAxisView::set_state (const XMLNode& node, int version)
{
- TimeAxisView::set_state (node);
+ TimeAxisView::set_state (node, version);
XMLProperty const * type = node.property ("automation-id");
if (type && type->value () == ARDOUR::EventTypeMap::instance().to_symbol (_control->parameter())) {
_canvas_display->show (); /* FIXME: necessary? show_at? */
}
}
-
+
if (!_marked_for_display) {
hide();
}
AutomationTimeAxisView::show_at (double y, int& nth, Gtk::VBox *parent)
{
update_extra_xml_shown (true);
-
+
return TimeAxisView::show_at (y, nth, parent);
}