Module: Vedeu::Terminal::Buffer

Extended by:
Buffer
Included in:
Buffer
Defined in:
lib/vedeu/terminal/buffer.rb

Overview

All output will be written to this singleton, and #render will be called at the end of each run of MainLoop; effectively rendering this buffer to each registered renderer. This buffer is not cleared after this action though, as subsequent actions will modify the contents. This means that individual parts of Vedeu can write content here at various points and only at the end of each run of MainLoop will it be actually output ‘somewhere’.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.bufferArray<Array<Vedeu::Models::Cell>> Also known as: cells

Return a grid of Models::Cell objects defined by the height and width of this virtual terminal.

Returns:



22
23
24
25
26
27
28
# File 'lib/vedeu/terminal/buffer.rb', line 22

def buffer
  @output ||= Array.new(Vedeu.height + 1) do |y|
    Array.new(Vedeu.width + 1) do |x|
      Vedeu::Models::Cell.new(position: [y, x])
    end
  end
end

.clearString|void

Clear the output.

Examples:

Vedeu.clear

Returns:

  • (String|void)

    Most likely to be a String.



37
38
39
40
41
# File 'lib/vedeu/terminal/buffer.rb', line 37

def clear
  reset

  Vedeu.renderers.clear if Vedeu.ready?
end

.fetch(from, which) ⇒ Array<Vedeu::Views::Char>|Array (private)

Parameters:

  • from (Array)

    An Array of rows, or an Array of cells.

  • which (Fixnum)

    A Fixnum representing the index; the row number or the cell number for a row.

Returns:



109
110
111
# File 'lib/vedeu/terminal/buffer.rb', line 109

def fetch(from, which)
  from[which] || []
end

.outputVedeu::Models::Page

Returns:



44
45
46
# File 'lib/vedeu/terminal/buffer.rb', line 44

def output
  Vedeu::Models::Page.coerce(buffer)
end

.position?(value) ⇒ Boolean (private)

Returns a boolean indicating the value has a position attribute.

Parameters:

  • value (void)

Returns:

  • (Boolean)


118
119
120
121
# File 'lib/vedeu/terminal/buffer.rb', line 118

def position?(value)
  value.respond_to?(:position) &&
    value.position.is_a?(Vedeu::Geometry::Position)
end

.read(y, x) ⇒ Vedeu::Views::Char

Note:

Given two actual coordinates (y, x) e.g. (1, 1) Convert to coordinate indices (cy, cx) e.g. (0, 0) Fetch the row at cy and return the cell from cx

Read a single cell from the virtual terminal.

Parameters:

  • y (Fixnum)

    The row/line coordinate.

  • x (Fixnum)

    The column/character coordinate.

Returns:



58
59
60
61
62
63
64
65
# File 'lib/vedeu/terminal/buffer.rb', line 58

def read(y, x)
  cy, cx = Vedeu::Geometry::Position[y, x].as_indices

  row  = fetch(cells, cy)
  cell = fetch(row, cx)

  cell
end

.renderString|void Also known as: refresh

Send the cells to the renderer and return the rendered result.

Returns:

  • (String|void)

    Most likely to be a String.



70
71
72
# File 'lib/vedeu/terminal/buffer.rb', line 70

def render
  Vedeu.renderers.render(output) if Vedeu.ready?
end

.resetArray<Array<Vedeu::Models::Cell>>

Removes all content from the virtual terminal; effectively clearing it.

Returns:



79
80
81
82
83
84
85
# File 'lib/vedeu/terminal/buffer.rb', line 79

def reset
  @output = Array.new(Vedeu.height + 1) do |y|
    Array.new(Vedeu.width + 1) do |x|
      Vedeu::Models::Cell.new(position: [y, x])
    end
  end
end

.valid_position?(value) ⇒ Boolean (private)

Returns a boolean indicating the value has a position attribute and is within the terminal boundary.

Parameters:

  • value (void)

Returns:

  • (Boolean)


128
129
130
# File 'lib/vedeu/terminal/buffer.rb', line 128

def valid_position?(value)
  position?(value) && within_terminal_boundary?(value)
end

.within_terminal_boundary?(value) ⇒ Boolean (private)

Returns a boolean indicating the position of the value object is valid for this terminal.

Parameters:

  • value (void)

Returns:

  • (Boolean)


137
138
139
# File 'lib/vedeu/terminal/buffer.rb', line 137

def within_terminal_boundary?(value)
  buffer[value.position.y] && buffer[value.position.y][value.position.x]
end

.write(value) ⇒ Array<Array<Vedeu::Views::Char>>

Write a collection of cells to the virtual terminal.

Parameters:

Returns:



