2015-01-05 7 views
5

Ich versuche, eine cli-App in Ruby, die ein Array nimmt dann zeigt es als eine Liste, die ich mit den Pfeiltasten durchsuchen kann.Curses Array durchsuchen mit Tastatur in Ruby

Ich fühle mich wie ich bereits eine Bibliothek in Ruby gesehen habe, die das bereits tut, aber ich kann mich nicht an den Namen erinnern.

Ich versuche, den Code von soundcloud2000 um etwas ähnliches zu reverse Engineering, aber sein Code ist eng mit der Verwendung der Soundcloud-API gekoppelt.

Ich bin mir bewusst, der Edelstein Flüche, ich denke mit etwas mehr abstraction.Ad

Hat jemand eine Bibliothek gesehen, dass es oder ein Proof of Concept Ruby-Code tut, die dies tun könnte?

+0

awesome_print? – daremkd

Antwort

6

Ich weiß nicht, ob das ist, was Sie suchen, aber vielleicht können Sie meine Idee verwenden.

Da ich nicht mehr Informationen über das, was Sie erreichen möchten, was ist Ihre Eingabe und so weiter, wird dieses Beispiel sehr einfach sein.

Lassen Sie uns sagen, dass wir eine Klasse mit genannt PlaylistDemo zu arbeiten, die eine Playlist mit Songs erstellen wird:

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 

einige Lieder vorbereiten:

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

Und gehen Sie vor und ein Objekt machen:

pd = PlaylistDemo.new(songs) 

Jetzt ist meine Idee, dispel zu verwenden, um Position und se zu manipulieren Genau wo du bist (und aktualisiere die "UI" entsprechend).

Dafür ich eine Funktion vorbereitet haben, die die Benutzeroberfläche für Ihre CLI-Anwendung machen:

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

Schluss Stück Code:

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 

Sie auch colorize aber dafür verwenden, können Sie werde irgendwo puts brauchen.

Bitte nicht, dass ich kein Limit für die Position gesetzt habe, da dies nur ein Beispiel ist.

Siehe mein Beispiel hier:

Voll Code: http://paste.debian.net/139651/

+0

Bam, das ist es, denke ich! Dispel war die Bibliothek, an die ich dachte * und * und ein paar perfekte Beispielcodes! Lassen Sie mich das heute Abend ausprobieren und Ihnen das Kopfgeld geben :) –

+0

Ich bin froh, dass es geholfen hat :) mein erstes Kopfgeld – radubogdan

2

Sie suchen nach dem curses Rubin Edelstein.

Example Menü erstellt von @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

Ich weiß über das Fluch-Juwel, ich spreche über eine Bibliothek, die mehr Abstraktion hat –

+1

Es tut mir leid, dass das nicht hilfreich war, das nächste Mal bitte, dass Sie sich der zutreffenden Edelsteine ​​bewusst sind, damit andere Ihre Frage genauer beantworten können. – eabraham

+0

Keine Sorge, habe es nur zu meiner Antwort hinzugefügt. –