diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-03-02 18:05:26 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-03-02 18:05:26 +0000 |
commit | 17088ee3ea5af1e6174b098bb5bcfdaec6ebf9b0 (patch) | |
tree | cbf9fe8fb94212f9a50c6b760ebaac3b4a1bcec6 /libs/pbd | |
parent | a5ab2e99e19d5f5d4c1f91f38cd774fefdf257dc (diff) |
(1) remove most uses of MementoCommand for Playlist and Region (2) move frozen state from Region into Stateful, renamed "suspend property changes" (3) successive changes to a Property (scalar) after clear_history() do not keep resetting the old value (fixes region trim)
git-svn-id: svn://localhost/ardour2/branches/3.0@6720 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd')
-rw-r--r-- | libs/pbd/pbd/properties.h | 6 | ||||
-rw-r--r-- | libs/pbd/pbd/stateful.h | 19 | ||||
-rw-r--r-- | libs/pbd/stateful.cc | 52 |
3 files changed, 73 insertions, 4 deletions
diff --git a/libs/pbd/pbd/properties.h b/libs/pbd/pbd/properties.h index 274dfffd9c..8d2f465ebf 100644 --- a/libs/pbd/pbd/properties.h +++ b/libs/pbd/pbd/properties.h @@ -122,8 +122,10 @@ protected: {} void set (T const& v) { - _old = _current; - _have_old = true; + if (!_have_old) { + _old = _current; + _have_old = true; + } _current = v; } diff --git a/libs/pbd/pbd/stateful.h b/libs/pbd/pbd/stateful.h index 78b9eb7b3b..93f353a095 100644 --- a/libs/pbd/pbd/stateful.h +++ b/libs/pbd/pbd/stateful.h @@ -82,6 +82,12 @@ class Stateful { static int current_state_version; static int loading_state_version; + virtual void suspend_property_changes (); + virtual void resume_property_changes (); + + void unlock_property_changes () { _no_property_changes = false; } + void block_property_changes () { _no_property_changes = true; } + protected: void add_instant_xml (XMLNode&, const sys::path& directory_path); @@ -100,10 +106,21 @@ class Stateful { XMLNode *_extra_xml; XMLNode *_instant_xml; - PBD::ID _id; + PBD::ID _id; + int32_t _frozen; + bool _no_property_changes; + PBD::PropertyChange _pending_changed; + Glib::Mutex _lock; std::string _xml_node_name; ///< name of node to use for this object in XML OwnedPropertyList* _properties; + + virtual void send_change (const PropertyChange&); + /** derived classes can implement this in order to process a property change + within thaw() just before send_change() is called. + */ + virtual void mid_thaw (const PropertyChange&) { } + bool property_changes_suspended() const { return g_atomic_int_get (&_frozen) > 0; } }; } // namespace PBD diff --git a/libs/pbd/stateful.cc b/libs/pbd/stateful.cc index f2d9f9ee12..1bf8c17d83 100644 --- a/libs/pbd/stateful.cc +++ b/libs/pbd/stateful.cc @@ -39,7 +39,9 @@ int Stateful::current_state_version = 0; int Stateful::loading_state_version = 0; Stateful::Stateful () - : _properties (new OwnedPropertyList) + : _frozen (0) + , _no_property_changes (false) + , _properties (new OwnedPropertyList) { _extra_xml = 0; _instant_xml = 0; @@ -238,4 +240,52 @@ Stateful::add_property (PropertyBase& s) _properties->add (s); } +void +Stateful::send_change (const PropertyChange& what_changed) +{ + if (what_changed.empty()) { + return; + } + + { + Glib::Mutex::Lock lm (_lock); + if (_frozen) { + _pending_changed.add (what_changed); + return; + } + } + + PropertyChanged (what_changed); +} + +void +Stateful::suspend_property_changes () +{ + _frozen++; +} + +void +Stateful::resume_property_changes () +{ + PropertyChange what_changed; + + { + Glib::Mutex::Lock lm (_lock); + + if (_frozen && --_frozen > 0) { + return; + } + + if (!_pending_changed.empty()) { + what_changed = _pending_changed; + _pending_changed.clear (); + } + } + + mid_thaw (what_changed); + + send_change (what_changed); +} + + } // namespace PBD |