新增根据帧数控制可见性
This commit is contained in:
113
client/core/library/ToolJson.cpp
Normal file
113
client/core/library/ToolJson.cpp
Normal file
@@ -0,0 +1,113 @@
|
||||
#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
|
||||
|
||||
Reference in New Issue
Block a user