From 387b82d38541c2e01c0b29d4a1a510cf7a2c94aa Mon Sep 17 00:00:00 2001 From: antopilo Date: Sun, 26 Jan 2025 11:49:37 -0500 Subject: [PATCH] Reorganized folder structure + using template concepts for security --- Editor/IEditorWidget.h | 17 --------- Editor/src/Windows/EditorInterface.cpp | 7 ++-- Editor/src/Windows/EditorInterface.h | 3 +- .../Windows/SceneEditor}/EditorContext.h | 9 +++-- .../SceneEditor}/SceneEditorWindow.cpp | 12 +++---- .../Windows/SceneEditor}/SceneEditorWindow.h | 10 +++--- .../SceneEditor/Widgets/IEditorWidget.h | 35 +++++++++++++++++++ .../Widgets}/SceneHierarchyWidget.cpp | 24 +++++++------ .../Widgets}/SceneHierarchyWidget.h | 0 .../Widgets}/SelectionPropertyWidget.cpp | 8 ++++- .../Widgets}/SelectionPropertyWidget.h | 0 11 files changed, 78 insertions(+), 47 deletions(-) delete mode 100644 Editor/IEditorWidget.h rename Editor/{ => src/Windows/SceneEditor}/EditorContext.h (69%) rename Editor/{ => src/Windows/SceneEditor}/SceneEditorWindow.cpp (81%) rename Editor/{ => src/Windows/SceneEditor}/SceneEditorWindow.h (75%) create mode 100644 Editor/src/Windows/SceneEditor/Widgets/IEditorWidget.h rename Editor/{ => src/Windows/SceneEditor/Widgets}/SceneHierarchyWidget.cpp (97%) rename Editor/{ => src/Windows/SceneEditor/Widgets}/SceneHierarchyWidget.h (100%) rename Editor/{ => src/Windows/SceneEditor/Widgets}/SelectionPropertyWidget.cpp (63%) rename Editor/{ => src/Windows/SceneEditor/Widgets}/SelectionPropertyWidget.h (100%) diff --git a/Editor/IEditorWidget.h b/Editor/IEditorWidget.h deleted file mode 100644 index 8c63a81b..00000000 --- a/Editor/IEditorWidget.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -class EditorContext; - -class IEditorWidget -{ -protected: - EditorContext& editorContext; - -public: - IEditorWidget(EditorContext& inContext) : editorContext(inContext) {} - ~IEditorWidget() {}; - -public: - virtual void Update(float ts) = 0; - virtual void Draw() = 0; -}; \ No newline at end of file diff --git a/Editor/src/Windows/EditorInterface.cpp b/Editor/src/Windows/EditorInterface.cpp index b7af3a49..71d9125e 100644 --- a/Editor/src/Windows/EditorInterface.cpp +++ b/Editor/src/Windows/EditorInterface.cpp @@ -1255,7 +1255,7 @@ namespace Nuake { ImGui::PopFont(); } - + void EditorInterface::DrawSceneTree() { @@ -2741,11 +2741,10 @@ namespace Nuake { ImGuiWindowClass top_level_class; top_level_class.ClassId = ImHashStr("SceneEditor"); top_level_class.DockingAllowUnclassed = false; - ImGui::DockSpace(ImGui::GetID("SceneEditorDockSpace"), {0, 0}, 0, &top_level_class); - style.WindowMinSize.x = minWinSizeX; + ImGuiDockNode* node = (ImGuiDockNode*)GImGui->DockContext.Nodes.GetVoidPtr(ImGui::GetID("SceneEditorDockSpace")); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 64); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() - 32); if(ImGui::DockNodeBeginAmendTabBar(node)) { ImGui::SetNextItemWidth(48); diff --git a/Editor/src/Windows/EditorInterface.h b/Editor/src/Windows/EditorInterface.h index d4856caf..7717c2c2 100644 --- a/Editor/src/Windows/EditorInterface.h +++ b/Editor/src/Windows/EditorInterface.h @@ -19,7 +19,8 @@ #include #include "ProjectSettings/ProjectSettingsWindow.h" #include "PrefabEditor/PrefabEditorWindow.h" -#include "../../SceneEditorWindow.h" + +#include "SceneEditor/SceneEditorWindow.h" using namespace NuakeEditor; diff --git a/Editor/EditorContext.h b/Editor/src/Windows/SceneEditor/EditorContext.h similarity index 69% rename from Editor/EditorContext.h rename to Editor/src/Windows/SceneEditor/EditorContext.h index 49a89548..b3bbe3a4 100644 --- a/Editor/EditorContext.h +++ b/Editor/src/Windows/SceneEditor/EditorContext.h @@ -1,8 +1,8 @@ #pragma once #include "src/Core/Core.h" #include "src/Core/MulticastDelegate.h" +#include "../../Actions/EditorSelection.h" -#include "src/Actions/EditorSelection.h" namespace Nuake { @@ -14,17 +14,20 @@ class EditorContext private: EditorSelection selection; Ref scene; + std::string windowClass; public: EditorContext() = default; ~EditorContext() = default; - EditorContext(Ref inScene) - : scene(inScene) + EditorContext(Ref inScene, std::string inWindowClass) : + scene(inScene), + windowClass(inWindowClass) { } public: + const std::string_view GetWindowClass() const { return windowClass; } MulticastDelegate OnSelectionChanged; const EditorSelection& GetSelection() const { return selection; } diff --git a/Editor/SceneEditorWindow.cpp b/Editor/src/Windows/SceneEditor/SceneEditorWindow.cpp similarity index 81% rename from Editor/SceneEditorWindow.cpp rename to Editor/src/Windows/SceneEditor/SceneEditorWindow.cpp index 478c87f4..c581fa04 100644 --- a/Editor/SceneEditorWindow.cpp +++ b/Editor/src/Windows/SceneEditor/SceneEditorWindow.cpp @@ -1,16 +1,15 @@ #include "SceneEditorWindow.h" -#include "SelectionPropertyWidget.h" -#include "SceneHierarchyWidget.h" +#include "Widgets/SceneHierarchyWidget.h" +#include "Widgets/SelectionPropertyWidget.h" -#include -#include +#include using namespace Nuake; SceneEditorWindow::SceneEditorWindow(Ref inScene) { - editorContext = EditorContext(inScene); + editorContext = EditorContext(inScene, inScene->GetName()); RegisterWidget(); RegisterWidget(); @@ -30,9 +29,8 @@ void SceneEditorWindow::Draw() const std::string sceneName = scene->GetName(); // This is to prevent other windows of other scene editors to dock - // into this window ImGuiWindowClass windowClass; - windowClass.ClassId = ImHashStr("SceneEditor"); + windowClass.ClassId = ImHashStr(editorContext.GetWindowClass().data()); windowClass.DockingAllowUnclassed = false; ImGui::SetNextWindowClass(&windowClass); diff --git a/Editor/SceneEditorWindow.h b/Editor/src/Windows/SceneEditor/SceneEditorWindow.h similarity index 75% rename from Editor/SceneEditorWindow.h rename to Editor/src/Windows/SceneEditor/SceneEditorWindow.h index 3812f51a..49664939 100644 --- a/Editor/SceneEditorWindow.h +++ b/Editor/src/Windows/SceneEditor/SceneEditorWindow.h @@ -1,11 +1,13 @@ #pragma once #include "src/Core/Core.h" -#include "IEditorWidget.h" #include "EditorContext.h" +#include "Widgets/IEditorWidget.h" + #include #include +#include // Forward declarations namespace Nuake @@ -14,7 +16,8 @@ namespace Nuake class Entity; } -class SceneHierarchyWidget; +template +concept DerivedFromEditorWidget = std::derived_from; class SceneEditorWindow { @@ -33,10 +36,9 @@ public: void Draw(); private: - template + template inline void RegisterWidget() { widgets.push_back(CreateScope(editorContext)); } - }; \ No newline at end of file diff --git a/Editor/src/Windows/SceneEditor/Widgets/IEditorWidget.h b/Editor/src/Windows/SceneEditor/Widgets/IEditorWidget.h new file mode 100644 index 00000000..c0c5c3ad --- /dev/null +++ b/Editor/src/Windows/SceneEditor/Widgets/IEditorWidget.h @@ -0,0 +1,35 @@ +#pragma once + +#include "../EditorContext.h" + +#include "src/UI/ImUI.h" + +class IEditorWidget +{ +protected: + EditorContext& editorContext; + +public: + IEditorWidget(EditorContext& inContext) : editorContext(inContext) {} + virtual ~IEditorWidget() {}; + +public: + virtual void Update(float ts) = 0; + virtual void Draw() = 0; + + bool BeginWidgetWindow(const std::string_view& name) + { + return BeginWidgetWindow(name.data()); + } + + bool BeginWidgetWindow(const char* name) + { + ImGuiWindowClass windowClass; + windowClass.ClassId = ImHashStr(editorContext.GetWindowClass().data()); + windowClass.DockingAllowUnclassed = false; + ImGui::SetNextWindowClass(&windowClass); + + std::string nameStr = std::string(name) + "##" + editorContext.GetScene()->GetName(); + return ImGui::Begin(nameStr.c_str()); + } +}; \ No newline at end of file diff --git a/Editor/SceneHierarchyWidget.cpp b/Editor/src/Windows/SceneEditor/Widgets/SceneHierarchyWidget.cpp similarity index 97% rename from Editor/SceneHierarchyWidget.cpp rename to Editor/src/Windows/SceneEditor/Widgets/SceneHierarchyWidget.cpp index b1e6529f..7e7b909a 100644 --- a/Editor/SceneHierarchyWidget.cpp +++ b/Editor/src/Windows/SceneEditor/Widgets/SceneHierarchyWidget.cpp @@ -8,7 +8,7 @@ #include "src/Scene/Entities/Entity.h" #include "src/Scene/Components.h" -#include "SceneEditorWindow.h" + #include #include #include "Engine.h" @@ -16,27 +16,31 @@ using namespace Nuake; -SceneHierarchyWidget::SceneHierarchyWidget(EditorContext& inCtx) : IEditorWidget(inCtx) +SceneHierarchyWidget::SceneHierarchyWidget(EditorContext& inCtx) : + IEditorWidget(inCtx), + isRenaming(false), + searchQuery("") { } void SceneHierarchyWidget::Update(float ts) { - //std::string searchQuery = ""; - // - //ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { 8, 8 }); - //ImGui::InputTextWithHint("##search", "Search entity", &searchQuery, 0, 0, 0); - //ImGui::PopStyleVar(); + } void SceneHierarchyWidget::Draw() { - DrawSearchBar(); + if (BeginWidgetWindow("Scene Hierarchy")) + { + DrawSearchBar(); - DrawCreateEntityButton(); + DrawCreateEntityButton(); - DrawEntityTree(); + DrawEntityTree(); + + ImGui::End(); + } } void SceneHierarchyWidget::DrawSearchBar() diff --git a/Editor/SceneHierarchyWidget.h b/Editor/src/Windows/SceneEditor/Widgets/SceneHierarchyWidget.h similarity index 100% rename from Editor/SceneHierarchyWidget.h rename to Editor/src/Windows/SceneEditor/Widgets/SceneHierarchyWidget.h diff --git a/Editor/SelectionPropertyWidget.cpp b/Editor/src/Windows/SceneEditor/Widgets/SelectionPropertyWidget.cpp similarity index 63% rename from Editor/SelectionPropertyWidget.cpp rename to Editor/src/Windows/SceneEditor/Widgets/SelectionPropertyWidget.cpp index 5b2293ab..2248e975 100644 --- a/Editor/SelectionPropertyWidget.cpp +++ b/Editor/src/Windows/SceneEditor/Widgets/SelectionPropertyWidget.cpp @@ -1,5 +1,7 @@ #include "SelectionPropertyWidget.h" +#include "src/UI/ImUI.h" + SelectionPropertyWidget::SelectionPropertyWidget(EditorContext& inCtx) : IEditorWidget(inCtx) { @@ -8,7 +10,11 @@ SelectionPropertyWidget::SelectionPropertyWidget(EditorContext& inCtx) void SelectionPropertyWidget::Update(float ts) { - + if (BeginWidgetWindow("Selection Properties")) + { + ImGui::Text("Selection Properties"); + ImGui::End(); + } } void SelectionPropertyWidget::Draw() diff --git a/Editor/SelectionPropertyWidget.h b/Editor/src/Windows/SceneEditor/Widgets/SelectionPropertyWidget.h similarity index 100% rename from Editor/SelectionPropertyWidget.h rename to Editor/src/Windows/SceneEditor/Widgets/SelectionPropertyWidget.h