Files
MovementTests/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd
Minimata caeae26a09
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 22s
Create tag and build when new code gets to main / Test (push) Failing after 2m10s
Create tag and build when new code gets to main / Export (push) Has been skipped
fixed camera and sword animation issue and upgraded to Godot 4.6
2026-01-27 17:47:19 +01:00

116 lines
3.5 KiB
GDScript

@tool
class_name GdUnitRichTextMessageWriter
extends GdUnitMessageWriter
## A message writer implementation using [RichTextLabel] for the test report UI.[br]
## [br]
## This writer implementation writes formatted messages to a [RichTextLabel] using BBCode.[br]
## It supports:[br]
## - Text formatting using BBCode (bold, italic, underline)[br]
## - Text coloring using push colors[br]
## - Text indentation using push indent[br]
## - Text effects like wave[br]
## - Basic cursor positioning[br]
## [br]
## Used to format test reports in the editor UI.
## The [RichTextLabel] instance to write formatted messages
var _output: RichTextLabel
## Tracks current position in characters from line start
var _current_pos := 0
## Creates a new message writer for the given [RichTextLabel].[br]
## [br]
## [param output] The [RichTextLabel] used for output.
func _init(output: RichTextLabel) -> void:
_output = output
## Applies text style flags by wrapping text in BBCode tags.[br]
## [br]
## Available styles:[br]
## - BOLD: [b]text[/b][br]
## - ITALIC: [i]text[/i][br]
## - UNDERLINE: [u]text[/u][br]
## [br]
## [param message] The text to format.[br]
## [param flags] The text style flags to apply.
func _apply_flags(message: String, flags: int) -> String:
if flags & BOLD:
message = "[b]%s[/b]" % message
if flags & ITALIC:
message = "[i]%s[/i]" % message
if flags & UNDERLINE:
message = "[u]%s[/u]" % message
return message
## Writes a message with formatting.[br]
## [br]
## [param message] The text to write.[br]
## [param _color] The color to use.[br]
## [param _indent] The indentation level.[br]
## [param flags] The text style flags to apply.
func _print_message(message: String, _color: Color, _indent: int, flags: int) -> void:
for i in _indent:
_output.push_indent(1)
_output.push_color(_color)
message = _apply_flags(message, flags)
_output.append_text(message)
_output.pop()
for i in _indent:
_output.pop()
_current_pos += _indent * 2 + message.length()
## Writes a message with formatting followed by a line break.[br]
## [br]
## [param message] The text to write.[br]
## [param _color] The color to use.[br]
## [param _indent] The indentation level.[br]
## [param flags] The text style flags to apply.
func _println_message(message: String, _color: Color, _indent: int, flags: int) -> void:
_print_message(message, _color, _indent, flags)
_output.newline()
_current_pos = 0
## Writes a message at a specific column position.[br]
## [br]
## [param message] The text to write.[br]
## [param cursor_pos] The column position from line start.[br]
## [param _color] The color to use.[br]
## [param _effect] The text effect to apply (e.g. wave).[br]
## [param _align] The text alignment (left or right).[br]
## [param flags] The text style flags to apply.
func _print_at(message: String, cursor_pos: int, _color: Color, _effect: GdUnitMessageWriter.Effect, _align: Align, flags: int) -> void:
if _align == Align.RIGHT:
cursor_pos = cursor_pos - message.length()
var spaces := cursor_pos - _current_pos
if spaces > 0:
_output.append_text("".lpad(spaces))
_current_pos += spaces
else:
_output.append_text(" ")
_current_pos += 1
_output.push_color(_color)
message = _apply_flags(message, flags)
match _effect:
Effect.NONE:
pass
Effect.WAVE:
message = "[wave]%s[/wave]" % message
_output.append_text(message)
_output.pop()
_current_pos += message.length()
## Clears all written content from the [RichTextLabel].
func clear() -> void:
_output.clear()
_current_pos = 0