Class: Yatte::Overlay
- Inherits:
-
Object
- Object
- Yatte::Overlay
- Defined in:
- lib/yatte/overlay.rb
Overview
Abstract base for modal overlay pickers (file finder, project search, …). Subclasses override: #prepare (optional), #fetch(query), #inner_width_cap, #title_for(items), #render_row(item, inner_width, selected:).
Direct Known Subclasses
Instance Method Summary collapse
-
#initialize(terminal:, input:, background:) ⇒ Overlay
constructor
A new instance of Overlay.
-
#pick ⇒ Object
Runs the modal loop.
Constructor Details
#initialize(terminal:, input:, background:) ⇒ Overlay
Returns a new instance of Overlay.
8 9 10 11 12 |
# File 'lib/yatte/overlay.rb', line 8 def initialize(terminal:, input:, background:) @terminal = terminal @input = input @background = background end |
Instance Method Details
#pick ⇒ Object
Runs the modal loop. Returns the chosen item (via #fetch) or nil on cancel.
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 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/yatte/overlay.rb', line 15 def pick prepare query = +"" selected = 0 scroll_offset = 0 items = fetch(query) query_changed = false loop do if query_changed items = fetch(query) query_changed = false end selected = selected.clamp(0, [items.length - 1, 0].max) rows, = @terminal.size visible_count = [rows - 7, 1].max scroll_offset = selected if selected < scroll_offset if selected >= scroll_offset + visible_count scroll_offset = selected - visible_count + 1 end draw(query, items, selected, scroll_offset, visible_count) key = @input.read_keypress case key when :enter return items[selected] when :escape return nil when :backspace unless query.empty? query.chop! query_changed = true selected = 0 scroll_offset = 0 end when :arrow_up selected -= 1 if selected > 0 when :arrow_down selected += 1 if selected < items.length - 1 when String query << key query_changed = true selected = 0 scroll_offset = 0 end end end |