forked from qt-creator/qt-creator
QmlDesigner: Add support for importing materials to content lib
Fixes: QDS-12965 Change-Id: I422a45f305593eb4b58cd59b807e3bdefd9d056f Reviewed-by: Shrief Gabr <shrief.gabr@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
@@ -129,9 +129,9 @@ void ContentLibraryUserModel::add3DItem(const QString &name, const QString &qml,
|
|||||||
m_user3DItems.append(new ContentLibraryItem(this, name, qml, type, icon, files));
|
m_user3DItems.append(new ContentLibraryItem(this, name, qml, type, icon, files));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentLibraryUserModel::refresh3DSection()
|
void ContentLibraryUserModel::refreshSection(SectionIndex sectionIndex)
|
||||||
{
|
{
|
||||||
emit dataChanged(index(Items3DSectionIdx), index(Items3DSectionIdx));
|
emit dataChanged(index(sectionIndex), index(sectionIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentLibraryUserModel::addTextures(const QStringList &paths)
|
void ContentLibraryUserModel::addTextures(const QStringList &paths)
|
||||||
@@ -244,6 +244,17 @@ void ContentLibraryUserModel::remove3DFromContentLibByName(const QString &qmlFil
|
|||||||
remove3DFromContentLib(itemToRemove);
|
remove3DFromContentLib(itemToRemove);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ContentLibraryUserModel::removeMaterialFromContentLibByName(const QString &qmlFileName)
|
||||||
|
{
|
||||||
|
ContentLibraryMaterial *itemToRemove = Utils::findOr(m_userMaterials, nullptr,
|
||||||
|
[&qmlFileName](ContentLibraryMaterial *item) {
|
||||||
|
return item->qml() == qmlFileName;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (itemToRemove)
|
||||||
|
removeMaterialFromContentLib(itemToRemove);
|
||||||
|
}
|
||||||
|
|
||||||
void ContentLibraryUserModel::remove3DFromContentLib(ContentLibraryItem *item)
|
void ContentLibraryUserModel::remove3DFromContentLib(ContentLibraryItem *item)
|
||||||
{
|
{
|
||||||
QJsonArray itemsArr = m_bundleObj3D.value("items").toArray();
|
QJsonArray itemsArr = m_bundleObj3D.value("items").toArray();
|
||||||
|
@@ -31,6 +31,11 @@ class ContentLibraryUserModel : public QAbstractListModel
|
|||||||
Q_PROPERTY(QList<ContentLibraryItem *> userEffects MEMBER m_userEffects NOTIFY userEffectsChanged)
|
Q_PROPERTY(QList<ContentLibraryItem *> userEffects MEMBER m_userEffects NOTIFY userEffectsChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
enum SectionIndex { MaterialsSectionIdx = 0,
|
||||||
|
TexturesSectionIdx,
|
||||||
|
Items3DSectionIdx,
|
||||||
|
EffectsSectionIdx };
|
||||||
|
|
||||||
ContentLibraryUserModel(ContentLibraryWidget *parent = nullptr);
|
ContentLibraryUserModel(ContentLibraryWidget *parent = nullptr);
|
||||||
|
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
@@ -59,12 +64,13 @@ public:
|
|||||||
|
|
||||||
void addMaterial(const QString &name, const QString &qml, const QUrl &icon, const QStringList &files);
|
void addMaterial(const QString &name, const QString &qml, const QUrl &icon, const QStringList &files);
|
||||||
void add3DItem(const QString &name, const QString &qml, const QUrl &icon, const QStringList &files);
|
void add3DItem(const QString &name, const QString &qml, const QUrl &icon, const QStringList &files);
|
||||||
void refresh3DSection();
|
void refreshSection(SectionIndex sectionIndex);
|
||||||
void addTextures(const QStringList &paths);
|
void addTextures(const QStringList &paths);
|
||||||
|
|
||||||
void add3DInstance(ContentLibraryItem *bundleItem);
|
void add3DInstance(ContentLibraryItem *bundleItem);
|
||||||
|
|
||||||
void remove3DFromContentLibByName(const QString &qmlFileName);
|
void remove3DFromContentLibByName(const QString &qmlFileName);
|
||||||
|
void removeMaterialFromContentLibByName(const QString &qmlFileName);
|
||||||
|
|
||||||
void setBundleObj(const QJsonObject &newBundleObj);
|
void setBundleObj(const QJsonObject &newBundleObj);
|
||||||
QJsonObject &bundleJsonMaterialObjectRef();
|
QJsonObject &bundleJsonMaterialObjectRef();
|
||||||
@@ -89,11 +95,6 @@ signals:
|
|||||||
void bundle3DExistsChanged();
|
void bundle3DExistsChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum SectionIndex { MaterialsSectionIdx = 0,
|
|
||||||
TexturesSectionIdx,
|
|
||||||
Items3DSectionIdx,
|
|
||||||
EffectsSectionIdx };
|
|
||||||
|
|
||||||
void loadMaterialBundle();
|
void loadMaterialBundle();
|
||||||
void load3DBundle();
|
void load3DBundle();
|
||||||
void loadTextureBundle();
|
void loadTextureBundle();
|
||||||
|
@@ -710,7 +710,7 @@ void ContentLibraryView::addLib3DComponent(const ModelNode &node)
|
|||||||
getImageFromCache(compDir.pathAppended(compFileName).path(), [&](const QImage &image) {
|
getImageFromCache(compDir.pathAppended(compFileName).path(), [&](const QImage &image) {
|
||||||
bool iconSaved = image.save(m_iconSavePath.toFSPathString());
|
bool iconSaved = image.save(m_iconSavePath.toFSPathString());
|
||||||
if (iconSaved)
|
if (iconSaved)
|
||||||
m_widget->userModel()->refresh3DSection();
|
m_widget->userModel()->refreshSection(ContentLibraryUserModel::Items3DSectionIdx);
|
||||||
else
|
else
|
||||||
qWarning() << "ContentLibraryView::getImageFromCache(): icon save failed" << iconPath;
|
qWarning() << "ContentLibraryView::getImageFromCache(): icon save failed" << iconPath;
|
||||||
});
|
});
|
||||||
@@ -848,7 +848,7 @@ void ContentLibraryView::addLib3DItem(const ModelNode &node)
|
|||||||
getImageFromCache(qmlPath, [&](const QImage &image) {
|
getImageFromCache(qmlPath, [&](const QImage &image) {
|
||||||
bool iconSaved = image.save(m_iconSavePath.toFSPathString());
|
bool iconSaved = image.save(m_iconSavePath.toFSPathString());
|
||||||
if (iconSaved)
|
if (iconSaved)
|
||||||
m_widget->userModel()->refresh3DSection();
|
m_widget->userModel()->refreshSection(ContentLibraryUserModel::Items3DSectionIdx);
|
||||||
else
|
else
|
||||||
qWarning() << "ContentLibraryView::getImageFromCache(): icon save failed" << iconPath;
|
qWarning() << "ContentLibraryView::getImageFromCache(): icon save failed" << iconPath;
|
||||||
});
|
});
|
||||||
@@ -988,13 +988,10 @@ void ContentLibraryView::exportLib3DItem(const ModelNode &node, const QPixmap &i
|
|||||||
|
|
||||||
void ContentLibraryView::importBundle()
|
void ContentLibraryView::importBundle()
|
||||||
{
|
{
|
||||||
// TODO: support importing materials
|
|
||||||
|
|
||||||
QString importPath = getImportPath();
|
QString importPath = getImportPath();
|
||||||
if (importPath.isEmpty())
|
if (importPath.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto bundlePath = Utils::FilePath::fromString(Paths::bundlesPathSetting() + "/User/3d/");
|
|
||||||
ZipReader zipReader(importPath);
|
ZipReader zipReader(importPath);
|
||||||
|
|
||||||
QByteArray bundleJsonContent = zipReader.fileData(Constants::BUNDLE_JSON_FILENAME);
|
QByteArray bundleJsonContent = zipReader.fileData(Constants::BUNDLE_JSON_FILENAME);
|
||||||
@@ -1004,7 +1001,14 @@ void ContentLibraryView::importBundle()
|
|||||||
const QJsonArray importedItemsArr = importedJsonObj.value("items").toArray();
|
const QJsonArray importedItemsArr = importedJsonObj.value("items").toArray();
|
||||||
QTC_ASSERT(!importedItemsArr.isEmpty(), return);
|
QTC_ASSERT(!importedItemsArr.isEmpty(), return);
|
||||||
|
|
||||||
QJsonObject &jsonRef = m_widget->userModel()->bundleJson3DObjectRef();
|
bool isMat = isMaterialBundle(importedJsonObj.value("id").toString());
|
||||||
|
|
||||||
|
QString bundleFolderName = isMat ? QLatin1String("materials") : QLatin1String("3d");
|
||||||
|
auto bundlePath = Utils::FilePath::fromString(QLatin1String("%1/User/%3/")
|
||||||
|
.arg(Paths::bundlesPathSetting(), bundleFolderName));
|
||||||
|
|
||||||
|
QJsonObject &jsonRef = isMat ? m_widget->userModel()->bundleJsonMaterialObjectRef()
|
||||||
|
: m_widget->userModel()->bundleJson3DObjectRef();
|
||||||
QJsonArray itemsArr = jsonRef.value("items").toArray();
|
QJsonArray itemsArr = jsonRef.value("items").toArray();
|
||||||
|
|
||||||
QStringList existingQmls;
|
QStringList existingQmls;
|
||||||
@@ -1026,7 +1030,10 @@ void ContentLibraryView::importBundle()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// before overwriting remove old item (to avoid partial items and dangling assets)
|
// before overwriting remove old item (to avoid partial items and dangling assets)
|
||||||
m_widget->userModel()->remove3DFromContentLibByName(qml);
|
if (isMat)
|
||||||
|
m_widget->userModel()->removeMaterialFromContentLibByName(qml);
|
||||||
|
else
|
||||||
|
m_widget->userModel()->remove3DFromContentLibByName(qml);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add entry to json
|
// add entry to json
|
||||||
@@ -1037,7 +1044,6 @@ void ContentLibraryView::importBundle()
|
|||||||
QStringList files = itemObj.value("files").toVariant().toStringList();
|
QStringList files = itemObj.value("files").toVariant().toStringList();
|
||||||
QString icon = itemObj.value("icon").toString();
|
QString icon = itemObj.value("icon").toString();
|
||||||
QUrl iconUrl = bundlePath.pathAppended(icon).toUrl();
|
QUrl iconUrl = bundlePath.pathAppended(icon).toUrl();
|
||||||
m_widget->userModel()->add3DItem(name, qml, iconUrl, files);
|
|
||||||
|
|
||||||
// copy files
|
// copy files
|
||||||
files << qml << icon; // all files
|
files << qml << icon; // all files
|
||||||
@@ -1046,6 +1052,11 @@ void ContentLibraryView::importBundle()
|
|||||||
filePath.parentDir().ensureWritableDir();
|
filePath.parentDir().ensureWritableDir();
|
||||||
QTC_ASSERT_EXPECTED(filePath.writeFileContents(zipReader.fileData(file)),);
|
QTC_ASSERT_EXPECTED(filePath.writeFileContents(zipReader.fileData(file)),);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isMat)
|
||||||
|
m_widget->userModel()->addMaterial(name, qml, iconUrl, files);
|
||||||
|
else
|
||||||
|
m_widget->userModel()->add3DItem(name, qml, iconUrl, files);
|
||||||
}
|
}
|
||||||
|
|
||||||
zipReader.close();
|
zipReader.close();
|
||||||
@@ -1056,7 +1067,9 @@ void ContentLibraryView::importBundle()
|
|||||||
.writeFileContents(QJsonDocument(jsonRef).toJson());
|
.writeFileContents(QJsonDocument(jsonRef).toJson());
|
||||||
QTC_ASSERT_EXPECTED(result,);
|
QTC_ASSERT_EXPECTED(result,);
|
||||||
|
|
||||||
m_widget->userModel()->refresh3DSection();
|
auto sectionIdx = isMat ? ContentLibraryUserModel::MaterialsSectionIdx
|
||||||
|
: ContentLibraryUserModel::Items3DSectionIdx;
|
||||||
|
m_widget->userModel()->refreshSection(sectionIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user