我试图在Ruby中制作一个带有给定数组的cli应用程序,然后将其显示为一个列表,我可以使用箭头键进行浏览。
我觉得我已经在Ruby中看到过这样做的库,但我不记得它的名字。
我试图对来自soundcloud2000的代码进行逆向工程来做类似的事情,但他的代码与使用Soundcloud API紧密相关。
我知道诅咒的宝石,我正在考虑更多抽象的东西.Ad
有没有人见过这样做的库或者可以做到这一点的概念证明Ruby代码?
答案 0 :(得分:6)
我不知道这是否是您正在寻找的,但也许您可以使用我的想法。
由于我没有更多关于你要完成什么的信息,你的输入是什么等等,这个例子将非常简单。
假设我们有一个类可以使用名为PlaylistDemo的类来创建带有歌曲的播放列表:
class PlaylistDemo
attr_accessor :position
def initialize songs
@playlist = Array.new
songs.each { |song| @playlist << song }
@position = 0
end
def show_playlist
@playlist.each_with_index.map do |song, index|
position == index ? "[#{song}]" : " #{song} "
end
end
end
准备一些歌曲:
# From billboard.com
songs = [
"Taylor Swift - Blank Space",
"Mark Ronson Featuring Bruno Mars - Uptown Funk!",
"Hozier - Take Me To Church",
"Meghan Trainor - Lips Are Movin",
"Meghan Trainor - All About That Bass"
]
继续做一个对象:
pd = PlaylistDemo.new(songs)
现在我的想法是使用dispel来操纵位置并准确查看你的位置(并相应地更新“UI”)。
为此,我准备了一个函数,它将为您的CLI应用程序创建UI:
def show_ui playlist_obj
["\n", playlist_obj.show_playlist, "\nCurrent position: #{playlist_obj.position + 1} "].join("\n")
end
最后一段代码:
Dispel::Screen.open do |screen|
screen.draw show_ui(pd)
Dispel::Keyboard.output do |key|
case key
when :up then pd.position -= 1
when :down then pd.position += 1
when "q" then break
end
screen.draw show_ui(pd)
end
end
您也可以使用colorize,但为此您需要puts
某处。
请注意,我没有设置位置限制,因为这只是一个例子。
请参阅我的示例:
答案 1 :(得分:2)
您正在寻找curses红宝石宝石。
@phoet创建的菜单require "curses"
include Curses
init_screen
start_color
noecho
def draw_menu(menu, active_index=nil)
4.times do |i|
menu.setpos(i + 1, 1)
menu.attrset(i == active_index ? A_STANDOUT : A_NORMAL)
menu.addstr "item_#{i}"
end
end
def draw_info(menu, text)
menu.setpos(1, 10)
menu.attrset(A_NORMAL)
menu.addstr text
end
position = 0
menu = Window.new(7,40,7,2)
menu.box('|', '-')
draw_menu(menu, position)
while ch = menu.getch
case ch
when 'w'
draw_info menu, 'move up'
position -= 1
when 's'
draw_info menu, 'move down'
position += 1
when 'x'
exit
end
position = 3 if position < 0
position = 0 if position > 3
draw_menu(menu, position)
end