30 namespace ValueTreeSynchroniserHelpers
42 static void getValueTreePath (ValueTree v,
const ValueTree& topLevelTree, Array<int>& path)
44 while (v != topLevelTree)
46 ValueTree parent (v.getParent());
48 if (! parent.isValid())
51 path.add (parent.indexOf (v));
56 static void writeHeader (MemoryOutputStream& stream, ChangeType type)
58 stream.writeByte ((
char) type);
61 static void writeHeader (ValueTreeSynchroniser& target, MemoryOutputStream& stream,
62 ChangeType type, ValueTree v)
64 writeHeader (stream, type);
67 getValueTreePath (v, target.getRoot(), path);
69 stream.writeCompressedInt (path.size());
71 for (
int i = path.size(); --i >= 0;)
72 stream.writeCompressedInt (path.getUnchecked(i));
75 static ValueTree readSubTreeLocation (MemoryInputStream& input, ValueTree v)
77 const int numLevels = input.readCompressedInt();
79 if (! isPositiveAndBelow (numLevels, 65536))
82 for (
int i = numLevels; --i >= 0;)
84 const int index = input.readCompressedInt();
86 if (! isPositiveAndBelow (index, v.getNumChildren()))
109 writeHeader (m, ValueTreeSynchroniserHelpers::fullSync);
114 void ValueTreeSynchroniser::valueTreePropertyChanged (
ValueTree& vt,
const Identifier& property)
120 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::propertyChanged, vt);
122 value->writeToStream (m);
126 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::propertyRemoved, vt);
133 void ValueTreeSynchroniser::valueTreeChildAdded (
ValueTree& parentTree,
ValueTree& childTree)
135 const int index = parentTree.
indexOf (childTree);
136 jassert (index >= 0);
139 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::childAdded, parentTree);
145 void ValueTreeSynchroniser::valueTreeChildRemoved (
ValueTree& parentTree,
ValueTree&,
int oldIndex)
148 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::childRemoved, parentTree);
153 void ValueTreeSynchroniser::valueTreeChildOrderChanged (
ValueTree& parent,
int oldIndex,
int newIndex)
156 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::childMoved, parent);
166 const ValueTreeSynchroniserHelpers::ChangeType type = (ValueTreeSynchroniserHelpers::ChangeType) input.
readByte();
168 if (type == ValueTreeSynchroniserHelpers::fullSync)
174 ValueTree v (ValueTreeSynchroniserHelpers::readSubTreeLocation (input, root));
181 case ValueTreeSynchroniserHelpers::propertyChanged:
188 case ValueTreeSynchroniserHelpers::propertyRemoved:
195 case ValueTreeSynchroniserHelpers::childAdded:
202 case ValueTreeSynchroniserHelpers::childRemoved:
216 case ValueTreeSynchroniserHelpers::childMoved:
224 v.
moveChild (oldIndex, newIndex, undoManager);
~ValueTreeSynchroniser() override
void addListener(Listener *listener)
static ValueTree readFromStream(InputStream &input)
void removeChild(const ValueTree &child, UndoManager *undoManager)
void removeListener(Listener *listener)
int getNumChildren() const noexcept
static bool applyChange(ValueTree &target, const void *encodedChangeData, size_t encodedChangeDataSize, UndoManager *undoManager)
ValueTree getChild(int index) const
bool isValid() const noexcept
const void * getData() const noexcept
ValueTree & setProperty(const Identifier &name, const var &newValue, UndoManager *undoManager)
virtual void stateChanged(const void *encodedChange, size_t encodedChangeSize)=0
const String & toString() const noexcept
void addChild(const ValueTree &child, int index, UndoManager *undoManager)
void moveChild(int currentIndex, int newIndex, UndoManager *undoManager)
ValueTreeSynchroniser(const ValueTree &tree)
size_t getDataSize() const noexcept
void sendFullSyncCallback()
int indexOf(const ValueTree &child) const noexcept
void writeToStream(OutputStream &output) const
const var * getPropertyPointer(const Identifier &name) const noexcept
virtual bool writeCompressedInt(int value)
virtual bool writeString(const String &text)
void removeProperty(const Identifier &name, UndoManager *undoManager)
static var readFromStream(InputStream &input)