QmlDesigner: Fix content library visibility logic

Also fix enable logic of context menus in content library.

Fixes: QDS-8446
Change-Id: I82f80779f507aa5336ebafac5cffc36365238fc5
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Miikka Heikkinen
2022-11-29 16:56:08 +02:00
parent 44cfc4a8cd
commit 57448021b8
13 changed files with 207 additions and 208 deletions

View File

@@ -35,7 +35,15 @@ Item {
id: searchBox
width: root.width
enabled: !materialsModel.hasMaterialRoot && materialsModel.hasQuick3DImport
enabled: {
if (tabBar.currIndex == 0) { // Materials tab
materialsModel.matBundleExists
&& rootView.hasMaterialLibrary
&& materialsModel.hasRequiredQuick3DImport
} else { // Textures / Environments tabs
texturesModel.texBundleExists
}
}
onSearchChanged: (searchText) => {
rootView.handleSearchFilterChanged(searchText)
@@ -47,35 +55,12 @@ Item {
}
}
Text {
// TODO: only disable the materials section, textures should be available
text: {
if (materialsModel.hasMaterialRoot)
qsTr("<b>Content Library</b> is disabled inside a material component.")
else if (!materialsModel.hasQuick3DImport)
qsTr("To use <b>Content Library</b>, first add the QtQuick3D module in the <b>Components</b> view.")
else
""
}
textFormat: Text.RichText
color: StudioTheme.Values.themeTextColor
font.pixelSize: StudioTheme.Values.mediumFontSize
topPadding: 30
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
width: root.width
visible: text !== ""
}
UnimportBundleMaterialDialog {
id: confirmUnimportDialog
}
ContentLibraryTabBar {
id: tabBar
visible: materialsModel.hasQuick3DImport
// TODO: update icons
tabsModel: [{name: qsTr("Materials"), icon: StudioTheme.Constants.gradient},
{name: qsTr("Textures"), icon: StudioTheme.Constants.materialPreviewEnvironment},
@@ -86,7 +71,6 @@ Item {
width: root.width
height: root.height - y
currentIndex: tabBar.currIndex
visible: materialsModel.hasQuick3DImport
ContentLibraryMaterialsView {
id: materialsView

View File

@@ -10,7 +10,13 @@ StudioControls.Menu {
id: root
property var targetMaterial: null
property bool hasModelSelection: false
property bool importerRunning: false
readonly property bool targetAvailable: targetMaterial && !importerRunning
signal unimport(var bundleMat);
signal addToProject(var bundleMat)
function popupMenu(targetMaterial = null)
{
@@ -22,31 +28,31 @@ StudioControls.Menu {
StudioControls.MenuItem {
text: qsTr("Apply to selected (replace)")
enabled: root.targetMaterial && materialsModel.hasModelSelection
onTriggered: materialsModel.applyToSelected(root.targetMaterial, false)
enabled: root.targetAvailable && root.hasModelSelection
onTriggered: root.applyToSelected(root.targetMaterial, false)
}
StudioControls.MenuItem {
text: qsTr("Apply to selected (add)")
enabled: root.targetMaterial && materialsModel.hasModelSelection
onTriggered: materialsModel.applyToSelected(root.targetMaterial, true)
enabled: root.targetAvailable && root.hasModelSelection
onTriggered: root.applyToSelected(root.targetMaterial, true)
}
StudioControls.MenuSeparator {}
StudioControls.MenuItem {
enabled: !materialsModel.importerRunning
enabled: root.targetAvailable
text: qsTr("Add an instance to project")
onTriggered: {
materialsModel.addToProject(root.targetMaterial)
root.addToProject(root.targetMaterial)
}
}
StudioControls.MenuItem {
enabled: !materialsModel.importerRunning && root.targetMaterial && root.targetMaterial.bundleMaterialImported
enabled: root.targetAvailable && root.targetMaterial.bundleMaterialImported
text: qsTr("Remove from project")
onTriggered: root.unimport(root.targetMaterial);
onTriggered: root.unimport(root.targetMaterial)
}
}

View File

@@ -40,7 +40,11 @@ HelperWidgets.ScrollView {
ContentLibraryMaterialContextMenu {
id: ctxMenu
hasModelSelection: materialsModel.hasModelSelection
importerRunning: materialsModel.importerRunning
onUnimport: (bundleMat) => root.unimport(bundleMat)
onAddToProject: (bundleMat) => materialsModel.addToProject(bundleMat)
}
Repeater {
@@ -53,7 +57,7 @@ HelperWidgets.ScrollView {
caption: bundleCategoryName
addTopPadding: false
sectionBackgroundColor: "transparent"
visible: bundleCategoryVisible
visible: bundleCategoryVisible && !materialsModel.isEmpty
expanded: bundleCategoryExpanded
expandOnClick: false
onToggleExpand: bundleCategoryExpanded = !bundleCategoryExpanded
@@ -84,13 +88,26 @@ HelperWidgets.ScrollView {
}
Text {
id: noMatchText
text: qsTr("No match found.");
id: infoText
text: {
if (!materialsModel.matBundleExists)
qsTr("<b>Content Library</b> materials are not installed.")
else if (!rootView.hasQuick3DImport)
qsTr("To use <b>Content Library</b>, first add the QtQuick3D module in the <b>Components</b> view.")
else if (!materialsModel.hasRequiredQuick3DImport)
qsTr("To use <b>Content Library</b>, version 6.3 or later of the QtQuick3D module is required.")
else if (!rootView.hasMaterialLibrary)
qsTr("<b>Content Library</b> is disabled inside a non-visual component.")
else if (!searchBox.isEmpty())
qsTr("No match found.")
else
""
}
color: StudioTheme.Values.themeTextColor
font.pixelSize: StudioTheme.Values.baseFontSize
topPadding: 10
leftPadding: 10
visible: materialsModel.isEmpty && !searchBox.isEmpty() && !materialsModel.hasMaterialRoot
visible: materialsModel.isEmpty
}
}
}

View File

@@ -12,6 +12,8 @@ StudioControls.Menu {
property var targetTexture: null
property bool hasSceneEnv: false
property bool canUse3D: targetTexture && rootView.hasQuick3DImport && rootView.hasMaterialLibrary
function popupMenu(targetTexture = null)
{
this.targetTexture = targetTexture
@@ -29,13 +31,13 @@ StudioControls.Menu {
StudioControls.MenuItem {
text: qsTr("Add texture")
enabled: root.targetTexture
enabled: canUse3D
onTriggered: rootView.addTexture(root.targetTexture)
}
StudioControls.MenuItem {
text: qsTr("Add light probe")
enabled: root.hasSceneEnv && root.targetTexture
enabled: root.hasSceneEnv && canUse3D
onTriggered: rootView.addLightProbe(root.targetTexture)
}
}

View File

@@ -53,7 +53,7 @@ HelperWidgets.ScrollView {
caption: bundleCategoryName
addTopPadding: false
sectionBackgroundColor: "transparent"
visible: bundleCategoryVisible
visible: bundleCategoryVisible && !root.model.isEmpty
expanded: bundleCategoryExpanded
expandOnClick: false
onToggleExpand: bundleCategoryExpanded = !bundleCategoryExpanded
@@ -87,10 +87,12 @@ HelperWidgets.ScrollView {
Text {
id: infoText
text: {
if (!searchBox.isEmpty())
if (!root.model.texBundleExists)
qsTr("<b>Content Library</b> textures are not installed.")
else if (!searchBox.isEmpty())
qsTr("No match found.")
else
qsTr("Texture library is not installed.")
""
}
color: StudioTheme.Values.themeTextColor
font.pixelSize: StudioTheme.Values.baseFontSize

View File

@@ -6,7 +6,10 @@
#include "contentlibrarybundleimporter.h"
#include "contentlibrarymaterial.h"
#include "contentlibrarymaterialscategory.h"
#include "contentlibrarywidget.h"
#include "qmldesignerconstants.h"
#include "utils/algorithm.h"
#include "utils/qtcassert.h"
#include <QCoreApplication>
@@ -16,8 +19,9 @@
namespace QmlDesigner {
ContentLibraryMaterialsModel::ContentLibraryMaterialsModel(QObject *parent)
ContentLibraryMaterialsModel::ContentLibraryMaterialsModel(ContentLibraryWidget *parent)
: QAbstractListModel(parent)
, m_widget(parent)
{
loadMaterialBundle();
}
@@ -59,6 +63,22 @@ bool ContentLibraryMaterialsModel::isValidIndex(int idx) const
return idx > -1 && idx < rowCount();
}
void ContentLibraryMaterialsModel::updateIsEmpty()
{
const bool anyCatVisible = Utils::anyOf(m_bundleCategories,
[&](ContentLibraryMaterialsCategory *cat) {
return cat->visible();
});
const bool newEmpty = !anyCatVisible || m_bundleCategories.isEmpty()
|| !m_widget->hasMaterialLibrary() || !hasRequiredQuick3DImport();
if (newEmpty != m_isEmpty) {
m_isEmpty = newEmpty;
emit isEmptyChanged();
}
}
QHash<int, QByteArray> ContentLibraryMaterialsModel::roleNames() const
{
static const QHash<int, QByteArray> roles {
@@ -72,7 +92,7 @@ QHash<int, QByteArray> ContentLibraryMaterialsModel::roleNames() const
void ContentLibraryMaterialsModel::loadMaterialBundle()
{
if (m_matBundleLoaded || m_probeMatBundleDir)
if (m_matBundleExists || m_probeMatBundleDir)
return;
QDir matBundleDir(qEnvironmentVariable("MATERIAL_BUNDLE_PATH"));
@@ -108,7 +128,7 @@ void ContentLibraryMaterialsModel::loadMaterialBundle()
}
}
m_matBundleLoaded = true;
m_matBundleExists = true;
QString bundleId = m_matBundleObj.value("id").toString();
@@ -163,43 +183,17 @@ void ContentLibraryMaterialsModel::loadMaterialBundle()
emit bundleMaterialUnimported(metaInfo);
});
if (m_bundleCategories.isEmpty() != m_isEmpty) {
m_isEmpty = m_bundleCategories.isEmpty();
emit isEmptyChanged();
}
updateIsEmpty();
}
bool ContentLibraryMaterialsModel::hasQuick3DImport() const
bool ContentLibraryMaterialsModel::hasRequiredQuick3DImport() const
{
return m_hasQuick3DImport;
}
void ContentLibraryMaterialsModel::setHasQuick3DImport(bool b)
{
if (b == m_hasQuick3DImport)
return;
m_hasQuick3DImport = b;
emit hasQuick3DImportChanged();
}
bool ContentLibraryMaterialsModel::hasMaterialRoot() const
{
return m_hasMaterialRoot;
}
void ContentLibraryMaterialsModel::setHasMaterialRoot(bool b)
{
if (m_hasMaterialRoot == b)
return;
m_hasMaterialRoot = b;
emit hasMaterialRootChanged();
return m_widget->hasQuick3DImport() && m_quick3dMajorVersion == 6 && m_quick3dMinorVersion >= 3;
}
bool ContentLibraryMaterialsModel::matBundleExists() const
{
return m_matBundleLoaded && m_quick3dMajorVersion == 6 && m_quick3dMinorVersion >= 3;
return m_matBundleExists;
}
Internal::ContentLibraryBundleImporter *ContentLibraryMaterialsModel::bundleImporter() const
@@ -216,18 +210,11 @@ void ContentLibraryMaterialsModel::setSearchText(const QString &searchText)
m_searchText = lowerSearchText;
bool anyCatVisible = false;
bool catVisibilityChanged = false;
for (ContentLibraryMaterialsCategory *cat : std::as_const(m_bundleCategories)) {
for (ContentLibraryMaterialsCategory *cat : std::as_const(m_bundleCategories))
catVisibilityChanged |= cat->filter(m_searchText);
anyCatVisible |= cat->visible();
}
if (anyCatVisible == m_isEmpty) {
m_isEmpty = !anyCatVisible;
emit isEmptyChanged();
}
updateIsEmpty();
if (catVisibilityChanged)
resetModel();
@@ -245,13 +232,19 @@ void ContentLibraryMaterialsModel::updateImportedState(const QStringList &import
void ContentLibraryMaterialsModel::setQuick3DImportVersion(int major, int minor)
{
bool bundleExisted = matBundleExists();
bool oldRequiredImport = hasRequiredQuick3DImport();
m_quick3dMajorVersion = major;
m_quick3dMinorVersion = minor;
if (bundleExisted != matBundleExists())
emit matBundleExistsChanged();
bool newRequiredImport = hasRequiredQuick3DImport();
if (oldRequiredImport == newRequiredImport)
return;
emit hasRequiredQuick3DImportChanged();
updateIsEmpty();
}
void ContentLibraryMaterialsModel::resetModel()

View File

@@ -12,6 +12,7 @@ namespace QmlDesigner {
class ContentLibraryMaterial;
class ContentLibraryMaterialsCategory;
class ContentLibraryWidget;
namespace Internal {
class ContentLibraryBundleImporter;
@@ -23,13 +24,12 @@ class ContentLibraryMaterialsModel : public QAbstractListModel
Q_PROPERTY(bool matBundleExists READ matBundleExists NOTIFY matBundleExistsChanged)
Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged)
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged)
Q_PROPERTY(bool hasMaterialRoot READ hasMaterialRoot WRITE setHasMaterialRoot NOTIFY hasMaterialRootChanged)
Q_PROPERTY(bool hasRequiredQuick3DImport READ hasRequiredQuick3DImport NOTIFY hasRequiredQuick3DImportChanged)
Q_PROPERTY(bool hasModelSelection READ hasModelSelection NOTIFY hasModelSelectionChanged)
Q_PROPERTY(bool importerRunning MEMBER m_importerRunning NOTIFY importerRunningChanged)
public:
ContentLibraryMaterialsModel(QObject *parent = nullptr);
ContentLibraryMaterialsModel(ContentLibraryWidget *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
@@ -41,11 +41,7 @@ public:
void setQuick3DImportVersion(int major, int minor);
bool hasQuick3DImport() const;
void setHasQuick3DImport(bool b);
bool hasMaterialRoot() const;
void setHasMaterialRoot(bool b);
bool hasRequiredQuick3DImport() const;
bool matBundleExists() const;
@@ -53,6 +49,7 @@ public:
void setHasModelSelection(bool b);
void resetModel();
void updateIsEmpty();
Internal::ContentLibraryBundleImporter *bundleImporter() const;
@@ -62,9 +59,8 @@ public:
signals:
void isEmptyChanged();
void hasQuick3DImportChanged();
void hasRequiredQuick3DImportChanged();
void hasModelSelectionChanged();
void hasMaterialRootChanged();
void materialVisibleChanged();
void applyToSelectedTriggered(QmlDesigner::ContentLibraryMaterial *mat, bool add = false);
void bundleMaterialImported(const QmlDesigner::NodeMetaInfo &metaInfo);
@@ -77,15 +73,14 @@ private:
void loadMaterialBundle();
bool isValidIndex(int idx) const;
ContentLibraryWidget *m_widget = nullptr;
QString m_searchText;
QList<ContentLibraryMaterialsCategory *> m_bundleCategories;
QJsonObject m_matBundleObj;
Internal::ContentLibraryBundleImporter *m_importer = nullptr;
bool m_isEmpty = true;
bool m_hasMaterialRoot = false;
bool m_hasQuick3DImport = false;
bool m_matBundleLoaded = false;
bool m_matBundleExists = false;
bool m_hasModelSelection = false;
bool m_probeMatBundleDir = false;
bool m_importerRunning = false;

View File

@@ -4,6 +4,8 @@
#include "contentlibrarytexturesmodel.h"
#include "contentlibrarytexturescategory.h"
#include "utils/algorithm.h"
#include "utils/qtcassert.h"
#include <QCoreApplication>
@@ -55,6 +57,21 @@ bool ContentLibraryTexturesModel::isValidIndex(int idx) const
return idx > -1 && idx < rowCount();
}
void ContentLibraryTexturesModel::updateIsEmpty()
{
const bool anyCatVisible = Utils::anyOf(m_bundleCategories,
[&](ContentLibraryTexturesCategory *cat) {
return cat->visible();
});
const bool newEmpty = !anyCatVisible || m_bundleCategories.isEmpty();
if (newEmpty != m_isEmpty) {
m_isEmpty = newEmpty;
emit isEmptyChanged();
}
}
QHash<int, QByteArray> ContentLibraryTexturesModel::roleNames() const
{
static const QHash<int, QByteArray> roles {
@@ -74,7 +91,7 @@ void ContentLibraryTexturesModel::loadTextureBundle(const QString &bundlePath)
return;
}
if (m_texBundleLoaded)
if (!m_bundleCategories.isEmpty())
return;
const QFileInfoList dirs = bundleDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
@@ -86,38 +103,12 @@ void ContentLibraryTexturesModel::loadTextureBundle(const QString &bundlePath)
m_bundleCategories.append(category);
}
if (m_bundleCategories.isEmpty() != m_isEmpty) {
m_isEmpty = m_bundleCategories.isEmpty();
emit isEmptyChanged();
}
updateIsEmpty();
}
bool ContentLibraryTexturesModel::hasQuick3DImport() const
bool ContentLibraryTexturesModel::texBundleExists() const
{
return m_hasQuick3DImport;
}
void ContentLibraryTexturesModel::setHasQuick3DImport(bool b)
{
if (b == m_hasQuick3DImport)
return;
m_hasQuick3DImport = b;
emit hasQuick3DImportChanged();
}
bool ContentLibraryTexturesModel::hasMaterialRoot() const
{
return m_hasMaterialRoot;
}
void ContentLibraryTexturesModel::setHasMaterialRoot(bool b)
{
if (m_hasMaterialRoot == b)
return;
m_hasMaterialRoot = b;
emit hasMaterialRootChanged();
return !m_bundleCategories.isEmpty();
}
bool ContentLibraryTexturesModel::hasSceneEnv() const
@@ -134,11 +125,6 @@ void ContentLibraryTexturesModel::setHasSceneEnv(bool b)
emit hasSceneEnvChanged();
}
bool ContentLibraryTexturesModel::matBundleExists() const
{
return m_texBundleLoaded && m_quick3dMajorVersion == 6 && m_quick3dMinorVersion >= 3;
}
void ContentLibraryTexturesModel::setSearchText(const QString &searchText)
{
QString lowerSearchText = searchText.toLower();
@@ -148,57 +134,21 @@ void ContentLibraryTexturesModel::setSearchText(const QString &searchText)
m_searchText = lowerSearchText;
bool anyCatVisible = false;
bool catVisibilityChanged = false;
for (ContentLibraryTexturesCategory *cat : std::as_const(m_bundleCategories)) {
for (ContentLibraryTexturesCategory *cat : std::as_const(m_bundleCategories))
catVisibilityChanged |= cat->filter(m_searchText);
anyCatVisible |= cat->visible();
}
if (anyCatVisible == m_isEmpty) {
m_isEmpty = !anyCatVisible;
emit isEmptyChanged();
}
updateIsEmpty();
if (catVisibilityChanged)
resetModel();
}
void ContentLibraryTexturesModel::setQuick3DImportVersion(int major, int minor)
{
bool bundleExisted = matBundleExists();
m_quick3dMajorVersion = major;
m_quick3dMinorVersion = minor;
if (bundleExisted != matBundleExists())
emit matBundleExistsChanged();
}
void ContentLibraryTexturesModel::resetModel()
{
beginResetModel();
endResetModel();
}
void ContentLibraryTexturesModel::addToProject(const QString &mat)
{
// TODO: import asset
}
bool ContentLibraryTexturesModel::hasModelSelection() const
{
return m_hasModelSelection;
}
void ContentLibraryTexturesModel::setHasModelSelection(bool b)
{
if (b == m_hasModelSelection)
return;
m_hasModelSelection = b;
emit hasModelSelectionChanged();
}
} // namespace QmlDesigner

View File

@@ -13,12 +13,9 @@ class ContentLibraryTexturesModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(bool matBundleExists READ matBundleExists NOTIFY matBundleExistsChanged)
Q_PROPERTY(bool texBundleExists READ texBundleExists CONSTANT)
Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged)
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged)
Q_PROPERTY(bool hasMaterialRoot READ hasMaterialRoot WRITE setHasMaterialRoot NOTIFY hasMaterialRootChanged)
Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv WRITE setHasSceneEnv NOTIFY hasSceneEnvChanged)
Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged)
public:
ContentLibraryTexturesModel(QObject *parent = nullptr);
@@ -30,18 +27,7 @@ public:
void setSearchText(const QString &searchText);
void setQuick3DImportVersion(int major, int minor);
bool hasQuick3DImport() const;
void setHasQuick3DImport(bool b);
bool hasMaterialRoot() const;
void setHasMaterialRoot(bool b);
bool matBundleExists() const;
bool hasModelSelection() const;
void setHasModelSelection(bool b);
bool texBundleExists() const;
bool hasSceneEnv() const;
void setHasSceneEnv(bool b);
@@ -49,32 +35,21 @@ public:
void resetModel();
void loadTextureBundle(const QString &bundlePath);
Q_INVOKABLE void addToProject(const QString &mat);
signals:
void isEmptyChanged();
void hasQuick3DImportChanged();
void hasModelSelectionChanged();
void hasMaterialRootChanged();
void materialVisibleChanged();
void matBundleExistsChanged();
void hasSceneEnvChanged();
private:
bool isValidIndex(int idx) const;
void updateIsEmpty();
QString m_searchText;
QList<ContentLibraryTexturesCategory *> m_bundleCategories;
bool m_isEmpty = true;
bool m_hasMaterialRoot = false;
bool m_hasQuick3DImport = false;
bool m_texBundleLoaded = false;
bool m_hasModelSelection = false;
bool m_hasSceneEnv = false;
int m_quick3dMajorVersion = -1;
int m_quick3dMinorVersion = -1;
bool m_hasModelSelection = false;
};
} // namespace QmlDesigner

View File

@@ -11,6 +11,7 @@
#include "contentlibrarytexturesmodel.h"
#include "modelnodeoperations.h"
#include "nodelistproperty.h"
#include "qmldesignerconstants.h"
#include "qmlobjectnode.h"
#include "variantproperty.h"
@@ -161,15 +162,18 @@ void ContentLibraryView::modelAttached(Model *model)
m_hasQuick3DImport = model->hasImport("QtQuick3D");
m_widget->materialsModel()->setHasMaterialRoot(rootModelNode().metaInfo().isQtQuick3DMaterial());
m_widget->materialsModel()->setHasQuick3DImport(m_hasQuick3DImport);
updateBundleMaterialsQuick3DVersion();
updateBundleMaterialsImportedState();
const bool hasLibrary = materialLibraryNode().isValid();
m_widget->setHasMaterialLibrary(hasLibrary);
m_widget->setHasQuick3DImport(m_hasQuick3DImport);
}
void ContentLibraryView::modelAboutToBeDetached(Model *model)
{
m_widget->setHasMaterialLibrary(false);
m_widget->setHasQuick3DImport(false);
AbstractView::modelAboutToBeDetached(model);
}
@@ -187,7 +191,7 @@ void ContentLibraryView::importsChanged(const QList<Import> &addedImports, const
return;
m_hasQuick3DImport = hasQuick3DImport;
m_widget->materialsModel()->setHasQuick3DImport(m_hasQuick3DImport);
m_widget->setHasQuick3DImport(m_hasQuick3DImport);
}
void ContentLibraryView::active3DSceneChanged(qint32 sceneId)
@@ -244,6 +248,21 @@ void ContentLibraryView::customNotification(const AbstractView *view, const QStr
}
}
void ContentLibraryView::nodeReparented(const ModelNode &node,
[[maybe_unused]] const NodeAbstractProperty &newPropertyParent,
[[maybe_unused]] const NodeAbstractProperty &oldPropertyParent,
[[maybe_unused]] PropertyChangeFlags propertyChange)
{
if (node.id() == Constants::MATERIAL_LIB_ID)
m_widget->setHasMaterialLibrary(true);
}
void ContentLibraryView::nodeAboutToBeRemoved(const ModelNode &removedNode)
{
if (removedNode.id() == Constants::MATERIAL_LIB_ID)
m_widget->setHasMaterialLibrary(false);
}
void ContentLibraryView::applyBundleMaterialToDropTarget(const ModelNode &bundleMat,
const NodeMetaInfo &metaInfo)
{

View File

@@ -36,6 +36,10 @@ public:
const QList<ModelNode> &lastSelectedNodeList) override;
void customNotification(const AbstractView *view, const QString &identifier,
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent,
const NodeAbstractProperty &oldPropertyParent,
AbstractView::PropertyChangeFlags propertyChange) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
private:
void updateBundleMaterialsImportedState();

View File

@@ -157,6 +157,44 @@ void ContentLibraryWidget::clearSearchFilter()
QMetaObject::invokeMethod(m_quickWidget->rootObject(), "clearSearchFilter");
}
bool ContentLibraryWidget::hasQuick3DImport() const
{
return m_hasQuick3DImport;
}
void ContentLibraryWidget::setHasQuick3DImport(bool b)
{
if (b == m_hasQuick3DImport)
return;
const bool oldRequired = m_materialsModel->hasRequiredQuick3DImport();
m_hasQuick3DImport = b;
const bool newRequired = m_materialsModel->hasRequiredQuick3DImport();
if (oldRequired != newRequired)
emit m_materialsModel->hasRequiredQuick3DImportChanged();
emit hasQuick3DImportChanged();
m_materialsModel->updateIsEmpty();
}
bool ContentLibraryWidget::hasMaterialLibrary() const
{
return m_hasMaterialLibrary;
}
void ContentLibraryWidget::setHasMaterialLibrary(bool b)
{
if (m_hasMaterialLibrary == b)
return;
m_hasMaterialLibrary = b;
emit hasMaterialLibraryChanged();
m_materialsModel->updateIsEmpty();
}
void ContentLibraryWidget::reloadQmlSource()
{
const QString materialBrowserQmlPath = qmlSourcesPath() + "/ContentLibrary.qml";

View File

@@ -23,6 +23,9 @@ class ContentLibraryWidget : public QFrame
{
Q_OBJECT
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport NOTIFY hasQuick3DImportChanged)
Q_PROPERTY(bool hasMaterialLibrary READ hasMaterialLibrary NOTIFY hasMaterialLibraryChanged)
public:
ContentLibraryWidget();
@@ -31,6 +34,12 @@ public:
static QString qmlSourcesPath();
void clearSearchFilter();
bool hasQuick3DImport() const;
void setHasQuick3DImport(bool b);
bool hasMaterialLibrary() const;
void setHasMaterialLibrary(bool b);
Q_INVOKABLE void handleSearchFilterChanged(const QString &filterText);
void setMaterialsModel(QPointer<ContentLibraryMaterialsModel> newMaterialsModel);
@@ -53,6 +62,8 @@ signals:
void bundleTextureDragStarted(QmlDesigner::ContentLibraryTexture *bundleTex);
void addTextureRequested(const QString texPath, QmlDesigner::ContentLibraryWidget::AddTextureMode mode);
void updateSceneEnvStateRequested();
void hasQuick3DImportChanged();
void hasMaterialLibraryChanged();
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
@@ -74,6 +85,9 @@ private:
ContentLibraryMaterial *m_materialToDrag = nullptr;
ContentLibraryTexture *m_textureToDrag = nullptr;
QPoint m_dragStartPoint;
bool m_hasMaterialLibrary = false;
bool m_hasQuick3DImport = false;
};
} // namespace QmlDesigner