我不知道这是否是您需要的,但也许您可以使用我的想法。
由于我不知道您想要实现什么,您的输入等信息,所以此示例将非常简单。
假设我们有一个名为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应用程序创建用户界面:
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
。
请注意,我没有设置位置限制,因为这只是一个示例。
查看我的示例:
![source: imgur.com](https://i.imgur.com/cAn6hn3.png)
完整代码:
http://paste.debian.net/139651/