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