class FileBrowserView

Renders a directory view with pagination support. Allows highlighting an item in the directory to indicate its selected. Instance stores directory view rendering options.

Attributes

files_per_page[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 11
def initialize(options = {})
  default_header = ['Name', 'Size (B)', 'Date modified', 'Time modified']
  @header = options.fetch(:header, default_header)
  @dir_label = options.fetch(:dir_label, 'Directory')
  @page_label = options.fetch(:page_label, 'Page')
  @left_pad = options.fetch(:left_pad, 2)
  @right_pad = options.fetch(:right_pad, 2)
  @files_per_page = options.fetch(:files_per_page, 10)
  @show_info_line = options.fetch(:show_info_line, true)
  @info_line_position = options.fetch(:info_line_position, :top)
  @cache = ''
end

Public Instance Methods

render(dir_path, files, selected_index, page, use_cache = false) click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 24
def render(dir_path, files, selected_index, page, use_cache = false)
  files_table = files_table_string(files, use_cache)
  file_browser = render_file_browser(files_table, selected_index, page)

  return file_browser unless @show_info_line

  info_line = info_bar(files.length, page, dir_path)
  return "#{info_line}\n\n#{file_browser}" if @info_line_position == :top

  "#{file_browser}\n\n#{info_line}"
end

Private Instance Methods

files_table_string(files, use_cache) click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 51
def files_table_string(files, use_cache)
  @table = Table.new(@header, files, @left_pad, @right_pad)

  @cache = @table.render if !use_cache || (use_cache && @cache.empty?)
  return @cache unless table_width_overflowed?

  @cache.split("\n").map do |line|
    line[0..(screen_width - 1)]
  end.join("\n")
end
highlight_row(rows, row_no) click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 62
def highlight_row(rows, row_no)
  rows[row_no] = Helper.highlight(rows[row_no])

  rows
end
info_bar(total_files, page, dir_path) click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 68
def info_bar(total_files, page, dir_path)
  page_count = (total_files.to_f / @files_per_page).ceil
  page_info = "#{@page_label}: #{page + 1}/#{page_count}"
  dir_info = "#{@dir_label}: #{dir_path}"
  info_bar = "#{page_info} | #{dir_info}"
  return info_bar unless info_bar.length > screen_width

  info_bar[0..screen_width - 1]
end
paginate_table_body(body_rows, page_no) click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 78
def paginate_table_body(body_rows, page_no)
  page_start = page_no * @files_per_page
  page_end = page_start + (@files_per_page - 1)

  body_rows[page_start..page_end]
end
render_file_browser(rendered_files_table, selected_index, page) click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 38
def render_file_browser(rendered_files_table, selected_index, page)
  rendered_rows = rendered_files_table.split("\n")

  header = rendered_rows[0..1].join("\n")

  body_rows = rendered_rows[2..]
  body_rows = highlight_row(body_rows, selected_index)
  body_rows = paginate_table_body(body_rows, page)
  body = body_rows.join("\n")

  "#{header}\n#{body}"
end
screen_width() click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 89
def screen_width
  TTY::Screen.width
end
table_width_overflowed?() click to toggle source
# File lib/terminal-file-picker/file_browser_view.rb, line 85
def table_width_overflowed?
  @table.total_row_size >= screen_width
end