2019-09-06 05:05:57 +10:00
|
|
|
import QtQuick 2.12
|
|
|
|
import QtQuick.Window 2.12
|
|
|
|
import QtQuick.Layouts 1.12
|
|
|
|
import "Base"
|
|
|
|
|
2019-12-09 23:01:01 +11:00
|
|
|
HDrawer {
|
2019-09-06 06:28:06 +10:00
|
|
|
id: debugConsole
|
2019-12-11 05:46:05 +11:00
|
|
|
objectName: "debugConsole"
|
2019-12-10 03:27:40 +11:00
|
|
|
edge: Qt.TopEdge
|
2019-12-09 23:11:46 +11:00
|
|
|
x: horizontal ? 0 : referenceSizeParent.width / 2 - width / 2
|
|
|
|
y: vertical ? 0 : referenceSizeParent.height / 2 - height / 2
|
2019-12-09 23:10:03 +11:00
|
|
|
width: horizontal ? calculatedSize : Math.min(window.width, 720)
|
2019-12-10 03:56:25 +11:00
|
|
|
height: vertical ? calculatedSize : Math.min(window.height, 720)
|
2019-12-11 05:46:05 +11:00
|
|
|
defaultSize: 400
|
2019-12-09 23:01:01 +11:00
|
|
|
z: 9999
|
2019-12-10 03:27:40 +11:00
|
|
|
position: 0
|
2019-09-06 05:05:57 +10:00
|
|
|
|
2019-12-12 23:39:26 +11:00
|
|
|
property var previouslyFocused: null
|
2019-12-10 04:34:56 +11:00
|
|
|
|
2019-09-06 06:09:04 +10:00
|
|
|
property var target: null
|
|
|
|
property alias t: debugConsole.target
|
|
|
|
|
2019-12-10 04:21:12 +11:00
|
|
|
property var history: window.history.console
|
2019-09-20 08:26:52 +10:00
|
|
|
property alias his: debugConsole.history
|
|
|
|
property int historyEntry: -1
|
2019-12-10 04:51:50 +11:00
|
|
|
property int maxHistoryLength: 4096
|
2019-09-20 08:26:52 +10:00
|
|
|
|
2019-12-09 23:01:01 +11:00
|
|
|
property string help: qsTr(
|
|
|
|
`Javascript debugging console
|
|
|
|
|
2019-12-10 03:56:25 +11:00
|
|
|
Useful variables:
|
2019-12-18 08:59:53 +11:00
|
|
|
window, theme, settings, shortcuts, utils, mainUI, pageLoader
|
2019-12-10 03:56:25 +11:00
|
|
|
py Python interpreter
|
|
|
|
this The console itself
|
|
|
|
t Target item to debug for which this console was opened
|
|
|
|
his History, list of commands entered
|
2019-12-09 23:01:01 +11:00
|
|
|
|
|
|
|
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, "")
|
|
|
|
)
|
|
|
|
|
2019-12-10 04:00:42 +11:00
|
|
|
readonly property alias commandsView: commandsView
|
|
|
|
|
2019-09-06 06:09:04 +10:00
|
|
|
|
2019-09-20 06:47:35 +10:00
|
|
|
Component.onCompleted: {
|
2019-12-10 03:32:46 +11:00
|
|
|
if (mainUI.shortcuts.debugConsole)
|
|
|
|
mainUI.shortcuts.debugConsole.destroy()
|
|
|
|
|
2019-09-20 06:47:35 +10:00
|
|
|
mainUI.shortcuts.debugConsole = debugConsole
|
2019-12-10 03:27:40 +11:00
|
|
|
position = 1
|
2019-09-06 06:09:04 +10:00
|
|
|
commandsView.model.insert(0, {
|
2019-11-04 04:47:33 +11:00
|
|
|
input: "t = " + String(target),
|
2019-09-06 06:09:04 +10:00
|
|
|
output: "",
|
|
|
|
error: false,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2019-12-10 04:34:56 +11:00
|
|
|
onVisibleChanged: {
|
|
|
|
if (visible) {
|
2019-12-12 23:39:26 +11:00
|
|
|
previouslyFocused = window.activeFocusItem
|
2019-12-10 04:34:56 +11:00
|
|
|
forceActiveFocus()
|
2019-12-12 23:39:26 +11:00
|
|
|
} else if (previouslyFocused) {
|
|
|
|
previouslyFocused.forceActiveFocus()
|
2019-12-10 04:34:56 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-20 08:26:52 +10:00
|
|
|
onHistoryEntryChanged:
|
|
|
|
inputField.text =
|
|
|
|
historyEntry === -1 ? "" : history.slice(-historyEntry - 1)[0]
|
|
|
|
|
2019-09-06 06:09:04 +10:00
|
|
|
|
2019-09-06 05:05:57 +10:00
|
|
|
function runJS(input) {
|
2019-12-10 04:21:12 +11:00
|
|
|
if (history.slice(-1)[0] !== input) {
|
|
|
|
history.push(input)
|
|
|
|
while (history.length > maxHistoryLength) history.shift()
|
|
|
|
window.historyChanged()
|
|
|
|
}
|
2019-09-20 08:26:52 +10:00
|
|
|
|
2019-12-09 23:01:01 +11:00
|
|
|
let output = ""
|
|
|
|
let error = false
|
2019-09-06 05:05:57 +10:00
|
|
|
|
|
|
|
try {
|
2019-12-09 23:01:01 +11:00
|
|
|
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)
|
2019-09-20 08:26:52 +10:00
|
|
|
|
|
|
|
} else {
|
|
|
|
let result = eval(input)
|
2019-12-09 23:01:01 +11:00
|
|
|
output = result instanceof Array ?
|
2019-09-20 08:26:52 +10:00
|
|
|
"[" + String(result) + "]" : String(result)
|
|
|
|
}
|
|
|
|
|
2019-09-06 05:05:57 +10:00
|
|
|
} catch (err) {
|
2019-12-09 23:01:01 +11:00
|
|
|
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
|
2019-09-06 06:09:04 +10:00
|
|
|
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 {
|
2019-09-06 06:09:04 +10:00
|
|
|
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
|
2019-09-06 06:09:04 +10:00
|
|
|
font.family: theme.fontFamily.mono
|
2019-09-06 06:24:49 +10:00
|
|
|
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
|
2019-09-06 06:09:04 +10:00
|
|
|
font.family: theme.fontFamily.mono
|
2019-09-06 06:24:49 +10:00
|
|
|
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 {
|
2019-09-20 08:26:52 +10:00
|
|
|
id: inputField
|
2019-09-06 05:05:57 +10:00
|
|
|
focus: true
|
2019-09-20 08:43:25 +10:00
|
|
|
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
|
2019-12-09 23:01:01 +11:00
|
|
|
placeholderText: qsTr("Javascript debug console - Try .help")
|
2019-09-06 06:09:04 +10:00
|
|
|
font.family: theme.fontFamily.mono
|
2019-09-06 05:05:57 +10:00
|
|
|
|
2019-09-20 08:26:52 +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
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|