diff options
Diffstat (limited to 'addons/gut/printers.gd')
| -rw-r--r-- | addons/gut/printers.gd | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/addons/gut/printers.gd b/addons/gut/printers.gd new file mode 100644 index 0000000..c543603 --- /dev/null +++ b/addons/gut/printers.gd @@ -0,0 +1,157 @@ +# ------------------------------------------------------------------------------ +# 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 = PoolByteArray([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')) |
