114 lines
4.4 KiB
C++
114 lines
4.4 KiB
C++
#include "library/ToolJson.h"
|
|
|
|
#include <QJsonArray>
|
|
|
|
#include <algorithm>
|
|
|
|
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
|
|
|