Class: Yatte::Overlay

Inherits:
Object
  • Object
show all
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

FileFinderOverlay, ProjectSearchOverlay

Instance Method Summary collapse

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

#pickObject

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