🔧 Hierarchy Panel
Milestone: M1 — Scene Editor Foundation
Namespace: Caffeine::Editor
Arquivos: src/editor/HierarchyPanel.hpp, src/editor/HierarchyPanel.cpp
Status: 📅 Planeado
RF: RF6.2
Visão Geral
O HierarchyPanel é a janela que apresenta a estrutura organizacional de todas as entidades presentes na cena atual. Ele exibe as entidades em formato de árvore, permitindo visualizar relações de parentesco (transform parenting). Este painel é essencial para a navegação rápida, seleção e organização lógica dos objetos de jogo.
Além da visualização, o painel oferece ferramentas para criação, destruição e reordenação de entidades através de interação direta (drag-and-drop) ou menus de contexto.
Implementação
Estrutura da Classe
O painel utiliza o EditorContext para sincronizar a seleção global.
class HierarchyPanel {
EditorContext* m_context;
char m_searchFilter[256] = "";
public:
HierarchyPanel(EditorContext* context) : m_context(context) {}
void onImGuiRender() {
ImGui::Begin("Hierarchy");
renderSearchBar();
renderToolbar();
if (ImGui::BeginChild("EntityTree")) {
auto view = m_world->view<ECS::NameComponent>();
for (auto entity : view) {
// Apenas renderiza raízes; filhos são processados recursivamente
if (!m_world->has<ECS::ParentComponent>(entity)) {
renderEntityNode(entity);
}
}
}
ImGui::EndChild();
renderContextMenu();
ImGui::End();
}
private:
void renderEntityNode(ECS::EntityID entity) {
auto& name = m_world->get<ECS::NameComponent>(entity).name;
ImGuiTreeNodeFlags flags = ((m_context->selectedEntity == entity) ? ImGuiTreeNodeFlags_Selected : 0);
flags |= ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_SpanAvailWidth;
bool hasChildren = checkHasChildren(entity);
if (!hasChildren) flags |= ImGuiTreeNodeFlags_Leaf;
bool opened = ImGui::TreeNodeEx((void*)(uintptr_t)entity, flags, "%s", name.c_str());
if (ImGui::IsItemClicked()) {
m_context->selectEntity(entity);
}
// Context Menu para a entidade específica
if (ImGui::BeginPopupContextItem()) {
if (ImGui::MenuItem("Delete")) { m_world->destroy(entity); }
ImGui::EndPopup();
}
// Drag and Drop Logic
handleDragAndDrop(entity);
if (opened) {
if (hasChildren) {
renderChildren(entity);
}
ImGui::TreePop();
}
}
void handleDragAndDrop(ECS::EntityID entity);
void renderContextMenu(); // Create empty, etc.
};
Lógica de Hierarquia (Parenting)
A hierarquia é mantida através do ParentComponent e ChildrenComponent (ou uma lista de IDs). No M1, focaremos no ParentComponent.
struct ParentComponent {
ECS::EntityID parentId;
};
Diagrama de Fluxo de Seleção
[HierarchyPanel] Click Node
-> EditorContext::selectEntity(ID)
-> [InspectorPanel] Observa mudança
-> [InspectorPanel] Renderiza componentes de ID
Decisões de Design
| Decisão |
Justificativa |
ImGuiTreeNodeFlags_Leaf para vazios |
Fornece feedback visual imediato sobre quais entidades possuem filhos. |
| Filtro de Pesquisa |
Essencial para cenas com centenas de entidades onde a navegação manual é lenta. |
| Drag-and-Drop Reparenting |
Forma mais intuitiva de organizar objetos em 2D/3D. |
Critério de Aceitação
Dependências
- Upstream:
1.1-editor-context-undo-redo.md, docs/ecs/core.md
- Downstream:
1.3-inspector-panel.md, 1.6-scene-editor-orchestrator.md
🔗 Tópicos Relacionados
| Tópico |
Descrição |
| NameComponent |
Armazena a string visível no painel. |
| ECS Parenting |
Sistema que sincroniza transformações entre pais e filhos. |
Referências
🔧 Hierarchy Panel
Visão Geral
O
HierarchyPanelé a janela que apresenta a estrutura organizacional de todas as entidades presentes na cena atual. Ele exibe as entidades em formato de árvore, permitindo visualizar relações de parentesco (transform parenting). Este painel é essencial para a navegação rápida, seleção e organização lógica dos objetos de jogo.Além da visualização, o painel oferece ferramentas para criação, destruição e reordenação de entidades através de interação direta (drag-and-drop) ou menus de contexto.
Implementação
Estrutura da Classe
O painel utiliza o
EditorContextpara sincronizar a seleção global.Lógica de Hierarquia (Parenting)
A hierarquia é mantida através do
ParentComponenteChildrenComponent(ou uma lista de IDs). No M1, focaremos noParentComponent.Diagrama de Fluxo de Seleção
Decisões de Design
ImGuiTreeNodeFlags_Leafpara vaziosCritério de Aceitação
EditorContext.Deletecom entidade selecionada remove-a da cena.ParentComponentaparecem indentadas sob o pai.Dependências
1.1-editor-context-undo-redo.md,docs/ecs/core.md1.3-inspector-panel.md,1.6-scene-editor-orchestrator.md🔗 Tópicos Relacionados
Referências
docs/ui/editor-ui.md— Convenções de interface.