moment/src/qml/DebugConsole.qml

167 lines
4.9 KiB
QML
Raw Normal View History

2019-09-06 05:05:57 +10:00
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.12
import "Base"
import "utils.js" as Utils
2019-09-06 05:05:57 +10:00
HDrawer {
2019-09-06 06:28:06 +10:00
id: debugConsole
edge: Qt.BottomEdge
width: vertical ? Math.min(window.width, 720) : calculatedWidth
height: vertical ? calculatedWidth : Math.min(window.width, 480)
normalWidth: 360
z: 9999
2019-09-06 05:05:57 +10:00
property var target: null
property alias t: debugConsole.target
property var history: []
property alias his: debugConsole.history
property int historyEntry: -1
property string help: qsTr(
`Javascript debugging console
Special variables:
t Target item to debug for which this console was opened
his History, list of commands entered
Special commands:
.j OBJECT, .json OBJECT Print OBJECT as human-readable JSON
.t, .top Attach the console to the parent window's top
.b, .bottom Attach the console to the parent window's bottom
.l, .left Attach the console to the parent window's left
.r, .right Attach the console to the parent window's right
.h, .help Show this help`.replace(/^ {8}/gm, "")
)
Component.onCompleted: {
mainUI.shortcuts.debugConsole = debugConsole
commandsView.model.insert(0, {
input: "t = " + String(target),
output: "",
error: false,
})
visible = true
}
onHistoryEntryChanged:
inputField.text =
historyEntry === -1 ? "" : history.slice(-historyEntry - 1)[0]
2019-09-06 05:05:57 +10:00
function runJS(input) {
if (history.slice(-1)[0] !== input) history.push(input)
let output = ""
let error = false
2019-09-06 05:05:57 +10:00
try {
if ([".h", ".help"].includes(input)) {
output = debugConsole.help
} else if ([".t", ".top"].includes(input)) {
debugConsole.edge = Qt.TopEdge
} else if ([".b", ".bottom"].includes(input)) {
debugConsole.edge = Qt.BottomEdge
} else if ([".l", ".left"].includes(input)) {
debugConsole.edge = Qt.LeftEdge
} else if ([".r", ".right"].includes(input)) {
debugConsole.edge = Qt.RightEdge
} else if (input.startsWith(".j ") || input.startsWith(".json ")) {
output = JSON.stringify(eval(input.substring(2)), null, 4)
} else {
let result = eval(input)
output = result instanceof Array ?
"[" + String(result) + "]" : String(result)
}
2019-09-06 05:05:57 +10:00
} catch (err) {
error = true
output = err.toString()
2019-09-06 05:05:57 +10:00
}
commandsView.model.insert(0, { input, output, error })
}
HColumnLayout {
anchors.fill: parent
2019-09-06 06:28:06 +10:00
Keys.onEscapePressed: debugConsole.visible = false
2019-09-06 05:05:57 +10:00
HListView {
id: commandsView
spacing: theme.spacing
topMargin: theme.spacing
bottomMargin: topMargin
leftMargin: theme.spacing
rightMargin: leftMargin
2019-09-06 05:05:57 +10:00
clip: true
verticalLayoutDirection: ListView.BottomToTop
Layout.fillWidth: true
Layout.fillHeight: true
model: ListModel {}
delegate: HColumnLayout {
width: commandsView.width -
commandsView.leftMargin - commandsView.rightMargin
2019-09-06 05:05:57 +10:00
HLabel {
text: "> " + model.input
wrapMode: Text.Wrap
color: theme.chat.message.quote
font.family: theme.fontFamily.mono
visible: Boolean(model.input)
2019-09-06 05:05:57 +10:00
Layout.fillWidth: true
}
HLabel {
text: "" + model.output
wrapMode: Text.Wrap
color: model.error ?
theme.colors.errorText : theme.colors.text
font.family: theme.fontFamily.mono
visible: Boolean(model.output)
2019-09-06 05:05:57 +10:00
Layout.fillWidth: true
}
}
Rectangle {
z: -10
anchors.fill: parent
color: theme.colors.weakBackground
}
}
HTextField {
id: inputField
2019-09-06 05:05:57 +10:00
focus: true
onAccepted: if (text) { runJS(text); text = ""; historyEntry = -1 }
2019-09-06 05:05:57 +10:00
backgroundColor: Qt.hsla(0, 0, 0, 0.85)
bordered: false
placeholderText: qsTr("Javascript debug console - Try .help")
font.family: theme.fontFamily.mono
2019-09-06 05:05:57 +10:00
Keys.onUpPressed:
if (historyEntry + 1 < history.length ) historyEntry += 1
Keys.onDownPressed:
if (historyEntry - 1 >= -1) historyEntry -= 1
2019-09-06 05:05:57 +10:00
Layout.fillWidth: true
}
}
}