-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Description
Hello everyone.
I'm in a situation where I create ofParameters with .:newReference() function.
With that I have both ofParameters "linked together" similar to @arturoc ofParameterLink proposal
I have no issues with that except with ofParameter, as there is no notification loop safeguard.
I've resolved this issue updating what I did in this change with the notifiy loop safeguard implemented in :
openFrameworks/libs/openFrameworks/types/ofParameter.h
Lines 726 to 766 in b674f7e
| inline void ofParameter<ParameterType>::eventsSetValue(const ParameterType & v){ | |
| // If the object is notifying its parents, just set the value without triggering an event. | |
| if(obj->bInNotify) | |
| { | |
| noEventsSetValue(v); | |
| } | |
| else | |
| { | |
| // Mark the object as in its notification loop. | |
| obj->bInNotify = true; | |
| // Set the value. | |
| obj->value = v; | |
| // Notify any local subscribers. | |
| ofNotifyEvent(obj->changedE,obj->value,this); | |
| // Notify all parents, if there are any. | |
| if(!obj->parents.empty()) | |
| { | |
| // Erase each invalid parent | |
| obj->parents.erase(std::remove_if(obj->parents.begin(), | |
| obj->parents.end(), | |
| [this](const std::weak_ptr<ofParameterGroup::Value> & p){ return p.expired(); }), | |
| obj->parents.end()); | |
| // notify all leftover (valid) parents of this object's changed value. | |
| // this can't happen in the same iterator as above, because a notified listener | |
| // might perform similar cleanups that would corrupt our iterator | |
| // (which appens for example if the listener calls getFirstParent on us) | |
| for(auto & parent: obj->parents){ | |
| auto p = parent.lock(); | |
| if(p){ | |
| p->notifyParameterChanged(*this); | |
| } | |
| } | |
| } | |
| obj->bInNotify = false; | |
| } | |
| } |
See implementation in: PlaymodesStudio@7bbf058
My doubt is about using this approach, or using the setMethod / eventsSetValue / noEventsSetValue. Seems as a more elegant solution but, as ofParameter has no value, its use is only for triggering events noEventsSetValue is not a needed function.
What do you think about that?
Thanks!
Eduard