From 55abc9d63a8b9f5a6071964c330cbb8d0afe24a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A9meryc?= Date: Thu, 20 Jul 2023 22:13:10 -0400 Subject: [PATCH 1/4] NK-126 - Click Empty Component Script --- Editor/src/ComponentsPanel/ScriptPanel.h | 69 +++++++++++++++++++++++- Editor/src/Windows/FileSystemUI.cpp | 31 ----------- 2 files changed, 68 insertions(+), 32 deletions(-) diff --git a/Editor/src/ComponentsPanel/ScriptPanel.h b/Editor/src/ComponentsPanel/ScriptPanel.h index 2a51065d..53cda8e9 100644 --- a/Editor/src/ComponentsPanel/ScriptPanel.h +++ b/Editor/src/ComponentsPanel/ScriptPanel.h @@ -3,6 +3,38 @@ #include #include +const std::string TEMPLATE_SCRIPT_FIRST = R"(import "Nuake:Engine" for Engine +import "Nuake:ScriptableEntity" for ScriptableEntity +import "Nuake:Input" for Input +import "Nuake:Math" for Vector3, Math +import "Nuake:Scene" for Scene + +class )"; + +const std::string TEMPLATE_SCRIPT_SECOND = R"( is ScriptableEntity { + construct new() { + } + + // Called when the scene gets initialized + init() { + // Engine.Log("Hello World!") + } + + // Called every update + update(ts) { + } + + // Called 90 times per second + fixedUpdate(ts) { + } + + // Called on shutdown + exit() { + } +} +)"; + + class ScriptPanel : ComponentPanel { public: @@ -21,7 +53,7 @@ public: ImGui::TableNextColumn(); std::string path = component.Script; - ImGui::Button(component.Script.c_str(), ImVec2(ImGui::GetContentRegionAvail().x, 0)); + ImGui::Button( path.empty() ? "Create New" : component.Script.c_str(), ImVec2(ImGui::GetContentRegionAvail().x, 0)); if (ImGui::BeginDragDropTarget()) { if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("_Script")) @@ -45,6 +77,41 @@ public: { Nuake::OS::OpenIn(component.mWrenScript->GetFile()->GetAbsolutePath()); } + else + { + // TODO: Turn into command (Undo/Redo) + + std::string pathCreation = Nuake::FileDialog::SaveFile("*.wren"); + + if (!pathCreation.empty()) + { + if (!Nuake::String::EndsWith(pathCreation, ".wren")) + { + pathCreation += ".wren"; + } + + std::string fileName = Nuake::String::ToUpper(Nuake::FileSystem::GetFileNameFromPath(pathCreation)); + fileName = Nuake::String::RemoveWhiteSpace(fileName); + + if(!Nuake::String::IsDigit(fileName[0])) + { + Nuake::FileSystem::BeginWriteFile(pathCreation); + Nuake::FileSystem::WriteLine(TEMPLATE_SCRIPT_FIRST + fileName + TEMPLATE_SCRIPT_SECOND); + Nuake::FileSystem::EndWriteFile(); + + path = Nuake::FileSystem::AbsoluteToRelative(pathCreation); + Nuake::FileSystem::Scan(); + + component.LoadScript(path); + component.Script = path; + } + else + { + Nuake::Logger::Log("[FileSystem] Cannot create script files that starts with a number.", Nuake::CRITICAL); + } + } + + } } ImGui::TableNextColumn(); diff --git a/Editor/src/Windows/FileSystemUI.cpp b/Editor/src/Windows/FileSystemUI.cpp index 1a07bf03..91901b93 100644 --- a/Editor/src/Windows/FileSystemUI.cpp +++ b/Editor/src/Windows/FileSystemUI.cpp @@ -9,37 +9,6 @@ #include "src/Rendering/Textures/TextureManager.h" #include "EditorInterface.h" -const std::string TEMPLATE_SCRIPT_FIRST = R"(import "Nuake:Engine" for Engine -import "Nuake:ScriptableEntity" for ScriptableEntity -import "Nuake:Input" for Input -import "Nuake:Math" for Vector3, Math -import "Nuake:Scene" for Scene - -class )"; - -const std::string TEMPLATE_SCRIPT_SECOND = R"( is ScriptableEntity { - construct new() { - } - - // Called when the scene gets initialized - init() { - // Engine.Log("Hello World!") - } - - // Called every update - update(ts) { - } - - // Called 90 times per second - fixedUpdate(ts) { - } - - // Called on shutdown - exit() { - } -} -)"; - #include namespace Nuake From 24f9d092c1074583d099beffba18700b6dfad833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89meryc?= Date: Fri, 21 Jul 2023 19:19:29 -0400 Subject: [PATCH 2/4] NK-126 - Fixed File Browser Refresh --- Editor/src/ComponentsPanel/ScriptPanel.cpp | 111 ++++++++++++++++++++ Editor/src/ComponentsPanel/ScriptPanel.h | 110 +------------------ Editor/src/Windows/EditorInterface.cpp | 2 +- Editor/src/Windows/EditorSelectionPanel.cpp | 2 + Editor/src/Windows/FileSystemUI.cpp | 1 + Editor/src/Windows/FileSystemUI.h | 2 +- 6 files changed, 118 insertions(+), 110 deletions(-) create mode 100644 Editor/src/ComponentsPanel/ScriptPanel.cpp diff --git a/Editor/src/ComponentsPanel/ScriptPanel.cpp b/Editor/src/ComponentsPanel/ScriptPanel.cpp new file mode 100644 index 00000000..3c27ae3e --- /dev/null +++ b/Editor/src/ComponentsPanel/ScriptPanel.cpp @@ -0,0 +1,111 @@ +#include "ScriptPanel.h" +#include "../Windows/FileSystemUI.h" +#include +#include + +void ScriptPanel::Draw(Nuake::Entity entity) +{ + if (!entity.HasComponent()) + return; + + Nuake::WrenScriptComponent& component = entity.GetComponent(); + BeginComponentTable(SCRIPT, Nuake::WrenScriptComponent); + { + { + ImGui::Text("Script"); + ImGui::TableNextColumn(); + + std::string path = component.Script; + ImGui::Button( path.empty() ? "Create New" : component.Script.c_str(), ImVec2(ImGui::GetContentRegionAvail().x, 0)); + if (ImGui::BeginDragDropTarget()) + { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("_Script")) + { + char* file = (char*)payload->Data; + + std::string fullPath = std::string(file, 512); + path = Nuake::FileSystem::AbsoluteToRelative(std::move(fullPath)); + + component.LoadScript(path); + } + ImGui::EndDragDropTarget(); + } + + component.Script = path; + + // Double click on file + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0)) + { + if(!component.Script.empty()) + { + Nuake::OS::OpenIn(component.mWrenScript->GetFile()->GetAbsolutePath()); + } + else + { + // TODO: Turn into command (Undo/Redo) + + std::string pathCreation = Nuake::FileDialog::SaveFile("*.wren"); + + if (!pathCreation.empty()) + { + if (!Nuake::String::EndsWith(pathCreation, ".wren")) + { + pathCreation += ".wren"; + } + + std::string fileName = Nuake::String::ToUpper(Nuake::FileSystem::GetFileNameFromPath(pathCreation)); + fileName = Nuake::String::RemoveWhiteSpace(fileName); + + if(!Nuake::String::IsDigit(fileName[0])) + { + Nuake::FileSystem::BeginWriteFile(pathCreation); + Nuake::FileSystem::WriteLine(TEMPLATE_SCRIPT_FIRST + fileName + TEMPLATE_SCRIPT_SECOND); + Nuake::FileSystem::EndWriteFile(); + + path = Nuake::FileSystem::AbsoluteToRelative(pathCreation); + Nuake::FileSystem::Scan(); + Nuake::FileSystemUI::m_CurrentDirectory = Nuake::FileSystem::RootDirectory; + component.LoadScript(path); + component.Script = path; + } + else + { + Nuake::Logger::Log("[FileSystem] Cannot create script files that starts with a number.", Nuake::CRITICAL); + } + } + + } + } + + ImGui::TableNextColumn(); + + ComponentTableReset(component.Script, ""); + } + ImGui::TableNextColumn(); + { + ImGui::Text("Module"); + ImGui::TableNextColumn(); + + // Here we create a dropdown for every modules + auto& wrenScript = component.mWrenScript; + if (wrenScript) + { + auto modules = wrenScript->GetModules(); + + std::vector modulesC; + + for (auto& m : modules) + { + modulesC.push_back(m.c_str()); + } + static int currentModule = (int)component.mModule; + ImGui::Combo("##WrenModule", ¤tModule, &modulesC[0], modules.size()); + component.mModule = currentModule; + } + + ImGui::TableNextColumn(); + //ComponentTableReset(component.Class, ""); + } + } + EndComponentTable(); +} \ No newline at end of file diff --git a/Editor/src/ComponentsPanel/ScriptPanel.h b/Editor/src/ComponentsPanel/ScriptPanel.h index 53cda8e9..dac4c0c2 100644 --- a/Editor/src/ComponentsPanel/ScriptPanel.h +++ b/Editor/src/ComponentsPanel/ScriptPanel.h @@ -1,7 +1,6 @@ #pragma once #include "ComponentPanel.h" -#include -#include + const std::string TEMPLATE_SCRIPT_FIRST = R"(import "Nuake:Engine" for Engine import "Nuake:ScriptableEntity" for ScriptableEntity @@ -40,110 +39,5 @@ class ScriptPanel : ComponentPanel { public: ScriptPanel() {} - void Draw(Nuake::Entity entity) override - { - if (!entity.HasComponent()) - return; - - Nuake::WrenScriptComponent& component = entity.GetComponent(); - BeginComponentTable(SCRIPT, Nuake::WrenScriptComponent); - { - { - ImGui::Text("Script"); - ImGui::TableNextColumn(); - - std::string path = component.Script; - ImGui::Button( path.empty() ? "Create New" : component.Script.c_str(), ImVec2(ImGui::GetContentRegionAvail().x, 0)); - if (ImGui::BeginDragDropTarget()) - { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("_Script")) - { - char* file = (char*)payload->Data; - - std::string fullPath = std::string(file, 512); - path = Nuake::FileSystem::AbsoluteToRelative(std::move(fullPath)); - - component.LoadScript(path); - } - ImGui::EndDragDropTarget(); - } - - component.Script = path; - - // Double click on file - if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0)) - { - if(!component.Script.empty()) - { - Nuake::OS::OpenIn(component.mWrenScript->GetFile()->GetAbsolutePath()); - } - else - { - // TODO: Turn into command (Undo/Redo) - - std::string pathCreation = Nuake::FileDialog::SaveFile("*.wren"); - - if (!pathCreation.empty()) - { - if (!Nuake::String::EndsWith(pathCreation, ".wren")) - { - pathCreation += ".wren"; - } - - std::string fileName = Nuake::String::ToUpper(Nuake::FileSystem::GetFileNameFromPath(pathCreation)); - fileName = Nuake::String::RemoveWhiteSpace(fileName); - - if(!Nuake::String::IsDigit(fileName[0])) - { - Nuake::FileSystem::BeginWriteFile(pathCreation); - Nuake::FileSystem::WriteLine(TEMPLATE_SCRIPT_FIRST + fileName + TEMPLATE_SCRIPT_SECOND); - Nuake::FileSystem::EndWriteFile(); - - path = Nuake::FileSystem::AbsoluteToRelative(pathCreation); - Nuake::FileSystem::Scan(); - - component.LoadScript(path); - component.Script = path; - } - else - { - Nuake::Logger::Log("[FileSystem] Cannot create script files that starts with a number.", Nuake::CRITICAL); - } - } - - } - } - - ImGui::TableNextColumn(); - - ComponentTableReset(component.Script, ""); - } - ImGui::TableNextColumn(); - { - ImGui::Text("Module"); - ImGui::TableNextColumn(); - - // Here we create a dropdown for every modules - auto& wrenScript = component.mWrenScript; - if (wrenScript) - { - auto modules = wrenScript->GetModules(); - - std::vector modulesC; - - for (auto& m : modules) - { - modulesC.push_back(m.c_str()); - } - static int currentModule = (int)component.mModule; - ImGui::Combo("##WrenModule", ¤tModule, &modulesC[0], modules.size()); - component.mModule = currentModule; - } - - ImGui::TableNextColumn(); - //ComponentTableReset(component.Class, ""); - } - } - EndComponentTable(); - } + void Draw(Nuake::Entity entity) override; }; \ No newline at end of file diff --git a/Editor/src/Windows/EditorInterface.cpp b/Editor/src/Windows/EditorInterface.cpp index 81af2da4..7c993e65 100644 --- a/Editor/src/Windows/EditorInterface.cpp +++ b/Editor/src/Windows/EditorInterface.cpp @@ -50,7 +50,7 @@ namespace Nuake { ImFont* normalFont; ImFont* boldFont; ImFont* EditorInterface::bigIconFont; - + EditorInterface::EditorInterface() { filesystem = new FileSystemUI(this); diff --git a/Editor/src/Windows/EditorSelectionPanel.cpp b/Editor/src/Windows/EditorSelectionPanel.cpp index 639a8948..82699732 100644 --- a/Editor/src/Windows/EditorSelectionPanel.cpp +++ b/Editor/src/Windows/EditorSelectionPanel.cpp @@ -8,6 +8,8 @@ #include #include +#include "src/Scene/Components/WrenScriptComponent.h" + EditorSelectionPanel::EditorSelectionPanel() { mTransformPanel = TransformPanel(); diff --git a/Editor/src/Windows/FileSystemUI.cpp b/Editor/src/Windows/FileSystemUI.cpp index 91901b93..b6847006 100644 --- a/Editor/src/Windows/FileSystemUI.cpp +++ b/Editor/src/Windows/FileSystemUI.cpp @@ -13,6 +13,7 @@ namespace Nuake { + Ref FileSystemUI::m_CurrentDirectory; // TODO: add filetree in same panel void FileSystemUI::Draw() diff --git a/Editor/src/Windows/FileSystemUI.h b/Editor/src/Windows/FileSystemUI.h index 2ab62141..edad2cee 100644 --- a/Editor/src/Windows/FileSystemUI.h +++ b/Editor/src/Windows/FileSystemUI.h @@ -10,7 +10,7 @@ namespace Nuake { EditorInterface* Editor; public: - Ref m_CurrentDirectory; + static Ref m_CurrentDirectory; bool m_hasClickedOnFile; FileSystemUI(EditorInterface* editor) From 8c5ce77449a5a64aaba7764a43e6262ae0d76d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89meryc?= Date: Fri, 21 Jul 2023 19:23:03 -0400 Subject: [PATCH 3/4] NK-126 - Added Overwrite Prompt --- Nuake/src/Core/FileSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nuake/src/Core/FileSystem.cpp b/Nuake/src/Core/FileSystem.cpp index 3c5e9661..8b943af5 100644 --- a/Nuake/src/Core/FileSystem.cpp +++ b/Nuake/src/Core/FileSystem.cpp @@ -45,7 +45,7 @@ namespace Nuake ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = filter; ofn.nFilterIndex = 1; - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT; if (GetSaveFileNameA(&ofn) == TRUE) { return ofn.lpstrFile; From 8a931c768bf9ddda07179f454b952e3aea8a9106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89meryc?= Date: Fri, 21 Jul 2023 19:29:50 -0400 Subject: [PATCH 4/4] NK-126 - Fix Indent --- Editor/src/ComponentsPanel/ScriptPanel.cpp | 166 ++++++++++----------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/Editor/src/ComponentsPanel/ScriptPanel.cpp b/Editor/src/ComponentsPanel/ScriptPanel.cpp index 3c27ae3e..b9e7b512 100644 --- a/Editor/src/ComponentsPanel/ScriptPanel.cpp +++ b/Editor/src/ComponentsPanel/ScriptPanel.cpp @@ -6,106 +6,106 @@ void ScriptPanel::Draw(Nuake::Entity entity) { if (!entity.HasComponent()) - return; + return; - Nuake::WrenScriptComponent& component = entity.GetComponent(); - BeginComponentTable(SCRIPT, Nuake::WrenScriptComponent); + Nuake::WrenScriptComponent& component = entity.GetComponent(); + BeginComponentTable(SCRIPT, Nuake::WrenScriptComponent); + { { + ImGui::Text("Script"); + ImGui::TableNextColumn(); + + std::string path = component.Script; + ImGui::Button( path.empty() ? "Create New" : component.Script.c_str(), ImVec2(ImGui::GetContentRegionAvail().x, 0)); + if (ImGui::BeginDragDropTarget()) { - ImGui::Text("Script"); - ImGui::TableNextColumn(); - - std::string path = component.Script; - ImGui::Button( path.empty() ? "Create New" : component.Script.c_str(), ImVec2(ImGui::GetContentRegionAvail().x, 0)); - if (ImGui::BeginDragDropTarget()) + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("_Script")) { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("_Script")) - { - char* file = (char*)payload->Data; + char* file = (char*)payload->Data; - std::string fullPath = std::string(file, 512); - path = Nuake::FileSystem::AbsoluteToRelative(std::move(fullPath)); + std::string fullPath = std::string(file, 512); + path = Nuake::FileSystem::AbsoluteToRelative(std::move(fullPath)); - component.LoadScript(path); - } - ImGui::EndDragDropTarget(); + component.LoadScript(path); } + ImGui::EndDragDropTarget(); + } - component.Script = path; + component.Script = path; - // Double click on file - if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0)) + // Double click on file + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0)) + { + if(!component.Script.empty()) { - if(!component.Script.empty()) + Nuake::OS::OpenIn(component.mWrenScript->GetFile()->GetAbsolutePath()); + } + else + { + // TODO: Turn into command (Undo/Redo) + + std::string pathCreation = Nuake::FileDialog::SaveFile("*.wren"); + + if (!pathCreation.empty()) { - Nuake::OS::OpenIn(component.mWrenScript->GetFile()->GetAbsolutePath()); - } - else - { - // TODO: Turn into command (Undo/Redo) - - std::string pathCreation = Nuake::FileDialog::SaveFile("*.wren"); - - if (!pathCreation.empty()) + if (!Nuake::String::EndsWith(pathCreation, ".wren")) { - if (!Nuake::String::EndsWith(pathCreation, ".wren")) - { - pathCreation += ".wren"; - } - - std::string fileName = Nuake::String::ToUpper(Nuake::FileSystem::GetFileNameFromPath(pathCreation)); - fileName = Nuake::String::RemoveWhiteSpace(fileName); - - if(!Nuake::String::IsDigit(fileName[0])) - { - Nuake::FileSystem::BeginWriteFile(pathCreation); - Nuake::FileSystem::WriteLine(TEMPLATE_SCRIPT_FIRST + fileName + TEMPLATE_SCRIPT_SECOND); - Nuake::FileSystem::EndWriteFile(); - - path = Nuake::FileSystem::AbsoluteToRelative(pathCreation); - Nuake::FileSystem::Scan(); - Nuake::FileSystemUI::m_CurrentDirectory = Nuake::FileSystem::RootDirectory; - component.LoadScript(path); - component.Script = path; - } - else - { - Nuake::Logger::Log("[FileSystem] Cannot create script files that starts with a number.", Nuake::CRITICAL); - } + pathCreation += ".wren"; } - } - } - - ImGui::TableNextColumn(); + std::string fileName = Nuake::String::ToUpper(Nuake::FileSystem::GetFileNameFromPath(pathCreation)); + fileName = Nuake::String::RemoveWhiteSpace(fileName); + + if(!Nuake::String::IsDigit(fileName[0])) + { + Nuake::FileSystem::BeginWriteFile(pathCreation); + Nuake::FileSystem::WriteLine(TEMPLATE_SCRIPT_FIRST + fileName + TEMPLATE_SCRIPT_SECOND); + Nuake::FileSystem::EndWriteFile(); - ComponentTableReset(component.Script, ""); + path = Nuake::FileSystem::AbsoluteToRelative(pathCreation); + Nuake::FileSystem::Scan(); + Nuake::FileSystemUI::m_CurrentDirectory = Nuake::FileSystem::RootDirectory; + component.LoadScript(path); + component.Script = path; + } + else + { + Nuake::Logger::Log("[FileSystem] Cannot create script files that starts with a number.", Nuake::CRITICAL); + } + } + + } } + ImGui::TableNextColumn(); - { - ImGui::Text("Module"); - ImGui::TableNextColumn(); - // Here we create a dropdown for every modules - auto& wrenScript = component.mWrenScript; - if (wrenScript) - { - auto modules = wrenScript->GetModules(); - - std::vector modulesC; - - for (auto& m : modules) - { - modulesC.push_back(m.c_str()); - } - static int currentModule = (int)component.mModule; - ImGui::Combo("##WrenModule", ¤tModule, &modulesC[0], modules.size()); - component.mModule = currentModule; - } - - ImGui::TableNextColumn(); - //ComponentTableReset(component.Class, ""); - } + ComponentTableReset(component.Script, ""); } - EndComponentTable(); + ImGui::TableNextColumn(); + { + ImGui::Text("Module"); + ImGui::TableNextColumn(); + + // Here we create a dropdown for every modules + auto& wrenScript = component.mWrenScript; + if (wrenScript) + { + auto modules = wrenScript->GetModules(); + + std::vector modulesC; + + for (auto& m : modules) + { + modulesC.push_back(m.c_str()); + } + static int currentModule = (int)component.mModule; + ImGui::Combo("##WrenModule", ¤tModule, &modulesC[0], modules.size()); + component.mModule = currentModule; + } + + ImGui::TableNextColumn(); + //ComponentTableReset(component.Class, ""); + } + } + EndComponentTable(); } \ No newline at end of file