1 #include "pbd/convert.h"
3 #include "pbd/locale_guard.h"
4 #include "pbd/enumwriter.h"
6 #include "ardour/region.h"
7 #include "ardour/utils.h"
11 using namespace ARDOUR;
15 RegionCommand::RegionCommand (boost::shared_ptr<Region> r, const XMLNode& node)
18 if (set_state (node, 0)) {
19 throw failed_constructor();
23 RegionCommand::RegionCommand (boost::shared_ptr<Region> r)
28 RegionCommand::RegionCommand (boost::shared_ptr<Region> r, Property prop, const std::string& target_value)
31 LocaleGuard lg ("POSIX");
35 /* get current value as a string */
41 case PositionLockStyle:
42 before = enum_2_string (r->positional_lock_style());
45 snprintf (buf, sizeof (buf), "%" PRId32, r->length());
49 snprintf (buf, sizeof (buf), "%" PRId32, r->start());
53 snprintf (buf, sizeof (buf), "%" PRId32, r->position());
57 snprintf (buf, sizeof (buf), "%" PRId32, r->position());
61 snprintf (buf, sizeof (buf), "%" PRId32, r->layer());
65 snprintf (buf, sizeof (buf), "%" PRId32, r->sync_position());
69 before = (r->hidden() ? "yes" : "no");
72 before = (r->muted() ? "yes" : "no");
75 before = (r->opaque() ? "yes" : "no");
78 before = (r->locked() ? "yes" : "no");
81 before = (r->position_locked() ? "yes" : "no");
106 case DefaultEnvelope:
111 add_property_change (prop, before, target_value);
115 RegionCommand::_add_property_change (Property prop, const std::string& before, const std::string& after)
117 property_changes.push_back (PropertyTriple (prop, before, after));
121 RegionCommand::operator() ()
124 for (PropertyTriples::iterator i= property_changes.begin(); i != property_changes.end(); ++i) {
125 do_property_change (i->property, i->after);
131 RegionCommand::undo ()
134 for (PropertyTriples::iterator i= property_changes.begin(); i != property_changes.end(); ++i) {
135 do_property_change (i->property, i->before);
141 RegionCommand::do_property_change (Property prop, const std::string& value)
143 Region::PositionLockStyle pls;
147 region->set_name (value);
149 case PositionLockStyle:
150 region->set_position_lock_style ((Region::PositionLockStyle) string_2_enum (value, pls));
153 region->set_length (atoll (value), this);
156 region->set_start (atoll (value), this);
159 region->set_position (atoll (value), this);
162 region->set_position_on_top (atoll (value), this);
165 region->set_layer (atoi (value));
168 region->set_sync_position (atoi (value));
171 region->set_hidden (string_is_affirmative (value));
174 region->set_muted (string_is_affirmative (value));
177 region->set_opaque (string_is_affirmative (value));
180 region->set_locked (string_is_affirmative (value));
183 region->set_position_locked (string_is_affirmative (value));
208 case DefaultEnvelope:
215 RegionCommand::get_state ()
217 XMLNode* node = new XMLNode (X_("RegionCommand"));
220 node->add_property (X_("region"), region->id().to_s());
222 for (PropertyTriples::iterator i = property_changes.begin(); i != property_changes.end(); ++i) {
224 child = new XMLNode (X_("Op"));
226 child->add_property (X_("property"), enum_2_string (i->property));
227 child->add_property (X_("before"), i->before);
228 child->add_property (X_("after"), i->after);
230 node->add_child_nocopy (*child);
237 RegionCommand::set_state (const XMLNode& node, int /* version */)
239 const XMLNodeList& children (node.children());
243 const XMLProperty* prop;
245 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
247 if ((*i)->name() != X_("Op")) {
251 if ((prop = (*i)->property (X_("property"))) == 0) {
255 property = (Property) string_2_enum (prop->value(), property);
257 if ((prop = (*i)->property (X_("before"))) == 0) {
261 before = prop->value();
263 if ((prop = (*i)->property (X_("after"))) == 0) {
267 after = prop->value();
269 add_property_change (property, before, after);