diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index ea8bb99f1a1..9477212bb7d 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -90,6 +90,7 @@ const char fitSelectionToScreenCommandId[] = "FitSelectionToScreen"; const char editAnnotationCommandId[] = "EditAnnotation"; const char openSignalDialogCommandId[] = "OpenSignalDialog"; +const char update3DAssetCommandId[] = "Update3DAsset"; const char selectionCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Selection"); const char flowConnectionCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Connect"); @@ -131,6 +132,7 @@ const char moveToComponentDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextM const char editAnnotationDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Edit Annotation"); const char openSignalDialogDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Open Signal Dialog"); +const char update3DAssetDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Update 3D Asset"); const char setIdDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Set Id"); diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 02596eaf1f0..cccc108bbb5 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -1412,6 +1412,17 @@ void DesignerActionManager::createDefaultDesignerActions() 66, &openSignalDialog, &singleSelectionAndHasSlotTrigger)); + + addDesignerAction(new ModelNodeContextMenuAction( + update3DAssetCommandId, + update3DAssetDisplayName, + {}, + rootCategory, + QKeySequence(), + priorityGenericToolBar, + &updateImported3DAsset, + &selectionIsImported3DAsset, + &selectionIsImported3DAsset)); } void DesignerActionManager::createDefaultAddResourceHandler() diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp index 195ce608d4c..b7a68890b82 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp @@ -31,6 +31,7 @@ #include #include #include +#include namespace QmlDesigner { @@ -99,6 +100,21 @@ bool selectionIsComponent(const SelectionContext &selectionState) && selectionState.currentSingleSelectedNode().isComponent(); } +bool selectionIsImported3DAsset(const SelectionContext &selectionState) +{ + ModelNode node = selectionState.currentSingleSelectedNode(); + if (selectionState.view() && node.isValid() && node.hasMetaInfo()) { + QString fileName = node.metaInfo().componentFileName(); // absolute path + if (fileName.isEmpty()) { + // Node is not a file component, so we have to check if the current doc itself is + fileName = node.model()->fileUrl().toLocalFile(); + } + if (fileName.contains(Constants::QUICK_3D_ASSETS_FOLDER)) + return true; + } + return false; +} + } //SelectionStateFunctors } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h index 37696245849..dc36da3dc6e 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h @@ -109,6 +109,7 @@ bool selectionHasSameParent(const SelectionContext &selectionState); bool selectionIsComponent(const SelectionContext &selectionState); bool singleSelectionItemIsAnchored(const SelectionContext &selectionState); bool singleSelectionItemIsNotAnchored(const SelectionContext &selectionState); +bool selectionIsImported3DAsset(const SelectionContext &selectionState); } // namespace SelectionStateFunctors diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index c13080c8f1f..ebcae41091e 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -1581,6 +1581,15 @@ void openSignalDialog(const SelectionContext &selectionContext) SignalList::showWidget(selectionContext.currentSingleSelectedNode()); } +void updateImported3DAsset(const SelectionContext &selectionContext) +{ + if (selectionContext.view()) { + selectionContext.view()->emitCustomNotification( + "UpdateImported3DAsset", {selectionContext.currentSingleSelectedNode()}); + + } +} + } // namespace ModelNodeOperations } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 575e62f010a..0e302a3c65a 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -89,6 +89,7 @@ void removeGroup(const SelectionContext &selectionContext); void editAnnotation(const SelectionContext &selectionContext); void openSignalDialog(const SelectionContext &selectionContext); +void updateImported3DAsset(const SelectionContext &selectionContext); // ModelNodePreviewImageOperations QVariant previewImageDataForGenericNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp index 0b0c7fef103..1192fb0fef0 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp @@ -28,26 +28,33 @@ #include "qmldesignerplugin.h" #include "qmldesignerconstants.h" #include "model.h" +#include "nodemetainfo.h" +#include "variantproperty.h" #include "utils/outputformatter.h" #include "theme.h" #include #include +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace QmlDesigner { @@ -70,14 +77,15 @@ static const int rowHeight = 26; } -ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog(const QStringList &importFiles, - const QString &defaulTargetDirectory, - const QVariantMap &supportedExts, - const QVariantMap &supportedOpts, - QWidget *parent) : - QDialog(parent) +ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog( + const QStringList &importFiles, const QString &defaulTargetDirectory, + const QVariantMap &supportedExts, const QVariantMap &supportedOpts, + const QJsonObject &defaultOpts, const QSet &preselectedFilesForOverwrite, + QWidget *parent) + : QDialog(parent) , ui(new Ui::ItemLibraryAssetImportDialog) , m_importer(this) + , m_preselectedFilesForOverwrite(preselectedFilesForOverwrite) { setModal(true); ui->setupUi(this); @@ -172,6 +180,16 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog(const QStringList &im while (optIt != supportedOpts.constEnd()) { QJsonObject options = QJsonObject::fromVariantMap(qvariant_cast(optIt.value())); m_importOptions << options.value("options").toObject(); + auto it = defaultOpts.constBegin(); + while (it != defaultOpts.constEnd()) { + if (m_importOptions.last().contains(it.key())) { + QJsonObject optObj = m_importOptions.last()[it.key()].toObject(); + QJsonValue value(it.value()["value"]); + optObj.insert("value", value); + m_importOptions.last().insert(it.key(), optObj); + } + ++it; + } groups << options.value("groups").toObject(); const auto &exts = optIt.key().split(':'); for (const auto &ext : exts) @@ -252,6 +270,125 @@ ItemLibraryAssetImportDialog::~ItemLibraryAssetImportDialog() delete ui; } +void ItemLibraryAssetImportDialog::updateImport(const ModelNode &updateNode, + const QVariantMap &supportedExts, + const QVariantMap &supportedOpts) +{ + QString errorMsg; + const ModelNode &node = updateNode; + if (node.isValid() && node.hasMetaInfo()) { + QString compFileName = node.metaInfo().componentFileName(); // absolute path + bool preselectNodeSource = false; + if (compFileName.isEmpty()) { + // Node is not a file component, so we have to check if the current doc itself is + compFileName = node.model()->fileUrl().toLocalFile(); + preselectNodeSource = true; + } + QFileInfo compFileInfo{compFileName}; + + // Find to top asset folder + const QString assetFolder = QLatin1String(Constants::QUICK_3D_ASSETS_FOLDER).mid(1); + const QStringList parts = compFileName.split('/'); + int i = parts.size() - 1; + int previousSize = 0; + for (; i >= 0; --i) { + if (parts[i] == assetFolder) + break; + previousSize = parts[i].size(); + } + if (i >= 0) { + const QString assetPath = compFileName.left(compFileName.lastIndexOf(assetFolder) + + assetFolder.size() + previousSize + 1); + const QDir assetDir(assetPath); + + // Find import options and the original source scene + const QString jsonFileName = assetDir.absoluteFilePath( + Constants::QUICK_3D_ASSET_IMPORT_DATA_NAME); + QFile jsonFile{jsonFileName}; + if (jsonFile.open(QIODevice::ReadOnly)) { + QJsonParseError jsonError; + const QByteArray fileData = jsonFile.readAll(); + auto jsonDocument = QJsonDocument::fromJson(fileData, &jsonError); + jsonFile.close(); + if (jsonError.error == QJsonParseError::NoError) { + QJsonObject jsonObj = jsonDocument.object(); + const QJsonObject options = jsonObj.value( + Constants::QUICK_3D_ASSET_IMPORT_DATA_OPTIONS_KEY).toObject(); + QString sourcePath = jsonObj.value( + Constants::QUICK_3D_ASSET_IMPORT_DATA_SOURCE_KEY).toString(); + if (options.isEmpty() || sourcePath.isEmpty()) { + errorMsg = QCoreApplication::translate( + "ModelNodeOperations", + "Asset import data file '%1' is invalid.").arg(jsonFileName); + } else { + QFileInfo sourceInfo{sourcePath}; + if (!sourceInfo.exists()) { + // Unable to find original scene source, launch file dialog to locate it + QString initialPath; + ProjectExplorer::Project *currentProject + = ProjectExplorer::SessionManager::projectForFile( + Utils::FilePath::fromString(compFileName)); + if (currentProject) + initialPath = currentProject->projectDirectory().toString(); + else + initialPath = compFileInfo.absolutePath(); + QStringList selectedFiles = QFileDialog::getOpenFileNames( + Core::ICore::dialogParent(), + tr("Locate 3D Asset '%1'").arg(sourceInfo.fileName()), + initialPath, sourceInfo.fileName()); + if (!selectedFiles.isEmpty() + && QFileInfo{selectedFiles[0]}.fileName() == sourceInfo.fileName()) { + sourcePath = selectedFiles[0]; + sourceInfo.setFile(sourcePath); + } + } + if (sourceInfo.exists()) { + // In case of a selected node inside an imported component, preselect + // any file pointed to by a "source" property of the node. + QSet preselectedFiles; + if (preselectNodeSource && updateNode.hasProperty("source")) { + QString source = updateNode.variantProperty("source").value().toString(); + if (QFileInfo{source}.isRelative()) + source = QDir{compFileInfo.absolutePath()}.absoluteFilePath(source); + preselectedFiles.insert(source); + } + auto importDlg = new ItemLibraryAssetImportDialog( + {sourceInfo.absoluteFilePath()}, + node.model()->fileUrl().toLocalFile(), + supportedExts, supportedOpts, options, + preselectedFiles, Core::ICore::mainWindow()); + importDlg->show(); + + } else { + errorMsg = QCoreApplication::translate( + "ModelNodeOperations", "Unable to locate source scene '%1'.") + .arg(sourceInfo.fileName()); + } + } + } else { + errorMsg = jsonError.errorString(); + } + } else { + errorMsg = QCoreApplication::translate("ModelNodeOperations", + "Opening asset import data file '%1' failed.") + .arg(jsonFileName); + } + } else { + errorMsg = QCoreApplication::translate("ModelNodeOperations", + "Unable to resolve asset import path."); + } + } + + if (!errorMsg.isEmpty()) { + QMessageBox::warning( + qobject_cast(Core::ICore::dialogParent()), + QCoreApplication::translate("ModelNodeOperations", "Import Update Failed"), + QCoreApplication::translate("ModelNodeOperations", + "Failed to update import.\nError:\n%1").arg(errorMsg), + QMessageBox::Close); + } +} + void ItemLibraryAssetImportDialog::createTab(const QString &tabLabel, int optionsIndex, const QJsonObject &groups) { @@ -610,7 +747,8 @@ void ItemLibraryAssetImportDialog::onImport() if (!m_quick3DFiles.isEmpty()) { m_importer.importQuick3D(m_quick3DFiles, m_quick3DImportPath, - m_importOptions, m_extToImportOptionsMap); + m_importOptions, m_extToImportOptionsMap, + m_preselectedFilesForOverwrite); } } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.h index 3d4069986ec..ded5d75703a 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.h @@ -25,9 +25,11 @@ #pragma once #include "itemlibraryassetimporter.h" +#include "modelnode.h" -#include -#include +#include +#include +#include namespace Utils { class OutputFormatter; @@ -49,9 +51,15 @@ public: const QString &defaulTargetDirectory, const QVariantMap &supportedExts, const QVariantMap &supportedOpts, + const QJsonObject &defaultOpts, + const QSet &preselectedFilesForOverwrite, QWidget *parent = nullptr); ~ItemLibraryAssetImportDialog(); + static void updateImport(const ModelNode &updateNode, + const QVariantMap &supportedExts, + const QVariantMap &supportedOpts); + protected: void resizeEvent(QResizeEvent *event) override; @@ -82,5 +90,6 @@ private: QHash m_extToImportOptionsMap; int m_optionsHeight = 0; int m_optionsRows = 0; + QSet m_preselectedFilesForOverwrite; }; } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index 69924f20080..220dff8508a 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include namespace @@ -64,7 +65,8 @@ ItemLibraryAssetImporter::~ItemLibraryAssetImporter() { void ItemLibraryAssetImporter::importQuick3D(const QStringList &inputFiles, const QString &importPath, const QVector &options, - const QHash &extToImportOptionsMap) + const QHash &extToImportOptionsMap, + const QSet &preselectedFilesForOverwrite) { if (m_isImporting) cancelImport(); @@ -79,7 +81,7 @@ void ItemLibraryAssetImporter::importQuick3D(const QStringList &inputFiles, m_importPath = importPath; - parseFiles(inputFiles, options, extToImportOptionsMap); + parseFiles(inputFiles, options, extToImportOptionsMap, preselectedFilesForOverwrite); if (!isCancelled()) { const auto parseData = m_parseData; @@ -203,7 +205,8 @@ void ItemLibraryAssetImporter::reset() void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths, const QVector &options, - const QHash &extToImportOptionsMap) + const QHash &extToImportOptionsMap, + const QSet &preselectedFilesForOverwrite) { if (isCancelled()) return; @@ -219,7 +222,7 @@ void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths, int index = extToImportOptionsMap.value(QFileInfo(file).suffix()); ParseData pd; pd.options = options[index]; - if (preParseQuick3DAsset(file, pd)) { + if (preParseQuick3DAsset(file, pd, preselectedFilesForOverwrite)) { pd.importId = ++m_importIdCounter; m_parseData.insert(pd.importId, pd); } @@ -227,7 +230,8 @@ void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths, } } -bool ItemLibraryAssetImporter::preParseQuick3DAsset(const QString &file, ParseData &pd) +bool ItemLibraryAssetImporter::preParseQuick3DAsset(const QString &file, ParseData &pd, + const QSet &preselectedFilesForOverwrite) { pd.targetDir = QDir(m_importPath); pd.outDir = QDir(m_tempDir->path()); @@ -264,7 +268,9 @@ bool ItemLibraryAssetImporter::preParseQuick3DAsset(const QString &file, ParseDa pd.assetName = assetDirs[0]; pd.targetDirPath = pd.targetDir.filePath(pd.assetName); } - OverwriteResult result = confirmAssetOverwrite(pd.assetName); + OverwriteResult result = preselectedFilesForOverwrite.isEmpty() + ? confirmAssetOverwrite(pd.assetName) + : OverwriteResult::Update; if (result == OverwriteResult::Skip) { addWarning(tr("Skipped import of existing asset: \"%1\"").arg(pd.assetName)); return false; @@ -282,8 +288,11 @@ bool ItemLibraryAssetImporter::preParseQuick3DAsset(const QString &file, ParseDa alwaysOverwrite.insert(iconIt.fileInfo().absoluteFilePath()); } alwaysOverwrite.insert(sourceSceneTargetFilePath(pd)); + alwaysOverwrite.insert(pd.targetDirPath + '/' + Constants::QUICK_3D_ASSET_IMPORT_DATA_NAME); - Internal::AssetImportUpdateDialog dlg {pd.targetDirPath, {}, alwaysOverwrite, + Internal::AssetImportUpdateDialog dlg {pd.targetDirPath, + preselectedFilesForOverwrite, + alwaysOverwrite, qobject_cast(parent())}; int exitVal = dlg.exec(); @@ -421,6 +430,18 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd) } } + // Generate import metadata file + const QString sourcePath = pd.sourceInfo.absoluteFilePath(); + QString importDataFileName = outDir.absoluteFilePath(Constants::QUICK_3D_ASSET_IMPORT_DATA_NAME); + QSaveFile importDataFile(importDataFileName); + if (importDataFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + QJsonObject optObj; + optObj.insert(Constants::QUICK_3D_ASSET_IMPORT_DATA_OPTIONS_KEY, pd.options); + optObj.insert(Constants::QUICK_3D_ASSET_IMPORT_DATA_SOURCE_KEY, sourcePath); + importDataFile.write(QJsonDocument{optObj}.toJson()); + importDataFile.commit(); + } + // Gather all generated files QDirIterator dirIt(outDir.path(), QDir::Files, QDirIterator::Subdirectories); while (dirIt.hasNext()) { @@ -429,7 +450,7 @@ void ItemLibraryAssetImporter::postParseQuick3DAsset(const ParseData &pd) } // Copy the original asset into a subdirectory - assetFiles.insert(pd.sourceInfo.absoluteFilePath(), sourceSceneTargetFilePath(pd)); + assetFiles.insert(sourcePath, sourceSceneTargetFilePath(pd)); m_importFiles.insert(assetFiles); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h index 56bd8ec8f29..9abc315fbe0 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h @@ -54,7 +54,8 @@ public: void importQuick3D(const QStringList &inputFiles, const QString &importPath, const QVector &options, - const QHash &extToImportOptionsMap); + const QHash &extToImportOptionsMap, + const QSet &preselectedFilesForOverwrite); bool isImporting() const; void cancelImport(); @@ -91,8 +92,10 @@ private: void notifyFinished(); void reset(); void parseFiles(const QStringList &filePaths, const QVector &options, - const QHash &extToImportOptionsMap); - bool preParseQuick3DAsset(const QString &file, ParseData &pd); + const QHash &extToImportOptionsMap, + const QSet &preselectedFilesForOverwrite); + bool preParseQuick3DAsset(const QString &file, ParseData &pd, + const QSet &preselectedFilesForOverwrite); void postParseQuick3DAsset(const ParseData &pd); void copyImportedFiles(); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index dde17dbad32..151e6c5a596 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -48,6 +48,7 @@ #include #include #include +#include namespace QmlDesigner { @@ -240,7 +241,7 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) auto handle3DModel = [this](const QStringList &fileNames, const QString &defaultDir) -> bool { auto importDlg = new ItemLibraryAssetImportDialog(fileNames, defaultDir, m_importableExtensions3DMap, - m_importOptions3DMap, + m_importOptions3DMap, {}, {}, Core::ICore::mainWindow()); importDlg->show(); return true; @@ -263,4 +264,15 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) m_importOptions3DMap = qvariant_cast(supportMap.value("options")); } +void ItemLibraryView::customNotification(const AbstractView *view, const QString &identifier, + const QList &nodeList, const QList &data) +{ + if (identifier == "UpdateImported3DAsset" && nodeList.size() > 0) { + ItemLibraryAssetImportDialog::updateImport(nodeList[0], m_importableExtensions3DMap, + m_importOptions3DMap); + } else { + AbstractView::customNotification(view, identifier, nodeList, data); + } +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h index 5668b8fbc61..c9d7841bbd7 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h @@ -55,6 +55,8 @@ public: void usedImportsChanged(const QList &usedImports) override; void documentMessagesChanged(const QList &errors, const QList &warnings) override; void updateImport3DSupport(const QVariantMap &supportMap) override; + void customNotification(const AbstractView *view, const QString &identifier, + const QList &nodeList, const QList &data) override; void setResourcePath(const QString &resourcePath); diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 84985b991f7..937cfc8005f 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -69,6 +69,9 @@ const char QML_DESIGNER_SUBFOLDER[] = "/designer/"; const char QUICK_3D_ASSETS_FOLDER[] = "/Quick3DAssets"; const char QUICK_3D_ASSET_LIBRARY_ICON_SUFFIX[] = "_libicon"; const char QUICK_3D_ASSET_ICON_DIR[] = "_icons"; +const char QUICK_3D_ASSET_IMPORT_DATA_NAME[] = "_importdata.json"; +const char QUICK_3D_ASSET_IMPORT_DATA_OPTIONS_KEY[] = "import_options"; +const char QUICK_3D_ASSET_IMPORT_DATA_SOURCE_KEY[] = "source_scene"; const char DEFAULT_ASSET_IMPORT_FOLDER[] = "/asset_imports"; // Menus