class EntityTreeRender { EntityTreeRender(Entity _entity) { entity = _entity; } Entity entity; bool isActiveEntity() { return entity == ActiveEntity::getActiveEntity(); } void renderEntity() { string displayName = entity.name; if (displayName == "") { displayName = "-"; } else { displayName = "\uf1b2 " + displayName; } displayName += "##" + entity.id; array@ childs = entity.getChildrens(); if (childs.length() == 0) { // END OF THE TREE ImGui::treeNodeLeaf(displayName, isActiveEntity()); interaction(); } else { // ADD ANOTHER NODE bool opened = ImGui::treeNode(displayName, isActiveEntity(), SimpleFunction(this.renderChilds)); if (!opened) { interaction(); } } } void renderChilds() { interaction(); array@ childs = entity.getChildrens(); for (uint i = 0; i < childs.length(); i++) { EntityTreeRender child(childs[i]); child.renderEntity(); } } void interaction() { ImGui::dragDropSource("ENTITY", any(entity), entity.name); ImGui::dragDropTarget("ENTITY", ReciverFunction(this.entityDrop)); ImGui::contextItemPopup("POP_ENTITY_" + entity.id, SimpleFunction(this.renderContextMenu)); if (ImGui::isItemClicked(0)) { ActiveEntity::setActiveEntity(entity); } } void entityDrop(any@ data) { Entity data_entity; data.retrieve(data_entity); // You cant be the father of your father if (data_entity.isRoot || data_entity.isDescendantOf(entity)) { return; } data_entity.parent = entity; } void renderContextMenu() { if (entity.isRoot) { if (ImGui::menuItem("New Entity")) { print("Child id : " + entity.id); entity.createChild("node"); print("Child id : " + entity.id); } } else { if (ImGui::menuItem("Add child")) { print("Child id : " + entity.id); entity.createChild("node"); } if (ImGui::menuItem("Rename")) { ImGui::openPopup("Rename entity", any(entity)); } if (ImGui::menuItem("Destroy")) { entity.destroy(); } } } } class TreePanel : Panel { void onInit() { print("Wtf2"); } void onImGui() { Entity root; EntityTreeRender rootTree(root); ImGui::contextMenuPopup("Window popup", SimpleFunction(rootTree.renderContextMenu)); rootTree.renderEntity(); } }