// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 import QtQuick import HelperWidgets as HelperWidgets import StudioControls as StudioControls import StudioTheme as StudioTheme import ContentLibraryBackend HelperWidgets.ScrollView { id: root clip: true interactive: !ctxMenu.opened && !ContentLibraryBackend.rootView.isDragging && !HelperWidgets.Controller.contextMenuOpened property real cellWidth: 100 property real cellHeight: 120 property int numColumns: 4 property int count: 0 function assignMaxCount() { let c = 0 for (let i = 0; i < categoryRepeater.count; ++i) c = Math.max(c, categoryRepeater.itemAt(i)?.count ?? 0) root.count = c } property var materialsModel: ContentLibraryBackend.materialsModel required property var searchBox signal unimport(var bundleMat) function closeContextMenu() { ctxMenu.close() } function expandVisibleSections() { for (let i = 0; i < categoryRepeater.count; ++i) { let cat = categoryRepeater.itemAt(i) if (cat.visible && !cat.expanded) cat.expandSection() } } Column { ContentLibraryItemContextMenu { id: ctxMenu onApplyToSelected: (add) => root.materialsModel.applyToSelected(ctxMenu.targetItem, add) onUnimport: root.unimport(ctxMenu.targetItem) onAddToProject: root.materialsModel.addToProject(ctxMenu.targetItem) } Repeater { id: categoryRepeater model: root.materialsModel delegate: HelperWidgets.Section { id: section width: root.width leftPadding: StudioTheme.Values.sectionPadding rightPadding: StudioTheme.Values.sectionPadding topPadding: StudioTheme.Values.sectionPadding bottomPadding: StudioTheme.Values.sectionPadding caption: bundleCategoryName visible: bundleCategoryVisible && !root.materialsModel.isEmpty expanded: bundleCategoryExpanded expandOnClick: false category: "ContentLib_Mat" onToggleExpand: bundleCategoryExpanded = !bundleCategoryExpanded onExpand: bundleCategoryExpanded = true onCollapse: bundleCategoryExpanded = false function expandSection() { bundleCategoryExpanded = true } property alias count: repeater.count onCountChanged: root.assignMaxCount() Grid { width: section.width - section.leftPadding - section.rightPadding spacing: StudioTheme.Values.sectionGridSpacing columns: root.numColumns Repeater { id: repeater model: bundleCategoryMaterials delegate: ContentLibraryMaterial { width: root.cellWidth height: root.cellHeight onShowContextMenu: ctxMenu.popupMenu(modelData) onAddToProject: root.materialsModel.addToProject(modelData) } onCountChanged: root.assignMaxCount() } } } } Text { id: infoText text: { if (!ContentLibraryBackend.rootView.isQt6Project) qsTr("Content Library materials are not supported in Qt5 projects.") else if (!ContentLibraryBackend.rootView.hasQuick3DImport) qsTr("To use Content Library, first add the QtQuick3D module in the Components view.") else if (!root.materialsModel.hasRequiredQuick3DImport) qsTr("To use Content Library, version 6.3 or later of the QtQuick3D module is required.") else if (!ContentLibraryBackend.rootView.hasMaterialLibrary) qsTr("Content Library is disabled inside a non-visual component.") else if (!root.materialsModel.bundleExists) qsTr("No materials available. Make sure you have an internet connection.") else if (!searchBox.isEmpty()) qsTr("No match found.") else "" } color: StudioTheme.Values.themeTextColor font.pixelSize: StudioTheme.Values.baseFontSize topPadding: 10 leftPadding: 10 visible: root.materialsModel.isEmpty wrapMode: Text.WordWrap width: root.width - x } } }