Files
qt-creator/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml

157 lines
5.0 KiB
QML
Raw Normal View History

// 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 StudioTheme 1.0 as StudioTheme
import MaterialBrowserBackend
Rectangle {
id: root
signal showContextMenu()
function refreshPreview()
{
img.source = ""
img.source = "image://materialBrowser/" + materialInternalId
}
function startRename()
{
matName.readOnly = false
matName.selectAll()
matName.forceActiveFocus()
matName.ensureVisible(matName.text.length)
nameMouseArea.enabled = false
}
function commitRename()
{
if (matName.readOnly)
return;
MaterialBrowserBackend.materialBrowserModel.renameMaterial(index, matName.text);
mouseArea.forceActiveFocus()
}
border.width: MaterialBrowserBackend.materialBrowserModel.selectedIndex === index ? MaterialBrowserBackend.rootView.materialSectionFocused ? 3 : 1 : 0
border.color: MaterialBrowserBackend.materialBrowserModel.selectedIndex === index
? StudioTheme.Values.themeControlOutlineInteraction
: "transparent"
color: "transparent"
visible: materialVisible
DropArea {
anchors.fill: parent
onEntered: (drag) => {
drag.accepted = drag.formats[0] === "application/vnd.qtdesignstudio.texture"
|| drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture"
|| (drag.formats[0] === "application/vnd.qtdesignstudio.assets"
&& rootView.hasAcceptableAssets(drag.urls))
}
onDropped: (drag) => {
drag.accept()
if (drag.formats[0] === "application/vnd.qtdesignstudio.texture")
MaterialBrowserBackend.rootView.acceptTextureDropOnMaterial(index, drag.getDataAsString(drag.keys[0]))
else if (drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture")
MaterialBrowserBackend.rootView.acceptBundleTextureDropOnMaterial(index, drag.urls[0])
else if (drag.formats[0] === "application/vnd.qtdesignstudio.assets")
MaterialBrowserBackend.rootView.acceptAssetsDropOnMaterial(index, drag.urls)
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onPressed: (mouse) => {
MaterialBrowserBackend.materialBrowserModel.selectMaterial(index)
MaterialBrowserBackend.rootView.focusMaterialSection(true)
if (mouse.button === Qt.LeftButton)
MaterialBrowserBackend.rootView.startDragMaterial(index, mapToGlobal(mouse.x, mouse.y))
else if (mouse.button === Qt.RightButton)
root.showContextMenu()
}
onDoubleClicked: MaterialBrowserBackend.materialBrowserModel.openMaterialEditor();
}
Column {
anchors.fill: parent
spacing: 1
Item { width: 1; height: 5 } // spacer
Image {
id: img
width: root.width - 10
height: img.width
anchors.horizontalCenter: parent.horizontalCenter
source: "image://materialBrowser/" + materialInternalId
cache: false
}
// Eat keys so they are not passed to parent while editing name
Keys.onPressed: (e) => {
e.accepted = true;
}
TextInput {
id: matName
text: materialName
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
// allow only alphanumeric characters, underscores, no space at start, and 1 space between words
validator: RegExpValidator { regExp: /^(\w+\s)*\w+$/ }
onEditingFinished: root.commitRename()
onActiveFocusChanged: {
if (!activeFocus) {
matName.readOnly = true
nameMouseArea.enabled = true
ensureVisible(0)
}
}
Component.onCompleted: ensureVisible(0)
MouseArea {
id: nameMouseArea
anchors.fill: parent
onClicked: {
MaterialBrowserBackend.materialBrowserModel.selectMaterial(index)
MaterialBrowserBackend.rootView.focusMaterialSection(true)
}
onDoubleClicked: root.startRename()
}
}
}
}