QmlDesigner: Read and apply minimumVersion for material bundles

If `minQtVersion` exists for a material in material_bundle.json file,
and kit version is less than `minQtVersion`, the material should be
skipped.
Version class has improved and moved to QmlDesignerUtils.

Task-number: QDS-13274
Change-Id: I726c1765c69e5b080650099d0b811a90cfc3ccf5
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ali Kianian
2024-07-29 11:35:39 +03:00
parent 9a85110f91
commit ace48d4b7f
12 changed files with 471 additions and 281 deletions

View File

@@ -48,6 +48,7 @@ add_qtc_library(QmlDesignerUtils STATIC
ktximage.cpp ktximage.h
imageutils.cpp imageutils.h
qmldesignerutils_global.h
version.cpp version.h
)
extend_qtc_library(QmlDesignerUtils

View File

@@ -211,11 +211,11 @@ QString ContentLibraryMaterialsModel::bundleId() const
return m_bundleId;
}
void ContentLibraryMaterialsModel::loadMaterialBundle()
void ContentLibraryMaterialsModel::loadMaterialBundle(bool forceReload)
{
auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils();
if (m_bundleExists && m_bundleId == compUtils.materialsBundleId())
if (!forceReload && m_bundleExists && m_bundleId == compUtils.materialsBundleId())
return;
// clean up
@@ -257,6 +257,13 @@ void ContentLibraryMaterialsModel::loadMaterialBundle()
for (const QString &matName : matsNames) {
const QJsonObject matObj = matsObj.value(matName).toObject();
if (matObj.contains("minQtVersion")) {
const Version minQtVersion = Version::fromString(
matObj.value("minQtVersion").toString());
if (minQtVersion > m_quick3dVersion)
continue;
}
QStringList files;
const QJsonArray assetsArr = matObj.value("files").toArray();
for (const QJsonValueConstRef &asset : assetsArr)
@@ -289,7 +296,7 @@ void ContentLibraryMaterialsModel::loadMaterialBundle()
bool ContentLibraryMaterialsModel::hasRequiredQuick3DImport() const
{
return m_widget->hasQuick3DImport() && m_quick3dMajorVersion == 6 && m_quick3dMinorVersion >= 3;
return m_widget->hasQuick3DImport() && m_quick3dVersion >= Version{6, 3};
}
bool ContentLibraryMaterialsModel::matBundleExists() const
@@ -335,8 +342,11 @@ void ContentLibraryMaterialsModel::setQuick3DImportVersion(int major, int minor)
{
bool oldRequiredImport = hasRequiredQuick3DImport();
m_quick3dMajorVersion = major;
m_quick3dMinorVersion = minor;
const Version newVersion{major, minor};
if (m_quick3dVersion != newVersion) {
m_quick3dVersion = newVersion;
loadMaterialBundle(true);
}
bool newRequiredImport = hasRequiredQuick3DImport();

View File

@@ -4,6 +4,7 @@
#pragma once
#include <utils/filepath.h>
#include <utils/version.h>
#include <QAbstractListModel>
#include <QJsonObject>
@@ -60,7 +61,7 @@ signals:
void matBundleExistsChanged();
private:
void loadMaterialBundle();
void loadMaterialBundle(bool forceReload = false);
bool fetchBundleIcons();
bool fetchBundleJsonFile();
bool isValidIndex(int idx) const;
@@ -76,9 +77,7 @@ private:
bool m_isEmpty = true;
bool m_bundleExists = false;
int m_quick3dMajorVersion = -1;
int m_quick3dMinorVersion = -1;
Version m_quick3dVersion;
Utils::FilePath m_bundlePath;
QString m_baseUrl;
};

View File

@@ -14,10 +14,11 @@
#include <nodemetainfo.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectmanager.h>
#include "qmldesignerconstants.h"
#include "qmldesignerplugin.h"
#include <qmldesignerconstants.h>
#include <qmldesignerplugin.h>
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
#include <utils/version.h>
#include <QIODevice>
#include <QLoggingCategory>

View File

@@ -12,37 +12,9 @@
#include "qmldesignercorelib_global.h"
#include <limits>
namespace QmlDesigner {
class Version
{
public:
friend bool operator==(Version first, Version second)
{
return first.major == second.major && first.minor == second.minor;
}
friend bool operator<(Version first, Version second)
{
return std::tie(first.major, first.minor) < std::tie(second.major, second.minor);
}
friend bool operator>(Version first, Version second) { return second < first; }
friend bool operator<=(Version first, Version second) { return !(second < first); }
friend bool operator>=(Version first, Version second) { return !(first < second); }
bool isEmpty() const
{
return major == std::numeric_limits<int>::max() || minor == std::numeric_limits<int>::max();
}
public:
int major = std::numeric_limits<int>::max();
int minor = std::numeric_limits<int>::max();
};
class Version;
class QMLDESIGNERCORE_EXPORT Import
{
using Imports = QList<Import>;

View File

@@ -3,6 +3,8 @@
#include "import.h"
#include <qmldesigner/utils/version.h>
#include <QHash>
#include <QStringView>

View File

@@ -40,6 +40,7 @@
#include <qmljs/qmljsmodelmanagerinterface.h>
#include <utils/algorithm.h>
#include <utils/version.h>
#include <QDrag>
#include <QFileInfo>

View File

@@ -0,0 +1,47 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "version.h"
#include <QDebug>
#include <QList>
namespace QmlDesigner {
Version Version::fromString(QStringView string)
{
Version result;
// Split version into parts (major, minor, patch)
QList<QStringView> versionParts = string.split('.');
auto readDigit = [](QStringView string, int defaultValue = 0) -> int {
bool canConvert = false;
int digit = string.toInt(&canConvert);
return (canConvert && digit > -1) ? digit : defaultValue;
};
if (versionParts.size() > 0)
result.major = readDigit(versionParts[0], std::numeric_limits<int>::max());
if (versionParts.size() > 1)
result.minor = readDigit(versionParts[1]);
if (versionParts.size() > 2)
result.patch = readDigit(versionParts[2]);
return result;
}
QString Version::toString() const
{
if (isEmpty())
return {};
return QString("%1.%2.%3").arg(major).arg(minor).arg(patch);
}
QDebug operator<<(QDebug debug, Version version)
{
return debug.noquote() << QStringView(u"Version(%1)").arg(version.toString());
}
} // namespace QmlDesigner

View File

@@ -0,0 +1,52 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "qmldesignerutils_global.h"
#include <limits>
#include <QString>
QT_BEGIN_NAMESPACE
class QDebug;
QT_END_NAMESPACE
namespace QmlDesigner {
class Version
{
public:
static Version QMLDESIGNERUTILS_EXPORT fromString(QStringView string);
QString QMLDESIGNERUTILS_EXPORT toString() const;
bool isEmpty() const { return major == std::numeric_limits<int>::max(); }
friend bool operator==(Version first, Version second)
{
return std::tie(first.major, first.minor, first.patch)
== std::tie(second.major, second.minor, second.patch);
}
friend bool operator<(Version first, Version second)
{
return std::tie(first.major, first.minor, first.patch)
< std::tie(second.major, second.minor, second.patch);
}
friend bool operator>(Version first, Version second) { return second < first; }
friend bool operator<=(Version first, Version second) { return !(second < first); }
friend bool operator>=(Version first, Version second) { return !(first < second); }
friend QMLDESIGNERUTILS_EXPORT QDebug operator<<(QDebug debug, Version version);
public:
int major = std::numeric_limits<int>::max();
int minor = 0;
int patch = 0;
};
} // namespace QmlDesigner