Raxol.Terminal.Renderer (Raxol v0.5.0)

View Source

Terminal renderer module.

This module handles rendering of terminal output, including:

  • Character cell rendering
  • Text styling
  • Cursor rendering
  • Performance optimizations

Integration with Other Modules

The Renderer module works closely with several specialized modules:

Manipulation Module

  • Receives text and style updates from the Manipulation module
  • Renders text with proper styling and positioning
  • Handles text insertion, deletion, and modification

Selection Module

  • Renders text selections with visual highlighting
  • Supports multiple selections
  • Handles selection state changes

Validation Module

  • Renders validation errors and warnings
  • Applies visual indicators for invalid input
  • Shows validation state through styling

Performance Optimizations

The renderer includes several optimizations:

  • Only renders changed cells
  • Batches style updates for consecutive cells
  • Minimizes DOM updates
  • Caches rendered output when possible

Usage

# Create a new renderer
buffer = ScreenBuffer.new(80, 24)
renderer = Renderer.new(buffer)

# Render with selection
selection = %{selection: {0, 0, 0, 5}}
output = Renderer.render(renderer, selection: selection)

# Render with validation
validation = Validation.validate_input(buffer, 0, 0, "text")
output = Renderer.render(renderer, validation: validation)

Summary

Functions

Clears the cursor position.

Gets the current content of the screen buffer.

Creates a new renderer with the given screen buffer.

Renders the terminal content without additional options.

Renders the terminal content.

Renders the terminal content with additional options.

Sets the cursor position.

Updates the font settings.

Updates the theme settings.

Starts a new renderer process.

Stops the renderer process.

Types

t()

@type t() :: %Raxol.Terminal.Renderer{
  cursor: {non_neg_integer(), non_neg_integer()} | nil,
  font_settings: map(),
  screen_buffer: Raxol.Terminal.ScreenBuffer.t(),
  theme: map()
}

Functions

clear_cursor(renderer)

Clears the cursor position.

Examples

iex> screen_buffer = ScreenBuffer.new(80, 24)
iex> renderer = Renderer.new(screen_buffer)
iex> renderer = Renderer.set_cursor(renderer, {10, 5})
iex> renderer = Renderer.clear_cursor(renderer)
iex> renderer.cursor
nil

get_content(renderer, opts \\ [])

Gets the current content of the screen buffer.

Parameters

  • renderer - The renderer to get content from
  • opts - Options for content retrieval
    • :include_style - Whether to include style information (default: false)
    • :include_cursor - Whether to include cursor position (default: false)

Returns

  • {:ok, content} - The current content
  • {:error, reason} - If content retrieval fails

Examples

iex> get_content(renderer)
{:ok, "Hello, World!"}

new(screen_buffer, theme \\ %{}, font_settings \\ %{})

Creates a new renderer with the given screen buffer.

Examples

iex> screen_buffer = ScreenBuffer.new(80, 24)
iex> renderer = Renderer.new(screen_buffer)
iex> renderer.screen_buffer
%ScreenBuffer{}

render(renderer)

Renders the terminal content without additional options.

render(renderer, opts)

Renders the terminal content.

render(renderer, opts, additional_opts)

Renders the terminal content with additional options.

set_cursor(renderer, position)

Sets the cursor position.

Examples

iex> screen_buffer = ScreenBuffer.new(80, 24)
iex> renderer = Renderer.new(screen_buffer)
iex> renderer = Renderer.set_cursor(renderer, {10, 5})
iex> renderer.cursor
{10, 5}

set_font_settings(renderer, settings)

Updates the font settings.

Examples

iex> screen_buffer = ScreenBuffer.new(80, 24)
iex> renderer = Renderer.new(screen_buffer)
iex> settings = %{family: "Fira Code"}
iex> renderer = Renderer.set_font_settings(renderer, settings)
iex> renderer.font_settings
%{family: "Fira Code"}

set_theme(renderer, theme)

Updates the theme settings.

Examples

iex> screen_buffer = ScreenBuffer.new(80, 24)
iex> renderer = Renderer.new(screen_buffer)
iex> theme = %{foreground: %{default: "#FFF"}}
iex> renderer = Renderer.set_theme(renderer, theme)
iex> renderer.theme
%{foreground: %{default: "#FFF"}}

start_link(opts \\ [])

Starts a new renderer process.

stop(renderer)

Stops the renderer process.