Add basic JS/QML debug console
This commit is contained in:
		@@ -108,7 +108,8 @@ class UISettings(JSONConfigFile):
 | 
			
		||||
            "theme": "Default.qpl",
 | 
			
		||||
            "writeAliases": {},
 | 
			
		||||
            "keys": {
 | 
			
		||||
                "startDebugger": "Alt+Shift+D",
 | 
			
		||||
                "startPythonDebugger": "Alt+Shift+D",
 | 
			
		||||
                "toggleDebugConsole":  "Alt+Shift+C",
 | 
			
		||||
                "reloadConfig":        "Alt+Shift+R",
 | 
			
		||||
 | 
			
		||||
                "scrollUp":       ["Alt+Up", "Alt+K"],
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										90
									
								
								src/qml/DebugConsole.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/qml/DebugConsole.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
			
		||||
import QtQuick 2.12
 | 
			
		||||
import QtQuick.Window 2.12
 | 
			
		||||
import QtQuick.Layouts 1.12
 | 
			
		||||
import "Base"
 | 
			
		||||
 | 
			
		||||
Window {
 | 
			
		||||
    title: qsTr("Debug console")
 | 
			
		||||
    width: 640
 | 
			
		||||
    height: 480
 | 
			
		||||
    visible: false
 | 
			
		||||
    flags: Qt.WA_TranslucentBackground
 | 
			
		||||
    color: "transparent"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function runJS(input) {
 | 
			
		||||
        let error = false
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            var output = input.startsWith("j ") ?
 | 
			
		||||
                         JSON.stringify(eval(input.substring(2)), null, 4) :
 | 
			
		||||
                         String(eval(input))
 | 
			
		||||
        } catch (err) {
 | 
			
		||||
            error = true
 | 
			
		||||
            var output = err.toString()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        commandsView.model.insert(0, { input, output, error })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    HColumnLayout {
 | 
			
		||||
        anchors.fill: parent
 | 
			
		||||
 | 
			
		||||
        HListView {
 | 
			
		||||
            id: commandsView
 | 
			
		||||
            spacing: theme.spacing
 | 
			
		||||
            topMargin: theme.spacing
 | 
			
		||||
            bottomMargin: topMargin
 | 
			
		||||
            leftMargin: theme.spacing
 | 
			
		||||
            rightMargin: rightMargin
 | 
			
		||||
            clip: true
 | 
			
		||||
            verticalLayoutDirection: ListView.BottomToTop
 | 
			
		||||
 | 
			
		||||
            Layout.fillWidth: true
 | 
			
		||||
            Layout.fillHeight: true
 | 
			
		||||
 | 
			
		||||
            model: ListModel {}
 | 
			
		||||
 | 
			
		||||
            delegate: HColumnLayout {
 | 
			
		||||
                width: commandsView.width
 | 
			
		||||
 | 
			
		||||
                HLabel {
 | 
			
		||||
                    text: "> " + model.input
 | 
			
		||||
                    wrapMode: Text.Wrap
 | 
			
		||||
                    color: theme.chat.message.quote
 | 
			
		||||
                    visible: model.input
 | 
			
		||||
 | 
			
		||||
                    Layout.fillWidth: true
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                HLabel {
 | 
			
		||||
                    text: "" + model.output
 | 
			
		||||
                    wrapMode: Text.Wrap
 | 
			
		||||
                    color: model.error ?
 | 
			
		||||
                           theme.colors.errorText : theme.colors.text
 | 
			
		||||
                    visible: model.output
 | 
			
		||||
 | 
			
		||||
                    Layout.fillWidth: true
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Rectangle {
 | 
			
		||||
                z: -10
 | 
			
		||||
                anchors.fill: parent
 | 
			
		||||
                color: theme.colors.weakBackground
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        HTextField {
 | 
			
		||||
            focus: true
 | 
			
		||||
            onAccepted: if (text) runJS(text)
 | 
			
		||||
            backgroundColor: Qt.hsla(0, 0, 0, 0.85)
 | 
			
		||||
            bordered: false
 | 
			
		||||
            placeholderText: qsTr("Type some JavaScript...")
 | 
			
		||||
 | 
			
		||||
            Layout.fillWidth: true
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -9,10 +9,16 @@ HShortcutHandler {
 | 
			
		||||
 | 
			
		||||
    HShortcut {
 | 
			
		||||
        enabled: debugMode
 | 
			
		||||
        sequences: settings.keys.startDebugger
 | 
			
		||||
        sequences: settings.keys.startPythonDebugger
 | 
			
		||||
        onPressed: py.call("APP.pdb")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    HShortcut {
 | 
			
		||||
        enabled: debugMode
 | 
			
		||||
        sequences: settings.keys.toggleDebugConsole
 | 
			
		||||
        onPressed: mainUI.debugConsole.visible = ! mainUI.debugConsole.visible
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    HShortcut {
 | 
			
		||||
        sequences: settings.keys.reloadConfig
 | 
			
		||||
        onPressed: py.loadSettings(() => { mainUI.pressAnimation.start() })
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ Item {
 | 
			
		||||
    property alias sidePane: sidePane
 | 
			
		||||
    property alias pageLoader: pageLoader
 | 
			
		||||
    property alias pressAnimation: pressAnimation
 | 
			
		||||
    property alias debugConsole: debugConsoleLoader.item
 | 
			
		||||
 | 
			
		||||
    SequentialAnimation {
 | 
			
		||||
        id: pressAnimation
 | 
			
		||||
@@ -138,4 +139,9 @@ Item {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    HLoader {
 | 
			
		||||
        id: debugConsoleLoader
 | 
			
		||||
        source: debugMode ? "DebugConsole.qml" : ""
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user