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); +} +