29namespace ValueTreeSynchroniserHelpers
41 static void getValueTreePath (ValueTree v,
const ValueTree& topLevelTree, Array<int>& path)
43 while (v != topLevelTree)
45 ValueTree parent (v.getParent());
47 if (! parent.isValid())
50 path.add (parent.indexOf (v));
55 static void writeHeader (MemoryOutputStream& stream, ChangeType type)
57 stream.writeByte ((
char) type);
60 static void writeHeader (ValueTreeSynchroniser& target, MemoryOutputStream& stream,
61 ChangeType type, ValueTree v)
63 writeHeader (stream, type);
66 getValueTreePath (v, target.getRoot(), path);
68 stream.writeCompressedInt (path.size());
70 for (
int i = path.size(); --i >= 0;)
71 stream.writeCompressedInt (path.getUnchecked (i));
74 static ValueTree readSubTreeLocation (MemoryInputStream& input, ValueTree v)
76 const int numLevels = input.readCompressedInt();
78 if (! isPositiveAndBelow (numLevels, 65536))
81 for (
int i = numLevels; --i >= 0;)
83 const int index = input.readCompressedInt();
85 if (! isPositiveAndBelow (index, v.getNumChildren()))
88 v = v.getChild (index);
108 writeHeader (m, ValueTreeSynchroniserHelpers::fullSync);
113void ValueTreeSynchroniser::valueTreePropertyChanged (
ValueTree& vt,
const Identifier& property)
119 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::propertyChanged, vt);
121 value->writeToStream (m);
125 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::propertyRemoved, vt);
132void ValueTreeSynchroniser::valueTreeChildAdded (ValueTree& parentTree, ValueTree& childTree)
134 const int index = parentTree.indexOf (childTree);
135 jassert (index >= 0);
137 MemoryOutputStream m;
138 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::childAdded, parentTree);
139 m.writeCompressedInt (index);
140 childTree.writeToStream (m);
144void ValueTreeSynchroniser::valueTreeChildRemoved (ValueTree& parentTree, ValueTree&,
int oldIndex)
146 MemoryOutputStream m;
147 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::childRemoved, parentTree);
148 m.writeCompressedInt (oldIndex);
152void ValueTreeSynchroniser::valueTreeChildOrderChanged (ValueTree& parent,
int oldIndex,
int newIndex)
154 MemoryOutputStream m;
155 ValueTreeSynchroniserHelpers::writeHeader (*
this, m, ValueTreeSynchroniserHelpers::childMoved, parent);
156 m.writeCompressedInt (oldIndex);
157 m.writeCompressedInt (newIndex);
165 const ValueTreeSynchroniserHelpers::ChangeType type = (ValueTreeSynchroniserHelpers::ChangeType) input.
readByte();
167 if (type == ValueTreeSynchroniserHelpers::fullSync)
173 ValueTree v (ValueTreeSynchroniserHelpers::readSubTreeLocation (input, root));
180 case ValueTreeSynchroniserHelpers::propertyChanged:
187 case ValueTreeSynchroniserHelpers::propertyRemoved:
194 case ValueTreeSynchroniserHelpers::childAdded:
201 case ValueTreeSynchroniserHelpers::childRemoved:
215 case ValueTreeSynchroniserHelpers::childMoved:
223 v.
moveChild (oldIndex, newIndex, undoManager);
231 case ValueTreeSynchroniserHelpers::fullSync:
const String & toString() const noexcept
const void * getData() const noexcept
size_t getDataSize() const noexcept
virtual bool writeString(const String &text)
~ValueTreeSynchroniser() override
static bool applyChange(ValueTree &target, const void *encodedChangeData, size_t encodedChangeDataSize, UndoManager *undoManager)
virtual void stateChanged(const void *encodedChange, size_t encodedChangeSize)=0
ValueTreeSynchroniser(const ValueTree &tree)
void sendFullSyncCallback()
static ValueTree readFromStream(InputStream &input)
void removeChild(const ValueTree &child, UndoManager *undoManager)
int getNumChildren() const noexcept
bool isValid() const noexcept
const var * getPropertyPointer(const Identifier &name) const noexcept
ValueTree & setProperty(const Identifier &name, const var &newValue, UndoManager *undoManager)
void addListener(Listener *listener)
void addChild(const ValueTree &child, int index, UndoManager *undoManager)
void removeListener(Listener *listener)
void writeToStream(OutputStream &output) const
void moveChild(int currentIndex, int newIndex, UndoManager *undoManager)
void removeProperty(const Identifier &name, UndoManager *undoManager)
static var readFromStream(InputStream &input)