#include "pbd/debug.h"
#include "pbd/stateful.h"
+#include "pbd/types_convert.h"
#include "pbd/property_list.h"
#include "pbd/properties.h"
#include "pbd/destructible.h"
#include "pbd/xml++.h"
#include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
int Stateful::current_state_version = 0;
int Stateful::loading_state_version = 0;
+Glib::Threads::Private<bool> Stateful::_regenerate_xml_or_string_ids;
+
Stateful::Stateful ()
- : _properties (new OwnedPropertyList)
+ : _extra_xml (0)
+ , _instant_xml (0)
+ , _properties (new OwnedPropertyList)
, _stateful_frozen (0)
{
- _extra_xml = 0;
- _instant_xml = 0;
}
Stateful::~Stateful ()
_extra_xml = new XMLNode ("Extra");
}
- _extra_xml->remove_nodes (node.name());
+ _extra_xml->remove_nodes_and_delete (node.name());
_extra_xml->add_child_nocopy (node);
}
to by _extra_xml if a new Extra node is found, but not
otherwise.
*/
-
+
const XMLNode* xtra = node.child ("Extra");
if (xtra) {
_instant_xml->add_child_copy (node);
std::string instant_xml_path = Glib::build_filename (directory_path, "instant.xml");
-
+
XMLTree tree;
tree.set_filename(instant_xml_path);
Stateful::get_changes_as_properties (Command* cmd) const
{
PropertyList* pl = new PropertyList;
-
+
for (OwnedPropertyList::const_iterator i = _properties->begin(); i != _properties->end(); ++i) {
i->second->get_changes_as_properties (*pl, cmd);
}
Stateful::set_values (XMLNode const & node)
{
PropertyChange c;
-
+
for (OwnedPropertyList::iterator i = _properties->begin(); i != _properties->end(); ++i) {
if (i->second->set_value (node)) {
c.add (i->first);
for (PropertyList::const_iterator pp = property_list.begin(); pp != property_list.end(); ++pp) {
DEBUG_TRACE (DEBUG::Stateful, string_compose ("in plist: %1\n", pp->second->property_name()));
}
-
+
for (PropertyList::const_iterator i = property_list.begin(); i != property_list.end(); ++i) {
if ((p = _properties->find (i->first)) != _properties->end()) {
DEBUG::Stateful,
string_compose ("actually setting property %1 using %2\n", p->second->property_name(), i->second->property_name())
);
-
+
if (apply_changes (*i->second)) {
c.add (i->first);
}
i->second->property_name()));
}
}
-
+
post_set (c);
send_change (c);
bool
Stateful::set_id (const XMLNode& node)
{
- const XMLProperty* prop;
+ bool* regen = _regenerate_xml_or_string_ids.get();
+
+ if (regen && *regen) {
+ reset_id ();
+ return true;
+ }
- if ((prop = node.property ("id")) != 0) {
- _id = prop->value ();
+ if (node.get_property ("id", _id)) {
return true;
}
void
Stateful::set_id (const string& str)
{
- _id = str;
+ bool* regen = _regenerate_xml_or_string_ids.get();
+
+ if (regen && *regen) {
+ reset_id ();
+ } else {
+ _id = str;
+ }
+}
+
+bool
+Stateful::regenerate_xml_or_string_ids () const
+{
+ bool* regen = _regenerate_xml_or_string_ids.get();
+ if (regen && *regen) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void
+Stateful::set_regenerate_xml_and_string_ids_in_this_thread (bool yn)
+{
+ bool* val = new bool (yn);
+ _regenerate_xml_or_string_ids.set (val);
}
} // namespace PBD