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); }
149 setValue (newValue, undoManager);
159 if (
auto* array = newValue.
getArray())
160 targetTree.setProperty (targetProperty, varArrayToDelimitedString (*array, delimiter),
undoManagerToUse);
175 referToWithDefault (tree,
178 Value (
new SynchronousValueSource (
var())),
192 referToWithDefault (tree,
210 referToWithDefault (tree,
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)
327using ValueWithDefault [[deprecated (
"This class has been renamed to better describe what is does. "
328 "This declaration is here for backwards compatibility and new "
329 "code should use the new class name.")]]
330 = ValueTreePropertyWithDefault;
ValueTree & getValueTree() noexcept
ValueTreePropertyWithDefault(ValueTree &tree, const Identifier &propertyID, UndoManager *um, var defaultToUse, StringRef arrayDelimiter)
Value getPropertyAsValue()
~ValueTreePropertyWithDefault() override
bool isUsingDefault() const
void referTo(ValueTree tree, const Identifier &property, UndoManager *um, var defaultVal, StringRef arrayDelimiter)
void setValue(const var &newValue, UndoManager *undoManagerToUse)
std::function< void()> onDefaultChange
void referTo(ValueTree tree, const Identifier &property, UndoManager *um, var defaultVal)
UndoManager * getUndoManager() noexcept
ValueTreePropertyWithDefault(const ValueTreePropertyWithDefault &other)
ValueTreePropertyWithDefault()=default
ValueTreePropertyWithDefault(ValueTree &tree, const Identifier &propertyID, UndoManager *um, var defaultToUse)
void setDefault(const var &newDefault)
Identifier & getPropertyID() noexcept
ValueTreePropertyWithDefault(ValueTree &tree, const Identifier &propertyID, UndoManager *um)
void resetToDefault() noexcept
void referTo(ValueTree tree, const Identifier &property, UndoManager *um)
Array< var > * getArray() const noexcept