From 2cf03962a66bf5862fee3dbd7ae160002a3d08db Mon Sep 17 00:00:00 2001 From: David Capello Date: Tue, 23 Apr 2024 16:06:54 -0300 Subject: [PATCH] Update saving/loading dock layouts w/tinyxml2 library --- src/app/ui/layout.cpp | 37 ++++++++++++++++++------------------- src/app/ui/layout.h | 9 +++++---- src/app/ui/layouts.cpp | 27 +++++++++++++++------------ 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/app/ui/layout.cpp b/src/app/ui/layout.cpp index 7c1fb00a7..4ee3acdf1 100644 --- a/src/app/ui/layout.cpp +++ b/src/app/ui/layout.cpp @@ -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(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. , // , 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(); 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("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(); diff --git a/src/app/ui/layout.h b/src/app/ui/layout.h index 0173e8177..9a8afc76d 100644 --- a/src/app/ui/layout.h +++ b/src/app/ui/layout.h @@ -11,7 +11,7 @@ #include #include -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 m_elem; + tinyxml2::XMLDocument m_dummyDoc; + tinyxml2::XMLElement* m_elem = nullptr; }; } // namespace app diff --git a/src/app/ui/layouts.cpp b/src/app/ui/layouts.cpp index b5b063189..a41d542fa 100644 --- a/src/app/ui/layouts.cpp +++ b/src/app/ui/layouts.cpp @@ -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(); + 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