Clean up handling of track vs region automation a bit.

git-svn-id: svn://localhost/ardour2/branches/3.0@7544 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2010-08-05 13:35:43 +00:00
parent 355c079f10
commit e7a2b99f3d
8 changed files with 79 additions and 56 deletions

View File

@ -158,10 +158,11 @@ AutomationStreamView::set_automation_state (AutoState state)
if (region_views.empty()) {
_pending_automation_state = state;
} else {
for (std::list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
boost::shared_ptr<AutomationLine> line = dynamic_cast<AutomationRegionView*>(*i)->line();
if (line && line->the_list()) {
line->the_list()->set_automation_state (state);
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
if ((*i)->the_list()) {
(*i)->the_list()->set_automation_state (state);
}
}
}
@ -225,13 +226,12 @@ AutomationStreamView::automation_state () const
bool
AutomationStreamView::has_automation () const
{
list<RegionView*>::const_iterator i = region_views.begin ();
while (i != region_views.end()) {
AutomationRegionView* rv = static_cast<AutomationRegionView*> (*i);
if (rv->line() && rv->line()->npoints() > 0) {
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
if ((*i)->npoints() > 0) {
return true;
}
++i;
}
return false;
@ -243,10 +243,10 @@ AutomationStreamView::has_automation () const
void
AutomationStreamView::set_interpolation (AutomationList::InterpolationStyle s)
{
for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) {
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*> (*i);
assert (arv);
arv->line()->the_list()->set_interpolation (s);
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
(*i)->the_list()->set_interpolation (s);
}
}
@ -267,10 +267,10 @@ AutomationStreamView::interpolation () const
void
AutomationStreamView::clear ()
{
for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*> (*i);
assert (arv);
arv->line()->clear ();
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
(*i)->clear ();
}
}
@ -287,9 +287,23 @@ AutomationStreamView::get_selectables (nframes_t start, nframes_t end, double bo
void
AutomationStreamView::set_selected_points (PointSelection& ps)
{
for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*> (*i);
assert (arv);
arv->line()->set_selected_points (ps);
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
(*i)->set_selected_points (ps);
}
}
list<boost::shared_ptr<AutomationLine> >
AutomationStreamView::get_lines () const
{
list<boost::shared_ptr<AutomationLine> > lines;
for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) {
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*> (*i);
assert (arv);
lines.push_back (arv->line());
}
return lines;
}

View File

@ -64,6 +64,8 @@ class AutomationStreamView : public StreamView
void get_selectables (nframes_t, nframes_t, double, double, std::list<Selectable*> &);
void set_selected_points (PointSelection &);
std::list<boost::shared_ptr<AutomationLine> > get_lines () const;
private:
void setup_rec_box ();

View File

