diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index 4b10ea5cb5..3332a066d9 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -900,3 +900,69 @@ AutomationTimeAxisView::parse_state_id ( return true; } + +void +AutomationTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) +{ + list > lines; + if (_line) { + lines.push_back (_line); + } else if (_view) { + lines = _view->get_lines (); + } + + for (list >::iterator i = lines.begin(); i != lines.end(); ++i) { + cut_copy_clear_one (**i, selection, op); + } +} + +void +AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& selection, CutCopyOp op) +{ + boost::shared_ptr what_we_got; + boost::shared_ptr alist (line.the_list()); + + XMLNode &before = alist->get_state(); + + /* convert time selection to automation list model coordinates */ + 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 ()); + + switch (op) { + case Delete: + if (alist->cut (start, end) != 0) { + _session->add_command(new MementoCommand(*alist.get(), &before, &alist->get_state())); + } + break; + + case Cut: + + if ((what_we_got = alist->cut (start, end)) != 0) { + _editor.get_cut_buffer().add (what_we_got); + _session->add_command(new MementoCommand(*alist.get(), &before, &alist->get_state())); + } + break; + case Copy: + if ((what_we_got = alist->copy (start, end)) != 0) { + _editor.get_cut_buffer().add (what_we_got); + } + break; + + case Clear: + if ((what_we_got = alist->cut (start, end)) != 0) { + _session->add_command(new MementoCommand(*alist.get(), &before, &alist->get_state())); + } + break; + } + + if (what_we_got) { + for (AutomationList::iterator x = what_we_got->begin(); x != what_we_got->end(); ++x) { + double when = (*x)->when; + double val = (*x)->value; + line.model_to_view_coord (when, val); + (*x)->when = when; + (*x)->value = val; + } + } +} diff --git a/gtk2_ardour/automation_time_axis.h b/gtk2_ardour/automation_time_axis.h index 913cd1b467..d883b189c0 100644 --- a/gtk2_ardour/automation_time_axis.h +++ b/gtk2_ardour/automation_time_axis.h @@ -91,6 +91,7 @@ class AutomationTimeAxisView : public TimeAxisView { /* editing operations */ + void cut_copy_clear (Selection&, Editing::CutCopyOp); bool paste (ARDOUR::framepos_t, float times, Selection&, size_t nth); int set_state (const XMLNode&, int version); @@ -166,6 +167,7 @@ class AutomationTimeAxisView : public TimeAxisView { void build_display_menu (); + void cut_copy_clear_one (AutomationLine&, Selection&, Editing::CutCopyOp); bool paste_one (AutomationLine&, ARDOUR::framepos_t, float times, Selection&, size_t nth); void route_going_away ();