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:



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

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)


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

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

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

Write a collection of cells to the virtual terminal, but do not send to a renderer.

Parameters:

Returns:



105
106
107
108
109
# File 'lib/vedeu/terminal/buffer.rb', line 105

def update(value)
  update_buffer(value)

  self
end

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

Parameters:

Returns:



133
134
135
136
137
138
139
# File 'lib/vedeu/terminal/buffer.rb', line 133

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

  values.each do |v|
    buffer[v.position.y][v.position.x] = v if valid_position?(v)
  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)


146
147
148
# File 'lib/vedeu/terminal/buffer.rb', line 146

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)


155
156
157
# File 'lib/vedeu/terminal/buffer.rb', line 155

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, will then send written content to be rendered by a renderer.

Parameters:

Returns:



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

def write(value)
  update_buffer(value)

  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:



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

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)


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

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

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

Write a collection of cells to the virtual terminal, but do not send to a renderer.

Parameters:

Returns:



105
106
107
108
109
# File 'lib/vedeu/terminal/buffer.rb', line 105

def update(value)
  update_buffer(value)

  self
end

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

Parameters:

Returns:



133
134
135
136
137
138
139
# File 'lib/vedeu/terminal/buffer.rb', line 133

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

  values.each do |v|
    buffer[v.position.y][v.position.x] = v if valid_position?(v)
  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)


146
147
148
# File 'lib/vedeu/terminal/buffer.rb', line 146

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)


155
156
157
# File 'lib/vedeu/terminal/buffer.rb', line 155

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, will then send written content to be rendered by a renderer.

Parameters:

Returns:



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

def write(value)
  update_buffer(value)

  render

  self
end