Files
panopainter/src/legacy_ui_node_loader.cpp

208 lines
6.4 KiB
C++

#include "pch.h"
#include "legacy_ui_node_loader.h"
#include "legacy_ui_node_attributes.h"
#include "log.h"
#include "node.h"
#include "layout.h"
#include "node_about.h"
#include "node_border.h"
#include "node_button.h"
#include "node_button_custom.h"
#include "node_canvas.h"
#include "node_changelog.h"
#include "node_checkbox.h"
#include "node_color_quad.h"
#include "node_colorwheel.h"
#include "node_combobox.h"
#include "node_dialog_browse.h"
#include "node_dialog_cloud.h"
#include "node_dialog_picker.h"
#include "node_icon.h"
#include "node_image.h"
#include "node_image_texture.h"
#include "node_metadata.h"
#include "node_panel_animation.h"
#include "node_panel_brush.h"
#include "node_panel_color.h"
#include "node_panel_grid.h"
#include "node_panel_layer.h"
#include "node_panel_quick.h"
#include "node_panel_stroke.h"
#include "node_popup_menu.h"
#include "node_scroll.h"
#include "node_slider.h"
#include "node_stroke_preview.h"
#include "node_text.h"
#include "node_text_input.h"
#include "node_tool_bucket.h"
#include "node_usermanual.h"
#include "node_viewport.h"
#include "util.h"
namespace pp::panopainter {
namespace {
bool should_skip_child_for_os(const tinyxml2::XMLElement& x_child)
{
if (auto os = x_child.Attribute("os"))
{
auto osv = split(os, ',');
if (std::find(osv.begin(), osv.end(), PP_OS) == osv.end())
{
LOG("Element %s not for this os(%s), skipping", x_child.Name(), PP_OS)
return true;
}
}
return false;
}
void load_ref_child(Node& parent, const tinyxml2::XMLElement& x_child)
{
auto ids = x_child.Attribute("id");
auto id = const_hash(ids);
auto& ref = (*parent.m_manager)[id]->m_children[0];
auto n = ref->clone();
n->m_nodeID_s = ids;
n->m_nodeID = id;
parent.add_child(n);
}
void load_text_child(Node& parent, const tinyxml2::XMLElement& x_child)
{
auto n = new NodeText();
parent.add_child(n);
n->load_internal(&x_child, true);
std::string text;
auto node = x_child.FirstChild();
while (node)
{
if (auto e = node->ToElement())
{
if (strcmp(e->Name(), "br") == 0)
text.append("\n");
}
else if (auto t = node->ToText())
{
text.append(t->Value());
}
node = node->NextSibling();
}
if (!text.empty())
n->set_text(text);
}
Node* instantiate_child_node(std::string_view node_name)
{
if (node_name == "node") return new Node();
if (node_name == "border") return new NodeBorder();
if (node_name == "image") return new NodeImage();
if (node_name == "image-texture") return new NodeImageTexture();
if (node_name == "icon") return new NodeIcon();
if (node_name == "text-input") return new NodeTextInput();
if (node_name == "button") return new NodeButton();
if (node_name == "button-custom") return new NodeButtonCustom();
if (node_name == "combobox") return new NodeComboBox();
if (node_name == "slider-h") return new NodeSliderH();
if (node_name == "slider-v") return new NodeSliderV();
if (node_name == "slider-hue") return new NodeSliderHue();
if (node_name == "popup-menu") return new NodePopupMenu();
if (node_name == "viewport") return new NodeViewport();
if (node_name == "checkbox") return new NodeCheckBox();
if (node_name == "layer") return new NodeLayer();
if (node_name == "panel-layer") return new NodePanelLayer();
if (node_name == "panel-brush") return new NodePanelBrush();
if (node_name == "panel-color") return new NodePanelColor();
if (node_name == "panel-stroke") return new NodePanelStroke();
if (node_name == "panel-grid") return new NodePanelGrid();
if (node_name == "panel-quick") return new NodePanelQuick();
if (node_name == "dialog-browse") return new NodeDialogBrowse();
if (node_name == "dialog-browse-item") return new NodeDialogBrowseItem();
if (node_name == "dialog-cloud") return new NodeDialogCloud();
if (node_name == "dialog-cloud-item") return new NodeDialogCloudItem();
if (node_name == "color-picker") return new NodeColorPicker();
if (node_name == "about") return new NodeAbout();
if (node_name == "changelog") return new NodeChangelog();
if (node_name == "usermanual") return new NodeUserManual();
if (node_name == "tool-bucket") return new NodeToolBucket();
if (node_name == "timeline") return new NodeAnimationTimeline();
if (node_name == "stroke-preview") return new NodeStrokePreview();
if (node_name == "canvas") return new NodeCanvas();
if (node_name == "scroll") return new NodeScroll();
if (node_name == "metadata") return new NodeMetadata();
if (node_name == "colorwheel") return new NodeColorWheel();
if (node_name == "color-quad") return new NodeColorQuad();
return nullptr;
}
void load_typed_child(Node& parent, const tinyxml2::XMLElement& x_child, std::string_view node_name)
{
if (auto* n = instantiate_child_node(node_name))
{
parent.add_child(n);
n->load_internal(&x_child);
return;
}
LOG("instancing UNKNOWN node: %s", x_child.Name());
auto* n = new Node();
parent.add_child(n);
n->load_internal(&x_child);
}
} // namespace
void load_legacy_ui_node(Node& node, const tinyxml2::XMLElement& x_node, bool skip_children)
{
node.m_name = x_node.Name();
//LOG("load_internal node %s", node.m_name.c_str());
node.init();
auto attr = x_node.FirstAttribute();
while (attr)
{
parse_legacy_ui_node_attribute(node, (kAttribute)const_hash(attr->Name()), attr);
attr = attr->Next();
}
node.create();
if (skip_children)
{
node.loaded();
return;
}
load_legacy_ui_children(node, x_node);
node.loaded();
}
void load_legacy_ui_children(Node& parent, const tinyxml2::XMLElement& x_node)
{
auto x_child = x_node.FirstChildElement();
while (x_child)
{
if (should_skip_child_for_os(*x_child))
{
x_child = x_child->NextSiblingElement();
continue;
}
std::string_view node_name = x_child->Name();
if (node_name == "ref")
load_ref_child(parent, *x_child);
else if (node_name == "text")
load_text_child(parent, *x_child);
else
load_typed_child(parent, *x_child, node_name);
x_child = x_child->NextSiblingElement();
}
}
} // namespace pp::panopainter