class Sawaal::Cursor

Handle cursor movements and text highlighting

@api private

Attributes

current_line_index[RW]

Public Class Methods

new() click to toggle source
# File lib/sawaal/cursor.rb, line 12
def initialize
  @text = []
  @current_line_index = -1
  @help_hidden = false
end

Public Instance Methods

hide() click to toggle source
# File lib/sawaal/cursor.rb, line 27
def hide
  TTY.print TTY::HIDE_CURSOR
end
hide_help() click to toggle source
# File lib/sawaal/cursor.rb, line 49
def hide_help
  return if @help_hidden
  restore_position
  clear_line
  move_down
  move_to_beginning
  @help_hidden = true
end
highlight(index) click to toggle source
# File lib/sawaal/cursor.rb, line 80
def highlight(index)
  index %= @text.length
  unhighlight
  move_to(index)
  @current_line_index = index

  move_to_beginning
  clear_line
  TTY.print cyan(@text[@current_line_index])
end
move_down() click to toggle source
# File lib/sawaal/cursor.rb, line 39
def move_down
  TTY.print TTY::MOVE_DOWN
end
move_up() click to toggle source
# File lib/sawaal/cursor.rb, line 35
def move_up
  TTY.print TTY::MOVE_UP
end
save_excursion(&block) click to toggle source
# File lib/sawaal/cursor.rb, line 18
def save_excursion(&block)
  hide
  begin
    return block.call
  ensure
    show
  end
end
show() click to toggle source
# File lib/sawaal/cursor.rb, line 31
def show
  TTY.print TTY::SHOW_CURSOR
end
write_item(item) click to toggle source
# File lib/sawaal/cursor.rb, line 58
def write_item(item)
  line = "#{bold TTY::ARROW} #{item}"
  move_down
  move_to_beginning
  TTY.print line
  @text.push(line)
  @current_line_index += 1
end
write_question(question) click to toggle source
# File lib/sawaal/cursor.rb, line 43
def write_question(question)
  TTY.print "#{green('?')} #{bold(question)} "
  save_position
  TTY.print '(use arrow keys, press <enter> when finished)'
end
write_selection(item) click to toggle source
# File lib/sawaal/cursor.rb, line 67
def write_selection(item)
  move_to(@text.length)
  move_to_beginning
  @text.length.times do
    move_up
    clear_line
  end

  restore_position
  clear_line
  TTY.println cyan(item)
end

Private Instance Methods

clear_line() click to toggle source
# File lib/sawaal/cursor.rb, line 111
def clear_line
  TTY.print TTY::CLEAR_LINE
end
move_to(index) click to toggle source
# File lib/sawaal/cursor.rb, line 103
def move_to(index)
  if index < @current_line_index
    (@current_line_index - index).times { move_up }
  else
    (index - @current_line_index).times { move_down }
  end
end
move_to_beginning() click to toggle source
# File lib/sawaal/cursor.rb, line 99
def move_to_beginning
  TTY.print TTY::BEGINNING_OF_LINE
end
restore_position() click to toggle source
# File lib/sawaal/cursor.rb, line 119
def restore_position
  TTY.print TTY::RESTORE_POSITION
end
save_position() click to toggle source
# File lib/sawaal/cursor.rb, line 115
def save_position
  TTY.print TTY::SAVE_POSITION
end
unhighlight() click to toggle source
# File lib/sawaal/cursor.rb, line 93
def unhighlight
  move_to_beginning
  clear_line
  TTY.print @text[@current_line_index]
end