56 referTo (tree, propertyID, um);
68 referTo (tree, propertyID, um, defaultToUse);
85 referTo (tree, propertyID, um, defaultToUse, arrayDelimiter);
91 referToWithDefault (other.targetTree,
101 defaultValue.removeListener (
this);
111 if (isUsingDefault())
114 if (delimiter.isNotEmpty())
115 return delimitedStringToVarArray (targetTree[targetProperty].toString(), delimiter);
117 return targetTree[targetProperty];
130 bool isUsingDefault()
const {
return ! targetTree.hasProperty (targetProperty); }
133 void resetToDefault() noexcept { targetTree.removeProperty (targetProperty,
nullptr); }
149 setValue (newValue, undoManager);
159 if (
auto* array = newValue.
getArray())
160 targetTree.setProperty (targetProperty, varArrayToDelimitedString (*array, delimiter), undoManagerToUse);
162 targetTree.setProperty (targetProperty, newValue, undoManagerToUse);
175 referToWithDefault (tree,
178 Value (
new SynchronousValueSource (
var())),
192 referToWithDefault (tree,
195 Value (
new SynchronousValueSource (defaultVal)),
210 referToWithDefault (tree,
213 Value (
new SynchronousValueSource (defaultVal)),
230 referToWithDefault (other.targetTree,
231 other.targetProperty,
241 class SynchronousValueSource :
public Value::ValueSource
244 explicit SynchronousValueSource (
const var& initialValue)
245 : value (initialValue)
249 var getValue()
const override
254 void setValue (
const var& newValue)
override
256 if (! newValue.equalsWithSameType (value))
259 sendChangeMessage (
true);
266 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SynchronousValueSource)
270 static String varArrayToDelimitedString (
const Array<var>& input, StringRef delim)
274 jassert (delim.isNotEmpty());
276 StringArray elements;
278 for (
auto& v : input)
279 elements.add (v.toString());
281 return elements.joinIntoString (delim);
284 static Array<var> delimitedStringToVarArray (StringRef input, StringRef delim)
288 for (
auto t : StringArray::fromTokens (input, delim, {}))
294 void valueChanged (Value&)
override
296 NullCheckedInvocation::invoke (onDefaultChange);
299 void referToWithDefault (ValueTree v,
302 const Value& defaultVal,
308 defaultValue.referTo (defaultVal);
311 defaultValue.addListener (
this);
315 ValueTree targetTree;
316 Identifier targetProperty;
317 UndoManager* undoManager =
nullptr;
322 JUCE_LEAK_DETECTOR (ValueTreePropertyWithDefault)