From f72659255701a8705b9a5fb0cc2fc09967c9b45d Mon Sep 17 00:00:00 2001 From: SHAM-DP Date: Sat, 7 Jan 2023 17:34:07 +0800 Subject: [PATCH] Popup window base & popup management Added Scene save prompt popup (WIP) --- .../EditorPopups/SHEditorPopups.cpp | 33 +++++++++++ .../EditorPopups/SHEditorPopups.h | 16 +++++ .../EditorWindow/SHEditorWindowManager.cpp | 2 + .../EditorWindow/SHEditorWindowManager.h | 58 +++++++++++++++++++ .../src/Editor/EditorWindow/SHPopUpWindow.cpp | 21 +++++++ .../src/Editor/EditorWindow/SHPopUpWindow.h | 29 ++++++++++ SHADE_Engine/src/Editor/SHEditor.cpp | 7 ++- 7 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.cpp create mode 100644 SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.h create mode 100644 SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.cpp create mode 100644 SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.h diff --git a/SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.cpp b/SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.cpp new file mode 100644 index 00000000..31e6edde --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.cpp @@ -0,0 +1,33 @@ +#include "SHpch.h" +#include "SHEditorPopups.h" +#include "Editor/SHEditor.h" +#include "misc/cpp/imgui_stdlib.h" + +namespace SHADE +{ + void SHSceneSavePrompt::Draw() + { + if(Begin()) + { + static std::string newSceneName{}; + ImGui::Text("Enter new scene name"); + ImGui::InputText("##name", &newSceneName); + ImGui::BeginDisabled(newSceneName.empty()); + if (ImGui::Button("Save")) + { + editor->SaveScene(newSceneName); + newSceneName.clear(); + isOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndDisabled(); + ImGui::SameLine(); + if (ImGui::Button("Cancel")) + { + isOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } +} \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.h b/SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.h new file mode 100644 index 00000000..f1ce4fb5 --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/EditorPopups/SHEditorPopups.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Editor/EditorWindow/SHPopUpWindow.h" + +namespace SHADE +{ + class SHSceneSavePrompt : SHPopUpWindow + { + public: + SHSceneSavePrompt():SHPopUpWindow("Save Scene As", true, 0, 0){} + void Draw() override; + + private: + + }; +} \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.cpp b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.cpp index 420b5414..a63e659b 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.cpp @@ -4,5 +4,7 @@ namespace SHADE { SHEditorWindowManager::EditorWindowMap SHEditorWindowManager::editorWindows{}; + SHEditorWindowManager::PopupWindowMap SHEditorWindowManager::popupWindows{}; SHEditorWindowManager::EditorWindowID SHEditorWindowManager::windowCount{}; + SHEditorWindowManager::EditorWindowID SHEditorWindowManager::popupWindowCount{}; } diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.h b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.h index 60730f0e..062f864a 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.h +++ b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowManager.h @@ -3,6 +3,7 @@ #include #include #include "SHEditorWindow.h" +#include "SHPopUpWindow.h" #include "Tools/Logger/SHLog.h" namespace SHADE @@ -16,6 +17,10 @@ namespace SHADE using EditorWindowID = uint8_t; using EditorWindowPtr = std::unique_ptr; using EditorWindowMap = std::unordered_map; + + using PopupWindowPtr = std::unique_ptr; + using PopupWindowMap = std::unordered_map; + /** * @brief Get ID for the Editor Window Type * @@ -67,10 +72,63 @@ namespace SHADE return reinterpret_cast(editorWindows[GetEditorWindowID()].get()); } + /** + * @brief Get ID for the Popup Window Type + * + * @tparam T Type of Popup Window + * @return EditorWindowID ID of Popup Window Type + */ + template , bool> = true> + static EditorWindowID GetPopupWindowID() + { + static EditorWindowID id; + static bool idCreated = false; + if (!idCreated) + { + id = popupWindowCount++; + idCreated = true; + } + return id; + } + + /** + * @brief Create an Popup Window + * + * @tparam T Type of Popup Window to create + */ + template , bool> = true> + static void CreatePopupWindow() + { + static bool isCreated = false; + if (!isCreated) + { + popupWindows[GetPopupWindowID()] = std::make_unique(); + isCreated = true; + } + else + { + SHLog::Warning("Attempt to create duplicate of Popup window type"); + } + } + + /** + * @brief Get pointer to the Editor Window + * + * @tparam T Type of editor window to retrieve + * @return T* Pointer to the editor window + */ + template , bool> = true> + static T* GetPopupWindow() + { + return reinterpret_cast(popupWindows[GetPopupWindowID()].get()); + } + static EditorWindowMap editorWindows; + static PopupWindowMap popupWindows; private: // Number of windows; used for Editor Window ID Generation static EditorWindowID windowCount; + static EditorWindowID popupWindowCount; // Map of Editor Windows friend class SHEditor; }; diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.cpp b/SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.cpp new file mode 100644 index 00000000..f82a7495 --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.cpp @@ -0,0 +1,21 @@ +#include "SHpch.h" +#include "SHPopUpWindow.h" +#include "ECS_Base/Managers/SHSystemManager.h" +#include "Editor/SHEditor.h" + +namespace SHADE +{ + SHPopUpWindow::SHPopUpWindow(std::string_view const& name, bool modal, ImGuiPopupFlags inPopupFlags, ImGuiWindowFlags inWindowFlags) + :editor(nullptr), windowName(name), popupFlags(inPopupFlags), windowFlags(inWindowFlags), isOpen(false), isModal(modal) + { + editor = SHSystemManager::GetSystem(); + } + + bool SHPopUpWindow::Begin() + { + if (isOpen) + ImGui::OpenPopup(windowName.data(), popupFlags); + + return isModal ? ImGui::BeginPopupModal(windowName.data(), &isOpen, windowFlags) : ImGui::BeginPopup(windowName.data(), windowFlags); + } +} \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.h b/SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.h new file mode 100644 index 00000000..5d4e5117 --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/SHPopUpWindow.h @@ -0,0 +1,29 @@ +#pragma once + +//#==============================================================# +//|| STL Includes || +//#==============================================================# +#include +#include + +namespace SHADE +{ + class SHEditor; + class SHPopUpWindow + { + public: + SHPopUpWindow(std::string_view const& name, bool modal, ImGuiPopupFlags inPopupFlags, ImGuiWindowFlags inWindowFlags); + + virtual void Draw(){}; + + protected: + virtual bool Begin(); + + SHEditor* editor; + std::string_view windowName; + ImGuiPopupFlags popupFlags; + ImGuiWindowFlags windowFlags; + bool isOpen; + bool isModal; + }; +} \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/SHEditor.cpp b/SHADE_Engine/src/Editor/SHEditor.cpp index 2b8ddbb5..4556ae36 100644 --- a/SHADE_Engine/src/Editor/SHEditor.cpp +++ b/SHADE_Engine/src/Editor/SHEditor.cpp @@ -150,7 +150,7 @@ namespace SHADE { (void)dt; NewFrame(); - for (const auto& window : SHEditorWindowManager::editorWindows | std::views::values) + for (auto const& window : SHEditorWindowManager::editorWindows | std::views::values) { if(window->isOpen) { @@ -158,6 +158,11 @@ namespace SHADE } } + for(auto const& popupWindow : SHEditorWindowManager::popupWindows | std::views::values) + { + popupWindow->Draw(); + } + RenderSceneNamePrompt(); RenderUnsavedChangesPrompt(); //PollPicking();