project: moved color manager outside of node graph
This commit is contained in:
@@ -350,13 +350,6 @@ rational Footage::AdjustTimeByLoopMode(rational time, LoopMode loop_mode, const
|
||||
return time;
|
||||
}
|
||||
|
||||
void Footage::LoadFinishedEvent()
|
||||
{
|
||||
if (!filename().isEmpty()) {
|
||||
Reprobe();
|
||||
}
|
||||
}
|
||||
|
||||
QVariant Footage::data(const DataType &d) const
|
||||
{
|
||||
switch (d) {
|
||||
@@ -472,6 +465,16 @@ void Footage::SaveCustom(QXmlStreamWriter *writer) const
|
||||
writer->writeEndElement(); // viewer
|
||||
}
|
||||
|
||||
void Footage::AddedToGraphEvent(Project *p)
|
||||
{
|
||||
connect(p->color_manager(), &ColorManager::DefaultInputChanged, this, &Footage::DefaultColorSpaceChanged);
|
||||
}
|
||||
|
||||
void Footage::RemovedFromGraphEvent(Project *p)
|
||||
{
|
||||
disconnect(p->color_manager(), &ColorManager::DefaultInputChanged, this, &Footage::DefaultColorSpaceChanged);
|
||||
}
|
||||
|
||||
void Footage::Reprobe()
|
||||
{
|
||||
// Determine if file still exists
|
||||
@@ -596,4 +599,21 @@ void Footage::CheckFootage()
|
||||
}
|
||||
}
|
||||
|
||||
void Footage::DefaultColorSpaceChanged()
|
||||
{
|
||||
bool inv = false;
|
||||
int sz = GetVideoStreamCount();
|
||||
for (int i = 0; i < sz; i++) {
|
||||
// Check if any of our streams are using the default colorspace
|
||||
if (GetVideoParams(i).colorspace().isEmpty()) {
|
||||
inv = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (inv) {
|
||||
InvalidateAll(kVideoParamsInput);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -167,8 +167,6 @@ public:
|
||||
|
||||
static rational AdjustTimeByLoopMode(rational time, LoopMode loop_mode, const rational& length, VideoParams::Type type, const rational &timebase);
|
||||
|
||||
virtual void LoadFinishedEvent() override;
|
||||
|
||||
virtual QVariant data(const DataType &d) const override;
|
||||
|
||||
virtual int GetTotalStreamCount() const override { return total_stream_count_; }
|
||||
@@ -178,6 +176,9 @@ public:
|
||||
|
||||
static const QString kFilenameInput;
|
||||
|
||||
virtual void AddedToGraphEvent(Project *p) override;
|
||||
virtual void RemovedFromGraphEvent(Project *p) override;
|
||||
|
||||
protected:
|
||||
virtual void InputValueChangedEvent(const QString &input, int element) override;
|
||||
|
||||
@@ -209,6 +210,8 @@ private:
|
||||
private slots:
|
||||
void CheckFootage();
|
||||
|
||||
void DefaultColorSpaceChanged();
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -109,13 +109,15 @@ ProjectSerializer::Result ProjectSerializer::Load(Project *project, QXmlStreamRe
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("version")) { // 230220+ projects
|
||||
version = attr.value().toUInt();
|
||||
} else if (reader->name() == QStringLiteral("url")) { // 230220+ projects
|
||||
project->SetSavedURL(attr.value().toString());
|
||||
}
|
||||
}
|
||||
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("version")) { // projects <= 220403
|
||||
version = reader->readElementText().toUInt();
|
||||
} else if (reader->name() == QStringLiteral("url")) {
|
||||
} else if (reader->name() == QStringLiteral("url")) { // projects <= 220403
|
||||
if (project) {
|
||||
project->SetSavedURL(reader->readElementText());
|
||||
} else {
|
||||
@@ -208,7 +210,7 @@ ProjectSerializer::Result ProjectSerializer::Save(QXmlStreamWriter *writer, cons
|
||||
writer->writeAttribute(QStringLiteral("version"), QString::number(serializer->Version()));
|
||||
|
||||
if (!data.GetFilename().isEmpty()) {
|
||||
writer->writeTextElement("url", data.GetFilename());
|
||||
writer->writeAttribute("url", data.GetFilename());
|
||||
}
|
||||
|
||||
serializer->Save(writer, data, nullptr);
|
||||
|
||||
@@ -68,7 +68,8 @@ ProjectSerializer210528::LoadData ProjectSerializer210528::Load(Project *project
|
||||
if (is_root) {
|
||||
node = project->root();
|
||||
} else if (is_cm) {
|
||||
node = project->color_manager();
|
||||
LoadColorManager(reader, project);
|
||||
handled_elsewhere = true;
|
||||
} else if (is_settings) {
|
||||
LoadProjectSettings(reader, project);
|
||||
handled_elsewhere = true;
|
||||
@@ -257,6 +258,87 @@ void ProjectSerializer210528::LoadNode(Node *node, XMLNodeData &xml_node_data, Q
|
||||
node->LoadFinishedEvent();
|
||||
}
|
||||
|
||||
void ProjectSerializer210528::LoadColorManager(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("input")) {
|
||||
QString id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
id = attr.value().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("config") || id == QStringLiteral("default_input") || id == QStringLiteral("reference_space")) {
|
||||
QString value;
|
||||
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("primary")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("standard")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("track")) {
|
||||
value = reader->readElementText();
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("default_input")) {
|
||||
// Default color space
|
||||
// NOTE: Stupidly, we saved these as integers which means we can't add anything to the OCIO
|
||||
// config. So we must convert back to string here.
|
||||
static const QStringList list = {
|
||||
QStringLiteral("Linear"),
|
||||
QStringLiteral("CIE-XYZ D65"),
|
||||
QStringLiteral("Filmic Log Encoding"),
|
||||
QStringLiteral("sRGB OETF"),
|
||||
QStringLiteral("Apple DCI-P3 D65"),
|
||||
QStringLiteral("AppleP3 sRGB OETF"),
|
||||
QStringLiteral("BT.1886 EOTF"),
|
||||
QStringLiteral("AppleP3 Filmic Log Encoding"),
|
||||
QStringLiteral("BT.1886 Filmic Log Encoding"),
|
||||
QStringLiteral("Fuji F-Log OETF"),
|
||||
QStringLiteral("Fuji F-Log F-Gamut"),
|
||||
QStringLiteral("Panasonic V-Log V-Gamut"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 800"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 400"),
|
||||
QStringLiteral("Blackmagic Film Wide Gamut (Gen 5)"),
|
||||
QStringLiteral("Rec.709 OETF"),
|
||||
QStringLiteral("Non-Colour Data")
|
||||
};
|
||||
int num_value = value.toInt();
|
||||
value = list.at(num_value);
|
||||
project->SetDefaultInputColorSpace(value);
|
||||
} else if (id == QStringLiteral("reference_space")) {
|
||||
// Reference space
|
||||
if (value == QStringLiteral("1")) {
|
||||
value = OCIO::ROLE_COMPOSITING_LOG;
|
||||
} else {
|
||||
value = OCIO::ROLE_SCENE_LINEAR;
|
||||
}
|
||||
project->SetColorReferenceSpace(value);
|
||||
} else {
|
||||
// Config filename
|
||||
project->SetColorConfigFilename(value);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectSerializer210528::LoadProjectSettings(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
|
||||
@@ -68,6 +68,8 @@ private:
|
||||
|
||||
void LoadNode(Node *node, XMLNodeData &xml_node_data, QXmlStreamReader *reader) const;
|
||||
|
||||
void LoadColorManager(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadProjectSettings(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadInput(Node *node, QXmlStreamReader* reader, XMLNodeData &xml_node_data) const;
|
||||
|
||||
@@ -68,7 +68,8 @@ ProjectSerializer210907::LoadData ProjectSerializer210907::Load(Project *project
|
||||
if (is_root) {
|
||||
node = project->root();
|
||||
} else if (is_cm) {
|
||||
node = project->color_manager();
|
||||
LoadColorManager(reader, project);
|
||||
handled_elsewhere = true;
|
||||
} else if (is_settings) {
|
||||
LoadProjectSettings(reader, project);
|
||||
handled_elsewhere = true;
|
||||
@@ -254,6 +255,87 @@ void ProjectSerializer210907::LoadNode(Node *node, XMLNodeData &xml_node_data, Q
|
||||
node->LoadFinishedEvent();
|
||||
}
|
||||
|
||||
void ProjectSerializer210907::LoadColorManager(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("input")) {
|
||||
QString id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
id = attr.value().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("config") || id == QStringLiteral("default_input") || id == QStringLiteral("reference_space")) {
|
||||
QString value;
|
||||
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("primary")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("standard")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("track")) {
|
||||
value = reader->readElementText();
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("default_input")) {
|
||||
// Default color space
|
||||
// NOTE: Stupidly, we saved these as integers which means we can't add anything to the OCIO
|
||||
// config. So we must convert back to string here.
|
||||
static const QStringList list = {
|
||||
QStringLiteral("Linear"),
|
||||
QStringLiteral("CIE-XYZ D65"),
|
||||
QStringLiteral("Filmic Log Encoding"),
|
||||
QStringLiteral("sRGB OETF"),
|
||||
QStringLiteral("Apple DCI-P3 D65"),
|
||||
QStringLiteral("AppleP3 sRGB OETF"),
|
||||
QStringLiteral("BT.1886 EOTF"),
|
||||
QStringLiteral("AppleP3 Filmic Log Encoding"),
|
||||
QStringLiteral("BT.1886 Filmic Log Encoding"),
|
||||
QStringLiteral("Fuji F-Log OETF"),
|
||||
QStringLiteral("Fuji F-Log F-Gamut"),
|
||||
QStringLiteral("Panasonic V-Log V-Gamut"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 800"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 400"),
|
||||
QStringLiteral("Blackmagic Film Wide Gamut (Gen 5)"),
|
||||
QStringLiteral("Rec.709 OETF"),
|
||||
QStringLiteral("Non-Colour Data")
|
||||
};
|
||||
int num_value = value.toInt();
|
||||
value = list.at(num_value);
|
||||
project->SetDefaultInputColorSpace(value);
|
||||
} else if (id == QStringLiteral("reference_space")) {
|
||||
// Reference space
|
||||
if (value == QStringLiteral("1")) {
|
||||
value = OCIO::ROLE_COMPOSITING_LOG;
|
||||
} else {
|
||||
value = OCIO::ROLE_SCENE_LINEAR;
|
||||
}
|
||||
project->SetColorReferenceSpace(value);
|
||||
} else {
|
||||
// Config filename
|
||||
project->SetColorConfigFilename(value);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectSerializer210907::LoadProjectSettings(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
|
||||
@@ -67,6 +67,8 @@ private:
|
||||
|
||||
void LoadNode(Node *node, XMLNodeData &xml_node_data, QXmlStreamReader *reader) const;
|
||||
|
||||
void LoadColorManager(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadProjectSettings(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadInput(Node *node, QXmlStreamReader* reader, XMLNodeData &xml_node_data) const;
|
||||
|
||||
@@ -70,7 +70,8 @@ ProjectSerializer211228::LoadData ProjectSerializer211228::Load(Project *project
|
||||
if (is_root) {
|
||||
node = project->root();
|
||||
} else if (is_cm) {
|
||||
node = project->color_manager();
|
||||
LoadColorManager(reader, project);
|
||||
handled_elsewhere = true;
|
||||
} else if (is_settings) {
|
||||
LoadProjectSettings(reader, project);
|
||||
handled_elsewhere = true;
|
||||
@@ -304,6 +305,87 @@ void ProjectSerializer211228::LoadNode(Node *node, XMLNodeData &xml_node_data, Q
|
||||
node->LoadFinishedEvent();
|
||||
}
|
||||
|
||||
void ProjectSerializer211228::LoadColorManager(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("input")) {
|
||||
QString id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
id = attr.value().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("config") || id == QStringLiteral("default_input") || id == QStringLiteral("reference_space")) {
|
||||
QString value;
|
||||
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("primary")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("standard")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("track")) {
|
||||
value = reader->readElementText();
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("default_input")) {
|
||||
// Default color space
|
||||
// NOTE: Stupidly, we saved these as integers which means we can't add anything to the OCIO
|
||||
// config. So we must convert back to string here.
|
||||
static const QStringList list = {
|
||||
QStringLiteral("Linear"),
|
||||
QStringLiteral("CIE-XYZ D65"),
|
||||
QStringLiteral("Filmic Log Encoding"),
|
||||
QStringLiteral("sRGB OETF"),
|
||||
QStringLiteral("Apple DCI-P3 D65"),
|
||||
QStringLiteral("AppleP3 sRGB OETF"),
|
||||
QStringLiteral("BT.1886 EOTF"),
|
||||
QStringLiteral("AppleP3 Filmic Log Encoding"),
|
||||
QStringLiteral("BT.1886 Filmic Log Encoding"),
|
||||
QStringLiteral("Fuji F-Log OETF"),
|
||||
QStringLiteral("Fuji F-Log F-Gamut"),
|
||||
QStringLiteral("Panasonic V-Log V-Gamut"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 800"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 400"),
|
||||
QStringLiteral("Blackmagic Film Wide Gamut (Gen 5)"),
|
||||
QStringLiteral("Rec.709 OETF"),
|
||||
QStringLiteral("Non-Colour Data")
|
||||
};
|
||||
int num_value = value.toInt();
|
||||
value = list.at(num_value);
|
||||
project->SetDefaultInputColorSpace(value);
|
||||
} else if (id == QStringLiteral("reference_space")) {
|
||||
// Reference space
|
||||
if (value == QStringLiteral("1")) {
|
||||
value = OCIO::ROLE_COMPOSITING_LOG;
|
||||
} else {
|
||||
value = OCIO::ROLE_SCENE_LINEAR;
|
||||
}
|
||||
project->SetColorReferenceSpace(value);
|
||||
} else {
|
||||
// Config filename
|
||||
project->SetColorConfigFilename(value);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectSerializer211228::LoadProjectSettings(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
|
||||
@@ -68,6 +68,8 @@ private:
|
||||
|
||||
void LoadNode(Node *node, XMLNodeData &xml_node_data, QXmlStreamReader *reader) const;
|
||||
|
||||
void LoadColorManager(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadProjectSettings(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadInput(Node *node, QXmlStreamReader* reader, XMLNodeData &xml_node_data) const;
|
||||
|
||||
@@ -89,7 +89,8 @@ ProjectSerializer220403::LoadData ProjectSerializer220403::Load(Project *project
|
||||
if (is_root) {
|
||||
node = project->root();
|
||||
} else if (is_cm) {
|
||||
node = project->color_manager();
|
||||
LoadColorManager(reader, project);
|
||||
handled_elsewhere = true;
|
||||
} else if (is_settings) {
|
||||
LoadProjectSettings(reader, project);
|
||||
handled_elsewhere = true;
|
||||
@@ -452,6 +453,86 @@ void ProjectSerializer220403::LoadNode(Node *node, XMLNodeData &xml_node_data, Q
|
||||
node->LoadFinishedEvent();
|
||||
}
|
||||
|
||||
void ProjectSerializer220403::LoadColorManager(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("input")) {
|
||||
QString id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
id = attr.value().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("config") || id == QStringLiteral("default_input") || id == QStringLiteral("reference_space")) {
|
||||
QString value;
|
||||
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("primary")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("standard")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("track")) {
|
||||
value = reader->readElementText();
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
|
||||
if (id == QStringLiteral("default_input")) {
|
||||
// Default color space
|
||||
// NOTE: Stupidly, we saved these as integers which means we can't add anything to the OCIO
|
||||
// config. So we must convert back to string here.
|
||||
static const QStringList list = {
|
||||
QStringLiteral("Linear"),
|
||||
QStringLiteral("Filmic Log Encoding"),
|
||||
QStringLiteral("sRGB OETF"),
|
||||
QStringLiteral("Apple DCI-P3 D65"),
|
||||
QStringLiteral("AppleP3 sRGB OETF"),
|
||||
QStringLiteral("BT.1886 EOTF"),
|
||||
QStringLiteral("AppleP3 Filmic Log Encoding"),
|
||||
QStringLiteral("BT.1886 Filmic Log Encoding"),
|
||||
QStringLiteral("Fuji F-Log OETF"),
|
||||
QStringLiteral("Fuji F-Log F-Gamut"),
|
||||
QStringLiteral("Panasonic V-Log V-Gamut"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 800"),
|
||||
QStringLiteral("Arri Wide Gamut / LogC EI 400"),
|
||||
QStringLiteral("Blackmagic Film Wide Gamut (Gen 5)"),
|
||||
QStringLiteral("Rec.709 OETF"),
|
||||
QStringLiteral("Non-Colour Data")
|
||||
};
|
||||
int num_value = value.toInt();
|
||||
value = list.at(num_value);
|
||||
project->SetDefaultInputColorSpace(value);
|
||||
} else if (id == QStringLiteral("reference_space")) {
|
||||
// Reference space
|
||||
if (value == QStringLiteral("1")) {
|
||||
value = OCIO::ROLE_COMPOSITING_LOG;
|
||||
} else {
|
||||
value = OCIO::ROLE_SCENE_LINEAR;
|
||||
}
|
||||
project->SetColorReferenceSpace(value);
|
||||
} else {
|
||||
// Config filename
|
||||
project->SetColorConfigFilename(value);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectSerializer220403::LoadProjectSettings(QXmlStreamReader *reader, Project *project) const
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
|
||||
@@ -74,6 +74,8 @@ private:
|
||||
|
||||
void LoadNode(Node *node, XMLNodeData &xml_node_data, QXmlStreamReader *reader) const;
|
||||
|
||||
void LoadColorManager(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadProjectSettings(QXmlStreamReader* reader, Project *project) const;
|
||||
|
||||
void LoadInput(Node *node, QXmlStreamReader* reader, XMLNodeData &xml_node_data) const;
|
||||
|
||||
@@ -37,196 +37,211 @@ ProjectSerializer230220::LoadData ProjectSerializer230220::Load(Project *project
|
||||
switch (load_type) {
|
||||
case kProject:
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("project")) {
|
||||
project_data = project->Load(reader);
|
||||
} else if (reader->name() == QStringLiteral("layout")) {
|
||||
load_data.layout = MainWindowLayoutInfo::fromXml(reader, project_data.node_ptrs);
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
if (reader->name() == QStringLiteral("project")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("project")) {
|
||||
project_data = project->Load(reader);
|
||||
} else if (reader->name() == QStringLiteral("layout")) {
|
||||
load_data.layout = MainWindowLayoutInfo::fromXml(reader, project_data.node_ptrs);
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PostConnect(project->nodes(), &project_data);
|
||||
PostConnect(project->nodes(), &project_data);
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kOnlyMarkers:
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("marker")) {
|
||||
TimelineMarker *marker = new TimelineMarker();
|
||||
marker->load(reader);
|
||||
load_data.markers.push_back(marker);
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
if (reader->name() == QStringLiteral("markers")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("marker")) {
|
||||
TimelineMarker *marker = new TimelineMarker();
|
||||
marker->load(reader);
|
||||
load_data.markers.push_back(marker);
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kOnlyKeyframes:
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("node")) {
|
||||
QString node_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
node_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Node *n = nullptr;
|
||||
if (!node_id.isEmpty()) {
|
||||
n = NodeFactory::CreateFromID(node_id);
|
||||
}
|
||||
|
||||
if (!n) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("input")) {
|
||||
QString input_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
input_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (input_id.isEmpty()) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("element")) {
|
||||
QString element_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
element_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (element_id.isEmpty()) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("track")) {
|
||||
QString track_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
track_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (track_id.isEmpty()) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("key")) {
|
||||
NodeKeyframe *key = new NodeKeyframe();
|
||||
key->set_input(input_id);
|
||||
key->set_element(element_id.toInt());
|
||||
key->set_track(track_id.toInt());
|
||||
|
||||
key->load(reader, n->GetInputDataType(input_id));
|
||||
|
||||
load_data.keyframes[node_id].append(key);
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
if (reader->name() == QStringLiteral("keyframes")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("node")) {
|
||||
QString node_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
node_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete n;
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
Node *n = nullptr;
|
||||
if (!node_id.isEmpty()) {
|
||||
n = NodeFactory::CreateFromID(node_id);
|
||||
}
|
||||
|
||||
if (!n) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("input")) {
|
||||
QString input_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
input_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (input_id.isEmpty()) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("element")) {
|
||||
QString element_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
element_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (element_id.isEmpty()) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("track")) {
|
||||
QString track_id;
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
track_id = attr.value().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (track_id.isEmpty()) {
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("key")) {
|
||||
NodeKeyframe *key = new NodeKeyframe();
|
||||
key->set_input(input_id);
|
||||
key->set_element(element_id.toInt());
|
||||
key->set_track(track_id.toInt());
|
||||
|
||||
key->load(reader, n->GetInputDataType(input_id));
|
||||
|
||||
load_data.keyframes[node_id].append(key);
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete n;
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kOnlyNodes:
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("node")) {
|
||||
QString id;
|
||||
if (reader->name() == QStringLiteral("nodes")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("node")) {
|
||||
QString id;
|
||||
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
id = attr.value().toString();
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("id")) {
|
||||
id = attr.value().toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (id.isEmpty()) {
|
||||
qWarning() << "Failed to load node with empty ID";
|
||||
reader->skipCurrentElement();
|
||||
if (id.isEmpty()) {
|
||||
qWarning() << "Failed to load node with empty ID";
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
Node* node = NodeFactory::CreateFromID(id);
|
||||
if (!node) {
|
||||
qWarning() << "Failed to find node with ID" << id;
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
// Disable cache while node is being loaded (we'll re-enable it later)
|
||||
node->SetCachesEnabled(false);
|
||||
node->Load(reader, &project_data);
|
||||
load_data.nodes.append(node);
|
||||
}
|
||||
}
|
||||
} else if (reader->name() == QStringLiteral("properties")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("node")) {
|
||||
quintptr ptr = 0;
|
||||
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("ptr")) {
|
||||
ptr = attr.value().toULongLong();
|
||||
|
||||
// Only attribute we're looking for right now
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ptr) {
|
||||
QMap<QString, QString> properties_for_node;
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
properties_for_node.insert(reader->name().toString(), reader->readElementText());
|
||||
}
|
||||
properties.insert(ptr, properties_for_node);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Node* node = NodeFactory::CreateFromID(id);
|
||||
if (!node) {
|
||||
qWarning() << "Failed to find node with ID" << id;
|
||||
reader->skipCurrentElement();
|
||||
} else {
|
||||
// Disable cache while node is being loaded (we'll re-enable it later)
|
||||
node->SetCachesEnabled(false);
|
||||
node->Load(reader, &project_data);
|
||||
load_data.nodes.append(node);
|
||||
}
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
} else if (reader->name() == QStringLiteral("properties")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("node")) {
|
||||
quintptr ptr = 0;
|
||||
}
|
||||
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("ptr")) {
|
||||
ptr = attr.value().toULongLong();
|
||||
PostConnect(load_data.nodes, &project_data);
|
||||
|
||||
// Only attribute we're looking for right now
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ptr) {
|
||||
QMap<QString, QString> properties_for_node;
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
properties_for_node.insert(reader->name().toString(), reader->readElementText());
|
||||
}
|
||||
properties.insert(ptr, properties_for_node);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
// Resolve serialized properties (if any)
|
||||
for (auto it=properties.cbegin(); it!=properties.cend(); it++) {
|
||||
Node *node = project_data.node_ptrs.value(it.key());
|
||||
if (node) {
|
||||
load_data.properties.insert(node, it.value());
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
|
||||
PostConnect(load_data.nodes, &project_data);
|
||||
|
||||
// Resolve serialized properties (if any)
|
||||
for (auto it=properties.cbegin(); it!=properties.cend(); it++) {
|
||||
Node *node = project_data.node_ptrs.value(it.key());
|
||||
if (node) {
|
||||
load_data.properties.insert(node, it.value());
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -332,13 +347,17 @@ void ProjectSerializer230220::Save(QXmlStreamWriter *writer, const SaveData &dat
|
||||
|
||||
writer->writeEndElement(); // nodes
|
||||
} else if (Project *project = data.GetProject()) {
|
||||
writer->writeStartElement(QStringLiteral("project"));
|
||||
|
||||
writer->writeStartElement(QStringLiteral("project"));
|
||||
project->Save(writer);
|
||||
writer->writeEndElement();
|
||||
writer->writeEndElement(); // project
|
||||
|
||||
writer->writeStartElement(QStringLiteral("layout"));
|
||||
data.GetLayout().toXml(writer);
|
||||
writer->writeEndElement();
|
||||
writer->writeEndElement(); // layout
|
||||
|
||||
writer->writeEndElement(); // project
|
||||
} else {
|
||||
qCritical() << "ProjectSerializer provided nothing to save";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user