godot-xterm/examples/web_console/web_console.gd
2024-03-30 22:52:39 +13:00

78 lines
1.9 KiB
GDScript

extends Node
const TPut := preload("res://addons/godot_xterm/util/tput.gd")
signal exited(status)
var line := ""
var _tput
@onready var terminal = $Terminal
@onready var _has_js: bool = OS.has_feature("web")
func prompt(prompt: String):
_tput.setaf(TPut.ANSIColor.bright_green)
terminal.write(prompt)
_tput.sgr0()
func _ready():
_tput = TPut.new(terminal)
_tput.setaf(TPut.ANSIColor.bright_cyan)
terminal.write("*** Web Console ***\r\n\r\n")
_tput.setaf(TPut.ANSIColor.yellow)
terminal.write("Input will be passed to Godot's JavaScript.eval() function.\r\n")
terminal.write("Some things you could try:\r\n\r\n")
terminal.write(">> 1 + 1\r\n")
terminal.write(">> window.location\r\n")
terminal.write(">> alert('Hello')\r\n\r\n")
_tput.setaf(TPut.ANSIColor.bright_cyan)
terminal.write("Enter 'q', 'quit', or 'exit' to return to the previous menu.\r\n\r\n")
_tput.sgr0()
prompt(">> ")
terminal.grab_focus()
func grab_focus():
terminal.grab_focus()
func _on_Terminal_key_pressed(_data, event: InputEventKey):
if not event:
return
# For some reason, data String is malformed on Web, so only use event.unicode.
var data = char(event.unicode)
match event.keycode:
KEY_ENTER:
terminal.write("\r\n")
if line == "q" or line == "quit" or line == "exit":
return emit_signal("exited", 0)
if not _has_js:
var msg := "WebConsole only available in Web build."
push_error(msg)
_tput.setaf(TPut.ANSIColor.red)
terminal.write(msg)
_tput.sgr0()
prompt("\r\n>> ")
else:
var json = JavaScriptBridge.eval("JSON.stringify(%s)" % line, true)
_tput.setaf(TPut.ANSIColor.magenta)
terminal.write(str(json))
_tput.sgr0()
line = ""
_tput.sgr0()
prompt("\r\n>> ")
KEY_BACKSPACE:
if line.length() > 0:
terminal.write("\b \b")
line = line.substr(0, line.length() - 1)
_:
line += data
terminal.write(data)