Skip to content

Commit

Permalink
Added loading, load file dialog, and new project (clearing the curren…
Browse files Browse the repository at this point in the history
…t buffer window).
  • Loading branch information
sigmareaver committed Nov 25, 2022
1 parent 7c875fb commit 1ee21a4
Show file tree
Hide file tree
Showing 4 changed files with 219 additions and 7 deletions.
15 changes: 15 additions & 0 deletions src/main_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,21 @@ void MainWindowGUI(ImStudio::GUI & gui_r)
ImStudio::Serializer::SaveProject(gui);
}

// close
ImGuiFileDialog::Instance()->Close();
}
// Load File Dialog
ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize);
if (ImGuiFileDialog::Instance()->Display("LoadFileDlg", ImGuiWindowFlags_NoCollapse, { 100.0f, 100.0f }, { 600.0f, 400.0f }))
{
// action if OK
if (ImGuiFileDialog::Instance()->IsOk())
{
gui.path = ImGuiFileDialog::Instance()->GetCurrentPath();
gui.filename = ImGuiFileDialog::Instance()->GetCurrentFileName();
ImStudio::Serializer::LoadProject(gui);
}

// close
ImGuiFileDialog::Instance()->Close();
}
Expand Down
12 changes: 12 additions & 0 deletions src/sources/ims_gui_menubar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,21 @@ void ImStudio::GUI::ShowMenubar()
#ifndef __EMSCRIPTEN__
if (ImGui::MenuItem("New"))
{
filename.clear();
path.clear();
bw.state = true;
bw.size = {};
bw.pos = {};
bw.idgen = 0;
bw.open_child = false;
bw.open_child_id = -1;
bw.selected_obj_id = -1;
bw.staticlayout = false;
bw.objects.clear();
}
if (ImGui::MenuItem("Load"))
{
Serializer::LoadProjectDlg();
}
ImGui::Separator();
if (ImGui::MenuItem("Save As.."))
Expand Down
189 changes: 183 additions & 6 deletions src/sources/ims_serializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,8 @@ int ImStudio::Serializer::SaveObject(YAML::Emitter& out, ImStudio::Object& obj)
KEY(out, "Grab2ID", child.grab2_id);
KEY(out, "Grab1", child.grab1);
KEY(out, "Grab2", child.grab2);
bool grabinit = false; //--
KEY(out, "GrabInit", child.grabinit);

std::vector<BaseObject> objects = {};
BEGIN_BSEQ(out, "Objects");
for (auto& cw : child.objects)
{
Expand All @@ -146,7 +144,7 @@ int ImStudio::Serializer::SaveBuffer(YAML::Emitter& out, ImStudio::BufferWindow&
KEY(out, "Size", bw.size);
KEY(out, "IDGen", bw.idgen);

Object* current_child = nullptr; //
//Object* current_child = nullptr; //

KEY(out, "StaticLayout", bw.staticlayout);

Expand Down Expand Up @@ -189,7 +187,7 @@ int ImStudio::Serializer::SaveGUI(YAML::Emitter& out, GUI& gui)
KEY(out, "OutputPos", gui.ot_P);
KEY(out, "OutputSize", gui.ot_S);

std::string output = {};
//std::string output = {};

KEY(out, "WkspOutputLua", gui.wksp_output_lua);
KEY(out, "ChildStyle", gui.child_style);
Expand All @@ -200,8 +198,8 @@ int ImStudio::Serializer::SaveGUI(YAML::Emitter& out, GUI& gui)
KEY(out, "ChildResources", gui.child_resources);
KEY(out, "ChildAbout", gui.child_about);

std::string filename;
std::string path;
//std::string filename;
//std::string path;

return 0;
}
Expand Down Expand Up @@ -239,3 +237,182 @@ int ImStudio::Serializer::SaveProject(GUI& gui)

return 0;
}

static void ClearProject(ImStudio::GUI& gui)
{
gui.bw.state = true;
gui.bw.size = {};
gui.bw.pos = {};
gui.bw.idgen = 0;
gui.bw.open_child = false;
gui.bw.open_child_id = -1;
gui.bw.selected_obj_id = -1;
gui.bw.staticlayout = false;
gui.bw.objects.clear();
}

int ImStudio::Serializer::LoadProjectDlg()
{
ImGuiFileDialog::Instance()->OpenDialog("LoadFileDlg", "Load File", ".gui", ".");
return 0;
}

int ImStudio::Serializer::LoadBaseObject(YAML::detail::iterator_value& it, Object& obj)
{
obj.id = it["ID"].as<int>();
obj.type = it["Type"].as<std::string>();
obj.identifier = it["Identifier"].as<std::string>();
obj.state = it["State"].as<bool>();
obj.pos = it["Pos"].as<ImVec2>();
obj.size = it["Size"].as<ImVec2>();
obj.width = it["Width"].as<float>();
obj.init = it["Init"].as<bool>();
obj.propinit = it["PropInit"].as<bool>();
obj.initial_selection = it["Initial_Selection"].as<bool>();
obj.locked = it["Locked"].as<bool>();
obj.center_h = it["CenterH"].as<bool>();
obj.autoresize = it["AutoResize"].as<bool>();
obj.animate = it["Animate"].as<bool>();
obj.label = it["Label"].as<std::string>();
obj.value_s = it["ValueS"].as<std::string>();
obj.value_b = it["ValueB"].as<bool>();

//Object* parent = nullptr; //--
////int parentid = 0; // | For child objects and
//if (obj.parent) // Apparently parent doesn't get initialized, needs done before further coding...
// KEY(out, "ParentID", obj.parent->id);
//else
// KEY(out, "ParentID", 0);

//KEY(out, "IsChild", obj.ischild);
obj.ischildwidget = it["IsChildWidget"].as<bool>();
obj.item_current = it["ItemCurrent"].as<int>();

return 0;
}

