#ifndef SCENE_HIERARCHY_HPP #define SCENE_HIERARCHY_HPP #include #include #include namespace OpenEngine { using ComponentDrawer = std::function; struct ComponentUI { std::string name; std::function draw_func; std::function remove_func; }; class SceneHierarchy { public: SceneHierarchy() = default; SceneHierarchy(const Ref& scene); void Init(const Ref& scene); void OnImGuiRender(); Entity GetSelectedEntity() const { return selected_context; }; void SetSelectedEntity(Entity entity) { selected_context = entity; }; private: void DrawEntityNode(Entity& entity); void DrawComponents(Entity& entity); /* template void DrawComponentDrawer(Entity& entity, const char* header) { bool component_marked_deletion = false; ImVec2 region_available = ImGui::GetContentRegionAvail(); ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_AllowOverlap; if (entity.HasComponent()) { ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{ 4, 4 }); float line_height = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.0f; bool opened = ImGui::TreeNodeEx((void*)typeid(T).hash_code(), tree_node_flags, "%s", header); ImGui::SameLine(region_available.x - line_height * 0.5f); ImGui::PushStyleColor(ImGuiCol_Button, { 0.290f, 0.301f, 0.388f, 1.0f }); if (ImGui::Button("...", ImVec2{ line_height, line_height })) ImGui::OpenPopup("component_settings"); ImGui::PopStyleColor(); ImGui::PopStyleVar(); if (ImGui::BeginPopup("component_settings")) { if (ImGui::MenuItem("Remove component")) component_marked_deletion = true; ImGui::EndPopup(); } if (opened) { entity.GetComponents().OnImGuiRender(entity); ImGui::TreePop(); } ImGui::Separator(); } if (component_marked_deletion) entity.RemoveComponents(); } */ private: template static void RegisterDrawer(const std::string& name, std::function func) { drawers[entt::type_id().hash()] = { name, func, [](entt::registry& reg, entt::entity ent) { reg.remove(ent); } }; } inline static std::map drawers; Ref scene; Entity selected_context, renamed_entity; double last_selected_time = 10.0; }; } #endif // SCENE_HIERARCHY_HPP