Files
work-secretfile-selfcheck/UmiOCR-data/qt_res/qml/Popup_/MessageBoxWin.qml

271 lines
8.9 KiB
QML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ==================================================
// =============== 外部通知弹窗 ===============
// ==================================================
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) // 关闭窗口
}
}
}
}
}