for (uint32_t i = 0; i < p->npanners (); ++i) {
boost::shared_ptr<AutomationList> pan_alist = p->streampanner(i).pan_control()->alist();
XMLNode & before = pan_alist->get_state ();
- pan_alist->move_ranges (movements);
- _session.add_command (new MementoCommand<AutomationList> (
- *pan_alist.get(), &before, &pan_alist->get_state ()));
+ bool const things_moved = pan_alist->move_ranges (movements);
+ if (things_moved) {
+ _session.add_command (new MementoCommand<AutomationList> (
+ *pan_alist.get(), &before, &pan_alist->get_state ()));
+ }
}
}
}
list< Evoral::RangeMove<double> > movements;
- for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
- i != movements_frames.end(); ++i) {
+ for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
}
set<Evoral::Parameter> const a = processor->what_can_be_automated ();
- cout << "move processor auto for " << processor->name() << "\n";
-
for (set<Evoral::Parameter>::iterator i = a.begin (); i != a.end (); ++i) {
- cout << "moving " << *i << "\n";
boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
XMLNode & before = al->get_state ();
- al->move_ranges (movements);
- _session.add_command (
- new MementoCommand<AutomationList> (
- *al.get(), &before, &al->get_state ()
- )
- );
+ bool const things_moved = al->move_ranges (movements);
+ if (things_moved) {
+ _session.add_command (
+ new MementoCommand<AutomationList> (
+ *al.get(), &before, &al->get_state ()
+ )
+ );
+ }
}
}
void erase_range (double start, double end);
void erase (iterator);
void erase (iterator, iterator);
- void move_ranges (std::list< RangeMove<double> > const &);
+ bool move_ranges (std::list< RangeMove<double> > const &);
void modify (iterator, double, double);
boost::shared_ptr<ControlList> cut (double, double);
cp.when = endt;
e = upper_bound (events.begin(), events.end(), &cp, time_comparator);
events.erase (s, e);
- erased = true;
+ if (s != e) {
+ erased = true;
+ }
}
return erased;
return true;
}
-/** Move automation around according to a list of region movements */
-void
+/** Move automation around according to a list of region movements.
+ * @param return true if anything was changed, otherwise false (ie nothing needed changing)
+ */
+bool
ControlList::move_ranges (const list< RangeMove<double> >& movements)
{
typedef list< RangeMove<double> > RangeMoveList;
EventList old_events = _events;
/* clear the source and destination ranges in the new list */
+ bool things_erased = false;
for (RangeMoveList::const_iterator i = movements.begin (); i != movements.end (); ++i) {
- erase_range_internal (i->from, i->from + i->length, _events);
- erase_range_internal (i->to, i->to + i->length, _events);
+ if (erase_range_internal (i->from, i->from + i->length, _events)) {
+ things_erased = true;
+ }
+
+ if (erase_range_internal (i->to, i->to + i->length, _events)) {
+ things_erased = true;
+ }
+ }
+ /* if nothing was erased, there is nothing to do */
+ if (!things_erased) {
+ return false;
}
/* copy the events into the new list */
}
maybe_signal_changed ();
+ return true;
}
void