91
92
93
94
95
96
97
98
99
100
101
# File 'lib/vedeu/terminal/buffer.rb', line 91

def write(value)
  values = Array(value).flatten

  values.each do |v|
    buffer[v.position.y][v.position.x] = v if valid_position?(v)
  end

  render

  self
end

Instance Method Details

#bufferArray<Array<Vedeu::Models::Cell>> Also known as: cells

Return a grid of Models::Cell objects defined by the height and width of this virtual terminal.

Returns:



22
23
24
25
26
27
28
# File 'lib/vedeu/terminal/buffer.rb', line 22

def buffer
  @output ||= Array.new(Vedeu.height + 1) do |y|
    Array.new(Vedeu.width + 1) do |x|
      Vedeu::Models::Cell.new(position: [y, x])
    end
  end
end

#clearString|void

Clear the output.

Examples:

Vedeu.clear

Returns:

  • (String|void)

    Most likely to be a String.



37
38
39
40
41
# File 'lib/vedeu/terminal/buffer.rb', line 37

def clear
  reset

  Vedeu.renderers.clear if Vedeu.ready?
end

#fetch(from, which) ⇒ Array<Vedeu::Views::Char>|Array (private)

Parameters:

  • from (Array)

    An Array of rows, or an Array of cells.

  • which (Fixnum)

    A Fixnum representing the index; the row number or the cell number for a row.

Returns:



109
110
111
# File 'lib/vedeu/terminal/buffer.rb', line 109

def fetch(from, which)
  from[which] || []
end

#outputVedeu::Models::Page

Returns:



44
45
46
# File 'lib/vedeu/terminal/buffer.rb', line 44

def output
  Vedeu::Models::Page.coerce(buffer)
end

#position?(value) ⇒ Boolean (private)

Returns a boolean indicating the value has a position attribute.

Parameters:

  • value (void)

Returns:

  • (Boolean)


118
119
120
121
# File 'lib/vedeu/terminal/buffer.rb', line 118

def position?(value)
  value.respond_to?(:position) &&
    value.position.is_a?(Vedeu::Geometry::Position)
end

#read(y, x) ⇒ Vedeu::Views::Char

Note:

Given two actual coordinates (y, x) e.g. (1, 1) Convert to coordinate indices (cy, cx) e.g. (0, 0) Fetch the row at cy and return the cell from cx

Read a single cell from the virtual terminal.

Parameters:

  • y (Fixnum)

    The row/line coordinate.

  • x (Fixnum)

    The column/character coordinate.

Returns:



58
59
60
61
62
63
64
65
# File 'lib/vedeu/terminal/buffer.rb', line 58

def read(y, x)
  cy, cx = Vedeu::Geometry::Position[y, x].as_indices

  row  = fetch(cells, cy)
  cell = fetch(row, cx)

  cell
end

#renderString|void Also known as: refresh

Send the cells to the renderer and return the rendered result.

Returns:

  • (String|void)

    Most likely to be a String.



70
71
72
# File 'lib/vedeu/terminal/buffer.rb', line 70

def render
  Vedeu.renderers.render(output) if Vedeu.ready?
end

#resetArray<Array<Vedeu::Models::Cell>>

Removes all content from the virtual terminal; effectively clearing it.

Returns:



79
80
81
82
83
84
85
# File 'lib/vedeu/terminal/buffer.rb', line 79

def reset
  @output = Array.new(Vedeu.height + 1) do |y|
    Array.new(Vedeu.width + 1) do |x|
      Vedeu::Models::Cell.new(position: [y, x])
    end
  end
end

#valid_position?(value) ⇒ Boolean (private)

Returns a boolean indicating the value has a position attribute and is within the terminal boundary.

Parameters:

  • value (void)

Returns:

  • (Boolean)


128
129
130
# File 'lib/vedeu/terminal/buffer.rb', line 128

def valid_position?(value)
  position?(value) && within_terminal_boundary?(value)
end

#within_terminal_boundary?(value) ⇒ Boolean (private)

Returns a boolean indicating the position of the value object is valid for this terminal.

Parameters:

  • value (void)

Returns:

  • (Boolean)


137
138
139
# File 'lib/vedeu/terminal/buffer.rb', line 137

def within_terminal_boundary?(value)
  buffer[value.position.y] && buffer[value.position.y][value.position.x]
end

#write(value) ⇒ Array<Array<Vedeu::Views::Char>>

Write a collection of cells to the virtual terminal.

Parameters:

Returns:



91
92
93
94
95
96
97
98
99
100
101
# File 'lib/vedeu/terminal/buffer.rb', line 91

def write(value)
  values = Array(value).flatten

  values.each do |v|
    buffer[v.position.y][v.position.x] = v if valid_position?(v)
  end

  render

  self
end