diff --git a/story-editor/src/code_editor.cpp b/story-editor/src/code_editor.cpp index 3d6b88f..708ad69 100644 --- a/story-editor/src/code_editor.cpp +++ b/story-editor/src/code_editor.cpp @@ -3,10 +3,12 @@ #include #include -CodeEditor::CodeEditor() +CodeEditor::CodeEditor(IStoryManager &project) : WindowBase("Code editor") + , m_storyManager(project) { - mEditor.SetReadOnly(true); + mEditor.SetReadOnly(false); + SetFlags(ImGuiWindowFlags_MenuBar); } void CodeEditor::Initialize() @@ -18,8 +20,8 @@ void CodeEditor::Initialize() // "breakpoint" markers - // m_breakPoints.insert(42); - // mEditor.SetBreakpoints(m_breakPoints); + // m_breakPoints.insert(42); + // mEditor.SetBreakpoints(m_breakPoints); } @@ -40,6 +42,12 @@ void CodeEditor::SetScript(const std::string &txt) mEditor.SetText(txt); } +std::string CodeEditor::GetScript() const +{ + return mEditor.GetText(); +} + + void CodeEditor::Draw() { WindowBase::BeginDraw(); @@ -109,6 +117,21 @@ void CodeEditor::Draw() mEditor.IsOverwrite() ? "Ovr" : "Ins", mEditor.CanUndo() ? "*" : " "); + ImGui::SameLine(); + if (ImGui::SmallButton("Toggle breakpoint")) { + if (m_breakPoints.contains(cpos.mLine)) + { + m_breakPoints.erase(cpos.mLine); + } + else + { + m_breakPoints.insert(cpos.mLine); + } + mEditor.SetBreakpoints(m_breakPoints); + + m_storyManager.ToggleBreakpoint(cpos.mLine); + } + mEditor.Render("TextEditor"); WindowBase::EndDraw(); } diff --git a/story-editor/src/code_editor.h b/story-editor/src/code_editor.h index 8bdcb0d..641d674 100644 --- a/story-editor/src/code_editor.h +++ b/story-editor/src/code_editor.h @@ -2,17 +2,19 @@ #include "TextEditor.h" #include "window_base.h" +#include "i_story_manager.h" class CodeEditor : public WindowBase { public: - CodeEditor(); + CodeEditor(IStoryManager &project); virtual void Draw() override; void Initialize(); void SetScript(const std::string &txt); + std::string GetScript() const; void ClearErrors(); void AddError(int line, const std::string &text); @@ -21,6 +23,8 @@ public: mEditor.SetExecutionMarker(line); } private: + IStoryManager &m_storyManager; + TextEditor mEditor; TextEditor::Breakpoints m_breakPoints; TextEditor::ErrorMarkers m_markers; diff --git a/story-editor/src/emulator_window.cpp b/story-editor/src/emulator_window.cpp index 726fad6..0d065af 100644 --- a/story-editor/src/emulator_window.cpp +++ b/story-editor/src/emulator_window.cpp @@ -76,13 +76,14 @@ void EmulatorWindow::Draw() ImGui::SeparatorText("Script control and debug"); - if (ImGui::Button("Generate pack")) + if (ImGui::Button("Build nodes")) { - m_story.Build(false); + m_story.BuildNodes(true); } - if (ImGui::Button("Build script")) + ImGui::SameLine(); + if (ImGui::Button("Build code")) { - m_story.Build(true); + m_story.BuildCode(true); } ImGui::SameLine(); if (ImGui::Button("Play")) diff --git a/story-editor/src/i_story_manager.h b/story-editor/src/i_story_manager.h index d1ddd77..1936e0b 100644 --- a/story-editor/src/i_story_manager.h +++ b/story-editor/src/i_story_manager.h @@ -46,12 +46,14 @@ public: virtual void DeleteResource(FilterIterator &it) = 0; // Node interaction - virtual void Build(bool compileonly) = 0; + virtual void BuildNodes(bool compileonly) = 0; + virtual void BuildCode(bool compileonly) = 0; virtual std::shared_ptr CreateNode(const std::string &type) = 0; virtual void DeleteNode(const std::string &id) = 0; virtual void DeleteLink(std::shared_ptr c) = 0; virtual std::list> GetNodeConnections(const std::string &nodeId) = 0; - virtual void LoadBinaryStory(const std::string &filename) = 0; + virtual void LoadBinaryStory(const std::string &filename) = 0; + virtual void ToggleBreakpoint(int line) = 0; virtual void Play() = 0; virtual void Ok() = 0; diff --git a/story-editor/src/main_window.cpp b/story-editor/src/main_window.cpp index e15157f..539e045 100644 --- a/story-editor/src/main_window.cpp +++ b/story-editor/src/main_window.cpp @@ -23,6 +23,7 @@ MainWindow::MainWindow() : m_libraryManager(*this) , m_emulatorWindow(*this) + , m_codeEditorWindow(*this) , m_resourcesWindow(*this) , m_nodeEditorWindow(*this) , m_libraryWindow(*this, m_libraryManager) @@ -192,7 +193,7 @@ void MainWindow::ProcessStory() { if (m_dbg.m_breakpoints.contains(m_dbg.line + 1)) { - Log("Breakpoint on line: " + std::to_string(m_dbg.line + 1)); + // Log("Breakpoint on line: " + std::to_string(m_dbg.line + 1)); m_dbg.free_run = false; return; } @@ -427,7 +428,7 @@ bool MainWindow::Initialize() m_player.Initialize(); // Initialize audio after GUI (uses SDL) // gui.ApplyTheme(); - m_editorWindow.Initialize(); + m_codeEditorWindow.Initialize(); m_emulatorWindow.Initialize(); m_nodeEditorWindow.Initialize(); m_PropertiesWindow.Initialize(); @@ -725,7 +726,7 @@ void MainWindow::OpenProject(const std::string &uuid) m_nodeEditorWindow.Enable(); m_emulatorWindow.Enable(); m_consoleWindow.Enable(); - m_editorWindow.Enable(); + m_codeEditorWindow.Enable(); m_resourcesWindow.Enable(); m_PropertiesWindow.Enable(); } @@ -771,12 +772,12 @@ void MainWindow::CloseProject() m_nodeEditorWindow.Clear(); m_emulatorWindow.ClearImage(); m_consoleWindow.ClearLog(); - m_editorWindow.ClearErrors(); - m_editorWindow.SetScript(""); + m_codeEditorWindow.ClearErrors(); + m_codeEditorWindow.SetScript(""); m_nodeEditorWindow.Disable(); m_emulatorWindow.Disable(); - m_editorWindow.Disable(); + m_codeEditorWindow.Disable(); m_resourcesWindow.Disable(); m_PropertiesWindow.Disable(); @@ -855,7 +856,7 @@ void MainWindow::Loop() { m_consoleWindow.Draw(); m_emulatorWindow.Draw(); - m_editorWindow.Draw(); + m_codeEditorWindow.Draw(); m_resourcesWindow.Draw(); m_nodeEditorWindow.Draw(); @@ -969,47 +970,71 @@ void MainWindow::LoadBinaryStory(const std::string &filename) } } +void MainWindow::ToggleBreakpoint(int line) +{ + if (m_dbg.m_breakpoints.contains(line)) + { + m_dbg.m_breakpoints.erase(line); + } + else + { + m_dbg.m_breakpoints.insert(line); + } +} -void MainWindow::Build(bool compileonly) +void MainWindow::BuildNodes(bool compileonly) { if (m_story->GenerateScript(m_currentCode)) { - m_editorWindow.SetScript(m_currentCode); - m_dbg.run_result = VM_FINISHED; - m_dbg.free_run = false; + m_codeEditorWindow.SetScript(m_currentCode); + Build(compileonly); + } +} - if (!compileonly) + +void MainWindow::Build(bool compileonly) +{ + m_dbg.run_result = VM_FINISHED; + m_dbg.free_run = false; + + if (!compileonly) + { + // 3. Convert all media to desired type format + m_resources.ConvertResources(m_story->AssetsPath(), "", m_story->GetImageFormat(), m_story->GetSoundFormat()); // pas de répertoire de destination + } + + Chip32::Assembler::Error err; + m_codeEditorWindow.ClearErrors(); + if (m_story->GenerateBinary(m_currentCode, err)) + { + m_result.Print(); + + if (m_story->CopyProgramTo(m_rom_data, sizeof (m_rom_data))) { - // 3. Convert all media to desired type format - m_resources.ConvertResources(m_story->AssetsPath(), "", m_story->GetImageFormat(), m_story->GetSoundFormat()); // pas de répertoire de destination - } - - Chip32::Assembler::Error err; - if (m_story->GenerateBinary(m_currentCode, err)) - { - m_result.Print(); - - if (m_story->CopyProgramTo(m_rom_data, sizeof (m_rom_data))) - { - // m_ramView->SetMemory(m_ram_data, sizeof(m_ram_data)); + // m_ramView->SetMemory(m_ram_data, sizeof(m_ram_data)); // m_romView->SetMemory(m_rom_data, m_program.size()); - m_story->SaveBinary(); - chip32_initialize(&m_chip32_ctx); - m_dbg.run_result = VM_READY; - UpdateVmView(); - } - else - { - Log("Program too big. Expand ROM memory."); - } + m_story->SaveBinary(); + chip32_initialize(&m_chip32_ctx); + m_dbg.run_result = VM_READY; + UpdateVmView(); } else { - Log(err.ToString(), true); - m_editorWindow.AddError(err.line, err.message); // show also the error in the code editor + Log("Program too big. Expand ROM memory."); } } + else + { + Log(err.ToString(), true); + m_codeEditorWindow.AddError(err.line, err.message); // show also the error in the code editor + } +} + +void MainWindow::BuildCode(bool compileonly) +{ + m_currentCode = m_codeEditorWindow.GetScript(); + Build(compileonly); } void MainWindow::DeleteNode(const std::string &id) @@ -1039,7 +1064,7 @@ void MainWindow::UpdateVmView() if (m_story->GetAssemblyLine(pcVal, line)) { m_dbg.line = (line - 1); - m_editorWindow.HighlightLine(m_dbg.line); + m_codeEditorWindow.HighlightLine(m_dbg.line); } else { diff --git a/story-editor/src/main_window.h b/story-editor/src/main_window.h index 62022b7..5004bc0 100644 --- a/story-editor/src/main_window.h +++ b/story-editor/src/main_window.h @@ -97,7 +97,7 @@ private: Gui m_gui; EmulatorWindow m_emulatorWindow; ConsoleWindow m_consoleWindow; - CodeEditor m_editorWindow; + CodeEditor m_codeEditorWindow; char m_project_name[256] = ""; @@ -133,11 +133,13 @@ private: virtual void DeleteResource(FilterIterator &it) override; virtual std::shared_ptr CreateNode(const std::string &type) override; - virtual void Build(bool compileonly) override; + virtual void BuildNodes(bool compileonly) override; + virtual void BuildCode(bool compileonly) override; virtual void DeleteNode(const std::string &id) override; virtual void DeleteLink(std::shared_ptr c) override; virtual std::list> GetNodeConnections(const std::string &nodeId) override; virtual void LoadBinaryStory(const std::string &filename) override; + virtual void ToggleBreakpoint(int line) override; virtual void Play() override; virtual void Ok() override; @@ -172,6 +174,7 @@ private: void StepInstruction(); void RefreshProjectInformation(); void ProjectPropertiesPopup(); + void Build(bool compileonly); }; #endif // MAINWINDOW_H diff --git a/story-editor/src/window_base.cpp b/story-editor/src/window_base.cpp index f246433..3872886 100644 --- a/story-editor/src/window_base.cpp +++ b/story-editor/src/window_base.cpp @@ -9,7 +9,7 @@ WindowBase::WindowBase(const std::string &title) bool WindowBase::BeginDraw() { - bool ok = ImGui::Begin(m_title.c_str(), nullptr); + bool ok = ImGui::Begin(m_title.c_str(), nullptr, m_windowFlags); if (m_disabled) { diff --git a/story-editor/src/window_base.h b/story-editor/src/window_base.h index dca828f..f8d5cc7 100644 --- a/story-editor/src/window_base.h +++ b/story-editor/src/window_base.h @@ -2,6 +2,7 @@ #define WINDOWBASE_H #include +#include "imgui.h" class WindowBase { @@ -26,10 +27,15 @@ public: m_disabled = false; } + void SetFlags(ImGuiWindowFlags flags) { + m_windowFlags = flags; + } + private: bool m_disabled{false}; std::string m_title; + ImGuiWindowFlags m_windowFlags = 0; }; #endif // WINDOWBASE_H