diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
index 3480a6f..a7798fa 100644
--- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
+++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
@@ -110,6 +110,7 @@
+
@@ -221,6 +222,7 @@
+
diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
index 1da6526..dcbccc4 100644
--- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
+++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
@@ -285,6 +285,9 @@
Source Files\Renderer\Preview
+
+ Source Files
+
@@ -576,6 +579,9 @@
Header Files\Renderer\Preview
+
+ Header Files
+
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidget.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidget.cpp
index 629ae62..d612699 100644
--- a/ArchitectureColoredPainting/src/Editor/EditorWidget.cpp
+++ b/ArchitectureColoredPainting/src/Editor/EditorWidget.cpp
@@ -70,11 +70,13 @@ void EditorWidget::initFileMenu()
auto* actionSave = new QAction(QStringLiteral("保存"), fileMenuButton);
auto* actionSaveAs = new QAction(QStringLiteral("另存为"), fileMenuButton);
auto* actionExport = new QAction(QStringLiteral("导出"), fileMenuButton);
+ auto* actionMerge = new QAction(QStringLiteral("合并"), fileMenuButton);
fileMenuButton->addMenuAction(actionCreate);
fileMenuButton->addMenuAction(actionOpen);
fileMenuButton->addMenuAction(actionSave);
fileMenuButton->addMenuAction(actionSaveAs);
fileMenuButton->addMenuAction(actionExport);
+ fileMenuButton->addMenuAction(actionMerge);
connect(actionCreate, &QAction::triggered, [this] {
static int count = 0;
const int prevCount = this->tabWidget->count();
@@ -117,6 +119,27 @@ void EditorWidget::initFileMenu()
item->exportAs();
}
});
+ connect(actionMerge, &QAction::triggered, this, [this] {
+ auto files = QFileDialog::getOpenFileNames(this, QStringLiteral("打开需要合并的项目文件"), "", QStringLiteral("JSON文件(*.json)"));
+ auto target = QFileDialog::getSaveFileName(this, QStringLiteral("保存至"), "", QStringLiteral("JSON文件(*.json)"));
+ auto load = [&](QString path) {
+ QFile file(path);
+ file.open(QFile::ReadOnly);
+ QByteArray setting = file.readAll().trimmed();
+ QJsonParseError jError;
+ QJsonDocument jsonDoc(QJsonDocument::fromJson(setting, &jError));
+ return jsonDoc.object();
+ };
+ QJsonObject result = load(files[0]);
+ for (int i = 1; i < files.size(); i++)
+ {
+ auto obj = load(files[i]);
+ result = MergeUtil::merge(result, obj);
+ }
+ QFile file(target);
+ file.open(QFile::WriteOnly);
+ file.write(QJsonDocument(result).toJson());
+ });
}
void EditorWidget::initProjectMenu()
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidget.h b/ArchitectureColoredPainting/src/Editor/EditorWidget.h
index 677f86b..dee518d 100644
--- a/ArchitectureColoredPainting/src/Editor/EditorWidget.h
+++ b/ArchitectureColoredPainting/src/Editor/EditorWidget.h
@@ -1,6 +1,7 @@
#pragma once
#include
#include "../FluentMenuButton.h"
+#include "util/JsonMerger.h"
#include "ui_EditorWidget.h"
class EditorWidget :
diff --git a/ArchitectureColoredPainting/src/Editor/util/JsonMerger.cpp b/ArchitectureColoredPainting/src/Editor/util/JsonMerger.cpp
new file mode 100644
index 0000000..250c534
--- /dev/null
+++ b/ArchitectureColoredPainting/src/Editor/util/JsonMerger.cpp
@@ -0,0 +1,62 @@
+#include "JsonMerger.h"
+
+namespace MergeUtil {
+ QJsonObject merge(QJsonObject a, QJsonObject b)
+ {
+ QJsonObject result = a;
+ int elementsCount0 = a.find("elements").value().toArray().count();
+ QJsonArray mergedElements = a.find("elements").value().toArray();
+ QJsonArray elements1 = b.find("elements").value().toArray();
+ for (auto v : elements1)
+ mergedElements.append(v);
+ result.insert("elements", mergedElements);
+ QJsonObject mergedLayer;
+ QJsonObject transform;
+ QJsonObject offset;
+ QJsonObject scale;
+ scale.insert("x", 1);
+ scale.insert("y", 1);
+ offset.insert("x", 0);
+ offset.insert("y", 0);
+ transform.insert("offset", offset);
+ transform.insert("scale", scale);
+ transform.insert("rotation", 0);
+ mergedLayer.insert("transform", transform);
+ mergedLayer.insert("referenced-by", QJsonValue());
+ mergedLayer.insert("name", "root");
+ mergedLayer.insert("effects", QJsonArray());
+ mergedLayer.insert("is-folder", true);
+ QJsonObject root0 = a.find("root-layer").value().toObject();
+ QJsonObject root1 = layerFixer(b.find("root-layer").value().toObject(), elementsCount0);
+ QJsonArray children;
+ children.append(root0);
+ children.append(root1);
+ mergedLayer.insert("children", children);
+ result.insert("root-layer", mergedLayer);
+ return result;
+ }
+
+ QJsonObject layerFixer(QJsonObject layer, int elementOffset) {
+ QJsonObject result = layer;
+ if (layer.find("referenced-by") != layer.end() && !layer.find("referenced-by").value().isNull())
+ {
+ result.insert("referenced-by", layer.find("referenced-by").value().toInt() + elementOffset);
+ }
+ else if (layer.find("element") != layer.end())
+ {
+ result.insert("element", layer.find("element").value().toInt() + elementOffset);
+ }
+ if (layer.find("children") != layer.end())
+ {
+ auto children = layer.find("children").value().toArray();
+ QJsonArray newChildren;
+ for (auto child : children)
+ {
+ newChildren.append(layerFixer(child.toObject(), elementOffset));
+ }
+ result.insert("children", newChildren);
+ }
+ return result;
+ };
+
+}
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/util/JsonMerger.h b/ArchitectureColoredPainting/src/Editor/util/JsonMerger.h
new file mode 100644
index 0000000..f00ec01
--- /dev/null
+++ b/ArchitectureColoredPainting/src/Editor/util/JsonMerger.h
@@ -0,0 +1,9 @@
+#pragma once
+#include
+#include
+
+namespace MergeUtil {
+ QJsonObject merge(QJsonObject a, QJsonObject b);
+ QJsonObject layerFixer(QJsonObject layer, int elementOffset);
+}
+