2015-01-05 15 views
5

Tôi đang cố gắng tạo một ứng dụng cli trong Ruby, sau đó hiển thị nó dưới dạng danh sách mà tôi có thể duyệt bằng các phím mũi tên.Duyệt tìm kiếm mảng bằng bàn phím trong Ruby

Tôi cảm thấy như tôi đã nhìn thấy một thư viện trong Ruby đã thực hiện điều này, nhưng tôi không thể nhớ tên của nó.

Tôi đang cố gắng thiết kế lại mã từ soundcloud2000 để làm điều gì đó tương tự, nhưng mã của anh ấy được kết hợp chặt chẽ với việc sử dụng API Soundcloud.

Tôi nhận thức được những lời nguyền đá quý, tôi đang nghĩ đến với một cái gì đó với nhiều abstraction.Ad

Có ai nhìn thấy một thư viện nào đó hoặc một số bằng chứng về khái niệm mã Ruby có thể làm điều này?

+0

awesome_print? – daremkd

Trả lời

6

Tôi không biết đây có phải là điều bạn đang tìm kiếm hay không nhưng có thể bạn có thể sử dụng ý tưởng của mình.

Vì tôi không có thêm thông tin về những gì bạn đang cố gắng hoàn thành, đầu vào của bạn là gì và như vậy, ví dụ này sẽ rất đơn giản.

Hãy nói rằng chúng tôi có một lớp học để làm việc với gọi PlaylistDemo rằng sẽ tạo ra một danh sách nhạc với những bài hát:

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 

Chuẩn bị một số bài hát:

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

Và đi trước và làm cho một đối tượng:

pd = PlaylistDemo.new(songs) 

Bây giờ ý tưởng của tôi là sử dụng dispel để thao tác vị trí và se e chính xác bạn đang ở đâu (và cập nhật "giao diện người dùng" tương ứng).

Đối với điều này tôi đã chuẩn bị một chức năng mà sẽ làm cho giao diện người dùng cho các ứng dụng CLI của bạn:

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

cuối cùng đoạn mã:

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 

Bạn cũng có thể sử dụng colorize nhưng đối với bạn sẽ cần puts ở đâu đó.

Xin lưu ý rằng tôi không đặt giới hạn vị trí vì đây chỉ là ví dụ.

Xem ví dụ của tôi ở đây:

Full mã: http://paste.debian.net/139651/

+0

Bam, đây là nó tôi nghĩ! Dispel là thư viện mà tôi đã nghĩ đến * và * và một số mã ví dụ hoàn hảo! Hãy để tôi dùng thử tối nay và cung cấp cho bạn tiền thưởng :) –

+0

Tôi rất vui vì nó đã giúp :) tiền thưởng đầu tiên của tôi – radubogdan

2

Bạn đang tìm kiếm đá quý ruby ​​curses.

Example menu được tạo bởi @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 
+0

Tôi biết về đá quý nguyền rủa, tôi đang nói về một thư viện trừu tượng hơn –

+1

Tôi xin lỗi vì điều đó không hữu ích, lần tới hãy đưa bạn biết về đá quý có thể áp dụng để người khác có thể trả lời câu hỏi của bạn chính xác hơn. – eabraham

+0

Đừng lo, chỉ cần thêm nó vào câu trả lời của tôi. –

Các vấn đề liên quan