summaryrefslogtreecommitdiff
path: root/addons/gut/printers.gd
diff options
context:
space:
mode:
Diffstat (limited to 'addons/gut/printers.gd')
-rw-r--r--addons/gut/printers.gd157
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'))