forked from qt-creator/qt-creator
Fixes: QDS-10625 Change-Id: I48ef68fd4b64a37de3dc60f5decfcda1b43496dc Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Amr Elsayed <amr.elsayed@qt.io> Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
153 lines
4.9 KiB
QML
153 lines
4.9 KiB
QML
// Copyright (C) 2023 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 EffectMakerBackend
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property var draggedSec: null
|
|
property var secsY: []
|
|
property int moveFromIdx: 0
|
|
property int moveToIdx: 0
|
|
|
|
Column {
|
|
id: col
|
|
anchors.fill: parent
|
|
spacing: 1
|
|
|
|
EffectMakerTopBar {
|
|
|
|
}
|
|
|
|
EffectMakerPreview {
|
|
mainRoot: root
|
|
}
|
|
|
|
Rectangle {
|
|
width: parent.width
|
|
height: StudioTheme.Values.toolbarHeight
|
|
color: StudioTheme.Values.themeToolbarBackground
|
|
|
|
EffectNodesComboBox {
|
|
mainRoot: root
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
HelperWidgets.AbstractButton {
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: 5
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
style: StudioTheme.Values.viewBarButtonStyle
|
|
buttonIcon: StudioTheme.Constants.code
|
|
tooltip: qsTr("Open Shader in Code Editor")
|
|
|
|
onClicked: {} // TODO
|
|
}
|
|
}
|
|
|
|
HelperWidgets.ScrollView {
|
|
id: scrollView
|
|
|
|
width: parent.width
|
|
height: parent.height - y
|
|
clip: true
|
|
|
|
Column {
|
|
width: scrollView.width
|
|
spacing: 1
|
|
|
|
Repeater {
|
|
id: repeater
|
|
|
|
width: root.width
|
|
model: EffectMakerBackend.effectMakerModel
|
|
|
|
onCountChanged: {
|
|
HelperWidgets.Controller.setCount("EffectMaker", repeater.count)
|
|
}
|
|
|
|
delegate: EffectCompositionNode {
|
|
width: root.width
|
|
|
|
Behavior on y {
|
|
PropertyAnimation {
|
|
duration: 300
|
|
easing.type: Easing.InOutQuad
|
|
}
|
|
}
|
|
|
|
onStartDrag: (section) => {
|
|
root.draggedSec = section
|
|
root.moveFromIdx = index
|
|
|
|
highlightBorder = true
|
|
|
|
root.secsY = []
|
|
for (let i = 0; i < repeater.count; ++i)
|
|
root.secsY[i] = repeater.itemAt(i).y
|
|
}
|
|
|
|
onStopDrag: {
|
|
if (root.moveFromIdx === root.moveToIdx)
|
|
root.draggedSec.y = root.secsY[root.moveFromIdx]
|
|
else
|
|
EffectMakerBackend.effectMakerModel.moveNode(root.moveFromIdx, root.moveToIdx)
|
|
|
|
highlightBorder = false
|
|
root.draggedSec = null
|
|
}
|
|
}
|
|
} // Repeater
|
|
|
|
Timer {
|
|
running: root.draggedSec
|
|
interval: 50
|
|
repeat: true
|
|
|
|
onTriggered: {
|
|
root.moveToIdx = root.moveFromIdx
|
|
for (let i = 0; i < repeater.count; ++i) {
|
|
let currItem = repeater.itemAt(i)
|
|
if (i > root.moveFromIdx) {
|
|
if (root.draggedSec.y > currItem.y + (currItem.height - root.draggedSec.height) * .5) {
|
|
currItem.y = root.secsY[i] - root.draggedSec.height
|
|
root.moveToIdx = i
|
|
} else {
|
|
currItem.y = root.secsY[i]
|
|
}
|
|
} else if (i < root.moveFromIdx) {
|
|
if (root.draggedSec.y < currItem.y + (currItem.height - root.draggedSec.height) * .5) {
|
|
currItem.y = root.secsY[i] + root.draggedSec.height
|
|
root.moveToIdx = Math.min(root.moveToIdx, i)
|
|
} else {
|
|
currItem.y = root.secsY[i]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} // Timer
|
|
} // Column
|
|
} // ScrollView
|
|
}
|
|
|
|
Text {
|
|
id: emptyText
|
|
|
|
text: qsTr("Add an effect node to start")
|
|
color: StudioTheme.Values.themeTextColor
|
|
font.pixelSize: StudioTheme.Values.baseFontSize
|
|
|
|
x: scrollView.x + (scrollView.width - emptyText.width) * .5
|
|
y: scrollView.y + scrollView.height * .5
|
|
|
|
visible: EffectMakerBackend.effectMakerModel.isEmpty
|
|
}
|
|
}
|