QmlDesigner: Fix old and new project structures discrepancies

Force reload bundles when generated folder changes between projects
launches.

Fixes: QDS-12899
Fixes: QDS-12902
Change-Id: I61b2729309cf2b853441358379ac5a569a3af886
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2024-06-20 14:17:13 +03:00
parent b9fdfe90ad
commit 29c222ba18
11 changed files with 25 additions and 21 deletions

View File

@@ -93,11 +93,9 @@ QHash<int, QByteArray> ContentLibraryEffectsModel::roleNames() const
return roles; return roles;
} }
void ContentLibraryEffectsModel::loadBundle() void ContentLibraryEffectsModel::loadBundle(bool force)
{ {
auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils(); if (m_probeBundleDir && !force)
if (m_probeBundleDir || (m_bundleExists && m_bundleId == compUtils.effectsBundleId()))
return; return;
// clean up // clean up
@@ -148,6 +146,7 @@ void ContentLibraryEffectsModel::loadBundle()
m_bundleObj = bundleJsonDoc.object(); m_bundleObj = bundleJsonDoc.object();
auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils();
QString bundleType = compUtils.effectsBundleType(); QString bundleType = compUtils.effectsBundleType();
m_bundleId = compUtils.effectsBundleId(); m_bundleId = compUtils.effectsBundleId();

View File

@@ -28,7 +28,7 @@ public:
bool setData(const QModelIndex &index, const QVariant &value, int role) override; bool setData(const QModelIndex &index, const QVariant &value, int role) override;
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
void loadBundle(); void loadBundle(bool force = false);
void setSearchText(const QString &searchText); void setSearchText(const QString &searchText);
void updateImportedState(const QStringList &importedItems); void updateImportedState(const QStringList &importedItems);

View File

@@ -234,10 +234,10 @@ QJsonObject &ContentLibraryUserModel::bundleObjectRef(const QString &bundleId)
return qobject_cast<UserItemCategory *>(m_userCategories[secIdx])->bundleObjRef(); return qobject_cast<UserItemCategory *>(m_userCategories[secIdx])->bundleObjRef();
} }
void ContentLibraryUserModel::loadBundles() void ContentLibraryUserModel::loadBundles(bool force)
{ {
for (UserCategory *cat : std::as_const(m_userCategories)) for (UserCategory *cat : std::as_const(m_userCategories))
cat->loadBundle(); cat->loadBundle(force);
resetModel(); resetModel();
updateIsEmpty(); updateIsEmpty();

View File

@@ -57,7 +57,7 @@ public:
void setBundleObj(const QJsonObject &newBundleObj); void setBundleObj(const QJsonObject &newBundleObj);
QJsonObject &bundleObjectRef(const QString &bundleId); QJsonObject &bundleObjectRef(const QString &bundleId);
void loadBundles(); void loadBundles(bool force = false);
Q_INVOKABLE void applyToSelected(QmlDesigner::ContentLibraryItem *mat, bool add = false); Q_INVOKABLE void applyToSelected(QmlDesigner::ContentLibraryItem *mat, bool add = false);
Q_INVOKABLE void addToProject(ContentLibraryItem *item); Q_INVOKABLE void addToProject(ContentLibraryItem *item);

View File

@@ -266,15 +266,20 @@ void ContentLibraryView::modelAttached(Model *model)
// bundles loading has to happen here, otherwise project path is not ready which will // bundles loading has to happen here, otherwise project path is not ready which will
// cause bundle items types to resolve incorrectly // cause bundle items types to resolve incorrectly
m_widget->materialsModel()->loadBundle();
m_widget->effectsModel()->loadBundle();
m_widget->userModel()->loadBundles();
auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils(); auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils();
QString genFolderName = compUtils.generatedComponentsPath().fileName();
bool forceReload = m_generatedFolderName != genFolderName;
m_widget->materialsModel()->loadBundle();
m_widget->effectsModel()->loadBundle(forceReload);
m_widget->userModel()->loadBundles(forceReload);
m_widget->updateImportedState(compUtils.materialsBundleId()); m_widget->updateImportedState(compUtils.materialsBundleId());
m_widget->updateImportedState(compUtils.effectsBundleId()); m_widget->updateImportedState(compUtils.effectsBundleId());
m_widget->updateImportedState(compUtils.userMaterialsBundleId()); m_widget->updateImportedState(compUtils.userMaterialsBundleId());
m_widget->updateImportedState(compUtils.user3DBundleId()); m_widget->updateImportedState(compUtils.user3DBundleId());
m_generatedFolderName = genFolderName;
} }
void ContentLibraryView::modelAboutToBeDetached(Model *model) void ContentLibraryView::modelAboutToBeDetached(Model *model)

