186 lines
6.1 KiB
QML
186 lines
6.1 KiB
QML
|
|
// ==================================================
|
|||
|
|
// =============== 简单通知弹窗 ===============
|
|||
|
|
// =============== 无确认,计时自动消失 ===============
|
|||
|
|
// ==================================================
|
|||
|
|
|
|||
|
|
import QtQuick 2.15
|
|||
|
|
import QtQuick.Controls 2.15
|
|||
|
|
import QtGraphicalEffects 1.15 // 阴影
|
|||
|
|
import QtQuick.Window 2.15
|
|||
|
|
|
|||
|
|
import "../Widgets"
|
|||
|
|
|
|||
|
|
Item {
|
|||
|
|
// ========================= 【对外接口】 =========================
|
|||
|
|
|
|||
|
|
function show(title, msg, showType) {
|
|||
|
|
if(showType=="default") {
|
|||
|
|
showType = qmlapp.globalConfigs.getValue("window.simpleNotificationType")
|
|||
|
|
}
|
|||
|
|
if(showType=="none") {
|
|||
|
|
return // 不发送
|
|||
|
|
}
|
|||
|
|
const time = 3000
|
|||
|
|
// 强制发送外部
|
|||
|
|
if(showType=="onlyOutside") {
|
|||
|
|
notificationWindow.show(title, msg, time)
|
|||
|
|
}
|
|||
|
|
// 主窗口可见,发送内部
|
|||
|
|
else if(qmlapp.mainWin.getVisibility()) {
|
|||
|
|
if(showType=="inside" || showType=="onlyInside") {
|
|||
|
|
notificationPopup.show(title, msg, time)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 主窗口不可见,发送外部
|
|||
|
|
else {
|
|||
|
|
if(showType=="inside") {
|
|||
|
|
// 发送外部通知
|
|||
|
|
notificationWindow.show(title, msg, time)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ========================= 【内部模式】 =========================
|
|||
|
|
|
|||
|
|
Popup {
|
|||
|
|
id: notificationPopup
|
|||
|
|
|
|||
|
|
// 显示通知弹窗
|
|||
|
|
function show(title, msg, time=3000) {
|
|||
|
|
if(opened) { // 已打开,则先关闭
|
|||
|
|
close()
|
|||
|
|
}
|
|||
|
|
nscPopup.show(title, msg, time) // 传入信息
|
|||
|
|
open() // 开始
|
|||
|
|
if(!qmlapp.enabledEffect) { // 无动画时,瞬间出现
|
|||
|
|
nscPopup.y = showY
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 隐藏通知弹窗
|
|||
|
|
function hide() {
|
|||
|
|
close()
|
|||
|
|
}
|
|||
|
|
// 属性
|
|||
|
|
padding: 0
|
|||
|
|
property real showY: -nscPopup.height*1.5
|
|||
|
|
modal: false // 非模态层(不阻挡下方)
|
|||
|
|
parent: Overlay.overlay
|
|||
|
|
x: Math.round((parent.width - width) / 2)
|
|||
|
|
y: Math.round((parent.height - height))
|
|||
|
|
closePolicy: Popup.NoAutoClose // 不被系统关闭
|
|||
|
|
// 组件
|
|||
|
|
MessageSimpleComp {
|
|||
|
|
id: nscPopup
|
|||
|
|
onHided: notificationPopup.hide // 关闭事件
|
|||
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|||
|
|
y: notificationPopup.showY
|
|||
|
|
}
|
|||
|
|
// 进入动画
|
|||
|
|
enter: qmlapp.enabledEffect ? enterAnimePop : null
|
|||
|
|
Transition {
|
|||
|
|
id: enterAnimePop
|
|||
|
|
NumberAnimation {
|
|||
|
|
target: nscPopup
|
|||
|
|
property: "y"
|
|||
|
|
duration: 200
|
|||
|
|
from: 0
|
|||
|
|
to: notificationPopup.showY
|
|||
|
|
easing.type: Easing.OutCubic
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 关闭动画
|
|||
|
|
exit: qmlapp.enabledEffect ? exitAnimePop : null
|
|||
|
|
Transition {
|
|||
|
|
id: exitAnimePop
|
|||
|
|
NumberAnimation {
|
|||
|
|
target: nscPopup
|
|||
|
|
property: "y"
|
|||
|
|
duration: 200
|
|||
|
|
from: notificationPopup.showY
|
|||
|
|
to: 0
|
|||
|
|
easing.type: Easing.InCubic
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ========================= 【外部模式】 =========================
|
|||
|
|
|
|||
|
|
Window {
|
|||
|
|
id: notificationWindow
|
|||
|
|
|
|||
|
|
/* TODO
|
|||
|
|
当:主窗口初始隐藏,弹出通知弹窗,隐藏通知弹窗,恢复主窗口。会报错:
|
|||
|
|
Conflicting properties 'visible' and 'visibility' for Window 'notificationWindow'
|
|||
|
|
似乎不影响使用,待调查。
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// 显示通知弹窗
|
|||
|
|
function show(title, msg, time) {
|
|||
|
|
let screenWidth = Screen.width
|
|||
|
|
let screenHeight = Screen.height
|
|||
|
|
x = (screenWidth - width) / 2 // 水平居中
|
|||
|
|
nscWindow.show(title, msg, time) // 传入信息
|
|||
|
|
if(qmlapp.enabledEffect) { // 出现动画
|
|||
|
|
enterAnimeWin.start()
|
|||
|
|
}
|
|||
|
|
else { // 无动画时,y瞬间出现
|
|||
|
|
y = screenHeight-showY
|
|||
|
|
}
|
|||
|
|
visible = true
|
|||
|
|
visibility = Window.Windowed
|
|||
|
|
}
|
|||
|
|
// 隐藏通知弹窗
|
|||
|
|
function hide() {
|
|||
|
|
if(qmlapp.enabledEffect) { // 关闭动画
|
|||
|
|
exitAnimeWin.start()
|
|||
|
|
}
|
|||
|
|
else { // 无动画时,瞬间关闭
|
|||
|
|
visible = false
|
|||
|
|
visibility = Window.Hidden
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 属性
|
|||
|
|
property real showY: nscWindow.height+100 // 显示位置高度
|
|||
|
|
visible: false
|
|||
|
|
flags: Qt.Popup | Qt.NoDropShadowWindowHint | Qt.WindowStaysOnTopHint // 弹出式,无阴影,置顶
|
|||
|
|
color: "#00000000"
|
|||
|
|
width: nscWindow.width+nscWindow.shadowWidth // 长宽要加上阴影宽度
|
|||
|
|
height: nscWindow.height+nscWindow.shadowWidth
|
|||
|
|
Component.onCompleted: y=Screen.height-showY // 初始y值,防止theme未加载导致第一次调用异常
|
|||
|
|
MessageSimpleComp {
|
|||
|
|
id: nscWindow
|
|||
|
|
anchors.centerIn: parent
|
|||
|
|
onHided: notificationWindow.hide // 关闭事件
|
|||
|
|
}
|
|||
|
|
// 进入动画
|
|||
|
|
ParallelAnimation {
|
|||
|
|
id: enterAnimeWin
|
|||
|
|
running: false
|
|||
|
|
NumberAnimation {
|
|||
|
|
target: notificationWindow
|
|||
|
|
property: "y"
|
|||
|
|
duration: 200
|
|||
|
|
from: Screen.height
|
|||
|
|
to: Screen.height-notificationWindow.showY
|
|||
|
|
easing.type: Easing.OutCubic
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 关闭动画
|
|||
|
|
ParallelAnimation {
|
|||
|
|
id: exitAnimeWin
|
|||
|
|
running: false
|
|||
|
|
onStopped: {
|
|||
|
|
notificationWindow.visible = false
|
|||
|
|
notificationWindow.visibility = Window.Hidden
|
|||
|
|
}
|
|||
|
|
NumberAnimation {
|
|||
|
|
target: notificationWindow
|
|||
|
|
property: "y"
|
|||
|
|
duration: 200
|
|||
|
|
from: Screen.height-notificationWindow.showY
|
|||
|
|
to: Screen.height
|
|||
|
|
easing.type: Easing.InCubic
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|