provide a mechanism to force ID regeneration/reset in PBD::Stateful when settingthe ID object from XML or string sources
This commit is contained in:
parent
487a2563a6
commit
92fe47bdee
@ -70,6 +70,17 @@ class LIBPBD_API Stateful {
|
|||||||
void set_id (const std::string&);
|
void set_id (const std::string&);
|
||||||
void reset_id ();
|
void reset_id ();
|
||||||
|
|
||||||
|
/* RAII structure to manage thread-local ID regeneration.
|
||||||
|
*/
|
||||||
|
struct ForceIDRegeneration {
|
||||||
|
ForceIDRegeneration () {
|
||||||
|
set_regenerate_xml_and_string_ids_in_this_thread (true);
|
||||||
|
}
|
||||||
|
~ForceIDRegeneration () {
|
||||||
|
set_regenerate_xml_and_string_ids_in_this_thread (false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* history management */
|
/* history management */
|
||||||
|
|
||||||
void clear_changes ();
|
void clear_changes ();
|
||||||
@ -121,11 +132,14 @@ class LIBPBD_API Stateful {
|
|||||||
virtual void mid_thaw (const PropertyChange&) { }
|
virtual void mid_thaw (const PropertyChange&) { }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
friend struct ForceIDRegeneration;
|
||||||
|
static Glib::Threads::Private<bool> regenerate_xml_or_string_ids;
|
||||||
PBD::ID _id;
|
PBD::ID _id;
|
||||||
gint _stateful_frozen;
|
gint _stateful_frozen;
|
||||||
|
|
||||||
|
static void set_regenerate_xml_and_string_ids_in_this_thread (bool yn);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace PBD
|
} // namespace PBD
|
||||||
|
|
||||||
#endif /* __pbd_stateful_h__ */
|
#endif /* __pbd_stateful_h__ */
|
||||||
|
|
||||||
|
@ -44,6 +44,10 @@ namespace PBD {
|
|||||||
int Stateful::current_state_version = 0;
|
int Stateful::current_state_version = 0;
|
||||||
int Stateful::loading_state_version = 0;
|
int Stateful::loading_state_version = 0;
|
||||||
|
|
||||||
|
static void do_not_delete (void*) { }
|
||||||
|
|
||||||
|
Glib::Threads::Private<bool> Stateful::regenerate_xml_or_string_ids (do_not_delete);
|
||||||
|
|
||||||
Stateful::Stateful ()
|
Stateful::Stateful ()
|
||||||
: _extra_xml (0)
|
: _extra_xml (0)
|
||||||
, _instant_xml (0)
|
, _instant_xml (0)
|
||||||
@ -382,6 +386,11 @@ Stateful::set_id (const XMLNode& node)
|
|||||||
{
|
{
|
||||||
const XMLProperty* prop;
|
const XMLProperty* prop;
|
||||||
|
|
||||||
|
if (regenerate_xml_or_string_ids.get()) {
|
||||||
|
reset_id ();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if ((prop = node.property ("id")) != 0) {
|
if ((prop = node.property ("id")) != 0) {
|
||||||
_id = prop->value ();
|
_id = prop->value ();
|
||||||
return true;
|
return true;
|
||||||
@ -399,7 +408,17 @@ Stateful::reset_id ()
|
|||||||
void
|
void
|
||||||
Stateful::set_id (const string& str)
|
Stateful::set_id (const string& str)
|
||||||
{
|
{
|
||||||
|
if (regenerate_xml_or_string_ids.get()) {
|
||||||
|
reset_id ();
|
||||||
|
} else {
|
||||||
_id = str;
|
_id = str;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Stateful::set_regenerate_xml_and_string_ids_in_this_thread (bool yn)
|
||||||
|
{
|
||||||
|
regenerate_xml_or_string_ids.set (&yn);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace PBD
|
} // namespace PBD
|
||||||
|
Loading…
Reference in New Issue
Block a user