# ------------------------------------------------------------------------------ # Interface and some basic functionality for all printers. # ------------------------------------------------------------------------------ class Printer: var _format_enabled = true var _disabled = false var _printer_name = "NOT SET" var _show_name = false # used for debugging, set manually func get_format_enabled(): return _format_enabled func set_format_enabled(format_enabled): _format_enabled = format_enabled func send(text, fmt = null): if _disabled: return var formatted = text if fmt != null and _format_enabled: formatted = format_text(text, fmt) if _show_name: formatted = str("(", _printer_name, ")") + formatted _output(formatted) func get_disabled(): return _disabled func set_disabled(disabled): _disabled = disabled # -------------------- # Virtual Methods (some have some default behavior) # -------------------- func _output(text): pass func format_text(text, fmt): return text # ------------------------------------------------------------------------------ # Responsible for sending text to a GUT gui. # ------------------------------------------------------------------------------ class GutGuiPrinter: extends Printer var _gut = null var _colors = {red = Color.RED, yellow = Color.YELLOW, green = Color.GREEN} func _init(): _printer_name = "gui" func _wrap_with_tag(text, tag): return str("[", tag, "]", text, "[/", tag, "]") func _color_text(text, c_word): return "[color=" + c_word + "]" + text + "[/color]" func format_text(text, fmt): var box = _gut.get_gui().get_text_box() if fmt == "bold": box.push_bold() elif fmt == "underline": box.push_underline() elif _colors.has(fmt): box.push_color(_colors[fmt]) else: # just pushing something to pop. box.push_normal() box.add_text(text) box.pop() return "" func _output(text): _gut.get_gui().get_text_box().add_text(text) func get_gut(): return _gut func set_gut(gut): _gut = gut # This can be very very slow when the box has a lot of text. func clear_line(): var box = _gut.get_gui().get_text_box() box.remove_line(box.get_line_count() - 1) box.update() # ------------------------------------------------------------------------------ # This AND TerminalPrinter should not be enabled at the same time since it will # result in duplicate output. printraw does not print to the console so i had # to make another one. # ------------------------------------------------------------------------------ class ConsolePrinter: extends Printer var _buffer = "" func _init(): _printer_name = "console" # suppresses output until it encounters a newline to keep things # inline as much as possible. func _output(text): if text.ends_with("\n"): print(_buffer + text.left(text.length() - 1)) _buffer = "" else: _buffer += text # ------------------------------------------------------------------------------ # Prints text to terminal, formats some words. # ------------------------------------------------------------------------------ class TerminalPrinter: extends Printer var escape = PackedByteArray([0x1b]).get_string_from_ascii() var cmd_colors = { red = escape + "[31m", yellow = escape + "[33m", green = escape + "[32m", underline = escape + "[4m", bold = escape + "[1m", default = escape + "[0m", clear_line = escape + "[2K" } func _init(): _printer_name = "terminal" func _output(text): # Note, printraw does not print to the console. printraw(text) func format_text(text, fmt): return cmd_colors[fmt] + text + cmd_colors.default func clear_line(): send(cmd_colors.clear_line) func back(n): send(escape + str("[", n, "D")) func forward(n): send(escape + str("[", n, "C"))