Update saving/loading dock layouts w/tinyxml2 library

This commit is contained in:
David Capello 2024-04-23 16:06:54 -03:00
parent 72b61fc2e7
commit 2cf03962a6
3 changed files with 38 additions and 35 deletions

View File

@ -29,7 +29,9 @@
namespace app {
static void save_dock_layout(TiXmlElement* elem, const Dock* dock)
using namespace tinyxml2;
static void save_dock_layout(XMLElement* elem, const Dock* dock)
{
for (const auto child : dock->children()) {
const int side = dock->whichSideChildIsDocked(child);
@ -46,30 +48,28 @@ static void save_dock_layout(TiXmlElement* elem, const Dock* dock)
break;
}
TiXmlElement childElem("");
XMLElement* childElem = elem->InsertNewChildElement("");
if (auto subdock = dynamic_cast<const Dock*>(child)) {
childElem.SetValue("dock");
childElem->SetValue("dock");
if (!sideStr.empty())
childElem.SetAttribute("side", sideStr);
childElem->SetAttribute("side", sideStr.c_str());
save_dock_layout(&childElem, subdock);
save_dock_layout(childElem, subdock);
}
else {
// Set the widget ID as the element name, e.g. <timeline />,
// <colorbar />, etc.
childElem.SetValue(child->id());
childElem->SetValue(child->id().c_str());
if (!sideStr.empty())
childElem.SetAttribute("side", sideStr);
if (size.w) childElem.SetAttribute("width", size.w);
if (size.h) childElem.SetAttribute("height", size.h);
childElem->SetAttribute("side", sideStr.c_str());
if (size.w) childElem->SetAttribute("width", size.w);
if (size.h) childElem->SetAttribute("height", size.h);
}
elem->InsertEndChild(childElem);
}
}
static void load_dock_layout(const TiXmlElement* elem, Dock* dock)
static void load_dock_layout(const XMLElement* elem, Dock* dock)
{
const char* elemNameStr = elem->Value();
if (!elemNameStr) {
@ -119,15 +119,14 @@ static void load_dock_layout(const TiXmlElement* elem, Dock* dock)
}
// static
LayoutPtr Layout::MakeFromXmlElement(const TiXmlElement* layoutElem)
LayoutPtr Layout::MakeFromXmlElement(const XMLElement* layoutElem)
{
auto layout = std::make_shared<Layout>();
if (auto name = layoutElem->Attribute("name")) {
layout->m_id = name;
layout->m_name = name;
}
layout->m_elem.reset(layoutElem->Clone()->ToElement());
layout->m_elem = layoutElem->DeepClone(&layout->m_dummyDoc)->ToElement();
return layout;
}
@ -140,9 +139,9 @@ LayoutPtr Layout::MakeFromDock(const std::string& id,
layout->m_id = id;
layout->m_name = name;
layout->m_elem = std::make_unique<TiXmlElement>("layout");
layout->m_elem->SetAttribute("name", name);
save_dock_layout(layout->m_elem.get(), dock);
layout->m_elem = layout->m_dummyDoc.NewElement("layout");
layout->m_elem->SetAttribute("name", name.c_str());
save_dock_layout(layout->m_elem, dock);
return layout;
}
@ -163,7 +162,7 @@ bool Layout::loadLayout(Dock* dock) const
if (!m_elem)
return false;
TiXmlElement* elem = m_elem->FirstChildElement();
XMLElement* elem = m_elem->FirstChildElement();
while (elem) {
load_dock_layout(elem, dock);
elem = elem->NextSiblingElement();

View File

@ -11,7 +11,7 @@
#include <memory>
#include <string>
class TiXmlElement;
#include "tinyxml2.h"
namespace app {
class Dock;
@ -24,14 +24,14 @@ namespace app {
static constexpr const char* kDefault = "_default_";
static constexpr const char* kMirroredDefault = "_mirrored_default_";
static LayoutPtr MakeFromXmlElement(const TiXmlElement* layoutElem);
static LayoutPtr MakeFromXmlElement(const tinyxml2::XMLElement* layoutElem);
static LayoutPtr MakeFromDock(const std::string& id,
const std::string& name,
const Dock* dock);
const std::string& id() const { return m_id; }
const std::string& name() const { return m_name; }
const TiXmlElement* xmlElement() const { return m_elem.get(); }
const tinyxml2::XMLElement* xmlElement() const { return m_elem; }
bool matchId(const std::string& id) const;
bool loadLayout(Dock* dock) const;
@ -39,7 +39,8 @@ namespace app {
private:
std::string m_id;
std::string m_name;
std::unique_ptr<TiXmlElement> m_elem;
tinyxml2::XMLDocument m_dummyDoc;
tinyxml2::XMLElement* m_elem = nullptr;
};
} // namespace app

View File

@ -20,6 +20,8 @@
namespace app {
using namespace tinyxml2;
Layouts::Layouts()
{
try {
@ -65,11 +67,11 @@ bool Layouts::addLayout(const LayoutPtr& layout)
void Layouts::load(const std::string& fn)
{
XmlDocumentRef doc = app::open_xml(fn);
TiXmlHandle handle(doc.get());
TiXmlElement* layoutElem = handle
.FirstChild("layouts")
.FirstChild("layout").ToElement();
XMLDocumentRef doc = app::open_xml(fn);
XMLHandle handle(doc.get());
XMLElement* layoutElem = handle
.FirstChildElement("layouts")
.FirstChildElement("layout").ToElement();
while (layoutElem) {
m_layouts.push_back(Layout::MakeFromXmlElement(layoutElem));
@ -79,16 +81,17 @@ void Layouts::load(const std::string& fn)
void Layouts::save(const std::string& fn) const
{
XmlDocumentRef doc(new TiXmlDocument());
TiXmlElement layoutsElem("layouts");
auto doc = std::make_unique<XMLDocument>();
XMLElement* layoutsElem = doc->NewElement("layouts");
for (const auto& layout : m_layouts)
layoutsElem.InsertEndChild(*layout->xmlElement());
for (const auto& layout : m_layouts) {
layoutsElem->InsertEndChild(
layout->xmlElement()->DeepClone(doc.get()));
}
TiXmlDeclaration declaration("1.0", "utf-8", "");
doc->InsertEndChild(declaration);
doc->InsertEndChild(doc->NewDeclaration("xml version=\"1.0\" encoding=\"utf-8\""));
doc->InsertEndChild(layoutsElem);
save_xml(doc, fn);
save_xml(doc.get(), fn);
}
// static