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