74 lines
1.4 KiB
Ruby
74 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Widgets
|
|
class Peers < VPanel
|
|
class List < Base
|
|
attr_reader :active, :top, :items
|
|
|
|
def initialize(x, y, width, height)
|
|
super
|
|
|
|
@active = 0
|
|
@top = 0
|
|
|
|
@items = 1.upto(height - 1 + 10).map do
|
|
Faker::Name.name
|
|
end
|
|
end
|
|
|
|
def render
|
|
items[top...(top + height)].each_with_index.each do |item, offset|
|
|
index = top + offset
|
|
|
|
if index == active && focused
|
|
Curses.attron Curses.color_pair 2
|
|
else
|
|
Curses.attron Curses.color_pair 1
|
|
end
|
|
|
|
Curses.setpos y + offset, x
|
|
|
|
s = "#{index}: #{item}"
|
|
if s.length <= width
|
|
Curses.addstr s.ljust width
|
|
else
|
|
Curses.addstr "#{s[0...width - 3]}..."
|
|
end
|
|
end
|
|
end
|
|
|
|
def trigger(event)
|
|
case event
|
|
when Events::Panel::Up
|
|
up
|
|
when Events::Panel::Down
|
|
down
|
|
end
|
|
end
|
|
|
|
def up
|
|
@active -= 1
|
|
update
|
|
end
|
|
|
|
def down
|
|
@active += 1
|
|
update
|
|
end
|
|
|
|
def update
|
|
if active.negative?
|
|
@active = items.count - 1
|
|
elsif active >= items.count
|
|
@active = 0
|
|
end
|
|
|
|
if active < top
|
|
@top = active
|
|
elsif active >= top + height
|
|
@top = active - height + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|