271 lines
8.9 KiB
QML
271 lines
8.9 KiB
QML
// ==================================================
|
||
// =============== 外部通知弹窗 ===============
|
||
// ==================================================
|
||
|
||
import QtQuick 2.15
|
||
import QtQuick.Controls 2.15
|
||
import QtQuick.Window 2.15
|
||
|
||
import "../Widgets"
|
||
|
||
Item {
|
||
id: messageRoot
|
||
// ========================= 【对外接口】 =========================
|
||
|
||
// 显示一个消息
|
||
function showMessage(title, msg, type) {
|
||
const argd = {
|
||
title:title, msg:msg, type:type
|
||
}
|
||
createWin(winMsg, argd)
|
||
}
|
||
|
||
// 带“不再提示”的消息
|
||
// mid: 唯一标识一个提示
|
||
function showMessageMemory(mid, title, msg, type) {
|
||
// 检查全局设置记忆列表中,是否已记录mid
|
||
const midList = qmlapp.globalConfigs.getValue("window.messageMemory")
|
||
if(midList.includes(mid)) // 已记录则不再弹出
|
||
return
|
||
const argd = {
|
||
mid: mid, title:title, msg:msg, type:type
|
||
}
|
||
createWin(winMsgMemory, argd)
|
||
}
|
||
|
||
// 显示一个双选项对话窗
|
||
function showDialog(title, msg, callback, yesText, noText, type) {
|
||
const argd = {
|
||
title:title, msg:msg, callback:callback, yesText:yesText, noText:noText, type:type
|
||
}
|
||
createWin(winDialog, argd)
|
||
}
|
||
|
||
// 显示一个双选项带倒计时对话窗
|
||
function showDialogCountdown(title, msg, callback, yesText, noText, type, time) {
|
||
const argd = {
|
||
title:title, msg:msg, callback:callback, yesText:yesText, noText:noText, type:type, time:time
|
||
}
|
||
createWin(winDialogCountdown, argd)
|
||
}
|
||
|
||
|
||
// ========================= 【弹窗】 =========================
|
||
|
||
// 主按钮颜色
|
||
function getYesColor(type) {
|
||
switch(type) {
|
||
case "warning":
|
||
case "error":
|
||
return theme.noColor
|
||
default:
|
||
return theme.specialTextColor
|
||
}
|
||
}
|
||
|
||
property var winDict: {}
|
||
// 生成一个弹窗,返回生成ID
|
||
function createWin(winComponent, argd) {
|
||
// 初始化字典
|
||
if(winDict===undefined) winDict={}
|
||
// 生成一个id
|
||
const winId = (Date.now()+Math.random()).toString()
|
||
argd.winId = winId // 添加id
|
||
// 生成组件,计入字典
|
||
const obj = winComponent.createObject(this, argd)
|
||
winDict[winId] = obj
|
||
// 显示遮罩层
|
||
qmlapp.popup.showMask("", winId)
|
||
}
|
||
// 关闭一个弹窗,传入生成ID
|
||
function close(winId) {
|
||
if(winDict.hasOwnProperty(winId)) {
|
||
winDict[winId].destroy()
|
||
}
|
||
// 隐藏遮罩层
|
||
qmlapp.popup.hideMask(winId)
|
||
}
|
||
|
||
// 只有单个确认键的普通消息
|
||
Component {
|
||
id: winMsg
|
||
|
||
FramelessWindow {
|
||
id: win
|
||
property string title: ""
|
||
property string msg: ""
|
||
property string type: ""
|
||
property string winId: ""
|
||
|
||
visible: true
|
||
width: msgComp.width+msgComp.shadowWidth
|
||
height: msgComp.height+msgComp.shadowWidth
|
||
color: "#00000000"
|
||
|
||
// 消息盒组件
|
||
MessageBox {
|
||
id: msgComp
|
||
anchors.centerIn: parent
|
||
title: win.title // 标题
|
||
msg: win.msg // 内容
|
||
type: win.type // 类型
|
||
btnsList: [ // 按钮列表
|
||
{"text": qsTr("确定"), "textColor": theme.specialTextColor, "bgColor": theme.specialBgColor},
|
||
]
|
||
onClosed: win.close // 关闭函数
|
||
}
|
||
|
||
function close() {
|
||
messageRoot.close(winId)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 带“不再提示”的记忆消息
|
||
Component {
|
||
id: winMsgMemory
|
||
|
||
FramelessWindow {
|
||
id: win
|
||
property string title: ""
|
||
property string msg: ""
|
||
property string type: ""
|
||
property string winId: ""
|
||
property string mid: ""
|
||
|
||
visible: true
|
||
width: msgComp.width+msgComp.shadowWidth
|
||
height: msgComp.height+msgComp.shadowWidth
|
||
color: "#00000000"
|
||
|
||
// 消息盒组件
|
||
MessageBox {
|
||
id: msgComp
|
||
anchors.centerIn: parent
|
||
title: win.title // 标题
|
||
msg: win.msg // 内容
|
||
type: win.type // 类型
|
||
btnsList: [ // 按钮列表
|
||
{"text": qsTr("不再提示"), "value": true, "textColor": theme.specialTextColor, "bgColor": theme.specialBgColor},
|
||
{"text": qsTr("知道了"), "value": false, "textColor": theme.subTextColor, "bgColor": theme.bgColor},
|
||
]
|
||
onClosed: (value)=>{
|
||
if(value) {
|
||
// 将mid添加到全局设置记忆列表中
|
||
let midList = qmlapp.globalConfigs.getValue("window.messageMemory")
|
||
midList.push(mid)
|
||
qmlapp.globalConfigs.setValue("window.messageMemory", midList)
|
||
}
|
||
messageRoot.close(winId) // 关闭窗口
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 有两个键(确认/取消)的对话框
|
||
Component {
|
||
id: winDialog
|
||
|
||
FramelessWindow {
|
||
id: win
|
||
property string title: ""
|
||
property string msg: ""
|
||
property string type: ""
|
||
property string winId: ""
|
||
property string yesText: ""
|
||
property string noText: ""
|
||
property var callback // 回调函数
|
||
|
||
visible: true
|
||
width: msgComp.width+msgComp.shadowWidth
|
||
height: msgComp.height+msgComp.shadowWidth
|
||
color: "#00000000"
|
||
|
||
MessageBox {
|
||
id: msgComp
|
||
anchors.centerIn: parent
|
||
title: win.title // 标题
|
||
msg: win.msg // 内容
|
||
type: win.type // 类型
|
||
btnsList: [ // 按钮列表
|
||
// 确认
|
||
{"text": yesText, "value": true, "textColor": messageRoot.getYesColor(win.type), "bgColor": theme.specialBgColor},
|
||
// 取消
|
||
{"text": noText, "value": false, "textColor": theme.subTextColor, "bgColor": theme.bgColor},
|
||
]
|
||
onClosed: (value)=>{
|
||
callback(value)
|
||
messageRoot.close(winId) // 关闭窗口
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 带倒计时的双键对话框
|
||
Component {
|
||
id: winDialogCountdown
|
||
|
||
FramelessWindow {
|
||
id: win
|
||
property string title: ""
|
||
property string msg: ""
|
||
property string type: ""
|
||
property string winId: ""
|
||
property string yesText: ""
|
||
property string yesTextTime: "" // 带倒计时的确定文本
|
||
property string noText: ""
|
||
property int time: 10000
|
||
property int nowTime: 0
|
||
property int interval: 1000
|
||
property var callback // 回调函数
|
||
|
||
visible: true
|
||
width: msgComp.width+msgComp.shadowWidth
|
||
height: msgComp.height+msgComp.shadowWidth
|
||
color: "#00000000"
|
||
|
||
|
||
Component.onCompleted: {
|
||
win.yesTextTime = win.yesText+` (${win.time*0.001})`
|
||
win.nowTime = win.time
|
||
timer.running = true
|
||
}
|
||
|
||
Timer {
|
||
id: timer
|
||
interval: win.interval // 间隔
|
||
running: false
|
||
repeat: true // 重复执行
|
||
onTriggered: {
|
||
win.nowTime -= win.interval
|
||
win.yesTextTime = win.yesText+` (${win.nowTime*0.001})`
|
||
if(win.nowTime<=0) {
|
||
timer.stop() // 停止计时器
|
||
callback(true) // 回调
|
||
messageRoot.close(winId) // 关闭窗口
|
||
return
|
||
}
|
||
}
|
||
}
|
||
|
||
MessageBox {
|
||
id: msgComp
|
||
anchors.centerIn: parent
|
||
title: win.title // 标题
|
||
msg: win.msg // 内容
|
||
type: win.type // 类型
|
||
btnsList: [ // 按钮列表
|
||
// 确认
|
||
{"text": yesTextTime, "value": true, "textColor": messageRoot.getYesColor(win.type), "bgColor": theme.specialBgColor},
|
||
// 取消
|
||
{"text": noText, "value": false, "textColor": theme.subTextColor, "bgColor": theme.bgColor},
|
||
]
|
||
onClosed: (value)=>{
|
||
timer.running = false // 停止计时器
|
||
callback(value)
|
||
messageRoot.close(winId) // 关闭窗口
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |