Find file
Fetching contributors…
Cannot retrieve contributors at this time
311 lines (226 sloc) 8.92 KB
= rbcurse
* << CORRECTED !!!
* rbcurse on rubyforge:
* See latest changes on
* Many working demos in examples folder, such as:
* test2.rb (exit with F1, Or Cancel button/Alt-C) contains various
widgets. F2 for menubar toggling
* rfe.rb is a ruby file explorer
* testtodo.rb is a test TODO application
* Screenshots on
and (new)
and on blog,
A small but comprehensive widget library written in ruby for creating ncurses
* entry fields in ruby
* scrollable list box (new, editable with Field, checkbox and combos)
* multi-line editable area
* togglebutton, radio and check buttons (with mnemonics)
* message box
* menubar - with submenu and CheckBoxMenuItem
* popup list
* tabbedpane (multiple forms using tabbed metaphor)
* combobox
* labels with mnemonics (hotkeys)
* multi-column table - with cell selection and editing
Above may be created using DSL like syntax, or hashes.
== Sample programs:
* rfe : file explorer or Finder like app
* testtodo.rb : a todo app based on a yaml file
* test2.rb most widgets (including menus)
* test1.rb various kinds of messageboxes (input, list, custom)
* testtabp.rb tabbed pane
* testcombo.rb combos with various insert policies and vertical
TextArea not bug free. Some situations wrapping errors could exist.
== Terminal related issues.
* Some terminals may not show underlines (e.g screen).
* Some terminals (xterm-color) do not process Function keys, avoid declaring F1 etc if
unsure of client terminals. I have put in fixes for xterm-color F1 and
* To use ALT/META keys on a Mac OS X, in Terminal preferences, under
Keyboard, select
"use Option as Meta key". All hotkeys are automatically, ALT combinations.
* Some screens do not display window background color under spaces.
This is okay under "screen" and "xterm-color" but not under "xterm". You will notice
this in the message box samples.
I am developing and testing under "screen" under OS X Leopard.
See lib/rbcurse/rwidgets.rb.
For test programs, see test1, test2, testcombo etc in examples folder.
This depends only on "window" provided by ncurses. Does not use forms
and fields. Minor changes and improvements may have happened to sample
code below. See test programs for latest, working code.
=== create a window and a form based on window
@layout = { :height => 0, :width => 0, :top => 0, :left => 0 }
@win =
@form = @win
=== create a bunch of fields with dependent labels
r = 1; c = 22;
%w[ name age company].each do |w|
field = @form do
name w
row r
col c
display_length 30
set_buffer "abcd #{w}"
set_label @form, {'text' => w}
r += 1
=== create a variable (like TkVariable) and tie a label to it.
$results =
$results.value = "A variable"
var = @form, {'text_variable' => $results, "row" => r, "col" => 22}
r += 1
=== create a list and a list box based on the list.
mylist = []
0.upto(100) { |v| mylist << "#{v} scrollable data" }
field = @form do
name "mylist"
row r
col 1
width 40
height 10
list mylist
field.insert 5, "hello ruby", "so long python", "farewell java", "RIP .Net"
=== create a textarea for entry (this can be buggy at present)
texta = @form do
name "mytext"
row 1
col 52
width 40
height 20
texta << "hello there" << "we are testing deletes in this application"
texta << "HELLO there" << "WE ARE testing deletes in this application"
=== create a check box, updates a Variable
checkbutton = @form do
text_variable $results
#value = true
onvalue "selected cb"
offvalue "UNselected cb"
text "Please click me"
row 17
col 22
=== change field properties at any time by referring to them by name
@form.by_name["age"].display_length = 3
@form.by_name["age"].maxlen = 3
@form.by_name["age"].set_buffer "24"
@form.by_name["name"].set_buffer "Not focusable"
@form.by_name["age"].chars_allowed = /\d/
@form.by_name["password"].color 'red'
@form.by_name["password"].bgcolor 'blue'
# restrict entry to some values
password.values(%w[ scotty tiger secret qwerty])
# validation using ruby's regular expressions
=== bind events to forms, and fields
@form.bind(:ENTER) { |f| f.label.bgcolor = $promptcolor if f.instance_of? RubyCurses::Field}
@form.bind(:LEAVE) { |f| f.label.bgcolor = $datacolor if f.instance_of? RubyCurses::Field}
=== create buttons
ok_button = @form do
text "OK"
name "OK"
row 18
col 22
ok_button.command { |form| $results.value = "OK PRESS:";form.printstr(@window, 23,45, "OK CALLED") }
#text "Cancel"
cancel_button = @form do
text_variable $results
row 18
col 28
cancel_button.command { |form| form.printstr(@window, 23,45, "Cancel CALLED"); throw(:close); }
=== create radio buttons
colorlabel = @form, {'text' => "Select a color:", "row" => 20,
"col" => 22, "color"=> "cyan"}
$radio =
radio1 = @form do
text_variable $radio
text "red"
value "red"
color "red"
row 21
col 22
radio2 = @form do
text_variable $radio
text "green"
value "green"
color "green"
row 22
col 22
=== create a messagebox
@mb = do
title "Enter your name"
message "Enter your name"
type :input
default_value "rahul"
default_button 0
#title "Color selector"
#type :custom
#buttons %w[red green blue yellow]
#underlines [0,0,0,0]
$log.debug "MBOX : #{@mb.selected_index} "
$log.debug "MBOX : #{@mb.input_value} "
=== create a read-only scrollable view of data
@textview = @form do
name "myView"
row 16
col 52
width 40
height 7
content ="../../README.txt","r").readlines
@textview.set_content content
## set it to point to row 21
@textview.top_row 21
# lets scroll the text view as we scroll the listbox
listb.bind(:ENTER_ROW, @textview) { |arow, tview| tview.top_row arow }
# lets scroll the text view to the line you enter in the numeric
# field
@form.by_name["line"].bind(:LEAVE, @textview) { |fld, tv| tv.top_row(fld.getvalue.to_i) }
# lets scroll the text view to the first match of the regex you
# enter
@form.by_name["regex"].bind(:LEAVE, @textview) { |fld, tv| tv.top_row(tv.find_first_match(fld.getvalue)) }
# change the value of colorlabel to the selected radiobutton
# (red or green)
$radio.update_command(colorlabel) {|tv, label| label.color tv.value}
# change the attribute of colorlabel to bold or normal
$results.update_command(colorlabel,checkbutton) {|tv, label, cb|
attrs = cb.value ? 'bold' : nil; label.attrs(attrs)}
# during menu creation, create a checkboxmenuitem
item = "CheckMe"
# when selected, make colorlabel attribute reverse.
item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' :
nil; label.attrs(att); label.repaint}
* ruby 1.8.7 (not compatible with 1.9)
* ncurses-ruby
(following is provided with source)
* uses the window class created by "manveru" (michael) - this can be
removed if not needed. (lib/ver/window)
It is provided with this package, and has some alterations from the
original. I have added a method getchar() which traps and returns
So basically do not remove it unless you have very different
* currently, just unzip/untar in a folder. Please change the path in
the top line of the test programs.
(Please advice me how i can improve installation procedure)
Copyright (c) 2008 rkumar
Same as ruby license.