Class: TTY::Prompt::EnumPaginator

Inherits:
Paginator
  • Object
show all
Defined in:
lib/tty/prompt/enum_paginator.rb

Constant Summary

Constants inherited from Paginator

Paginator::DEFAULT_PAGE_SIZE

Instance Method Summary collapse

Methods inherited from Paginator

#initialize, #max_index

Constructor Details

This class inherits a constructor from TTY::Prompt::Paginator

Instance Method Details

#paginate(list, active, per_page = nil, &block) ⇒ Object

Paginate list of choices based on current active choice. Move entire pages.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/tty/prompt/enum_paginator.rb', line 12

def paginate(list, active, per_page = nil, &block)
  default_size = (list.size <= DEFAULT_PAGE_SIZE ? list.size : DEFAULT_PAGE_SIZE)
  @per_page = @per_page || per_page || default_size

  # Don't paginate short lists
  if list.size <= @per_page
    @lower_index = 0
    @upper_index = list.size - 1
    if block
      return list.each_with_index(&block)
    else
      return list.each_with_index.to_enum
    end
  end

  unless active.nil? # User may input index out of range
    @last_index = active
  end
  page  = (@last_index / @per_page.to_f).ceil
  pages = (list.size / @per_page.to_f).ceil
  if page == 0
    @lower_index = 0
    @upper_index = @lower_index + @per_page - 1
  elsif page > 0 && page <= pages
    @lower_index = (page - 1) * @per_page
    @upper_index = @lower_index + @per_page - 1
  else
    @upper_index = list.size - 1
    @lower_index = @upper_index - @per_page + 1
  end

  sliced_list = list[@lower_index..@upper_index]
  indices = (@lower_index..@upper_index)

  if block
    sliced_list.each_with_index do |item, index|
      block[item, @lower_index + index]
    end
  else
    sliced_list.zip(indices).to_enum unless block_given?
  end
end