class TreePannel : DockPanel { void onRender() { Entity root = Engine::getRoot(); UI::contextMenuPopup("Window popup", any(root), ReciverFunc(this.entityContextMenu)); renderNode(any(root)); UI::modalPopup("Rename entity", renameEntity); } void renderNode(any@ data) { Entity entity; data.retrieve(entity); if (!entity.isRoot) entityInteraction(entity); // Maybe we deleted the entity in the context menu if (!entity.exists) return; for (int i = 0; i < entity.childs.count; i++) { Entity child = entity.childs[i]; bool isActive = child == Chewico::ActiveEntity::ActiveEntity::getActiveEntity(); string displayName = child.name; if (displayName == "") { displayName = "-"; } displayName += "##" + child.id; if (child.childs.count == 0) { // END OF THE TREE UI::treeNodeLeaf(displayName, isActive); entityInteraction(child); } else { // ADD ANOTHER NODE bool opened = UI::treeNode(displayName, isActive, any(child), ReciverFunc(this.renderNode)); if (!opened) { entityInteraction(child); } } } } void entityInteraction(Entity entity) { any data = any(entity); UI::dragDropSource("ENTITY", data, entity.name); UI::dragDropTarget("ENTITY", data, TransferFunc(this.entityDrop)); UI::contextItemPopup("POP_ENTITY_" + entity.id, data, ReciverFunc(this.entityContextMenu)); // We can't select the entity if (UI::isItemClicked(0)) { Chewico::ActiveEntity::ActiveEntity::setActiveEntity(entity); } } void entityContextMenu(any@ data) { Entity entity; data.retrieve(entity); if (entity.isRoot) { if (UI::menuItem("New Entity")) { entity.createChild("node"); } } else { if (UI::menuItem("Add child")) { entity.createChild("node"); } if (UI::menuItem("Rename")) { UI::openPopup("Rename entity", data); } if (UI::menuItem("Destroy")) { entity.destroy(); } } } void entityDrop(any@ reciver, any@ emiter) { Entity reciver_entity; reciver.retrieve(reciver_entity); Entity emiter_entity; emiter.retrieve(emiter_entity); // You cant be the father of your father if (emiter_entity.isRoot || reciver_entity.isDescendantOf(emiter_entity)) { return; } emiter_entity.parent = reciver_entity; } }