Extract canvas projection helpers and thin preview and node loading
This commit is contained in:
180
src/legacy_ui_node_loader.cpp
Normal file
180
src/legacy_ui_node_loader.cpp
Normal file
@@ -0,0 +1,180 @@
|
||||
#include "pch.h"
|
||||
#include "legacy_ui_node_loader.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_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
|
||||
Reference in New Issue
Block a user