DeerEngine/roe/Editor/tree_pannel.as

97 lines
2.7 KiB
ActionScript

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 == activeEntity;
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)) {
activeEntity = 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;
}
}