class Pecorb::List
Public Class Methods
new(items, opts={})
click to toggle source
# File lib/pecorb/list.rb, line 9 def initialize(items, opts={}) raise "Items must be enumerable!" unless items.is_a? Enumerable @prompt = opts.fetch(:prompt, "Select an item: ") @pager = Pager.new items, IO.console.winsize.first - 2 @cursor = 0 @filter_text = "" end
Public Instance Methods
prompt()
click to toggle source
# File lib/pecorb/list.rb, line 17 def prompt init_ui while c = read_char case c when "", "\r" break when "", "" carriage_return clear_to_eos exit 0 when "" clear_screen print @prompt @cursor.times { right } update_ui when "" # Backspace key next if @filter_text.empty? || @cursor <= 0 @filter_text.slice!(@cursor - 1) update_ui backspace @cursor -= 1 when Console::LEFT next unless @cursor > 0 print c @cursor -= 1 when Console::RIGHT next unless @cursor < @filter_text.length print c @cursor += 1 when Console::UP, "" @pager.up update_ui when Console::DOWN, "\n" # CTRL-J enters a linefeed char in bash @pager.down update_ui else @filter_text.insert(@cursor, c) update_ui print c @cursor += 1 end end backspace(@cursor) clear_to_eos cyan puts @pager.selected_item reset_color @pager.selected_item end
Private Instance Methods
clear_items()
click to toggle source
# File lib/pecorb/list.rb, line 94 def clear_items carriage_return; down; clear_to_eol @pager.items_in_viewport.size.times { down; clear_to_eol } @pager.items_in_viewport.size.times { up } end
init_ui()
click to toggle source
# File lib/pecorb/list.rb, line 70 def init_ui # WARNING: Can't use save_pos here because it causes problems when # introducing newlines, see issue #1 puts print_items carriage_return; (@pager.items_in_viewport.size + 1).times { up } print @prompt end
print_items()
click to toggle source
# File lib/pecorb/list.rb, line 100 def print_items @pager.items_in_viewport.each_with_index do |item, i| if item == @pager.selected_item cyan print "‣ " else print " " end puts item reset_color end end
update_filter_text()
click to toggle source
# File lib/pecorb/list.rb, line 88 def update_filter_text backspace(@cursor) print @filter_text clear_to_eol end
update_ui()
click to toggle source
# File lib/pecorb/list.rb, line 79 def update_ui save_pos do update_filter_text clear_items @pager.filter! @filter_text print_items end end