Rework to set Stateful properties automagically in the Stateful class rather than...
authorCarl Hetherington <carl@carlh.net>
Wed, 31 Mar 2010 22:45:27 +0000 (22:45 +0000)
committerCarl Hetherington <carl@carlh.net>
Wed, 31 Mar 2010 22:45:27 +0000 (22:45 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6817 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/audioregion.h
libs/ardour/ardour/region.h
libs/ardour/audioregion.cc
libs/ardour/region.cc
libs/pbd/pbd/properties.h
libs/pbd/pbd/property_basics.h
libs/pbd/pbd/sequence_property.h
libs/pbd/pbd/stateful.h
libs/pbd/stateful.cc

index 59876d6e56d5caa1d67c3dbcf8173862a85c9af4..f9c13b2bbe1172c7e327a941ccec6f3f69e866c9 100644 (file)
@@ -199,7 +199,6 @@ class AudioRegion : public Region
        PBD::Property<gain_t>   _scale_amplitude;
        
        void register_properties ();
-       bool set_property (const PBD::PropertyBase& prop);
        void post_set ();
 
        void init ();
index 09dd8f203c2f0625b4dc7e4c88aac84437e5d3be..a44b3fcb463482115a20b1b94ac7194e04cf0d9a 100644 (file)
@@ -344,7 +344,6 @@ class Region
 
        virtual int _set_state (const XMLNode&, int version, PBD::PropertyChange& what_changed, bool send_signal);
 
-       bool set_property (const PBD::PropertyBase&);
        void register_properties ();
 
 private:
index 3430eb5128a7761ef315da1e485b4ed1cff9d478..be6cce251aad7977917154da1024b789b956585e 100644 (file)
@@ -691,54 +691,6 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
        return 0;
 }
 
-bool
-AudioRegion::set_property (const PropertyBase& prop)
-{
-       DEBUG_TRACE (DEBUG::Properties,  string_compose ("audio region %1 set property %2\n", _name.val(), prop.property_name()));
-
-       if (prop == Properties::envelope_active.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _envelope_active) {
-                       _envelope_active = val;
-                       return true;
-               }
-       } else if (prop == Properties::default_fade_in.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _default_fade_in) {
-                       _default_fade_in = val;
-                       return true;
-               }
-       } else if (prop == Properties::default_fade_out.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _default_fade_out) {
-                       _default_fade_out = val;
-                       return true;
-               }
-       } else if (prop == Properties::fade_in_active.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _fade_in_active) {
-                       _fade_in_active = val;
-                       return true;
-               }
-       } else if (prop == Properties::fade_out_active.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _fade_out_active) {
-                       _fade_out_active = val;
-                       return true;
-               }
-       } else if (prop == Properties::scale_amplitude.property_id) {
-               gain_t val = dynamic_cast<const PropertyTemplate<gain_t>*>(&prop)->val();
-               if (val != _scale_amplitude) {
-                       _scale_amplitude = val;
-                       return true;
-               }
-       } else {
-               return Region::set_property (prop);
-       }
-       
-       return false;
-}
-
 int
 AudioRegion::set_state (const XMLNode& node, int version)
 {
index bb9338d98df2db21067368472fdae37afacaaeed..8625b17a8a8276b11c14bea9a852f5ecc68ffe1b 100644 (file)
@@ -1498,109 +1498,6 @@ Region::use_sources (SourceList const & s)
        }
 }
 
