We have the same with a project tree with the hierarchy of all objects. In terms of topology we have deleting objects, moving and copying on the editor side.

Our changeset has a scope for multiple operations (example float values dragging, node dragging, deleting lots of objects).

Basically:
`Changeset changeSet(pClient, "Undo Message")
changeSet.deleteObject(...);
changeSet.moveObject(...);
```
Was that what you meant?

In terms of actual ui. What we currently have is that each node checks if it still exists on global project tree changes (add, remove,...). If that happens the tree is corrected.

However soon I will work on a change that will basically just send over the expansion state of tree and generates and sends the full tree over. Already have that for searching in the project tree which is amazingly fast.

@vurtun I'm currently iterating over the data directly from the "document" to show the tree view. So if I delete a node that is earlier in the tree during the iteration, things crash.

Sounds like you have a separate node list, which indeed solves the issue (might have missing nodes, but you can still iterate). And indeed I have to do that for the search anyways.

I think this solves my meh :)

@MikkoMononen ah sorry yes. We basically have the complete tree separate on the server and sync with the editor.

Basically an up to date representation of all data and topology. On the server side that is. Currently it is in memory in form of a tree but it also is possible to use something like lmdb.

@MikkoMononen @vurtun There's also an i-frame (as in video i-frame)/'inbetween snapshot' representation. Basically a "this is what everything looked like at this point in time", so you can iterate from that point forwards and hypothetically backwards.