1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-11-25 20:22:39 +01:00
ScreenPlay/ScreenPlayWorkshop/qml/ScreenPlayItem.qml
2023-02-02 15:25:26 +01:00

302 lines
6.7 KiB
QML

import QtQuick
import Qt5Compat.GraphicalEffects
import QtQuick.Controls
Item {
id: screenPlayItem
property alias checkBox: checkBox
property string preview: screenPreview
property bool isSelected: false
property string absoluteStoragePath
property string type
property bool hasMenuOpen: false
property var publishedFileID: 0
property int itemIndex
property string folderName
signal itemClicked(var folderName, var type, var isActive)
width: 320
height: 180
state: "invisible"
opacity: 0
onTypeChanged: {
if (type === "widget")
icnType.source = "icons/icon_widgets.svg";
else if (type === "qmlScene")
icnType.source = "icons/icon_code.svg";
}
Component.onCompleted: {
screenPlayItem.state = "visible";
}
transform: [
Rotation {
id: rt
origin.x: width * 0.5
origin.y: height * 0.5
angle: 0
axis {
x: -0.5
y: 0
z: 0
}
},
Translate {
id: tr
},
Scale {
id: sc
origin.x: width * 0.5
origin.y: height * 0.5
}
]
Timer {
id: timerAnim
interval: 40 * itemIndex * Math.random()
running: true
repeat: false
onTriggered: showAnim.start()
}
ParallelAnimation {
id: showAnim
running: false
RotationAnimation {
target: rt
from: 90
to: 0
duration: 500
easing.type: Easing.OutQuint
property: "angle"
}
PropertyAnimation {
target: screenPlayItem
from: 0
to: 1
duration: 500
easing.type: Easing.OutQuint
property: "opacity"
}
PropertyAnimation {
target: tr
from: 80
to: 0
duration: 500
easing.type: Easing.OutQuint
property: "y"
}
PropertyAnimation {
target: sc
from: 0.8
to: 1
duration: 500
easing.type: Easing.OutQuint
properties: "xScale,yScale"
}
}
RectangularGlow {
id: effect
height: parent.height
width: parent.width
cached: true
glowRadius: 3
spread: 0.2
color: "black"
opacity: 0.4
cornerRadius: 15
anchors {
top: parent.top
topMargin: 3
}
}
Item {
id: screenPlayItemWrapper
anchors.centerIn: parent
height: 180
width: 320
Image {
id: mask
source: "qrc:/qml/ScreenPlayWorkshop/assets/images/window.svg"
sourceSize: Qt.size(screenPlayItem.width, screenPlayItem.height)
visible: false
smooth: true
fillMode: Image.PreserveAspectFit
}
Item {
id: itemWrapper
anchors.fill: parent
visible: false
ScreenPlayItemImage {
id: screenPlayItemImage
anchors.fill: parent
sourceImage: Qt.resolvedUrl(screenPlayItem.absoluteStoragePath + "/" + screenPreview)
}
Image {
id: icnType
width: 20
height: 20
opacity: 0
sourceSize: Qt.size(20, 20)
anchors {
top: parent.top
left: parent.left
margins: 10
}
}
Rectangle {
color: "#AAffffff"
height: 30
visible: false
anchors {
right: parent.right
left: parent.left
bottom: parent.bottom
}
}
}
OpacityMask {
anchors.fill: itemWrapper
source: itemWrapper
maskSource: mask
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
onEntered: {
if (!hasMenuOpen)
screenPlayItem.state = "hover";
}
onExited: {
if (!hasMenuOpen)
screenPlayItem.state = "visible";
}
onClicked: {
checkBox.toggle();
if (mouse.button === Qt.LeftButton)
itemClicked(screenId, type, checkBox.checkState === Qt.Checked);
}
}
}
CheckBox {
id: checkBox
onCheckStateChanged: {
if (checkState == Qt.Checked)
isSelected = true;
else
isSelected = false;
}
anchors {
top: parent.top
right: parent.right
margins: 10
}
}
}
states: [
State {
name: "invisible"
PropertyChanges {
target: screenPlayItemWrapper
y: -10
opacity: 0
}
PropertyChanges {
target: effect
opacity: 0
}
},
State {
name: "visible"
PropertyChanges {
target: effect
opacity: 0.4
}
PropertyChanges {
target: screenPlayItemWrapper
y: 0
opacity: 1
}
PropertyChanges {
target: screenPlayItem
width: 320
height: 180
}
PropertyChanges {
target: icnType
opacity: 0
}
},
State {
name: "selected"
PropertyChanges {
target: screenPlayItemWrapper
y: 0
opacity: 1
}
PropertyChanges {
target: icnType
opacity: 0.5
}
}
]
transitions: [
Transition {
from: "invisible"
to: "visible"
},
Transition {
from: "visible"
to: "selected"
reversible: true
PropertyAnimation {
target: icnType
property: "opacity"
duration: 80
}
}
]
}