Elevate Engine 1
Loading...
Searching...
No Matches
HierarchyPanel.cpp
Go to the documentation of this file.
1#include "eepch.h"
2#include "HierarchyPanel.h"
3
4#ifdef EE_EDITOR_BUILD
5
6#include "imgui.h"
9
10namespace Elevate::Editor
11{
12 void HierarchyPanel::DrawTreeHierarchy(std::shared_ptr<GameObject> object)
13 {
14 ImGuiTreeNodeFlags nodeFlags = ImGuiTreeNodeFlags_FramePadding | ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_OpenOnArrow;
15
16 if (!object->HasChild())
17 {
18 nodeFlags |= ImGuiTreeNodeFlags_Leaf;
19 }
20
21 if (object == EditorLayer::Get().GetSelectedObject().lock())
22 {
23 nodeFlags |= ImGuiTreeNodeFlags_Selected;
24 }
25
26 bool open = false;
27 if (m_renaming && object == m_renamedObject)
28 {
29 ImGui::Image((ImTextureID)m_objectTexture->GetNativeHandle(), ImVec2(16, 16));
30 ImGui::SameLine();
31
32 ImGui::PushID(object.get());
33
34 open = ImGui::TreeNodeEx(("##" + std::to_string((uintptr_t)object.get())).c_str(), nodeFlags);
35
36 ImGui::SameLine();
37
38 ImGui::SetKeyboardFocusHere();
39
40 ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x);
41 if (ImGui::InputText("##Rename", m_renameBuffer, sizeof(m_renameBuffer), ImGuiInputTextFlags_EnterReturnsTrue))
42 {
43 EndRename(object);
44 }
45
46 // Stop renaming if click is detected outside of rename box
47 if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) || ImGui::IsMouseClicked(ImGuiMouseButton_Right))
48 {
49 ImVec2 min = ImGui::GetItemRectMin();
50 ImVec2 max = ImGui::GetItemRectMax();
51 ImVec2 mousePos = ImGui::GetMousePos();
52
53 bool isMouseOutsideInput = mousePos.x < min.x || mousePos.x > max.x || mousePos.y < min.y || mousePos.y > max.y;
54
55 if (isMouseOutsideInput)
56 {
57 EndRename(object);
58 }
59 }
60
61 ImGui::PopID();
62 }
63 else
64 {
65 ImGui::Image((ImTextureID)m_objectTexture->GetNativeHandle(), ImVec2(16, 16));
66 ImGui::SameLine();
67
68 open = ImGui::TreeNodeEx((object->GetName() + "##" + std::to_string((uintptr_t)object.get())).c_str(), nodeFlags);
69
70 if (ImGui::BeginPopupContextItem())
71 {
72 if (ImGui::MenuItem("Delete")) { object->Destroy(); }
73 if (ImGui::MenuItem("Rename"))
74 {
75 m_renaming = true;
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';
79 }
80
81 ImGui::EndPopup();
82 }
83 }
84
85 if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
86 {
87 EditorLayer::Get().SelectObject(object);
88 }
89
90 if (open)
91 {
92 for (const std::shared_ptr<Elevate::GameObject>& child : object->GetChilds())
93 {
94 DrawTreeHierarchy(child);
95 }
96 ImGui::TreePop();
97 }
98 }
99
100 void HierarchyPanel::EndRename(std::shared_ptr<GameObject> object)
101 {
102 object->SetName(m_renameBuffer);
103 m_renaming = false;
104 m_renamedObject = nullptr;
105 }
106
107 HierarchyPanel::HierarchyPanel()
108 {
109 m_sceneTexture = Texture::CreateFromFile("editor://Icons/Light/scene.png");
110 m_objectTexture = Texture::CreateFromFile("editor://Icons/Light/object.png");
111 }
112
113 void HierarchyPanel::OnImGuiRender()
114 {
115 ImGui::Begin("Hierarchy");
116
117 for (auto it = SceneManager::begin(); it != SceneManager::end(); it++)
118 {
119 ScenePtr scene = *it;
120 if (scene->GetType() == SceneType::RuntimeScene && !scene->GetRootObjects().empty())
121 {
122 ImGui::Image((ImTextureID)m_sceneTexture->GetNativeHandle(), ImVec2(16, 16));
123 ImGui::SameLine();
124
125 if (ImGui::TreeNodeEx(scene->GetName().c_str(), ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_SpanAvailWidth))
126 {
127 for (std::shared_ptr<Elevate::GameObject> object : scene->GetRootObjects())
128 {
129 DrawTreeHierarchy(object);
130 }
131 ImGui::TreePop();
132 }
133 }
134 }
135
136 if (ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered())
137 {
138 if (ImGui::IsMouseClicked(ImGuiMouseButton_Left))
139 {
140 EditorLayer::Get().SelectObject(nullptr);
141 }
142 }
143 ImGui::End();
144 }
145}
146
147#endif // EE_EDITOR_BUILD
static std::vector< ScenePtr >::iterator end()
static std::vector< ScenePtr >::iterator begin()
static TexturePtr CreateFromFile(const std::string &path, TextureType usage=TextureType::Diffuse)
Definition Texture.cpp:22
@ RuntimeScene
Definition Scene.h:29
std::shared_ptr< Scene > ScenePtr
Definition Renderer.h:12