open-story-teller/story-editor/src/windows/emulator_window.cpp
anthony@rabine.fr 157c5a5a01 usage of submodules instead of git fetch
multiple fixes/file moves
2025-01-28 22:31:05 +01:00

183 lines
4.5 KiB
C++

#include "emulator_window.h"
#include "gui.h"
#include "ImGuiFileDialog.h"
#include "IconsMaterialDesignIcons.h"
EmulatorWindow::EmulatorWindow(IStoryManager &proj)
: WindowBase("Emulator")
, m_story(proj)
{
}
void EmulatorWindow::Initialize()
{
}
void EmulatorWindow::Draw()
{
// if (!IsVisible())
// {
// return;
// }
static ImVec2 size(320.0f, 240.0f);
WindowBase::BeginDraw();
ImGui::SetWindowSize(ImVec2(626, 744), ImGuiCond_FirstUseEver);
// ImGui::Image((void*)(intptr_t)my_image_texture, ImVec2(313, 367));
// float sz = ImGui::GetTextLineHeight();
ImVec2 p = ImGui::GetCursorScreenPos();
if (m_image.Valid())
{
ImGui::Image(reinterpret_cast<ImTextureID>(m_image.texture), ImVec2(320, 240));
}
else
{
ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 320, p.y + 240), ImGui::GetColorU32(ImVec4(1.0, 1.0, 1.0, 1.0)));
}
ImGui::SetCursorScreenPos(ImVec2(p.x, p.y + 244));
float old_size = ImGui::GetFont()->Scale;
ImGui::GetFont()->Scale *= 2;
ImGui::PushFont(ImGui::GetFont());
if (ImGui::Button(ICON_MDI_CHECK_CIRCLE_OUTLINE, ImVec2(50, 50)))
{
m_story.Ok();
}
ImGui::SameLine();
if (ImGui::Button(ICON_MDI_PAUSE, ImVec2(50, 50)))
{
m_story.Pause();
}
ImGui::SameLine();
if (ImGui::Button(ICON_MDI_HOME, ImVec2(50, 50)))
{
m_story.Home();
}
ImGui::SameLine();
if (ImGui::Button(ICON_MDI_ARROW_LEFT_BOLD_CIRCLE_OUTLINE, ImVec2(50, 50)))
{
m_story.Previous();
}
ImGui::SameLine();
if (ImGui::Button(ICON_MDI_ARROW_RIGHT_BOLD_CIRCLE_OUTLINE, ImVec2(50, 50)))
{
m_story.Next();
}
ImGui::GetFont()->Scale = old_size;
ImGui::PopFont();
ImGui::SeparatorText("Script control and debug");
if (ImGui::Button("Build nodes"))
{
m_story.BuildNodes(true);
}
ImGui::SameLine();
if (ImGui::Button("Build code"))
{
m_story.BuildCode(true);
}
ImGui::SameLine();
if (ImGui::Button("Play"))
{
m_story.Log("Play story");
m_story.Play();
}
ImGui::SameLine();
if (ImGui::Button("Stop"))
{
m_story.Log("Stop story");
m_story.Stop();
}
ImGui::SameLine();
ImGui::Text("VM state: %s", m_story.VmState().c_str());
if (ImGui::Button("Load binary story (.c32)"))
{
IGFD::FileDialogConfig config;
config.path = ".";
config.countSelectionMax = 1;
config.flags = ImGuiFileDialogFlags_Modal;
ImGuiFileDialog::Instance()->OpenDialog("LoadBinaryStoryDlgKey",
"Choose a binary story",
".c32",
config
);
}
ImGui::SameLine();
if (ImGui::Button("Set script source file (.chip32)"))
{
IGFD::FileDialogConfig config;
config.path = ".";
config.countSelectionMax = 1;
config.flags = ImGuiFileDialogFlags_Modal;
ImGuiFileDialog::Instance()->OpenDialog("SetSourceScriptDlgKey",
"Choose a binary story",
".chip32",
config
);
}
// ---------------- Load Binary story
if (ImGuiFileDialog::Instance()->Display("LoadBinaryStoryDlgKey"))
{
if (ImGuiFileDialog::Instance()->IsOk())
{
std::string filePathName = ImGuiFileDialog::Instance()->GetFilePathName();
std::string filePath = ImGuiFileDialog::Instance()->GetCurrentPath();
std::string filter = ImGuiFileDialog::Instance()->GetCurrentFilter();
m_story.LoadBinaryStory(filePathName);
}
// close
ImGuiFileDialog::Instance()->Close();
}
// ---------------- External source file
if (ImGuiFileDialog::Instance()->Display("SetSourceScriptDlgKey"))
{
if (ImGuiFileDialog::Instance()->IsOk())
{
std::string filePathName = ImGuiFileDialog::Instance()->GetFilePathName();
std::string filePath = ImGuiFileDialog::Instance()->GetCurrentPath();
std::string filter = ImGuiFileDialog::Instance()->GetCurrentFilter();
m_story.SetExternalSourceFile(filePathName);
}
// close
ImGuiFileDialog::Instance()->Close();
}
WindowBase::EndDraw();
}
void EmulatorWindow::ClearImage()
{
m_image.Clear();
}
void EmulatorWindow::SetImage(const std::string &image)
{
m_imageFileName = image;
m_image.Load(m_story.BuildFullAssetsPath(image));
}