Archived
1
0
Fork 0
This repository has been archived on 2023-03-27. You can view files and clone it, but cannot push or open issues or pull requests.
cli-old/lib/main.rb

117 lines
2.1 KiB
Ruby
Raw Normal View History

2017-07-21 02:48:04 -04:00
# frozen_string_literal: true
require 'thread'
require 'curses'
class Main
def self.inherited(_base)
raise "#{self} is final"
end
def self.mutex
(@mutex ||= Mutex.new).tap { freeze }
end
def initialize
raise "#{self.class} is singleton" unless self.class.mutex.try_lock
call
end
private
def call
before_loop
loop do
before_iteration
sleep
after_iteration
end
after_loop
end
def sleep
super 0.01
end
def before_loop
Curses.init_screen
Curses.start_color
Curses.noecho # do no echo input
Curses.curs_set 0 # invisible cursor
Curses.timeout = 0 # non-blocking input
Curses.stdscr.keypad = true
Curses.init_pair 1, Curses::COLOR_WHITE, Curses::COLOR_BLACK
Curses.init_pair 2, Curses::COLOR_BLACK, Curses::COLOR_WHITE
2017-07-21 07:41:05 -04:00
initials
2017-07-21 02:48:04 -04:00
end
def after_loop
Curses.close_screen
end
2017-07-21 07:41:05 -04:00
def before_iteration
render
end
2017-07-21 02:48:04 -04:00
def after_iteration
loop do
event = Curses.getch
break if event.nil?
handle event
end
end
2017-07-21 07:54:07 -04:00
def initials
2017-07-21 08:18:29 -04:00
@height = Curses.stdscr.maxy - 1
@items = 1.upto(@height + 10).map do
2017-07-21 07:54:07 -04:00
['Qwe'].*(3 * (1 + rand(10))).join(' ')
end
@top = 0
@active = 0
end
2017-07-21 07:41:05 -04:00
2017-07-21 08:03:53 -04:00
def handle(event)
case event
when Curses::Key::UP
@active -= 1
@active = @items.count - 1 if @active.negative?
when Curses::Key::DOWN
@active += 1
@active = 0 if @active >= @items.count
end
2017-07-21 08:25:17 -04:00
if @active < @top
@top = @active
elsif @active >= @top + @height
@top = @active - @height + 1
end
2017-07-21 08:03:53 -04:00
end
2017-07-21 07:41:05 -04:00
2017-07-21 07:54:07 -04:00
def render
Curses.clear
2017-07-21 08:18:29 -04:00
Curses.attron Curses.color_pair 1
Curses.setpos 0, 0
Curses.addstr "items: #{@items.count}, height: #@height, active: #@active, top: #@top"
2017-07-21 08:20:31 -04:00
@items[@top...(@top + @height)].each_with_index.each do |item, offset|
index = @top + offset
2017-07-21 07:54:07 -04:00
if index == @active
Curses.attron Curses.color_pair 2
else
Curses.attron Curses.color_pair 1
end
2017-07-21 08:20:31 -04:00
Curses.setpos 1 + offset, 0
2017-07-21 08:12:16 -04:00
Curses.addstr "#{index}: #{item}".ljust Curses.stdscr.maxx
2017-07-21 07:54:07 -04:00
end
Curses.refresh
end
2017-07-21 02:48:04 -04:00
end