12 void HierarchyPanel::DrawTreeHierarchy(std::shared_ptr<GameObject>
object)
14 ImGuiTreeNodeFlags nodeFlags = ImGuiTreeNodeFlags_FramePadding | ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_OpenOnArrow;
16 if (!object->HasChild())
18 nodeFlags |= ImGuiTreeNodeFlags_Leaf;
21 if (
object == EditorLayer::Get().GetSelectedObject().lock())
23 nodeFlags |= ImGuiTreeNodeFlags_Selected;
27 if (m_renaming &&
object == m_renamedObject)
29 ImGui::Image((ImTextureID)m_objectTexture->GetNativeHandle(), ImVec2(16, 16));
32 ImGui::PushID(
object.get());
34 open = ImGui::TreeNodeEx((
"##" + std::to_string((uintptr_t)
object.get())).c_str(), nodeFlags);
38 ImGui::SetKeyboardFocusHere();
40 ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x);
41 if (ImGui::InputText(
"##Rename", m_renameBuffer,
sizeof(m_renameBuffer), ImGuiInputTextFlags_EnterReturnsTrue))
47 if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) || ImGui::IsMouseClicked(ImGuiMouseButton_Right))
49 ImVec2 min = ImGui::GetItemRectMin();
50 ImVec2 max = ImGui::GetItemRectMax();
51 ImVec2 mousePos = ImGui::GetMousePos();
53 bool isMouseOutsideInput = mousePos.x < min.x || mousePos.x > max.x || mousePos.y < min.y || mousePos.y > max.y;
55 if (isMouseOutsideInput)
65 ImGui::Image((ImTextureID)m_objectTexture->GetNativeHandle(), ImVec2(16, 16));
68 open = ImGui::TreeNodeEx((object->GetName() +
"##" + std::to_string((uintptr_t)
object.get())).c_str(), nodeFlags);
70 if (ImGui::BeginPopupContextItem())
72 if (ImGui::MenuItem(
"Delete")) {
object->Destroy(); }
73 if (ImGui::MenuItem(
"Rename"))
76 m_renamedObject = object;
77 std::strncpy(m_renameBuffer, object->GetName().c_str(),
sizeof(m_renameBuffer) - 1);
78 m_renameBuffer[
sizeof(m_renameBuffer) - 1] =
'\0';
85 if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
87 EditorLayer::Get().SelectObject(
object);
92 for (
const std::shared_ptr<Elevate::GameObject>& child : object->GetChilds())
94 DrawTreeHierarchy(child);
100 void HierarchyPanel::EndRename(std::shared_ptr<GameObject>
object)
102 object->SetName(m_renameBuffer);
104 m_renamedObject =
nullptr;
107 HierarchyPanel::HierarchyPanel()
113 void HierarchyPanel::OnImGuiRender()
115 ImGui::Begin(
"Hierarchy");
122 ImGui::Image((ImTextureID)m_sceneTexture->GetNativeHandle(), ImVec2(16, 16));
125 if (ImGui::TreeNodeEx(scene->GetName().c_str(), ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_SpanAvailWidth))
127 for (std::shared_ptr<Elevate::GameObject>
object : scene->GetRootObjects())
129 DrawTreeHierarchy(
object);
136 if (ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered())
138 if (ImGui::IsMouseClicked(ImGuiMouseButton_Left))
140 EditorLayer::Get().SelectObject(
nullptr);
static std::vector< ScenePtr >::iterator end()
static std::vector< ScenePtr >::iterator begin()
static TexturePtr CreateFromFile(const std::string &path, TextureType usage=TextureType::Diffuse)
std::shared_ptr< Scene > ScenePtr