FreeKill/Fk/Pages/Replay.qml

167 lines
3.8 KiB
QML
Raw Permalink Normal View History

2023-08-01 13:01:01 +00:00
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtQuick.Dialogs
2023-08-01 13:01:01 +00:00
import Fk
import Fk.Common
2023-08-01 13:01:01 +00:00
Item {
id: root
ToolBar {
id: bar
width: parent.width
RowLayout {
anchors.fill: parent
ToolButton {
icon.source: AppPath + "/image/modmaker/back"
onClicked: mainStack.pop();
}
Label {
text: luatr("Replay Manager")
2023-08-01 13:01:01 +00:00
horizontalAlignment: Qt.AlignHCenter
Layout.fillWidth: true
}
ToolButton {
icon.source: AppPath + "/image/modmaker/menu"
onClicked: menu.open()
Menu {
id: menu
y: bar.height
MenuItem {
text: luatr("Replay from File")
onTriggered: {
fdialog.open();
}
}
2023-08-01 13:01:01 +00:00
}
}
}
}
Rectangle {
width: parent.width
height: parent.height - bar.height
anchors.top: bar.bottom
color: "#A0EFEFEF"
2023-08-01 13:01:01 +00:00
clip: true
ListView {
id: list
clip: true
anchors.fill: parent
model: ListModel {
id: model
}
delegate: Item {
width: root.width
height: 64
Avatar {
2023-08-01 13:01:01 +00:00
id: generalPic
width: 48; height: 48
2023-08-01 13:01:01 +00:00
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: 8
2023-12-12 11:22:18 +00:00
general: _general
2023-08-01 13:01:01 +00:00
}
ColumnLayout {
anchors.left: generalPic.right
anchors.margins: 8
Text {
text: {
const win = winner.split("+").indexOf(role) !== -1;
const winStr = win ? luatr("Game Win") : luatr("Game Lose");
return "<b>" + luatr(_general) + "</b> " + luatr(role)
+ " " + winStr;
2023-08-01 13:01:01 +00:00
}
font.pixelSize: 20
textFormat: Text.RichText
}
Text {
text: {
const y = repDate.slice(0,4);
const month = repDate.slice(4,6);
const d = repDate.slice(6,8);
const h = repDate.slice(8,10);
const m = repDate.slice(10,12);
const s = repDate.slice(12,14);
const dateStr = `${y}-${month}-${d} ${h}:${m}:${s}`;
2023-08-01 13:01:01 +00:00
return playerName + " " + luatr(gameMode) + " " + dateStr
2023-08-01 13:01:01 +00:00
}
}
}
Button {
id: replayBtn
text: luatr("Play the Replay")
2023-08-01 13:01:01 +00:00
anchors.right: delBtn.left
anchors.rightMargin: 8
onClicked: {
config.observing = true;
config.replaying = true;
Backend.playRecord("recording/" + fileName);
2023-08-01 13:01:01 +00:00
}
}
Button {
id: delBtn
text: luatr("Delete Replay")
2023-08-01 13:01:01 +00:00
anchors.right: parent.right
anchors.rightMargin: 8
onClicked: {
Backend.removeRecord(fileName);
removeModel(index);
}
}
}
}
}
FileDialog {
id: fdialog
nameFilters: ["FK Rep Files (*.fk.rep)"];
onAccepted: {
config.observing = true;
config.replaying = true;
let str = selectedFile.toString(); // QUrl -> string
Backend.playRecord(str);
}
}
2023-08-01 13:01:01 +00:00
function updateList() {
model.clear();
const data = Backend.ls("recording");
data.reverse();
data.forEach(s => {
const d = s.split(".");
if (d.length !== 8) return;
// s: <time>.<screenName>.<mode>.<general>.<role>.<winner>.fk.rep
const [t, name, mode, general, role, winner] = d;
model.append({
fileName: s,
repDate: t,
playerName: name,
gameMode: mode,
2023-12-12 11:22:18 +00:00
_general: general,
2023-08-01 13:01:01 +00:00
role: role,
winner: winner,
})
});
}
function removeModel(index) {
model.remove(index);
}
Component.onCompleted: {
updateList();
}
}