1 #include "pbd/convert.h"
3 #include "pbd/locale_guard.h"
4 #include "pbd/enumwriter.h"
6 #include "ardour/region.h"
7 #include "ardour/region_command.h"
8 #include "ardour/utils.h"
12 using namespace ARDOUR;
16 RegionCommand::RegionCommand (boost::shared_ptr<Region> r, const XMLNode& node)
19 if (set_state (node, 0)) {
20 throw failed_constructor();
24 RegionCommand::RegionCommand (boost::shared_ptr<Region> r)
29 RegionCommand::RegionCommand (boost::shared_ptr<Region> r, Property prop, const std::string& target_value)
32 LocaleGuard lg ("POSIX");
36 /* get current value as a string */
42 case PositionLockStyle:
43 before = enum_2_string (r->positional_lock_style());
46 snprintf (buf, sizeof (buf), "%" PRId32, r->length());
50 snprintf (buf, sizeof (buf), "%" PRId32, r->start());
54 snprintf (buf, sizeof (buf), "%" PRId32, r->position());
58 snprintf (buf, sizeof (buf), "%" PRId32, r->position());
62 snprintf (buf, sizeof (buf), "%" PRId32, r->layer());
66 snprintf (buf, sizeof (buf), "%" PRId32, r->sync_position());
70 before = (r->hidden() ? "yes" : "no");
73 before = (r->muted() ? "yes" : "no");
76 before = (r->opaque() ? "yes" : "no");
79 before = (r->locked() ? "yes" : "no");
82 before = (r->position_locked() ? "yes" : "no");
107 case DefaultEnvelope:
112 add_property_change (prop, before, target_value);
116 RegionCommand::_add_property_change (Property prop, const std::string& before, const std::string& after)
118 property_changes.push_back (PropertyTriple (prop, before, after));
122 RegionCommand::operator() ()
125 for (PropertyTriples::iterator i= property_changes.begin(); i != property_changes.end(); ++i) {
126 do_property_change (i->property, i->after);
132 RegionCommand::undo ()
135 for (PropertyTriples::iterator i= property_changes.begin(); i != property_changes.end(); ++i) {
136 do_property_change (i->property, i->before);
142 RegionCommand::do_property_change (Property prop, const std::string& value)
144 Region::PositionLockStyle pls;
148 region->set_name (value);
150 case PositionLockStyle:
151 region->set_position_lock_style ((Region::PositionLockStyle) string_2_enum (value, pls));
154 region->set_length (atoll (value), this);
157 region->set_start (atoll (value), this);
160 region->set_position (atoll (value), this);
163 region->set_position_on_top (atoll (value), this);
166 region->set_layer (atoi (value));
169 region->set_sync_position (atoi (value));
172 region->set_hidden (string_is_affirmative (value));
175 region->set_muted (string_is_affirmative (value));
178 region->set_opaque (string_is_affirmative (value));
181 region->set_locked (string_is_affirmative (value));
184 region->set_position_locked (string_is_affirmative (value));
209 case DefaultEnvelope:
216 RegionCommand::get_state ()
218 XMLNode* node = new XMLNode (X_("RegionCommand"));
221 node->add_property (X_("region"), region->id().to_s());
223 for (PropertyTriples::iterator i = property_changes.begin(); i != property_changes.end(); ++i) {
225 child = new XMLNode (X_("Op"));
227 child->add_property (X_("property"), enum_2_string (i->property));
228 child->add_property (X_("before"), i->before);
229 child->add_property (X_("after"), i->after);
231 node->add_child_nocopy (*child);
238 RegionCommand::set_state (const XMLNode& node, int /* version */)
240 const XMLNodeList& children (node.children());
244 const XMLProperty* prop;
246 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
248 if ((*i)->name() != X_("Op")) {
252 if ((prop = (*i)->property (X_("property"))) == 0) {
256 property = (Property) string_2_enum (prop->value(), property);
258 if ((prop = (*i)->property (X_("before"))) == 0) {
262 before = prop->value();
264 if ((prop = (*i)->property (X_("after"))) == 0) {
268 after = prop->value();
270 add_property_change (property, before, after);