From 129475d092cfae1d809277ee2bc8b556a486ea09 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 22 Sep 2023 23:21:14 +0800 Subject: [PATCH 1/2] Add menu for open in external editor in internal editor --- src/SHADERed/UI/CodeEditorUI.cpp | 78 ++++++++++++++++++++++---------- src/SHADERed/UI/CodeEditorUI.h | 2 + 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/src/SHADERed/UI/CodeEditorUI.cpp b/src/SHADERed/UI/CodeEditorUI.cpp index 59c6ac83..0a73263f 100644 --- a/src/SHADERed/UI/CodeEditorUI.cpp +++ b/src/SHADERed/UI/CodeEditorUI.cpp @@ -91,6 +91,28 @@ namespace ed { Settings::Instance().Editor.StatusBar = !Settings::Instance().Editor.StatusBar; }); } + + void CodeEditorUI::m_openInExternalEditor(int id) + { + if (id >= m_editor.size()) + return; + + m_editorSaveRequestID = id; + + auto openFunc = [this, id](bool success) { + std::string const shaderFile = m_getShaderFile(id); + if (!shaderFile.empty()) + UIHelper::ShellOpen(m_data->Parser.GetProjectPath(shaderFile)); + }; + + // prompt user to choose a project location first + if (m_data->Parser.GetOpenedFile() == "") { + RequestedProjectSave = true; + m_ui->SaveAsProject(true, openFunc); + } else + openFunc(true); + } + void CodeEditorUI::m_save(int editor_id) { if (editor_id >= m_editor.size()) @@ -196,31 +218,9 @@ namespace ed { m_save(id); - std::string shaderFile = ""; - if (m_items[id]->Type == PipelineItem::ItemType::ShaderPass) { - ed::pipe::ShaderPass* shader = reinterpret_cast(m_items[id]->Data); - if (m_shaderStage[id] == ShaderStage::Vertex) - shaderFile = shader->VSPath; - else if (m_shaderStage[id] == ShaderStage::Pixel) - shaderFile = shader->PSPath; - else if (m_shaderStage[id] == ShaderStage::Geometry) - shaderFile = shader->GSPath; - else if (m_shaderStage[id] == ShaderStage::TessellationControl) - shaderFile = shader->TCSPath; - else if (m_shaderStage[id] == ShaderStage::TessellationEvaluation) - shaderFile = shader->TESPath; - } else if (m_items[id]->Type == PipelineItem::ItemType::ComputePass) { - ed::pipe::ComputePass* shader = reinterpret_cast(m_items[id]->Data); - shaderFile = shader->Path; - } else if (m_items[id]->Type == PipelineItem::ItemType::AudioPass) { - ed::pipe::AudioPass* shader = reinterpret_cast(m_items[id]->Data); - shaderFile = shader->Path; - } else if (m_items[id]->Type == PipelineItem::ItemType::PluginItem) { - ed::pipe::PluginItemData* shader = reinterpret_cast(m_items[id]->Data); - shader->Owner->HandleRecompile(m_items[id]->Name); - } - - m_data->Renderer.RecompileFile(shaderFile.c_str()); + std::string const shaderFile = m_getShaderFile(id); + if (!shaderFile.empty()) + m_data->Renderer.RecompileFile(shaderFile.c_str()); } void CodeEditorUI::OnEvent(const SDL_Event& e) { } @@ -270,6 +270,7 @@ namespace ed { if (ImGui::MenuItem("Save SPIR-V binary")) m_saveAsSPV(i); if (ImGui::MenuItem("Save as GLSL")) m_saveAsGLSL(i); if (ImGui::MenuItem("Save as HLSL")) m_saveAsHLSL(i); + if (ImGui::MenuItem("Open in external editor")) m_openInExternalEditor(i); ImGui::EndMenu(); } if (ImGui::BeginMenu("Code")) { @@ -1477,6 +1478,33 @@ namespace ed { } } + std::string CodeEditorUI::m_getShaderFile(int id) + { + if (m_items[id]->Type == PipelineItem::ItemType::ShaderPass) { + ed::pipe::ShaderPass* shader = reinterpret_cast(m_items[id]->Data); + if (m_shaderStage[id] == ShaderStage::Vertex) + return shader->VSPath; + else if (m_shaderStage[id] == ShaderStage::Pixel) + return shader->PSPath; + else if (m_shaderStage[id] == ShaderStage::Geometry) + return shader->GSPath; + else if (m_shaderStage[id] == ShaderStage::TessellationControl) + return shader->TCSPath; + else if (m_shaderStage[id] == ShaderStage::TessellationEvaluation) + return shader->TESPath; + } else if (m_items[id]->Type == PipelineItem::ItemType::ComputePass) { + ed::pipe::ComputePass* shader = reinterpret_cast(m_items[id]->Data); + return shader->Path; + } else if (m_items[id]->Type == PipelineItem::ItemType::AudioPass) { + ed::pipe::AudioPass* shader = reinterpret_cast(m_items[id]->Data); + return shader->Path; + } else if (m_items[id]->Type == PipelineItem::ItemType::PluginItem) { + ed::pipe::PluginItemData* shader = reinterpret_cast(m_items[id]->Data); + shader->Owner->HandleRecompile(m_items[id]->Name); + } + return {}; + } + void CodeEditorUI::StopDebugging() { for (int i = 0; i < m_editor.size(); i++) { diff --git a/src/SHADERed/UI/CodeEditorUI.h b/src/SHADERed/UI/CodeEditorUI.h index 86907561..7944b464 100644 --- a/src/SHADERed/UI/CodeEditorUI.h +++ b/src/SHADERed/UI/CodeEditorUI.h @@ -116,6 +116,7 @@ namespace ed { void m_applyBreakpoints(TextEditor* editor, const std::string& path); void m_setupPlugin(ed::IPlugin1* plugin); + std::string m_getShaderFile(int id); std::vector m_snippets; @@ -123,6 +124,7 @@ namespace ed { ImFont* m_font; // menu bar item actions + void m_openInExternalEditor(int id); void m_save(int id); void m_saveAsSPV(int id); void m_saveAsGLSL(int id); From 63081a60c1dd2e5702d9653dc1a0ac726cb5f3c4 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 23 Sep 2023 00:07:23 +0800 Subject: [PATCH 2/2] Check for save result --- src/SHADERed/UI/CodeEditorUI.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/SHADERed/UI/CodeEditorUI.cpp b/src/SHADERed/UI/CodeEditorUI.cpp index 0a73263f..c12168dc 100644 --- a/src/SHADERed/UI/CodeEditorUI.cpp +++ b/src/SHADERed/UI/CodeEditorUI.cpp @@ -100,6 +100,8 @@ namespace ed { m_editorSaveRequestID = id; auto openFunc = [this, id](bool success) { + if (!success) return; + std::string const shaderFile = m_getShaderFile(id); if (!shaderFile.empty()) UIHelper::ShellOpen(m_data->Parser.GetProjectPath(shaderFile));