Files
qt-creator/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterial.qml
Samuel Ghinet 77720c1122 Download textures and materials only by clicking the download icon
Previously, clicking the texture thumbnail itself would start the
download.

Also, improved the look of the download icon:
* added a margin to the right
* the inside "arrow" is now black, instead of transparent

Task-number: QDS-9398
Change-Id: I58f958493f1c6072a57402288ea155135909e117
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
2023-03-27 17:59:05 +00:00

220 lines
6.8 KiB
QML

// 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 2.15
import QtQuick.Layouts 1.15
import QtQuickDesignerTheme 1.0
import HelperWidgets 2.0
import QtQuick.Controls
import StudioTheme 1.0 as StudioTheme
import ContentLibraryBackend
import WebFetcher 1.0
Item {
id: root
signal showContextMenu()
// Download states: "" (ie default, not downloaded), "unavailable", "downloading", "downloaded",
// "failed"
property string downloadState: modelData.isDownloaded() ? "downloaded" : ""
visible: modelData.bundleMaterialVisible
MouseArea {
id: mouseArea
enabled: root.downloadState !== "downloading"
hoverEnabled: true
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onPressed: (mouse) => {
if (mouse.button === Qt.LeftButton && !materialsModel.importerRunning) {
if (root.downloadState === "downloaded")
ContentLibraryBackend.rootView.startDragMaterial(modelData, mapToGlobal(mouse.x, mouse.y))
} else if (mouse.button === Qt.RightButton && root.downloadState === "downloaded") {
root.showContextMenu()
}
}
}
Column {
anchors.fill: parent
spacing: 1
Item { width: 1; height: 5 } // spacer
DownloadPane {
id: downloadPane
width: root.width - 10
height: img.width
visible: root.downloadState === "downloading"
onRequestCancel: downloader.cancel()
}
Image {
id: img
width: root.width - 10
height: img.width
anchors.horizontalCenter: parent.horizontalCenter
source: modelData.bundleMaterialIcon
cache: false
visible: root.downloadState != "downloading"
Rectangle { // circular indicator for imported bundle materials
width: 10
height: 10
radius: 5
anchors.right: img.right
anchors.top: img.top
anchors.margins: 5
color: "#00ff00"
border.color: "#555555"
border.width: 1
visible: modelData.bundleMaterialImported
ToolTip {
visible: indicatorMouseArea.containsMouse
text: qsTr("Material is imported to project")
delay: 1000
}
MouseArea {
id: indicatorMouseArea
anchors.fill: parent
hoverEnabled: true
}
}
IconButton {
icon: StudioTheme.Constants.plus
tooltip: qsTr("Add an instance to project")
buttonSize: 22
property color c: StudioTheme.Values.themeIconColor
normalColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .2)
hoverColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .3)
pressColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .4)
anchors.right: img.right
anchors.bottom: img.bottom
enabled: !ContentLibraryBackend.materialsModel.importerRunning
visible: root.downloadState === "downloaded"
&& (containsMouse || mouseArea.containsMouse)
onClicked: {
ContentLibraryBackend.materialsModel.addToProject(modelData)
}
} // IconButton
IconButton {
id: downloadIcon
icon: root.downloadState === "unavailable"
? StudioTheme.Constants.downloadUnavailable
: StudioTheme.Constants.download
iconColor: root.downloadState === "unavailable" || root.downloadState === "failed"
? StudioTheme.Values.themeRedLight
: StudioTheme.Values.themeTextColor
iconSize: 22
iconScale: downloadIcon.containsMouse ? 1.2 : 1
iconStyle: Text.Outline
iconStyleColor: "black"
tooltip: qsTr("Click to download material")
buttonSize: 22
transparentBg: true
anchors.right: parent.right
anchors.bottom: parent.bottom
visible: root.downloadState !== "downloaded"
anchors.bottomMargin: 0
anchors.rightMargin: 4
Rectangle { // arrow fill
anchors.centerIn: parent
z: -1
width: parent.width / 2
height: parent.height / 2
color: "black"
}
onClicked: {
if (root.downloadState !== "" && root.downloadState !== "failed")
return
downloadPane.beginDownload(Qt.binding(function() { return downloader.progress }))
root.downloadState = ""
downloader.start()
}
} // IconButton
} // Image
TextInput {
id: matName
text: modelData.bundleMaterialName
width: img.width
clip: true
anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: TextInput.AlignHCenter
font.pixelSize: StudioTheme.Values.myFontSize
readOnly: true
selectByMouse: !matName.readOnly
color: StudioTheme.Values.themeTextColor
selectionColor: StudioTheme.Values.themeTextSelectionColor
selectedTextColor: StudioTheme.Values.themeTextSelectedTextColor
}
} // Column
MultiFileDownloader {
id: downloader
baseUrl: modelData.bundleMaterialBaseWebUrl
files: modelData.bundleMaterialFiles
targetDirPath: modelData.bundleMaterialParentPath
onDownloadStarting: {
root.downloadState = "downloading"
}
onFinishedChanged: {
downloadPane.endDownload()
root.downloadState = "downloaded"
}
onDownloadCanceled: {
downloadPane.endDownload()
root.downloadState = ""
}
onDownloadFailed: {
downloadPane.endDownload()
root.downloadState = "failed"
}
downloader: FileDownloader {
id: fileDownloader
url: downloader.nextUrl
probeUrl: false
downloadEnabled: true
targetFilePath: downloader.nextTargetPath
} // FileDownloader
} // MultiFileDownloader
}