int ImStudio::Serializer::LoadObject(YAML::detail::iterator_value& it, Object& obj)
{
// BaseObject
LoadBaseObject(it, obj);

// ContainerChild
auto cc_node = it["ContainerChild"];
auto& child = obj.child;
child.id = cc_node["ID"].as<int>();
child.freerect = cc_node["FreeRect"].as<ImRect>();
child.windowrect = cc_node["WindowRect"].as<ImRect>();
child.open = cc_node["Open"].as<bool>();
child.locked = cc_node["Locked"].as<bool>();
child.border = cc_node["Border"].as<bool>();
child.init = cc_node["Init"].as<bool>();
child.grab1_id = cc_node["Grab1ID"].as<int>();
child.grab2_id = cc_node["Grab2ID"].as<int>();
child.grab1 = cc_node["Grab1"].as<ImVec2>();
child.grab2 = cc_node["Grab2"].as<ImVec2>();
child.grabinit = cc_node["GrabInit"].as<bool>();

auto objects_node = cc_node["Objects"];
for (auto it : objects_node)
{
int id = it["ID"].as<int>();
std::string type = it["Type"].as<std::string>();
Object widget(id, type);
LoadBaseObject(it, widget);
child.objects.push_back(widget);
}

return 0;
}

int ImStudio::Serializer::LoadBuffer(YAML::Node& node, ImStudio::BufferWindow& bw)
{
bw.state = node["State"].as<bool>();
bw.pos = node["Pos"].as<ImVec2>();
bw.size = node["Size"].as<ImVec2>();
bw.idgen = node["IDGen"].as<int>();

//Object* current_child = nullptr; //

bw.staticlayout = node["StaticLayout"].as<bool>();

auto objects_node = node["Objects"];
for (auto it : objects_node)
{
int id = it["ID"].as<int>();
std::string type = it["Type"].as<std::string>();
Object widget(id, type);
LoadObject(it, widget);
bw.objects.push_back(widget);
}

return 0;
}

int ImStudio::Serializer::LoadGUI(YAML::Node& node, GUI& gui)
{
gui.state = node["State"].as<bool>();
gui.compact = node["Compact"].as<bool>();
gui.wksp_create = node["WkspCreate"].as<bool>();
gui.menubar = node["Menubar"].as<bool>();
gui.mb_P = node["MenubarPos"].as<ImVec2>();
gui.mb_S = node["MenubarSize"].as<ImVec2>();
gui.sidebar = node["Sidebar"].as<bool>();
gui.sb_P = node["SidebarPos"].as<ImVec2>();
gui.sb_S = node["SidebarSize"].as<ImVec2>();
gui.properties = node["Properties"].as<bool>();
gui.pt_P = node["PropertiesPos"].as<ImVec2>();
gui.pt_S = node["PropertiesSize"].as<ImVec2>();

gui.viewport = node["Viewport"].as<bool>();
gui.vp_P = node["ViewportPos"].as<ImVec2>();
gui.vp_S = node["ViewportSize"].as<ImVec2>();

{
auto bw_node = node["BufferWindow"];
LoadBuffer(bw_node, gui.bw);
}

gui.wksp_output_cpp = node["WkspOutputCPP"].as<bool>();
gui.ot_P = node["OutputPos"].as<ImVec2>();
gui.ot_S = node["OutputSize"].as<ImVec2>();

//std::string output = {};

gui.wksp_output_lua = node["WkspOutputLua"].as<bool>();
gui.child_style = node["ChildStyle"].as<bool>();
gui.child_demo = node["ChildDemo"].as<bool>();
gui.child_metrics = node["ChildMetrics"].as<bool>();
gui.child_color = node["ChildColor"].as<bool>();
gui.child_stack = node["ChildStack"].as<bool>();
gui.child_resources = node["ChildResources"].as<bool>();
gui.child_about = node["ChildAbout"].as<bool>();

return 0;
}

int ImStudio::Serializer::LoadProject(GUI& gui)
{
if (gui.filename.length() == 0)
{
LoadProjectDlg();
return -1;
}


try
{
std::string path = gui.path + "\\" + gui.filename;
YAML::Node node = YAML::LoadFile(path);

ClearProject(gui);

LoadGUI(node, gui);
}
catch (const std::exception& e)
{
printf("%s\n", e.what());
}

return 0;
}
10 changes: 9 additions & 1 deletion src/sources/ims_serializer.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,20 @@ namespace ImStudio

class Serializer
{
public:
private:
static int SaveBaseObject(YAML::Emitter& out, BaseObject& obj);
static int SaveObject(YAML::Emitter& out, Object& obj);
static int SaveBuffer(YAML::Emitter& out, BufferWindow& bw);
static int SaveGUI(YAML::Emitter& out, GUI& gui);

static int LoadBaseObject(YAML::detail::iterator_value& it, Object& obj);
static int LoadObject(YAML::detail::iterator_value& it, Object& obj);
static int LoadBuffer(YAML::Node& node, ImStudio::BufferWindow& bw);
static int LoadGUI(YAML::Node& node, GUI& gui);
public:
static int SaveProjectAs(GUI& gui);
static int SaveProject(GUI& gui);
static int LoadProjectDlg();
static int LoadProject(GUI& gui);
};
}

0 comments on commit 1ee21a4

Please sign in to comment.