added editor WIP
This commit is contained in:
392
TSE_Editor/src/UI/windows/HirearchieView.cpp
Normal file
392
TSE_Editor/src/UI/windows/HirearchieView.cpp
Normal file
@@ -0,0 +1,392 @@
|
||||
#include "HirearchieView.hpp"
|
||||
#include "PropertiesView.hpp"
|
||||
|
||||
TSE::EDITOR::HirearchieView::HirearchieView(Scene *s) : GuiWindow("Hirearchie", ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoCollapse)
|
||||
{
|
||||
SetScene(s);
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::SetScene(Scene *s)
|
||||
{
|
||||
currentScene = s;
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::Define()
|
||||
{
|
||||
if(currentScene == nullptr) return;
|
||||
MenuBar();
|
||||
|
||||
bool collapseOpen = ImGui::CollapsingHeader(currentScene->GetName().c_str(), ImGuiTreeNodeFlags_DefaultOpen);
|
||||
if(ImGui::BeginPopupContextItem())
|
||||
{
|
||||
if(ImGui::MenuItem("Rename"))
|
||||
{
|
||||
strcpy(inputBuffer, currentScene->GetName().c_str());
|
||||
activatePopUpNamingLayer = true;
|
||||
inputPurpose = RenamingScene;
|
||||
}
|
||||
ImGui::Separator();
|
||||
AddMenu(nullptr, nullptr);
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
if(collapseOpen)
|
||||
{
|
||||
int layerCount = currentScene->GetLayerCount();
|
||||
for (int i = 0; i < layerCount; i++)
|
||||
{
|
||||
auto layer = currentScene->GetLayerAt(i);
|
||||
//if(layer->GetName() != ".editor")
|
||||
DisplayLayer(layer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(activatePopUpNamingLayer)
|
||||
{
|
||||
activatePopUpNamingLayer = false;
|
||||
openPopUpNamingLayer = true;
|
||||
ImGui::OpenPopup("Enter Text");
|
||||
}
|
||||
|
||||
if (openPopUpNamingLayer) {
|
||||
if (ImGui::BeginPopupModal("Enter Text", NULL, ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||
ImGui::Text("Please enter a Name:");
|
||||
|
||||
ImGui::InputText("##input", inputBuffer, IM_ARRAYSIZE(inputBuffer));
|
||||
|
||||
bool inputValid = strlen(inputBuffer) > 0;
|
||||
|
||||
if (!inputValid) {
|
||||
ImGui::TextColored(ImVec4(1,0,0,1), "Not Valid.");
|
||||
}
|
||||
|
||||
if (ImGui::Button("OK", ImVec2(120, 0))) {
|
||||
if (inputValid) {
|
||||
inputConfirmed = true;
|
||||
openPopUpNamingLayer = false;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Cancel", ImVec2(120, 0))) {
|
||||
openPopUpNamingLayer = false;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
}
|
||||
if (inputConfirmed) {
|
||||
switch (inputPurpose)
|
||||
{
|
||||
case LayerCreation:
|
||||
CreateLayer();
|
||||
break;
|
||||
case RenamingLayer:
|
||||
currentScene->RenameLayer(tmpHolder2->GetName(), inputBuffer);
|
||||
tmpHolder2 = nullptr;
|
||||
break;
|
||||
case RenamingScene:
|
||||
currentScene->SetName(inputBuffer);
|
||||
break;
|
||||
case RenamingTransformable:
|
||||
tmpHolder1->name = inputBuffer;
|
||||
tmpHolder1 = nullptr;
|
||||
break;
|
||||
|
||||
}
|
||||
inputConfirmed = false;
|
||||
inputPurpose = Nothing;
|
||||
strcpy(inputBuffer, ""); // Reset
|
||||
}
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::MenuBar()
|
||||
{
|
||||
if(ImGui::BeginMenuBar())
|
||||
{
|
||||
if(ImGui::BeginMenu("Add"))
|
||||
{
|
||||
if(ImGui::MenuItem("Empty"))
|
||||
{
|
||||
CreateEmpty(currentScene->GetLayerAt(0));
|
||||
}
|
||||
ImGui::Separator();
|
||||
if(ImGui::MenuItem("Layer"))
|
||||
{
|
||||
activatePopUpNamingLayer = true;
|
||||
inputPurpose = LayerCreation;
|
||||
}
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
}
|
||||
ImGui::EndMenuBar();
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::DisplayLayer(Layer *l)
|
||||
{
|
||||
ImGui::Indent(20.0f);
|
||||
bool collapseOpen = ImGui::CollapsingHeader(l->GetName().c_str(), ImGuiTreeNodeFlags_DefaultOpen);
|
||||
if(ImGui::BeginPopupContextItem())
|
||||
{
|
||||
bool disabled = currentScene->GetLayerCount() <= 1;
|
||||
if (disabled)
|
||||
{
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f);
|
||||
}
|
||||
if(ImGui::MenuItem("Move Up") && !disabled)
|
||||
{
|
||||
MoveUpLayer(l);
|
||||
}
|
||||
if(ImGui::MenuItem("Move Down") && !disabled)
|
||||
{
|
||||
MoveDownLayer(l);
|
||||
}
|
||||
if (disabled)
|
||||
{
|
||||
ImGui::PopStyleVar();
|
||||
}
|
||||
if(ImGui::MenuItem("Rename"))
|
||||
{
|
||||
strcpy(inputBuffer, l->GetName().c_str());
|
||||
activatePopUpNamingLayer = true;
|
||||
inputPurpose = RenamingLayer;
|
||||
tmpHolder2 = l;
|
||||
}
|
||||
ImGui::Separator();
|
||||
AddMenu(nullptr, l);
|
||||
ImGui::Separator();
|
||||
if(ImGui::MenuItem("Delete"))
|
||||
{
|
||||
currentScene->RemoveLayer(l->GetName());
|
||||
//property display remove if present
|
||||
|
||||
//exit early:
|
||||
ImGui::EndPopup();
|
||||
ImGui::Unindent(20.0f);
|
||||
return;
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
if(ImGui::BeginDragDropTarget())
|
||||
{
|
||||
auto payload = ImGui::AcceptDragDropPayload("OBJ_TRANS_PTR");
|
||||
if(payload != nullptr)
|
||||
{
|
||||
auto t2 = *(Transformable**)payload->Data;
|
||||
HandleDropping(l, t2);
|
||||
}
|
||||
ImGui::EndDragDropTarget();
|
||||
}
|
||||
if(collapseOpen)
|
||||
{
|
||||
for(int i = 0; i < l->GetAllObjects().size(); i++)
|
||||
{
|
||||
DisplayObj(l->GetAllObjects()[i], l);
|
||||
}
|
||||
}
|
||||
ImGui::Unindent(20.0f);
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::DisplayObj(Transformable *t, Layer *l)
|
||||
{
|
||||
ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanFullWidth;
|
||||
if(t->GetChildren().size() == 0)
|
||||
{
|
||||
flags |= ImGuiTreeNodeFlags_Leaf;
|
||||
}
|
||||
if(selected == t->id)
|
||||
{
|
||||
flags |= ImGuiTreeNodeFlags_Selected;
|
||||
}
|
||||
bool open = ImGui::TreeNodeEx((t->GetName() + "##" + to_string(t->id)).c_str(), flags);
|
||||
if(ImGui::BeginPopupContextItem())
|
||||
{
|
||||
bool disabled = false;
|
||||
if(t->GetParent() != nullptr)
|
||||
disabled = t->GetParent()->GetChildren().size() < 1;
|
||||
else
|
||||
disabled = l->GetAllObjects().size() <= 1;
|
||||
if (disabled)
|
||||
{
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f);
|
||||
}
|
||||
if(ImGui::MenuItem("Move Up") && !disabled)
|
||||
{
|
||||
t->MoveUp(l);
|
||||
}
|
||||
if(ImGui::MenuItem("Move Down") && !disabled)
|
||||
{
|
||||
t->MoveDown(l);
|
||||
}
|
||||
if (disabled)
|
||||
{
|
||||
ImGui::PopStyleVar();
|
||||
}
|
||||
if(ImGui::MenuItem("Rename"))
|
||||
{
|
||||
strcpy(inputBuffer, t->name.c_str());
|
||||
activatePopUpNamingLayer = true;
|
||||
inputPurpose = RenamingTransformable;
|
||||
tmpHolder1 = t;
|
||||
}
|
||||
ImGui::Separator();
|
||||
AddMenu(t, nullptr);
|
||||
ImGui::Separator();
|
||||
if(ImGui::MenuItem("Delete"))
|
||||
{
|
||||
t->SetParent(nullptr);
|
||||
int layerCount = currentScene->GetLayerCount();
|
||||
for (int i = 0; i < layerCount; i++)
|
||||
{
|
||||
auto layer = currentScene->GetLayerAt(i);
|
||||
if(layer->HasTransformable(t))
|
||||
{
|
||||
layer->RemoveTransformable(t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
Transformable::HardDelete(t->id);
|
||||
PropertiesView::ForceClearInspectorElement();
|
||||
|
||||
//exit early:
|
||||
ImGui::EndPopup();
|
||||
if(open)
|
||||
{
|
||||
ImGui::TreePop();
|
||||
}
|
||||
return;
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
if(ImGui::BeginDragDropSource())
|
||||
{
|
||||
auto ptr = &t;
|
||||
ImGui::SetDragDropPayload("OBJ_TRANS_PTR", ptr, sizeof(ptr));
|
||||
std::string name = t->GetName();
|
||||
ImGui::Text((std::string("Move \"") + t->GetName() + "\"").c_str());
|
||||
ImGui::EndDragDropSource();
|
||||
}
|
||||
if(ImGui::BeginDragDropTarget())
|
||||
{
|
||||
auto payload = ImGui::AcceptDragDropPayload("OBJ_TRANS_PTR");
|
||||
if(payload != nullptr)
|
||||
{
|
||||
auto t2 = *(Transformable**)payload->Data;
|
||||
HandleDropping(t, t2);
|
||||
}
|
||||
ImGui::EndDragDropTarget();
|
||||
}
|
||||
if(ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
|
||||
{
|
||||
selected = t->id;
|
||||
PropertiesView::SetInspectorElement(InspectableType::Transformable, t);
|
||||
}
|
||||
if(open)
|
||||
{
|
||||
for(int i = 0; i < t->GetChildren().size(); i++)
|
||||
{
|
||||
DisplayObj(t->GetChildren()[i], nullptr);
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::HandleDropping(Layer *target, Transformable *payload)
|
||||
{
|
||||
payload->SetParent(nullptr);
|
||||
int layerCount = currentScene->GetLayerCount();
|
||||
for (int i = 0; i < layerCount; i++)
|
||||
{
|
||||
auto layer = currentScene->GetLayerAt(i);
|
||||
if(layer == target && layer->HasTransformable(payload)) return;
|
||||
if(layer->HasTransformable(payload))
|
||||
{
|
||||
layer->RemoveTransformable(payload);
|
||||
break;
|
||||
}
|
||||
}
|
||||
target->AddTransformable(payload);
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::HandleDropping(Transformable *target, Transformable *payload)
|
||||
{
|
||||
if(target->id == payload->id) return;
|
||||
if(payload->IsMyChild(target)) return;
|
||||
int layerCount = currentScene->GetLayerCount();
|
||||
for (int i = 0; i < layerCount; i++)
|
||||
{
|
||||
auto layer = currentScene->GetLayerAt(i);
|
||||
if(layer->HasTransformable(payload))
|
||||
{
|
||||
layer->RemoveTransformable(payload);
|
||||
break;
|
||||
}
|
||||
}
|
||||
payload->SetParent(target);
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::AddMenu(Transformable *t, Layer *l)
|
||||
{
|
||||
if(t== nullptr && l == nullptr) //Scene
|
||||
{
|
||||
if(ImGui::MenuItem("Add Layer"))
|
||||
{
|
||||
activatePopUpNamingLayer = true;
|
||||
inputPurpose = LayerCreation;
|
||||
}
|
||||
}
|
||||
else //Layer and Transformable
|
||||
{
|
||||
if(ImGui::MenuItem("Add Empty"))
|
||||
{
|
||||
if(t == nullptr)
|
||||
CreateEmpty(l);
|
||||
else
|
||||
CreateEmpty(t);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::MoveUpLayer(Layer *t)
|
||||
{
|
||||
if(currentScene->GetLayerAt(0) == t) return;
|
||||
currentScene->MoveLayerUp(t);
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::MoveDownLayer(Layer *t)
|
||||
{
|
||||
int lc = currentScene->GetLayerCount();
|
||||
if(currentScene->GetLayerAt(lc - 1) == t) return;
|
||||
currentScene->MoveLayerDown(t);
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::CreateEmpty(Transformable *parent)
|
||||
{
|
||||
Transformable* t = new Transformable("Unnamed Object");
|
||||
if(parent != nullptr)
|
||||
{
|
||||
t->SetParent(parent);
|
||||
}
|
||||
// else
|
||||
// {
|
||||
// // TODO: need to chose a layer to put it in. I would suggest the first one?
|
||||
// currentScene->GetLayerAt(0)->AddTransformable(t);
|
||||
// }
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::CreateEmpty(Layer *parent)
|
||||
{
|
||||
Transformable* t = new Transformable("Unnamed Object");
|
||||
if(parent != nullptr)
|
||||
{
|
||||
parent->AddTransformable(t);
|
||||
}
|
||||
}
|
||||
|
||||
void TSE::EDITOR::HirearchieView::CreateLayer()
|
||||
{
|
||||
Layer* l = new Layer(inputBuffer);
|
||||
currentScene->AddLayer(l);
|
||||
}
|
||||
Reference in New Issue
Block a user