class FilePicker
Responsible for keeping the state of the interactive file picker. Also responds to user input to modify the state and redraw file picker to reflect new state.
Public Class Methods
new(start_dir_path, options = {})
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 11 def initialize(start_dir_path, options = {}) @model = FileBrowserModel.new(start_dir_path, options) @view = FileBrowserView.new(options) @reader = TTY::Reader.new(interrupt: :exit) @reader.subscribe(self) @cursor = TTY::Cursor @user_have_picked = false absolute_start_path = File.absolute_path(start_dir_path) change_directory(absolute_start_path) end
Public Instance Methods
keydown(_event)
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 35 def keydown(_event) @model.selected += 1 unless selected_at_bottom? if selected_below_page? @model.page += 1 print(@cursor.clear_screen_down) end redraw(true) end
keypress(event)
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 53 def keypress(event) case event.value when "\r" selected = @model.selected_absolute_path if File.directory?(selected) change_directory(selected) print(@cursor.clear_screen_down) # Cache keeps a rendering of current directory. # Going to a new directory, so needs to refresh # the cache. redraw(false) else @user_have_picked = true end end end
keyup(_event)
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 44 def keyup(_event) @model.selected -= 1 unless selected_at_top? if selected_above_page? @model.page -= 1 print(@cursor.clear_screen_down) end redraw(true) end
pick_file()
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 23 def pick_file @user_have_picked = false redraw(false) @cursor.invisible do @reader.read_keypress until @user_have_picked end print(@cursor.clear_screen_down) @model.selected_absolute_path end
Private Instance Methods
change_directory(absolute_file_path)
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 73 def change_directory(absolute_file_path) @model.current_path = absolute_file_path @model.page = 0 @model.selected = 0 @model.files = @model.order_files(@model.files_in_dir) end
redraw(use_cache)
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 80 def redraw(use_cache) rendered = @view.render(@model.current_path, @model.files, @model.selected, @model.page, use_cache) Helper.print_in_place(rendered) end
selected_above_page?()
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 97 def selected_above_page? @model.selected < (@model.page * @view.files_per_page) end
selected_at_bottom?()
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 93 def selected_at_bottom? @model.selected == @model.files.length - 1 end
selected_at_top?()
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 89 def selected_at_top? @model.selected.zero? end
selected_below_page?()
click to toggle source
# File lib/terminal-file-picker/file_picker.rb, line 101 def selected_below_page? @model.selected > (@model.page * @view.files_per_page) + @view.files_per_page - 1 end