class Pecorb::Pager

Public Class Methods

new(items, viewport_size) click to toggle source
# File lib/pecorb/pager.rb, line 5
def initialize(items, viewport_size)
  @configured_items = @items = items
  @viewport_size = viewport_size
  @cursor = 0
  set_viewport_to_top
end

Public Instance Methods

down() click to toggle source
# File lib/pecorb/pager.rb, line 31
def down
  move_cursor_by(1)
end
filter!(filter_text) click to toggle source
# File lib/pecorb/pager.rb, line 20
def filter!(filter_text)
  self.items = fuzzy_filter(filter_text)
end
items=(new_items) click to toggle source
# File lib/pecorb/pager.rb, line 24
def items=(new_items)
  @items = new_items
  max = @items.any? ? (@items.size - 1) : 0
  @cursor = @cursor.clamp(0, max)
  reset_viewport_to_cover_cursor
end
items_in_viewport() click to toggle source
# File lib/pecorb/pager.rb, line 16
def items_in_viewport
  @items.slice(@viewport.min, @viewport_size)
end
selected_item() click to toggle source
# File lib/pecorb/pager.rb, line 12
def selected_item
  @items.fetch(@cursor)
end
up() click to toggle source
# File lib/pecorb/pager.rb, line 35
def up
  move_cursor_by(-1)
end

Private Instance Methods

fuzzy_filter(filter_text) click to toggle source
# File lib/pecorb/pager.rb, line 76
def fuzzy_filter(filter_text)
  return @configured_items unless filter_text
  regex = Regexp.new(filter_text.chars.join(".*"), "i")
  @configured_items.select {|i| regex.match i }
end
move_cursor_by(number) click to toggle source
# File lib/pecorb/pager.rb, line 42
def move_cursor_by(number)
  new_cursor = @cursor + number
  if new_cursor >= @items.size
    @cursor = 0
    reset_viewport_to_cover_cursor
  elsif new_cursor > @viewport.max
    shift_viewport_by(1)
  end
  if new_cursor < 0
    @cursor = @items.size - 1
    reset_viewport_to_cover_cursor
  elsif new_cursor < @viewport.min
    shift_viewport_by(-1)
  end
  @cursor = new_cursor % @items.size
end
reset_viewport_to_cover_cursor() click to toggle source
# File lib/pecorb/pager.rb, line 63
def reset_viewport_to_cover_cursor
  set_viewport_to_top unless @viewport.all? {|i| @items[i]}
  if @cursor < @viewport.min
    @viewport = @cursor..(@cursor + @viewport_size - 1)
  elsif @cursor > @viewport.max
    @viewport = (@cursor - @viewport_size + 1)..@cursor
  end
end
set_viewport_to_top() click to toggle source
# File lib/pecorb/pager.rb, line 72
def set_viewport_to_top
  @viewport = 0..(@viewport_size - 1)
end
shift_viewport_by(number) click to toggle source
# File lib/pecorb/pager.rb, line 59
def shift_viewport_by(number)
  @viewport = (@viewport.min + number)..(@viewport.max + number)
end