nosignal-shell/modules/utilities/RecordingDeleteModal.qml
2026-04-22 22:47:18 +10:00

215 lines
7.5 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import QtQuick.Shapes
import Caelestia
import Caelestia.Config
import qs.components
import qs.components.controls
import qs.components.effects
import qs.services
Loader {
id: root
required property var props
required property matrix4x4 deformMatrix
asynchronous: true
anchors.fill: parent
opacity: root.props.recordingConfirmDelete ? 1 : 0
active: opacity > 0
sourceComponent: MouseArea {
id: deleteConfirmation
property string path
Component.onCompleted: path = root.props.recordingConfirmDelete
hoverEnabled: true
onClicked: root.props.recordingConfirmDelete = ""
Item {
anchors.fill: parent
anchors.margins: -Tokens.padding.large
anchors.rightMargin: -Tokens.padding.large - Config.border.thickness
anchors.bottomMargin: -Tokens.padding.large - Config.border.thickness
opacity: 0.5
StyledRect {
anchors.fill: parent
anchors.rightMargin: -parent.width * (1 - root.deformMatrix.m11) / 2 // Additional bit to account for deform
anchors.bottomMargin: -parent.height * 0.1 // Additional bit to account for overshoot
topLeftRadius: Tokens.rounding.extraLarge
color: Colours.palette.m3scrim
}
Shape {
id: shape
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
asynchronous: true
// Bottom left
ShapePath {
startX: -root.Config.border.smoothing * 2
startY: shape.height - root.Config.border.thickness
strokeWidth: 0
fillGradient: LinearGradient {
orientation: LinearGradient.Horizontal
x1: -root.Config.border.smoothing * 2
GradientStop {
position: 0
color: Qt.alpha(Colours.palette.m3scrim, 0)
}
GradientStop {
position: 1
color: Colours.palette.m3scrim
}
}
PathLine {
relativeX: root.Config.border.smoothing
relativeY: 0
}
PathCubic {
relativeX: root.Config.border.smoothing
relativeY: -root.Config.border.smoothing
relativeControl1X: root.Config.border.smoothing * 0.93
relativeControl1Y: -root.Config.border.smoothing * 0.07
relativeControl2X: root.Config.border.smoothing * 0.93
relativeControl2Y: -root.Config.border.smoothing * 0.07
}
PathLine {
relativeX: 0
relativeY: root.Config.border.smoothing + root.Config.border.thickness
}
PathLine {
relativeX: -root.Config.border.smoothing * 2
relativeY: 0
}
}
// Top right curve
ShapePath {
startX: shape.width - root.Config.border.smoothing - root.Config.border.thickness + (1 - root.deformMatrix.m11) * shape.width / 2
strokeWidth: 0
fillGradient: LinearGradient {
orientation: LinearGradient.Vertical
y1: -root.Config.border.smoothing * 2
GradientStop {
position: 0
color: Qt.alpha(Colours.palette.m3scrim, 0)
}
GradientStop {
position: 1
color: Colours.palette.m3scrim
}
}
PathCubic {
relativeX: root.Config.border.smoothing
relativeY: -root.Config.border.smoothing
relativeControl1X: root.Config.border.smoothing * 0.93
relativeControl1Y: -root.Config.border.smoothing * 0.07
relativeControl2X: root.Config.border.smoothing * 0.93
relativeControl2Y: -root.Config.border.smoothing * 0.07
}
PathLine {
relativeX: 0
relativeY: -root.Config.border.smoothing
}
PathLine {
relativeX: root.Config.border.thickness
relativeY: 0
}
PathLine {
relativeX: 0
}
}
}
}
StyledRect {
anchors.centerIn: parent
radius: Tokens.rounding.extraLarge
color: Colours.palette.m3surfaceContainerHigh
scale: 0
Component.onCompleted: scale = Qt.binding(() => root.props.recordingConfirmDelete ? 1 : 0)
width: Math.min(parent.width - Tokens.padding.extraLargeIncreased, implicitWidth)
implicitWidth: deleteConfirmationLayout.implicitWidth + Tokens.padding.extraExtraLarge
implicitHeight: deleteConfirmationLayout.implicitHeight + Tokens.padding.extraExtraLarge
MouseArea {
anchors.fill: parent
}
Elevation {
anchors.fill: parent
radius: parent.radius
z: -1
level: 3
}
ColumnLayout {
id: deleteConfirmationLayout
anchors.fill: parent
anchors.margins: Tokens.padding.large * 1.5
spacing: Tokens.spacing.medium
StyledText {
text: qsTr("Delete recording?")
font: Tokens.font.body.large
}
StyledText {
Layout.fillWidth: true
text: qsTr("Recording '%1' will be permanently deleted.").arg(deleteConfirmation.path)
color: Colours.palette.m3onSurfaceVariant
font: Tokens.font.body.small
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
}
RowLayout {
Layout.topMargin: Tokens.spacing.medium
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.medium
TextButton {
text: qsTr("Cancel")
type: TextButton.Text
onClicked: root.props.recordingConfirmDelete = ""
}
TextButton {
text: qsTr("Delete")
type: TextButton.Text
onClicked: {
CUtils.deleteFile(Qt.resolvedUrl(root.props.recordingConfirmDelete));
root.props.recordingConfirmDelete = "";
}
}
}
}
Behavior on scale {
Anim {
type: Anim.DefaultSpatial
}
}
}
}
Behavior on opacity {
Anim {}
}
}