-
-bool
-Region::set_property (const PropertyBase& prop)
-{
-       DEBUG_TRACE (DEBUG::Properties,  string_compose ("region %1 set property %2\n", _name.val(), prop.property_name()));
-
-       if (prop == Properties::muted.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _muted) {
-                       DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 muted changed from %2 to %3",
-                                                                       _name.val(), _muted.val(), val));
-                       _muted = val;
-                       return true;
-               }
-       } else if (prop == Properties::opaque.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _opaque) {
-                       DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 opaque changed from %2 to %3",
-                                                                       _name.val(), _opaque.val(), val));
-                       _opaque = val;
-                       return true;
-               }
-       } else if (prop == Properties::locked.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _locked) {
-                       DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 locked changed from %2 to %3",
-                                                                       _name.val(), _locked.val(), val));
-                       _locked = val;
-                       return true;
-               }
-       } else if (prop == Properties::automatic.property_id) {
-               _automatic = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::whole_file.property_id) {
-               _whole_file = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::import.property_id) {
-               _import = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::external.property_id) {
-               _external = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::sync_marked.property_id) {
-               _sync_marked = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::left_of_split.property_id) {
-               _left_of_split = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::right_of_split.property_id) {
-               _right_of_split = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::hidden.property_id) {
-               bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-               if (val != _hidden) {
-                       _hidden = val;
-                       return true;
-               }
-       } else if (prop == Properties::position_locked.property_id) {
-               _position_locked = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
-       } else if (prop == Properties::start.property_id) {
-               framepos_t val = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
-                if (val != _start) {
-                        DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 start changed from %2 to %3",
-                                                                       _name.val(), _start, val));
-                        _start = val;
-                        return true;
-                }
-       } else if (prop == Properties::length.property_id) {
-               framecnt_t val = dynamic_cast<const PropertyTemplate<framecnt_t>* > (&prop)->val();
-               if (val != _length) {
-                       DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 length changed from %2 to %3",
-                                                                       _name.val(), _length, val));
-                       _length = val;
-                       return true;
-               }
-       } else if (prop == Properties::position.property_id) {
-               framepos_t val = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
-               if (val != _position) {
-                       DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 position changed from %2 to %3",
-                                                                       _name.val(), _position, val));
-                       _position = val;
-                       return true;
-               }
-       } else if (prop == Properties::sync_position.property_id) {
-               framepos_t val = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
-               if (val != _sync_position) {
-                       _sync_position = val;
-                       return true;
-               }
-       } else if (prop == Properties::layer.property_id) {
-               layer_t val = dynamic_cast<const PropertyTemplate<layer_t>*>(&prop)->val();
-               if (val != _layer) {
-                       _layer = val;
-                       return true;
-               }
-       } else if (prop == Properties::ancestral_start.property_id) {
-               _ancestral_start = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
-       } else if (prop == Properties::ancestral_length.property_id) {
-               _ancestral_length = dynamic_cast<const PropertyTemplate<framecnt_t>*>(&prop)->val();
-       } else if (prop == Properties::stretch.property_id) {
-               _stretch = dynamic_cast<const PropertyTemplate<float>*>(&prop)->val();
-       } else if (prop == Properties::shift.property_id) {
-               _shift = dynamic_cast<const PropertyTemplate<float>*>(&prop)->val();
-       } else {
-               return SessionObject::set_property (prop);
-       }
-       
-       return false;
-}
-
 PropertyList*
 Region::property_factory (const XMLNode& history_node) const
 {
index 691ab9c4adf8baa17d32ca75ea2f409789cc430e..31197030f936a61af3ae496da810aa3aa2ceb63f 100644 (file)
@@ -118,6 +118,12 @@ public:
        }
 
        bool changed () const { return _have_old; }
+       void set_state_from_property (PropertyBase const * p) {
+               T v = dynamic_cast<const PropertyTemplate<T>* > (p)->val ();
+               if (v != _current) {
+                       set (v);
+               }
+       }
 
 protected:
         /** Constructs a PropertyTemplate with a default
index 251d71dc66425a3afaf5bbd43553e2fe5d109d22..1baa14ac6495d0eb67579b0d9a35b48d1be329cb 100644 (file)
@@ -91,6 +91,9 @@ public:
        virtual void add_state_to_owner_state (XMLNode&) const   = 0;
        virtual bool changed() const = 0;
 
+       /** Set the value of this property from another */
+       virtual void set_state_from_property (PropertyBase const *) = 0;
+
        const gchar*property_name () const { return g_quark_to_string (_property_id); }
        PropertyID  property_id () const   { return _property_id; }
 
index 8bbc7c77d281f1fc3959c006f86275a5b8b8e256..d9ef6255d25a766c38edad5a8edb3d5451405c9e 100644 (file)
@@ -123,6 +123,11 @@ class SequenceProperty : public PropertyBase
                _change.removed.clear ();
        }
 
+       void set_state_from_property (PropertyBase const * p) {
+               const ChangeRecord& change (dynamic_cast<const SequenceProperty*> (p)->change ());
+               update (change);
+       }
+
        /** Given a record of changes to this property, pass it to a callback that will
         *  update the property in some appropriate way. 
         *
index 5585b5c13b41196c6035042b4bec140a2024ef4a..4352e8820159c6758999076bf48ff1025effa2b0 100644 (file)
@@ -48,10 +48,7 @@ class Stateful {
 
        virtual XMLNode& get_state (void) = 0;
        virtual int set_state (const XMLNode&, int version) = 0;
-       /* derived types do not have to implement this, but probably should
-          give it serious attention.
-       */
-       virtual bool set_property (const PropertyBase&) { return false; }
+       virtual bool set_property (const PropertyBase&);
 
        PropertyChange set_properties (const PropertyList&);
         const OwnedPropertyList& properties() const { return *_properties; }
index 89b22edd244ccfbaa263c612f1b9f16e09fc7f22..36a0d747786d0cd6b90cea55dd43f47be177fd08 100644 (file)
@@ -299,4 +299,16 @@ Stateful::changed() const
         return false;
 }
 
+bool
+Stateful::set_property (const PropertyBase& prop)
+{
+       OwnedPropertyList::iterator i = _properties->find (prop.property_id());
+       if (i == _properties->end()) {
+               return false;
+       }
+
+       i->second->set_state_from_property (&prop);
+       return true;
+}
+
 } // namespace PBD