View File

@@ -101,6 +101,7 @@ private:
qint32 m_sceneId = -1; qint32 m_sceneId = -1;
CreateTexture m_createTexture; CreateTexture m_createTexture;
Utils::FilePath m_iconSavePath; Utils::FilePath m_iconSavePath;
QString m_generatedFolderName;
std::unique_ptr<ZipWriter> m_zipWriter; std::unique_ptr<ZipWriter> m_zipWriter;
std::unique_ptr<QTemporaryDir> m_tempDir; std::unique_ptr<QTemporaryDir> m_tempDir;

View File

@@ -25,7 +25,7 @@ public:
bool noMatch() const; bool noMatch() const;
void setNoMatch(bool val); void setNoMatch(bool val);
virtual void loadBundle() = 0; virtual void loadBundle(bool force = false) = 0;
virtual void filter(const QString &searchText) = 0; virtual void filter(const QString &searchText) = 0;
void addItem(QObject *item); void addItem(QObject *item);

View File

@@ -20,9 +20,9 @@ UserItemCategory::UserItemCategory(const QString &title, const Utils::FilePath &
{ {
} }
void UserItemCategory::loadBundle() void UserItemCategory::loadBundle(bool force)
{ {
if (m_bundleLoaded) if (m_bundleLoaded && !force)
return; return;
// clean up // clean up
@@ -66,12 +66,11 @@ void UserItemCategory::loadBundle()
return; return;
} }
auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils();
m_bundleObj = bundleJsonDoc.object(); m_bundleObj = bundleJsonDoc.object();
m_bundleObj["id"] = m_bundleId; m_bundleObj["id"] = m_bundleId;
// parse items // parse items
auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils();
QString typePrefix = compUtils.userBundleType(m_bundleId); QString typePrefix = compUtils.userBundleType(m_bundleId);
const QJsonArray itemsArr = m_bundleObj.value("items").toArray(); const QJsonArray itemsArr = m_bundleObj.value("items").toArray();
for (const QJsonValueConstRef &itemRef : itemsArr) { for (const QJsonValueConstRef &itemRef : itemsArr) {

View File

@@ -18,7 +18,7 @@ class UserItemCategory : public UserCategory
public: public:
UserItemCategory(const QString &title, const Utils::FilePath &bundlePath, const QString &bundleId); UserItemCategory(const QString &title, const Utils::FilePath &bundlePath, const QString &bundleId);
void loadBundle() override; void loadBundle(bool force) override;
void filter(const QString &searchText) override; void filter(const QString &searchText) override;
QStringList sharedFiles() const; QStringList sharedFiles() const;

View File

@@ -15,9 +15,9 @@ UserTextureCategory::UserTextureCategory(const QString &title, const Utils::File
{ {
} }
void UserTextureCategory::loadBundle() void UserTextureCategory::loadBundle(bool force)
{ {
if (m_bundleLoaded) if (m_bundleLoaded && !force)
return; return;
// clean up // clean up

View File

@@ -16,7 +16,7 @@ class UserTextureCategory : public UserCategory
public: public:
UserTextureCategory(const QString &title, const Utils::FilePath &bundlePath); UserTextureCategory(const QString &title, const Utils::FilePath &bundlePath);
void loadBundle() override; void loadBundle(bool force) override;
void filter(const QString &searchText) override; void filter(const QString &searchText) override;
void addItems(const Utils::FilePaths &paths); void addItems(const Utils::FilePaths &paths);