Class: Vedeu::Output::Viewport

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/vedeu/output/viewport.rb

Overview

A Viewport is the visible part of the content within an interface.

When a buffer has more lines than the defined height, or more columns than the defined width of the interface, this class provides ‘scrolling’ via the cursor’s position.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(view) ⇒ Vedeu::Output::Viewport

Returns an instance of Vedeu::Output::Viewport.

Parameters:



39
40
41
# File 'lib/vedeu/output/viewport.rb', line 39

def initialize(view)
  @view = view
end

Instance Attribute Details

#viewVedeu::Views::View (readonly, protected)

Returns:



75
76
77
# File 'lib/vedeu/output/viewport.rb', line 75

def view
  @view
end

Class Method Details

.render(view) ⇒ Array<Array<Vedeu::Views::Char>>

Parameters:

Returns:



31
32
33
# File 'lib/vedeu/output/viewport.rb', line 31

def self.render(view)
  new(view).render
end

Instance Method Details

#borderObject (private)

Return the border associated with the interface/view we are drawing.



153
154
155
# File 'lib/vedeu/output/viewport.rb', line 153

def border
  @border ||= Vedeu.borders.by_name(name)
end

#bxFixnum (private)

Returns:

  • (Fixnum)


158
159
160
# File 'lib/vedeu/output/viewport.rb', line 158

def bx
  @bx ||= border.bx
end

#byFixnum (private)

Returns:

  • (Fixnum)


163
164
165
# File 'lib/vedeu/output/viewport.rb', line 163

def by
  @by ||= border.by
end

#columnsRange (private)

Note:

The width is reduced by one as #columns is a range of Array elements.

Using the current cursor’s x position, return a range of visible columns.

Scrolls the content horizontally when the stored cursor’s x position for the interface is outside of the visible area.

Returns:

  • (Range)


118
119
120
# File 'lib/vedeu/output/viewport.rb', line 118

def columns
  left...(left + width)
end

#content_offset(offset, dimension) ⇒ Fixnum (private)

Returns the offset for the content (the number of rows or columns to change the viewport by on either the y or x axis) determined by the offset (the cursor’s y or x offset position.

Parameters:

  • offset (Fixnum)

    The cursor’s oy or ox values.

  • dimension (Fixnum)

    Either the height or width.

Returns:

  • (Fixnum)


139
140
141
142
143
144
145
146
147
# File 'lib/vedeu/output/viewport.rb', line 139

def content_offset(offset, dimension)
  if offset >= dimension
    offset - dimension

  else
    0

  end
end

#cursorVedeu::Cursors::Cursor (private)

Returns:

See Also:

  • Cursors::Repository#by_name


169
170
171
# File 'lib/vedeu/output/viewport.rb', line 169

def cursor
  @cursor ||= Vedeu.cursors.by_name(name)
end

#leftFixnum (private)

Returns:

  • (Fixnum)


123
124
125
# File 'lib/vedeu/output/viewport.rb', line 123

def left
  @left ||= content_offset(ox, width)
end

#renderArray<Array<String>>

Returns the content for the view.

Returns:

  • (Array<Array<String>>)


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/vedeu/output/viewport.rb', line 46

def render
  return [] unless visible?

  Vedeu.timer("Rendering: '#{name}'") do
    out = []

    show.each_with_index do |line, iy|
      line.each_with_index do |column, ix|
        column.position = [by + iy, bx + ix]
        out << column
      end
    end

    out
  end
end

#rowsRange (private)

Note:

The height is reduced by one as #rows is a range of Array elements.

Using the current cursor’s y position, return a range of visible lines.

Scrolls the content vertically when the stored cursor’s y position for the interface is outside of the visible area.

Returns:

  • (Range)


103
104
105
# File 'lib/vedeu/output/viewport.rb', line 103

def rows
  top...(top + height)
end

#showArray (private)

Note:

If there are no lines of content, we return an empty array. If there are no more columns of content we return a space enclosed in an array; this prevents a weird line hopping bug which occurs when the current line has no more content, but subsequent lines do.

Returns the visible content for the view.

Returns:

  • (Array)


88
89
90
# File 'lib/vedeu/output/viewport.rb', line 88

def show
  (lines[rows] || []).map { |line| (line.chars[columns] || []) }
end

#to_sString Also known as: to_str

Returns a string representation of the viewport.

Returns:

  • (String)


66
67
68
# File 'lib/vedeu/output/viewport.rb', line 66

def to_s
  render.map(&:to_s).join("\n")
end

#topFixnum (private)

Returns:

  • (Fixnum)


128
129
130
# File 'lib/vedeu/output/viewport.rb', line 128

def top
  @top ||= content_offset(oy, height)
end