2015-01-05 18 views
5

Belirli bir diziyi alan Ruby'de bir cli uygulaması yapmaya çalışıyorum ve sonra ok tuşlarına göz atabildiğim bir liste olarak görüntüliyorum.Curses dizisi Ruby'de klavye ile tarama

Zaten Ruby'de zaten var olan bir kütüphane görmüş gibi hissediyorum, ama bunun adını hatırlayamıyorum.

Kodu benzer bir işlem yapmak için soundcloud2000 kodunu tersine çevirmeye çalışıyorum, ancak bu kod, Soundcloud API'sinin kullanımına sıkı sıkıya bağlı.

ben abstraction.Ad

herkes ya bu yapabilirdi kavram Yakut kod bazı kanıt yapan bir kütüphane gördü fazlası ile şeyle düşünüyorum, lanetler mücevher farkındayım?

+0

awesome_print? – daremkd

cevap

6

Bu sizin aradığınız şey olup olmadığını bilmiyorum ama belki benim fikrimi kullanabilirsiniz.

Neyi başarmaya çalıştığınıza dair daha fazla bilgiye sahip olmadığımdan, girişiniz nedir ve bu örnek çok basit olacaktır.

# 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" 
] 

Ve devam edin ve bir nesne yapmak:

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 

bazı şarkılar hazırlayın:

en biz müzik parçalarından bir liste yaratacağı denilen PlaylistDemo çalışmak için bir sınıf var diyelim

pd = PlaylistDemo.new(songs) 

Şimdi benim düşüncem, pozisyonu değiştirmek için dispel kullanmaktır. tam olarak nerede olduğunuzu (ve buna göre "UI" güncelleyin). kod

def show_ui playlist_obj 
    ["\n", playlist_obj.show_playlist, "\nCurrent position: #{playlist_obj.position + 1} "].join("\n") 
end 

Final süsü: Ben senin CLI uygulama için UI yapacak bir fonksiyon hazırladım Bunun için

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 

Ayrıca colorize kullanabilirsiniz ama bunun için Bir yerde puts'a ihtiyacım var.

Lütfen bu bir örnek olduğundan, konum için bir limit belirlemedim.

burada örneğe bakın:

Tam kodu: http://paste.debian.net/139651/

+0

Bam, bence bu! Dispel * ve * ve bazı mükemmel örnek kodlarını düşündüğüm kütüphaneydi! Bu gece bunu deneyelim ve size ödül vereyim :) –

+0

Yardım ettiğim için çok mutluyum :) ilk lütufumu – radubogdan

2

curses ruby ​​gem'i arıyorsun. @phoet tarafından oluşturulan menünün

Example.

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 
+0

Ben curses gem hakkında biliyorum, ben daha soyutlama –

+1

olan bir kütüphaneden bahsediyorum Yardımcı olmadığım için üzgünüm, bir dahaki sefere lütfen diğer değerli cevherlerin farkında olmanızı sağlayın, böylece başkaları sorunuza daha doğru cevap verebilir. – eabraham

+0

Endişeye gerek yok, sadece cevabıma ekledim. –