|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
- 27th April 2017).
-
- End User License Agreement: www.juce.com/juce-5-licence
- Privacy Policy: www.juce.com/juce-5-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- //==============================================================================
- /**
- This class acts as a wrapper around a property inside a ValueTree.
-
- If the property inside the ValueTree is missing or empty the ValueWithDefault will automatically
- return a default value, which can be specified when initialising the ValueWithDefault.
- */
- class ValueWithDefault
- {
- public:
- //==============================================================================
- /** Creates an unitialised ValueWithDefault. Initialise it using one of the referTo() methods. */
- ValueWithDefault() : undoManager (nullptr) {}
-
- /** Creates an ValueWithDefault object. The default value will be an empty var. */
- ValueWithDefault (ValueTree& tree, const Identifier& propertyID,
- UndoManager* um)
- : targetTree (tree),
- targetProperty (propertyID),
- undoManager (um),
- defaultValue()
- {
- }
-
- /** Creates an ValueWithDefault object. The default value will be defaultToUse. */
- ValueWithDefault (ValueTree& tree, const Identifier& propertyID,
- UndoManager* um, const var& defaultToUse)
- : targetTree (tree),
- targetProperty (propertyID),
- undoManager (um),
- defaultValue (defaultToUse)
- {
- }
-
- /** Creates a ValueWithDefault object from another ValueWithDefault object. */
- ValueWithDefault (const ValueWithDefault& other)
- : targetTree (other.targetTree),
- targetProperty (other.targetProperty),
- undoManager (other.undoManager),
- defaultValue (other.defaultValue)
- {
- }
-
- //==============================================================================
- /** Returns the current value of the property. If the property does not exist or is empty,
- returns the default value.
- */
- var get() const noexcept
- {
- if (isUsingDefault())
- return defaultValue;
-
- return targetTree[targetProperty];
- }
-
- /** Returns the current property as a Value object. */
- Value getPropertyAsValue() { return targetTree.getPropertyAsValue (targetProperty, undoManager); }
-
- /** Returns the current default value. */
- var getDefault() const { return defaultValue; }
-
- /** Sets the default value to a new var. */
- void setDefault (const var& newDefault)
- {
- if (defaultValue != newDefault)
- defaultValue = newDefault;
- }
-
- /** Returns true if the property does not exist or is empty. */
- bool isUsingDefault() const
- {
- return ! targetTree.hasProperty (targetProperty);
- }
-
- /** Resets the property to an empty var. */
- void resetToDefault() noexcept
- {
- targetTree.removeProperty (targetProperty, nullptr);
- }
-
- //==============================================================================
- /** Sets the property and returns the new ValueWithDefault. This will modify the property in the referenced ValueTree. */
- ValueWithDefault& operator= (const var& newValue)
- {
- setValue (newValue, undoManager);
- return *this;
- }
-
- /** Sets the property. This will actually modify the property in the referenced ValueTree. */
- void setValue (const var& newValue, UndoManager* undoManagerToUse)
- {
- targetTree.setProperty (targetProperty, newValue, undoManagerToUse);
- }
-
- //==============================================================================
- /** Makes the ValueWithDefault refer to the specified property inside the given ValueTree. */
- void referTo (ValueTree& tree, const Identifier& property, UndoManager* um)
- {
- referToWithDefault (tree, property, um, var());
- }
-
- /** Makes the ValueWithDefault refer to the specified property inside the given ValueTree,
- and specifies a default value to use.
- */
- void referTo (ValueTree& tree, const Identifier& property, UndoManager* um, const var& defaultVal)
- {
- referToWithDefault (tree, property, um, defaultVal);
- }
-
- //==============================================================================
- /** Returns a reference to the ValueTree containing the referenced property. */
- ValueTree& getValueTree() noexcept { return targetTree; }
-
- /** Returns the property ID of the referenced property. */
- Identifier& getPropertyID() noexcept { return targetProperty; }
-
- private:
- //==============================================================================
- ValueTree targetTree;
- Identifier targetProperty;
- UndoManager* undoManager;
- var defaultValue;
-
- //==============================================================================
- void referToWithDefault (ValueTree& v, const Identifier& i, UndoManager* um, const var& defaultVal)
- {
- targetTree = v;
- targetProperty = i;
- undoManager = um;
- defaultValue = defaultVal;
- }
- };
-
- } // namespace juce
|