aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVikas Pachdha <vikas.pachdha@qt.io>2021-01-12 19:06:05 +0100
committerVikas Pachdha <vikas.pachdha@qt.io>2021-01-19 12:23:31 +0000
commit55cbe717a9b71fa57b404338dbfbb0f024ca5713 (patch)
tree5b3a0bab2e86e25a84911f461949ff2325bd68c1
parente2c808f576eac08f68af6b37e9108f6c605c36dd (diff)
AssetExport: Export reference assets of components
Task-number: QDS-2868 Change-Id: Ib5d3875e009bde972a30b0a90216bad6ef6e38ea Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp43
-rw-r--r--src/plugins/qmldesigner/assetexporterplugin/assetexporter.h7
-rw-r--r--src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h1
-rw-r--r--src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp34
-rw-r--r--src/plugins/qmldesigner/assetexporterplugin/componentexporter.h2
-rw-r--r--src/plugins/qmldesigner/assetexporterplugin/parsers/assetnodeparser.cpp6
6 files changed, 81 insertions, 12 deletions
diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp
index 856ff32390..74498f185b 100644
--- a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp
+++ b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp
@@ -23,6 +23,7 @@
**
****************************************************************************/
#include "assetexporter.h"
+#include "assetexportpluginconstants.h"
#include "componentexporter.h"
#include "exportnotification.h"
@@ -154,21 +155,47 @@ bool AssetExporter::isBusy() const
m_currentState == AssetExporter::ParsingState::WritingJson;
}
-Utils::FilePath AssetExporter::exportAsset(const QmlObjectNode &node, const Component *component,
- const QString &uuid)
+const QPixmap &AssetExporter::generateAsset(const ModelNode &node)
{
+ static QPixmap nullPixmap;
if (m_cancelled)
+ return nullPixmap;
+
+ const QString uuid = node.auxiliaryData(Constants::UuidAuxTag).toString();
+ QTC_ASSERT(!uuid.isEmpty(), return nullPixmap);
+
+ if (!m_assets.contains(uuid)) {
+ // Generate asset.
+ QmlObjectNode objectNode(node);
+ QPixmap asset = objectNode.toQmlItemNode().instanceRenderPixmap();
+ m_assets[uuid] = asset;
+ }
+ return m_assets[uuid];
+}
+
+Utils::FilePath AssetExporter::assetPath(const ModelNode &node, const Component *component,
+ const QString &suffix) const
+{
+ const QString uuid = node.auxiliaryData(Constants::UuidAuxTag).toString();
+ if (!component || uuid.isEmpty())
return {};
- const Utils::FilePath assetExportDir = m_perComponentExport ? componentExportDir(component) :
- m_exportPath;
- const QString fileName = uuid + ".png";
- const Utils::FilePath assetPath = assetExportDir.pathAppended("assets").pathAppended(fileName);
- if (m_assetDumper)
- m_assetDumper->dumpAsset(node.toQmlItemNode().instanceRenderPixmap(), assetPath);
+
+ const Utils::FilePath assetExportDir =
+ m_perComponentExport ? componentExportDir(component) : m_exportPath;
+ const Utils::FilePath assetPath = assetExportDir.pathAppended("assets")
+ .pathAppended(uuid + suffix + ".png");
return assetPath;
}
+void AssetExporter::exportAsset(const QPixmap &asset, const Utils::FilePath &path)
+{
+ if (m_cancelled || !m_assetDumper)
+ return;
+
+ m_assetDumper->dumpAsset(asset, path);
+}
+
void AssetExporter::exportComponent(const ModelNode &rootNode)
{
qCDebug(loggerInfo) << "Exporting component" << rootNode.id();
diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.h b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.h
index cd5b302e16..55b1432d22 100644
--- a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.h
+++ b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.h
@@ -71,8 +71,10 @@ public:
void cancel();
bool isBusy() const;
- Utils::FilePath exportAsset(const QmlObjectNode& node, const Component *component,
- const QString &uuid);
+ const QPixmap &generateAsset(const ModelNode &node);
+ Utils::FilePath assetPath(const ModelNode &node, const Component *component,
+ const QString &suffix = {}) const;
+ void exportAsset(const QPixmap &asset, const Utils::FilePath &path);
QByteArray generateUuid(const ModelNode &node);
signals:
@@ -108,6 +110,7 @@ private:
bool m_perComponentExport = false;
std::vector<std::unique_ptr<Component>> m_components;
QSet<QByteArray> m_usedHashes;
+ QHash<QString, QPixmap> m_assets;
std::unique_ptr<AssetDumper> m_assetDumper;
bool m_cancelled = false;
};
diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h b/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h
index 5f09b74860..36033a5ea2 100644
--- a/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h
+++ b/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h
@@ -63,6 +63,7 @@ const char ImportsTag[] = "extraImports";
const char UuidTag[] = "uuid";
const char ClipTag[] = "clip";
const char AssetDataTag[] = "assetData";
+const char ReferenceAssetTag[] = "referenceAsset";
const char AssetPathTag[] = "assetPath";
const char AssetBoundsTag[] = "assetBounds";
const char OpacityTag[] = "opacity";
diff --git a/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp b/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp
index a84cfe72c3..d3e2edfc82 100644
--- a/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp
+++ b/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp
@@ -31,6 +31,7 @@
#include "model.h"
#include "nodeabstractproperty.h"
#include "nodemetainfo.h"
+#include "qmlitemnode.h"
#include "rewriterview.h"
#include "utils/qtcassert.h"
@@ -38,6 +39,7 @@
#include <QJsonArray>
#include <QJsonObject>
#include <QLoggingCategory>
+#include <QPainter>
namespace {
Q_LOGGING_CATEGORY(loggerInfo, "qtc.designer.assetExportPlugin.modelExporter", QtInfoMsg)
@@ -86,6 +88,7 @@ void Component::exportComponent()
// Change the export type to component
QJsonObject metadata = m_json.value(MetadataTag).toObject();
metadata.insert(ExportTypeTag, ExportTypeComponent);
+ addReferenceAsset(metadata);
m_json.insert(MetadataTag, metadata);
addImports();
}
@@ -152,6 +155,37 @@ QJsonObject Component::nodeToJson(const ModelNode &node)
return jsonObject;
}
+void Component::addReferenceAsset(QJsonObject &metadataObject) const
+{
+ QPixmap refAsset = m_exporter.generateAsset(m_rootNode);
+ stichChildrendAssets(m_rootNode, refAsset);
+ Utils::FilePath refAssetPath = m_exporter.assetPath(m_rootNode, this, "_ref");
+ m_exporter.exportAsset(refAsset, refAssetPath);
+ QJsonObject assetData;
+ if (metadataObject.contains(AssetDataTag))
+ assetData = metadataObject[AssetDataTag].toObject();
+ assetData.insert(ReferenceAssetTag, refAssetPath.toString());
+ metadataObject.insert(AssetDataTag, assetData);
+}
+
+void Component::stichChildrendAssets(const ModelNode &node, QPixmap &parentPixmap) const
+{
+ if (!node.hasAnySubModelNodes())
+ return;
+
+ QPainter painter(&parentPixmap);
+ for (const ModelNode &child : node.directSubModelNodes()) {
+ QPixmap childPixmap = m_exporter.generateAsset(child);
+ if (childPixmap.isNull())
+ continue;
+ stichChildrendAssets(child, childPixmap);
+ QTransform cTransform = QmlObjectNode(child).toQmlItemNode().instanceTransform();
+ painter.setTransform(cTransform);
+ painter.drawPixmap(QPoint(0, 0), childPixmap);
+ }
+ painter.end();
+}
+
void Component::addImports()
{
QJsonArray importsArray;
diff --git a/src/plugins/qmldesigner/assetexporterplugin/componentexporter.h b/src/plugins/qmldesigner/assetexporterplugin/componentexporter.h
index 3f2fa6ee8a..533586c380 100644
--- a/src/plugins/qmldesigner/assetexporterplugin/componentexporter.h
+++ b/src/plugins/qmldesigner/assetexporterplugin/componentexporter.h
@@ -88,6 +88,8 @@ public:
private:
ModelNodeParser* createNodeParser(const ModelNode &node) const;
QJsonObject nodeToJson(const ModelNode &node);
+ void addReferenceAsset(QJsonObject &metadataObject) const;
+ void stichChildrendAssets(const ModelNode &node, QPixmap &parentPixmap) const;
void addImports();
private:
diff --git a/src/plugins/qmldesigner/assetexporterplugin/parsers/assetnodeparser.cpp b/src/plugins/qmldesigner/assetexporterplugin/parsers/assetnodeparser.cpp
index b498efbd35..7511184815 100644
--- a/src/plugins/qmldesigner/assetexporterplugin/parsers/assetnodeparser.cpp
+++ b/src/plugins/qmldesigner/assetexporterplugin/parsers/assetnodeparser.cpp
@@ -54,10 +54,12 @@ QJsonObject AssetNodeParser::json(Component &component) const
{
QJsonObject jsonObject = ItemNodeParser::json(component);
- Utils::FilePath assetPath = component.exporter().exportAsset(objectNode(), &component, uuid());
+ AssetExporter &exporter = component.exporter();
+ const Utils::FilePath assetPath = exporter.assetPath(m_node, &component);
+ exporter.exportAsset(exporter.generateAsset(m_node), assetPath);
+
QJsonObject assetData;
assetData.insert(AssetPathTag, assetPath.toString());
-
QJsonObject metadata = jsonObject.value(MetadataTag).toObject();
metadata.insert(AssetDataTag, assetData);
jsonObject.insert(MetadataTag, metadata);