status-desktop/ui/imports/shared/panels/ModuleWarning.qml

191 lines
4.6 KiB
QML

import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import QtGraphicalEffects 1.13
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import utils 1.0
import "../"
import "./"
Item {
id: root
objectName: "moduleWarningBanner"
enum Type {
Danger,
Success
}
property bool active: false
property int type: ModuleWarning.Danger
property string text: ""
property alias buttonText: button.text
signal clicked()
signal closeClicked()
signal showStarted()
signal showFinihsed()
signal hideStarted()
signal hideFinished()
function show() {
hideTimer.stop()
active = true;
}
function showFor(duration = 5000) {
show();
hide(duration);
}
function hide(timeout = 0) {
hideTimer.interval = timeout
hideTimer.start()
}
function close() {
closeButtonMouseArea.clicked(null)
}
implicitHeight: root.active ? content.implicitHeight : 0
visible: implicitHeight > 0
onActiveChanged: {
active ? showAnimation.start() : hideAnimation.start()
}
NumberAnimation {
id: showAnimation
target: root
property: "implicitHeight"
from: 0
to: content.implicitHeight
duration: 500
easing.type: Easing.OutCubic
onStarted: {
root.showStarted()
}
onFinished: {
root.showFinihsed()
}
}
NumberAnimation {
id: hideAnimation
target: root
property: "implicitHeight"
to: 0
from: content.implicitHeight
duration: 500
easing.type: Easing.OutCubic
onStarted: {
root.hideStarted()
}
onFinished: {
root.hideFinished()
}
}
Timer {
id: hideTimer
repeat: false
running: false
onTriggered: {
root.active = false
}
}
Rectangle {
id: content
anchors.bottom: parent.bottom
width: parent.width
implicitHeight: 32
readonly property color baseColor: {
switch (root.type) {
case ModuleWarning.Danger: return Theme.palette.dangerColor1
case ModuleWarning.Success: return Theme.palette.successColor1
default: return Theme.palette.baseColor1
}
}
color: baseColor
Behavior on color {
ColorAnimation {
duration: 150
}
}
RowLayout {
id: layout
spacing: 12
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
StatusBaseText {
text: root.text
Layout.alignment: Qt.AlignVCenter
font.pixelSize: 13
color: Theme.palette.indirectColor1
}
Button {
id: button
visible: text != ""
padding: 5
onClicked: {
root.clicked()
}
contentItem: Text {
text: button.text
font.pixelSize: 12
font.weight: Font.Medium
font.family: Style.current.baseFont.name
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: Theme.palette.indirectColor1
}
background: Rectangle {
radius: 4
border.width: 1
border.color: Theme.palette.indirectColor3
color: Theme.palette.getColor("white", button.hovered ? 0.4 : 0.1)
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.NoButton
cursorShape: Qt.PointingHandCursor
}
}
}
StatusIcon {
id: closeImg
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 18
height: 20
width: 20
icon: "close-circle"
color: Theme.palette.indirectColor1
opacity: closeButtonMouseArea.containsMouse ? 1 : 0.7
MouseArea {
id: closeButtonMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
root.closeClicked()
}
}
}
}
}