class LessCurse::Widgets::List

Attributes

display_func[RW]
on_select[RW]
selected_data[RW]
top_element_idx[RW]

Public Class Methods

new(data: [], title: "") click to toggle source
Calls superclass method LessCurse::Widgets::Base::new
# File lib/less_curse/widgets/list.rb, line 9
def initialize data: [], title: ""
  super(data: data, title: title)
end

Public Instance Methods

draw(window) click to toggle source
# File lib/less_curse/widgets/list.rb, line 20
def draw window
  LessCurse::Renderer::bold_if focused?, window do
    LessCurse::Renderer::box_with_title window, @title
  end

  # Do we have kind of a display-window?
  visible_data.each_with_index do |d, idx|
    LessCurse::Renderer::bold_if(@selected_data == d, window) do
      if @display_func
        item_text = display_func.call(d)
      else
        item_text = d.to_s
      end
      LessCurse::Renderer::write_line window, idx, item_text
    end
  end

  if visible_data.size != @data.size
    LessCurse::Renderer::box_foot window, "..."
  end
end
handle_input(key) click to toggle source
# File lib/less_curse/widgets/list.rb, line 42
def handle_input key
  action = @actions[key]
  LessCurse::debug_msg "List will execute action: #{action}"
  return false if !action
  send(action)
end
select_next() click to toggle source

Select next data element in list (roll over if nexessary)

# File lib/less_curse/widgets/list.rb, line 64
def select_next
  if @selected_data.nil? && @data.size >= 0
    @selected_data = @data.to_a[0]
  else
    @selected_data = @data.to_a[(selected_data_index + 1) % @data.size]
  end
  recalc_top_index
  if @on_select
    @on_select.call @selected_data
  end
  @selected_data
end
select_previous() click to toggle source

Select previous data element in list (roll over if nexessary)

# File lib/less_curse/widgets/list.rb, line 50
def select_previous
  if @selected_data.nil? && @data.size >= 0
    @selected_data = @data.to_a[0]
  else
    @selected_data = @data.to_a[(selected_data_index - 1) % @data.size]
  end
  recalc_top_index
  if @on_select
    @on_select.call @selected_data
  end
  @selected_data
end
set_default_actions() click to toggle source
# File lib/less_curse/widgets/list.rb, line 15
def set_default_actions
  @actions = { FFI::NCurses::KEY_UP   => :select_previous,
               FFI::NCurses::KEY_DOWN => :select_next}
end

Private Instance Methods

data_index(element) click to toggle source

Get index of given element in @data

# File lib/less_curse/widgets/list.rb, line 80
def data_index element
  @data.to_a.index(element)
end
recalc_top_index() click to toggle source
# File lib/less_curse/widgets/list.rb, line 89
def recalc_top_index
  window = LessCurse.screen.windows[self]
  height,width = FFI::NCurses::getmaxyx(window)
  if @data.size <= (height - 2)
    @top_element_idx = 0
  else
    @top_element_idx = [selected_data_index, (@data.size - (height - 2)).abs].min
  end
end
selected_data_index() click to toggle source

Get index of selected element in @data

# File lib/less_curse/widgets/list.rb, line 85
def selected_data_index
  data_index @selected_data
end
visible_data() click to toggle source
# File lib/less_curse/widgets/list.rb, line 99
def visible_data
  @top_element_idx ||= 0
  window = LessCurse.screen.windows[self]
  height,width = FFI::NCurses::getmaxyx(window)
  # -2: border, -1: 0-based indexing
  @data.to_a[@top_element_idx..(@top_element_idx + height - 2 - 1)]
end