30 Value::ValueSource::ValueSource()
34 Value::ValueSource::~ValueSource()
36 cancelPendingUpdate();
39 void Value::ValueSource::handleAsyncUpdate()
41 sendChangeMessage (
true);
46 const int numListeners = valuesWithListeners.size();
54 cancelPendingUpdate();
56 for (
int i = numListeners; --i >= 0;)
57 if (
Value*
const v = valuesWithListeners[i])
75 SimpleValueSource (
const var& initialValue)
76 : value (initialValue)
85 void setValue (
const var& newValue)
override
87 if (! newValue.equalsWithSameType (value))
90 sendChangeMessage (
false);
97 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleValueSource)
108 jassert (v !=
nullptr);
123 jassert (other.listeners.size() == 0);
125 other.removeFromListenerList();
126 value = std::move (other.value);
133 jassert (other.listeners.size() == 0);
135 other.removeFromListenerList();
136 value = std::move (other.value);
142 removeFromListenerList();
145 void Value::removeFromListenerList()
147 if (listeners.size() > 0 && value !=
nullptr)
148 value->valuesWithListeners.removeValue (
this);
154 return value->getValue();
157 Value::operator
var()
const
159 return value->getValue();
164 value->setValue (newValue);
169 return value->getValue().toString();
174 value->setValue (newValue);
180 if (valueToReferTo.value != value)
182 if (listeners.size() > 0)
184 value->valuesWithListeners.removeValue (
this);
185 valueToReferTo.value->valuesWithListeners.add (
this);
188 value = valueToReferTo.value;
195 return value == other.value;
200 return value == other.value || value->getValue() == other.
getValue();
205 return value != other.value && value->getValue() != other.
getValue();
211 if (listener !=
nullptr)
213 if (listeners.size() == 0)
214 value->valuesWithListeners.add (
this);
216 listeners.add (listener);
222 listeners.remove (listener);
224 if (listeners.size() == 0)
225 value->valuesWithListeners.removeValue (
this);
228 void Value::callListeners()
230 if (listeners.size() > 0)
237 OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream,
const Value& value)
239 return stream << value.toString();
virtual void valueChanged(Value &value)=0
void sendChangeMessage(bool dispatchSynchronously)
bool operator==(const Value &other) const
void setValue(const var &newValue)
void addListener(Listener *listener)
void removeListener(Listener *listener)
bool refersToSameSourceAs(const Value &other) const
Value & operator=(const var &newValue)
void referTo(const Value &valueToReferTo)
bool operator!=(const Value &other) const