添加退出确认 (#174)

This commit is contained in:
orz12 2023-06-06 12:16:07 +08:00 committed by GitHub
parent bbaa8a0235
commit 81440000b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 181 additions and 160 deletions

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick import QtQuick
import QtQuick.Dialogs
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Window import QtQuick.Window
import "Logic.js" as Logic import "Logic.js" as Logic
@ -17,172 +18,173 @@ Window {
property var callbacks: Logic.callbacks property var callbacks: Logic.callbacks
property var tipList: [] property var tipList: []
Item {
id: mainWindow
width: (parent.width / parent.height < 960 / 540)
? 960 : 540 * parent.width / parent.height
height: (parent.width / parent.height > 960 / 540)
? 540 : 960 * parent.height / parent.width
scale: parent.width / width
anchors.centerIn: parent
property bool is_pending: false
property var pending_message: []
Config {
id: config
}
Image {
source: config.lobbyBg
anchors.fill: parent
fillMode: Image.PreserveAspectCrop
}
FontLoader { id: fontLibian; source: AppPath + "/fonts/FZLBGBK.ttf" }
FontLoader { id: fontLi2; source: AppPath + "/fonts/FZLE.ttf" }
StackView {
id: mainStack
visible: !mainWindow.busy
// If error occurs during loading initialItem, the program will fall into "polish()" loop
// initialItem: init
anchors.fill: parent
}
Component { id: init; Init {} }
Component { id: packageManage; PackageManage {} }
Component { id: modMaker; ModMaker {} }
Component { id: lobby; Lobby {} }
Component { id: generalsOverview; GeneralsOverview {} }
Component { id: cardsOverview; CardsOverview {} }
Component { id: modesOverview; ModesOverview {} }
Component { id: room; Room {} }
Component { id: aboutPage; About {} }
property var generalsOverviewPage
property var cardsOverviewPage
property alias modesOverviewPage: modesOverview
property alias aboutPage: aboutPage
property bool busy: false
property string busyText: ""
onBusyChanged: busyText = "";
BusyIndicator {
id: busyIndicator
running: true
anchors.centerIn: parent
visible: mainWindow.busy === true
}
Text {
anchors.top: busyIndicator.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 8
visible: mainWindow.busy === true
property int idx: 1
text: tipList[idx - 1] ?? ""
color: "#F0E5DA"
font.pixelSize: 20
font.family: fontLibian.name
style: Text.Outline
styleColor: "#3D2D1C"
textFormat: Text.RichText
width: parent.width * 0.7
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WrapAnywhere
onVisibleChanged: idx = 0;
Timer {
running: parent.visible
interval: 3600
repeat: true
onTriggered: {
const oldIdx = parent.idx;
while (parent.idx === oldIdx) {
parent.idx = Math.floor(Math.random() * tipList.length) + 1;
}
}
}
}
Item { Item {
visible: mainWindow.busy === true && mainWindow.busyText !== "" id: mainWindow
anchors.bottom: parent.bottom width: (parent.width / parent.height < 960 / 540)
height: 32 ? 960 : 540 * parent.width / parent.height
width: parent.width height: (parent.width / parent.height > 960 / 540)
Rectangle { ? 540 : 960 * parent.height / parent.width
anchors.fill: parent scale: parent.width / width
color: "#88EEEEEE"
}
Text {
anchors.centerIn: parent
text: mainWindow.busyText
font.pixelSize: 24
}
}
Popup {
id: errDialog
property string txt: ""
modal: true
anchors.centerIn: parent anchors.centerIn: parent
width: Math.min(contentWidth + 24, realMainWin.width * 0.9) property bool is_pending: false
height: Math.min(contentHeight + 24, realMainWin.height * 0.9) property var pending_message: []
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
padding: 12
contentItem: Text {
text: errDialog.txt
wrapMode: Text.WordWrap
TapHandler { Config {
onTapped: errDialog.close(); id: config
}
} }
}
ToastManager { Image {
id: toast source: config.lobbyBg
} anchors.fill: parent
fillMode: Image.PreserveAspectCrop
}
Connections { FontLoader { id: fontLibian; source: AppPath + "/fonts/FZLBGBK.ttf" }
target: Backend FontLoader { id: fontLi2; source: AppPath + "/fonts/FZLE.ttf" }
function onNotifyUI(command, jsonData) {
if (command === "ErrorDialog") { StackView {
errDialog.txt = jsonData; id: mainStack
errDialog.open(); visible: !mainWindow.busy
return; // If error occurs during loading initialItem, the program will fall into "polish()" loop
} // initialItem: init
if (mainWindow.is_pending && command !== "ChangeSelf") { anchors.fill: parent
mainWindow.pending_message.push({ command: command, jsonData: jsonData }); }
} else {
if (command === "StartChangeSelf") { Component { id: init; Init {} }
mainWindow.is_pending = true; Component { id: packageManage; PackageManage {} }
Component { id: modMaker; ModMaker {} }
Component { id: lobby; Lobby {} }
Component { id: generalsOverview; GeneralsOverview {} }
Component { id: cardsOverview; CardsOverview {} }
Component { id: modesOverview; ModesOverview {} }
Component { id: room; Room {} }
Component { id: aboutPage; About {} }
property var generalsOverviewPage
property var cardsOverviewPage
property alias modesOverviewPage: modesOverview
property alias aboutPage: aboutPage
property bool busy: false
property string busyText: ""
onBusyChanged: busyText = "";
property bool closing: false
BusyIndicator {
id: busyIndicator
running: true
anchors.centerIn: parent
visible: mainWindow.busy === true
}
Text {
anchors.top: busyIndicator.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 8
visible: mainWindow.busy === true
property int idx: 1
text: tipList[idx - 1] ?? ""
color: "#F0E5DA"
font.pixelSize: 20
font.family: fontLibian.name
style: Text.Outline
styleColor: "#3D2D1C"
textFormat: Text.RichText
width: parent.width * 0.7
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WrapAnywhere
onVisibleChanged: idx = 0;
Timer {
running: parent.visible
interval: 3600
repeat: true
onTriggered: {
const oldIdx = parent.idx;
while (parent.idx === oldIdx) {
parent.idx = Math.floor(Math.random() * tipList.length) + 1;
}
} }
mainWindow.handleMessage(command, jsonData); }
}
Item {
visible: mainWindow.busy === true && mainWindow.busyText !== ""
anchors.bottom: parent.bottom
height: 32
width: parent.width
Rectangle {
anchors.fill: parent
color: "#88EEEEEE"
}
Text {
anchors.centerIn: parent
text: mainWindow.busyText
font.pixelSize: 24
}
}
Popup {
id: errDialog
property string txt: ""
modal: true
anchors.centerIn: parent
width: Math.min(contentWidth + 24, realMainWin.width * 0.9)
height: Math.min(contentHeight + 24, realMainWin.height * 0.9)
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
padding: 12
contentItem: Text {
text: errDialog.txt
wrapMode: Text.WordWrap
TapHandler {
onTapped: errDialog.close();
}
}
}
ToastManager {
id: toast
}
Connections {
target: Backend
function onNotifyUI(command, jsonData) {
if (command === "ErrorDialog") {
errDialog.txt = jsonData;
errDialog.open();
return;
}
if (mainWindow.is_pending && command !== "ChangeSelf") {
mainWindow.pending_message.push({ command: command, jsonData: jsonData });
} else {
if (command === "StartChangeSelf") {
mainWindow.is_pending = true;
}
mainWindow.handleMessage(command, jsonData);
}
}
}
function fetchMessage() {
let ret = pending_message.splice(0, 1)[0];
if (pending_message.length === 0) {
is_pending = false;
}
return ret;
}
function handleMessage(command, jsonData) {
let cb = callbacks[command]
if (typeof(cb) === "function") {
cb(jsonData);
} else {
callbacks["ErrorMsg"]("Unknown command " + command + "!");
} }
} }
} }
function fetchMessage() {
let ret = pending_message.splice(0, 1)[0];
if (pending_message.length === 0) {
is_pending = false;
}
return ret;
}
function handleMessage(command, jsonData) {
let cb = callbacks[command]
if (typeof(cb) === "function") {
cb(jsonData);
} else {
callbacks["ErrorMsg"]("Unknown command " + command + "!");
}
}
}
Shortcut { Shortcut {
sequences: [ StandardKey.FullScreen ] sequences: [ StandardKey.FullScreen ]
onActivated: { onActivated: {
@ -217,10 +219,25 @@ Item {
tipList = tips.trim().split("\n"); tipList = tips.trim().split("\n");
} }
onClosing: { MessageDialog {
config.winWidth = width; id: exitMessageDialog
config.winHeight = height; title: realMainWin.title
config.saveConf(); informativeText: qsTr("Are you sure to exit?")
Backend.quitLobby(false); buttons: MessageDialog.Ok | MessageDialog.Cancel
onAccepted: {
mainWindow.closing = true;
config.winWidth = width;
config.winHeight = height;
config.saveConf();
Backend.quitLobby(false);
realMainWin.close();
}
}
onClosing: (closeEvent) => {
if (!mainWindow.closing) {
closeEvent.accepted = false;
exitMessageDialog.open();
}
} }
} }

View File

@ -167,6 +167,10 @@
<source>updated packages for md5</source> <source>updated packages for md5</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Are you sure to exit?</source>
<translation>退</translation>
</message>
</context> </context>
<context> <context>