@ -407,8 +407,9 @@ AutomationTimeAxisView::set_height (uint32_t h)
TimeAxisView::set_height (h);
_base_rect->property_y2() = h;
if (_line)
if (_line) {
_line->set_height(h);
}
if (_view) {
_view->set_height(h);
@ -480,11 +481,13 @@ AutomationTimeAxisView::set_samples_per_unit (double spu)
{
TimeAxisView::set_samples_per_unit (spu);
if (_line)
if (_line) {
_line->reset ();
}
if (_view)
if (_view) {
_view->set_samples_per_unit (spu);
}
}
void
@ -608,18 +611,26 @@ AutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* /*item*/, GdkE
_session->set_dirty ();
}
bool
void
AutomationTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
{
return (_line ? cut_copy_clear_one (*_line, selection, op) : false);
list<boost::shared_ptr<AutomationLine> > lines;
if (_line) {
lines.push_back (_line);
} else if (_view) {
lines = _view->get_lines ();
}
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
cut_copy_clear_one (**i, selection, op);
}
}
bool
void
AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& selection, CutCopyOp op)
{
boost::shared_ptr<Evoral::ControlList> what_we_got;
boost::shared_ptr<AutomationList> alist (line.the_list());
bool ret = false;
XMLNode &before = alist->get_state();
@ -628,7 +639,6 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
if ((what_we_got = alist->cut (selection.time.front().start, selection.time.front().end)) != 0) {
_editor.get_cut_buffer().add (what_we_got);
_session->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &alist->get_state()));
ret = true;
}
break;
case Copy:
@ -640,7 +650,6 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
case Clear:
if ((what_we_got = alist->cut (selection.time.front().start, selection.time.front().end)) != 0) {
_session->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &alist->get_state()));
ret = true;
}
break;
}
@ -654,8 +663,6 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
(*x)->value = val;
}
}
return ret;
}
void
@ -681,18 +688,26 @@ AutomationTimeAxisView::reset_objects_one (AutomationLine& line, PointSelection&
}
}
bool
void
AutomationTimeAxisView::cut_copy_clear_objects (PointSelection& selection, CutCopyOp op)
{
return cut_copy_clear_objects_one (*_line, selection, op);
list<boost::shared_ptr<AutomationLine> > lines;
if (_line) {
lines.push_back (_line);
} else if (_view) {
lines = _view->get_lines ();
}
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
cut_copy_clear_objects_one (**i, selection, op);
}
}
bool
void
AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointSelection& selection, CutCopyOp op)
{
boost::shared_ptr<Evoral::ControlList> what_we_got;
boost::shared_ptr<AutomationList> alist(line.the_list());
bool ret = false;
XMLNode &before = alist->get_state();
@ -707,7 +722,6 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
if ((what_we_got = alist->cut ((*i).start, (*i).end)) != 0) {
_editor.get_cut_buffer().add (what_we_got);
_session->add_command (new MementoCommand<AutomationList>(*alist.get(), new XMLNode (before), &alist->get_state()));
ret = true;
}
break;
case Copy:
@ -719,7 +733,6 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
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()));
ret = true;
}
break;
}
@ -727,6 +740,8 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
delete &before;
cout << "CCC objects " << what_we_got->size() << "\n";
if (what_we_got) {
for (AutomationList::iterator x = what_we_got->begin(); x != what_we_got->end(); ++x) {
double when = (*x)->when;
@ -736,8 +751,6 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
(*x)->value = val;
}
}
return ret;
}
bool
@ -825,8 +838,9 @@ AutomationTimeAxisView::get_selectables (nframes_t start, nframes_t end, double
void
AutomationTimeAxisView::get_inverted_selectables (Selection& sel, list<Selectable*>& result)
{
if (_line)
if (_line) {
_line->get_inverted_selectables (sel, result);
}
}
void

View File

@ -86,8 +86,8 @@ class AutomationTimeAxisView : public TimeAxisView {
/* editing operations */
bool cut_copy_clear (Selection&, Editing::CutCopyOp);
bool cut_copy_clear_objects (PointSelection&, Editing::CutCopyOp);
void cut_copy_clear (Selection&, Editing::CutCopyOp);
void cut_copy_clear_objects (PointSelection&, Editing::CutCopyOp);
bool paste (nframes_t, float times, Selection&, size_t nth);
void reset_objects (PointSelection&);
@ -146,8 +146,8 @@ class AutomationTimeAxisView : public TimeAxisView {
void build_display_menu ();
bool cut_copy_clear_one (AutomationLine&, Selection&, Editing::CutCopyOp);
bool cut_copy_clear_objects_one (AutomationLine&, PointSelection&, Editing::CutCopyOp);
void cut_copy_clear_one (AutomationLine&, Selection&, Editing::CutCopyOp);
void cut_copy_clear_objects_one (AutomationLine&, PointSelection&, Editing::CutCopyOp);
bool paste_one (AutomationLine&, nframes_t, float times, Selection&, size_t nth);
void reset_objects_one (AutomationLine&, PointSelection&);

View File

@ -3106,8 +3106,6 @@ RubberbandSelectDrag::finished (GdkEvent* event, bool movement_occurred)
_editor->begin_reversible_command (_("rubberband selection"));
cout << "RSD finished, selecting all within <fred>\n";
if (grab_frame() < last_pointer_frame()) {
committed = _editor->select_all_within (grab_frame(), last_pointer_frame() - 1, y1, y2, _editor->track_views, op);
} else {

View File

@ -1299,17 +1299,16 @@ RouteTimeAxisView::find_next_region_boundary (nframes64_t pos, int32_t dir)
return -1;
}
bool
void
RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
{
boost::shared_ptr<Playlist> what_we_got;
boost::shared_ptr<Track> tr = track ();
boost::shared_ptr<Playlist> playlist;
bool ret = false;
if (tr == 0) {
/* route is a bus, not a track */
return false;
return;
}
playlist = tr->playlist();
@ -1339,7 +1338,6 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
_session->add_command (*c);
}
_session->add_command (new StatefulDiffCommand (playlist));
ret = true;
}
break;
case Copy:
@ -1359,12 +1357,9 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
}
_session->add_command (new StatefulDiffCommand (playlist));
what_we_got->release ();
ret = true;
}
break;
}
return ret;
}
bool

View File

@ -92,7 +92,7 @@ public:
nframes64_t find_next_region_boundary (nframes64_t pos, int32_t dir);
/* Editing operations */
bool cut_copy_clear (Selection&, Editing::CutCopyOp);
void cut_copy_clear (Selection&, Editing::CutCopyOp);
bool paste (nframes_t, float times, Selection&, size_t nth);
TimeAxisView::Children get_child_list();

View File

@ -177,7 +177,7 @@ class TimeAxisView : public virtual AxisView, public PBD::Stateful
/* editing operations */
virtual bool cut_copy_clear (Selection&, Editing::CutCopyOp) { return false; }
virtual void cut_copy_clear (Selection&, Editing::CutCopyOp) {}
virtual bool paste (nframes_t, float /*times*/, Selection&, size_t /*nth*/) { return false; }
virtual void set_selected_regionviews (RegionSelection&) {}