class Pepin::CursesView::ListView

Public Class Methods

new(height, width, y, x, query:) click to toggle source
# File lib/pepin/curses_view.rb, line 65
def initialize(height, width, y, x, query:)
  @query  = query
  @window = Curses::Window.new(height, width, y, x)

  @query.add_observer -> { render }, :call
end

Public Instance Methods

render() click to toggle source
# File lib/pepin/curses_view.rb, line 72
def render
  @window.clear

  @query.search.each.with_index 1 do |item, n|
    selected       = n == 1
    matched_offset = @query.pattern ? @query.pattern.match(item).offset(0) : [-1, -1]

    @window.setpos n, 0
    @window.attron Curses::A_UNDERLINE if selected
    item.each_char.with_index do |ch, i|
      @window.attron  Curses::A_BOLD if i == matched_offset[0]
      @window.attroff Curses::A_BOLD if i == matched_offset[1]
      @window.addch ch
    end

    @window.addstr ' ' * (@window.maxx - @window.curx)
    @window.attroff Curses::A_UNDERLINE if selected
    @window.attroff Curses::A_BOLD
  end

  @window.refresh
end