#include "library/ToolJson.h" #include #include namespace core::library { static QJsonArray pointToJson(const QPointF& p) { QJsonArray a; a.append(p.x()); a.append(p.y()); return a; } static QPointF pointFromJson(const QJsonValue& v) { const QJsonArray a = v.toArray(); if (a.size() >= 2) { return QPointF(a.at(0).toDouble(0.0), a.at(1).toDouble(0.0)); } return QPointF(); } QJsonObject toolToJson(const core::Project::Tool& t) { QJsonObject o; o.insert(QStringLiteral("id"), t.id); o.insert(QStringLiteral("displayName"), t.displayName); o.insert(QStringLiteral("visible"), t.visible); o.insert(QStringLiteral("parentId"), t.parentId); o.insert(QStringLiteral("parentOffsetWorld"), pointToJson(t.parentOffsetWorld)); o.insert(QStringLiteral("originWorld"), pointToJson(t.originWorld)); o.insert(QStringLiteral("type"), QStringLiteral("bubble")); o.insert(QStringLiteral("text"), t.text); o.insert(QStringLiteral("fontPx"), t.fontPx); QString align = QStringLiteral("center"); if (t.align == core::Project::Tool::TextAlign::Left) align = QStringLiteral("left"); if (t.align == core::Project::Tool::TextAlign::Right) align = QStringLiteral("right"); o.insert(QStringLiteral("align"), align); o.insert(QStringLiteral("pointerT"), t.bubblePointerT01); QJsonArray vis; for (const auto& k : t.visibilityKeys) { QJsonObject ko; ko.insert(QStringLiteral("frame"), k.frame); ko.insert(QStringLiteral("value"), k.value); vis.append(ko); } o.insert(QStringLiteral("visibilityKeys"), vis); QJsonArray loc; for (const auto& k : t.locationKeys) { QJsonObject ko; ko.insert(QStringLiteral("frame"), k.frame); ko.insert(QStringLiteral("x"), k.value.x()); ko.insert(QStringLiteral("y"), k.value.y()); loc.append(ko); } o.insert(QStringLiteral("locationKeys"), loc); return o; } bool toolFromJson(const QJsonObject& o, core::Project::Tool& out) { core::Project::Tool t; t.id = o.value(QStringLiteral("id")).toString(); t.displayName = o.value(QStringLiteral("displayName")).toString(); t.visible = o.value(QStringLiteral("visible")).toBool(true); t.parentId = o.value(QStringLiteral("parentId")).toString(); t.parentOffsetWorld = pointFromJson(o.value(QStringLiteral("parentOffsetWorld"))); t.originWorld = pointFromJson(o.value(QStringLiteral("originWorld"))); const QString type = o.value(QStringLiteral("type")).toString(QStringLiteral("bubble")); if (type != QStringLiteral("bubble")) { return false; } t.type = core::Project::Tool::Type::Bubble; t.text = o.value(QStringLiteral("text")).toString(); t.fontPx = std::clamp(o.value(QStringLiteral("fontPx")).toInt(18), 8, 120); const QString align = o.value(QStringLiteral("align")).toString(QStringLiteral("center")); if (align == QStringLiteral("left")) t.align = core::Project::Tool::TextAlign::Left; else if (align == QStringLiteral("right")) t.align = core::Project::Tool::TextAlign::Right; else t.align = core::Project::Tool::TextAlign::Center; if (o.contains(QStringLiteral("pointerT"))) { t.bubblePointerT01 = std::clamp(o.value(QStringLiteral("pointerT")).toDouble(0.5), 0.0, 1.0); } else { const QString ptr = o.value(QStringLiteral("pointer")).toString(QStringLiteral("mid")); if (ptr == QStringLiteral("left")) t.bubblePointerT01 = 0.12; else if (ptr == QStringLiteral("right")) t.bubblePointerT01 = 0.88; else t.bubblePointerT01 = 0.5; } const QJsonArray vis = o.value(QStringLiteral("visibilityKeys")).toArray(); for (const auto& kv : vis) { const QJsonObject ko = kv.toObject(); core::Project::ToolKeyframeBool k; k.frame = ko.value(QStringLiteral("frame")).toInt(0); k.value = ko.value(QStringLiteral("value")).toBool(true); t.visibilityKeys.push_back(k); } const QJsonArray loc = o.value(QStringLiteral("locationKeys")).toArray(); for (const auto& kv : loc) { const QJsonObject ko = kv.toObject(); core::Project::Entity::KeyframeVec2 k; k.frame = ko.value(QStringLiteral("frame")).toInt(0); k.value = QPointF(ko.value(QStringLiteral("x")).toDouble(0.0), ko.value(QStringLiteral("y")).toDouble(0.0)); t.locationKeys.push_back(k); } out = t; return true; } } // namespace core::library