rbcurse-core 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +69 -0
- data/VERSION +1 -0
- data/examples/abasiclist.rb +151 -0
- data/examples/alpmenu.rb +46 -0
- data/examples/app.sample +17 -0
- data/examples/atree.rb +100 -0
- data/examples/common/file.rb +45 -0
- data/examples/data/README.markdown +9 -0
- data/examples/data/brew.txt +38 -0
- data/examples/data/color.2 +37 -0
- data/examples/data/gemlist.txt +60 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/ports.txt +136 -0
- data/examples/data/table.txt +37 -0
- data/examples/data/tasks.csv +88 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/todo.txt +10 -0
- data/examples/data/todocsv.csv +28 -0
- data/examples/data/unix1.txt +21 -0
- data/examples/data/unix2.txt +11 -0
- data/examples/dbdemo.rb +487 -0
- data/examples/dirtree.rb +90 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/newtesttabp.rb +92 -0
- data/examples/tabular.rb +132 -0
- data/examples/tasks.rb +167 -0
- data/examples/term2.rb +83 -0
- data/examples/testkeypress.rb +72 -0
- data/examples/testlistbox.rb +158 -0
- data/examples/testmessagebox.rb +140 -0
- data/examples/testree.rb +106 -0
- data/examples/testwsshortcuts.rb +66 -0
- data/examples/testwsshortcuts2.rb +127 -0
- data/lib/rbcurse.rb +8 -0
- data/lib/rbcurse/core/docs/index.txt +73 -0
- data/lib/rbcurse/core/include/action.rb +40 -0
- data/lib/rbcurse/core/include/appmethods.rb +112 -0
- data/lib/rbcurse/core/include/bordertitle.rb +41 -0
- data/lib/rbcurse/core/include/chunk.rb +182 -0
- data/lib/rbcurse/core/include/io.rb +953 -0
- data/lib/rbcurse/core/include/listcellrenderer.rb +140 -0
- data/lib/rbcurse/core/include/listeditable.rb +317 -0
- data/lib/rbcurse/core/include/listscrollable.rb +590 -0
- data/lib/rbcurse/core/include/listselectable.rb +264 -0
- data/lib/rbcurse/core/include/multibuffer.rb +83 -0
- data/lib/rbcurse/core/include/orderedhash.rb +77 -0
- data/lib/rbcurse/core/include/ractionevent.rb +67 -0
- data/lib/rbcurse/core/include/rchangeevent.rb +27 -0
- data/lib/rbcurse/core/include/rhistory.rb +62 -0
- data/lib/rbcurse/core/include/rinputdataevent.rb +47 -0
- data/lib/rbcurse/core/include/vieditable.rb +170 -0
- data/lib/rbcurse/core/system/colormap.rb +163 -0
- data/lib/rbcurse/core/system/keyboard.rb +150 -0
- data/lib/rbcurse/core/system/keydefs.rb +30 -0
- data/lib/rbcurse/core/system/ncurses.rb +218 -0
- data/lib/rbcurse/core/system/panel.rb +162 -0
- data/lib/rbcurse/core/system/window.rb +901 -0
- data/lib/rbcurse/core/util/ansiparser.rb +117 -0
- data/lib/rbcurse/core/util/app.rb +1235 -0
- data/lib/rbcurse/core/util/basestack.rb +407 -0
- data/lib/rbcurse/core/util/bottomline.rb +1850 -0
- data/lib/rbcurse/core/util/colorparser.rb +71 -0
- data/lib/rbcurse/core/util/focusmanager.rb +31 -0
- data/lib/rbcurse/core/util/padreader.rb +189 -0
- data/lib/rbcurse/core/util/rcommandwindow.rb +587 -0
- data/lib/rbcurse/core/util/rdialogs.rb +619 -0
- data/lib/rbcurse/core/util/viewer.rb +149 -0
- data/lib/rbcurse/core/util/widgetshortcuts.rb +505 -0
- data/lib/rbcurse/core/widgets/applicationheader.rb +102 -0
- data/lib/rbcurse/core/widgets/box.rb +58 -0
- data/lib/rbcurse/core/widgets/divider.rb +310 -0
- data/lib/rbcurse/core/widgets/keylabelprinter.rb +178 -0
- data/lib/rbcurse/core/widgets/rcombo.rb +238 -0
- data/lib/rbcurse/core/widgets/rcontainer.rb +415 -0
- data/lib/rbcurse/core/widgets/rlink.rb +30 -0
- data/lib/rbcurse/core/widgets/rlist.rb +723 -0
- data/lib/rbcurse/core/widgets/rmenu.rb +939 -0
- data/lib/rbcurse/core/widgets/rmenulink.rb +22 -0
- data/lib/rbcurse/core/widgets/rmessagebox.rb +373 -0
- data/lib/rbcurse/core/widgets/rprogress.rb +118 -0
- data/lib/rbcurse/core/widgets/rtabbedpane.rb +615 -0
- data/lib/rbcurse/core/widgets/rtabbedwindow.rb +68 -0
- data/lib/rbcurse/core/widgets/rtextarea.rb +920 -0
- data/lib/rbcurse/core/widgets/rtextview.rb +780 -0
- data/lib/rbcurse/core/widgets/rtree.rb +787 -0
- data/lib/rbcurse/core/widgets/rwidget.rb +3040 -0
- data/lib/rbcurse/core/widgets/scrollbar.rb +143 -0
- data/lib/rbcurse/core/widgets/statusline.rb +94 -0
- data/lib/rbcurse/core/widgets/tabular.rb +264 -0
- data/lib/rbcurse/core/widgets/tabularwidget.rb +1211 -0
- data/lib/rbcurse/core/widgets/textpad.rb +516 -0
- data/lib/rbcurse/core/widgets/tree/treecellrenderer.rb +150 -0
- data/lib/rbcurse/core/widgets/tree/treemodel.rb +428 -0
- metadata +156 -0
data/examples/testree.rb
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require 'rbcurse'
|
|
2
|
+
require 'rbcurse/core/widgets/rtree'
|
|
3
|
+
|
|
4
|
+
if $0 == __FILE__
|
|
5
|
+
$choice = ARGV[0].to_i || 1
|
|
6
|
+
class Tester
|
|
7
|
+
def initialize
|
|
8
|
+
acolor = $reversecolor
|
|
9
|
+
end
|
|
10
|
+
def run
|
|
11
|
+
@window = VER::Window.root_window
|
|
12
|
+
@form = Form.new @window
|
|
13
|
+
|
|
14
|
+
h = 20; w = 75; t = 3; l = 4
|
|
15
|
+
#$choice = 1
|
|
16
|
+
case $choice
|
|
17
|
+
when 1
|
|
18
|
+
root = TreeNode.new "ROOT"
|
|
19
|
+
subroot = TreeNode.new "subroot"
|
|
20
|
+
leaf1 = TreeNode.new "leaf 1"
|
|
21
|
+
leaf2 = TreeNode.new "leaf 2"
|
|
22
|
+
|
|
23
|
+
model = DefaultTreeModel.new root
|
|
24
|
+
#model.insert_node_into(subroot, root, 0)
|
|
25
|
+
#model.insert_node_into(leaf1, subroot, 0)
|
|
26
|
+
#model.insert_node_into(leaf2, subroot, 1)
|
|
27
|
+
root << subroot
|
|
28
|
+
subroot << leaf1 << leaf2
|
|
29
|
+
leaf1 << "leaf11"
|
|
30
|
+
leaf1 << "leaf12"
|
|
31
|
+
|
|
32
|
+
root.add "blocky", true do
|
|
33
|
+
add "block2"
|
|
34
|
+
add "block3" do
|
|
35
|
+
add "block31"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
Tree.new @form, :data => model, :row =>2, :col=>2, :height => 20, :width => 30
|
|
39
|
+
|
|
40
|
+
when 2
|
|
41
|
+
|
|
42
|
+
# use an array to populate
|
|
43
|
+
# we need to do root_visible = false so you get just a list
|
|
44
|
+
model = %W[ ruby lua jruby smalltalk haskell scheme perl lisp ]
|
|
45
|
+
Tree.new @form, :data => model, :row =>2, :col=>2, :height => 20, :width => 30
|
|
46
|
+
|
|
47
|
+
when 3
|
|
48
|
+
|
|
49
|
+
# use an Has to populate
|
|
50
|
+
#model = { :ruby => %W[ "jruby", "mri", "yarv", "rubinius", "macruby" ], :python => %W[ cpython jython laden-swallow ] }
|
|
51
|
+
model = { :ruby => [ "jruby", {:mri => %W[ 1.8.6 1.8.7]}, {:yarv => %W[1.9.1 1.9.2]}, "rubinius", "macruby" ], :python => %W[ cpython jython pypy ] }
|
|
52
|
+
|
|
53
|
+
Tree.new @form, :data => model, :row =>2, :col=>2, :height => 20, :width => 30
|
|
54
|
+
#when 4
|
|
55
|
+
else
|
|
56
|
+
Tree.new @form, :row =>2, :col=>2, :height => 20, :width => 30 do
|
|
57
|
+
root "root" do
|
|
58
|
+
branch "vim" do
|
|
59
|
+
leaf "vimrc"
|
|
60
|
+
end
|
|
61
|
+
branch "ack" do
|
|
62
|
+
leaf "ackrc"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
help = "C-q to quit. <ENTER> to expand nodes. j/k to navigate. Pass command-line argument 1,2,3,4 #{$0} "
|
|
71
|
+
RubyCurses::Label.new @form, {:text => help, :row => 1, :col => 2, :color => :cyan}
|
|
72
|
+
@form.repaint
|
|
73
|
+
@window.wrefresh
|
|
74
|
+
Ncurses::Panel.update_panels
|
|
75
|
+
while((ch = @window.getchar()) != ?\C-q.getbyte(0))
|
|
76
|
+
ret = @form.handle_key(ch)
|
|
77
|
+
@window.wrefresh
|
|
78
|
+
if ret == :UNHANDLED
|
|
79
|
+
str = keycode_tos ch
|
|
80
|
+
$log.debug " UNHANDLED #{str} by Vim #{ret} "
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
@window.destroy
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
include RubyCurses
|
|
89
|
+
include RubyCurses::Utils
|
|
90
|
+
# Initialize curses
|
|
91
|
+
begin
|
|
92
|
+
# XXX update with new color and kb
|
|
93
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
|
94
|
+
$log = Logger.new("rbc13.log")
|
|
95
|
+
$log.level = Logger::DEBUG
|
|
96
|
+
n = Tester.new
|
|
97
|
+
n.run
|
|
98
|
+
rescue => ex
|
|
99
|
+
ensure
|
|
100
|
+
VER::stop_ncurses
|
|
101
|
+
p ex if ex
|
|
102
|
+
puts(ex.backtrace.join("\n")) if ex
|
|
103
|
+
$log.debug( ex) if ex
|
|
104
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# this is a test program, tests out tabbed panes. type F1 to exit
|
|
2
|
+
#
|
|
3
|
+
require 'rbcurse'
|
|
4
|
+
require 'rbcurse/core/util/widgetshortcuts'
|
|
5
|
+
|
|
6
|
+
include RubyCurses
|
|
7
|
+
|
|
8
|
+
class SetupMessagebox
|
|
9
|
+
include RubyCurses::WidgetShortcuts
|
|
10
|
+
def initialize config={}, &block
|
|
11
|
+
@window = VER::Window.root_window
|
|
12
|
+
@form = Form.new @window
|
|
13
|
+
end
|
|
14
|
+
def run
|
|
15
|
+
_create_form
|
|
16
|
+
@form.repaint
|
|
17
|
+
@window.wrefresh
|
|
18
|
+
while ((ch = @window.getchar()) != 999)
|
|
19
|
+
break if ch == ?\C-q.getbyte(0)
|
|
20
|
+
@form.handle_key ch
|
|
21
|
+
@window.wrefresh
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
def _create_form
|
|
25
|
+
widget_shortcuts_init
|
|
26
|
+
stack :margin_top => 2, :margin_left => 3, :width => 50 , :color => :cyan, :bgcolor => :black do
|
|
27
|
+
label :text => " Details ", :color => :blue, :attr => :reverse, :width => :expand, :justify => :center
|
|
28
|
+
blank
|
|
29
|
+
field :text => "john", :attr => :reverse, :label => "%15s" % ["Name: "]
|
|
30
|
+
field :label => "%15s" % ["Address: "], :width => 15, :attr => :reverse
|
|
31
|
+
check :text => "Using version control", :value => true, :onvalue => "yes", :offvalue => "no"
|
|
32
|
+
check :text => "Upgraded to Lion", :value => false, :onvalue => "yes", :offvalue => "no"
|
|
33
|
+
blank
|
|
34
|
+
radio :text => "Linux", :value => "LIN", :group => :os
|
|
35
|
+
radio :text => "OSX", :value => "OSX", :group => :os
|
|
36
|
+
radio :text => "Window", :value => "Win", :group => :os
|
|
37
|
+
flow :margin_top => 2, :margin_left => 4, :item_width => 15 do
|
|
38
|
+
button :text => "Ok" do throw :close; end
|
|
39
|
+
button :text => "Cancel"
|
|
40
|
+
button :text => "Apply"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
if $0 == __FILE__
|
|
47
|
+
# Initialize curses
|
|
48
|
+
begin
|
|
49
|
+
# XXX update with new color and kb
|
|
50
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
|
51
|
+
$log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
|
|
52
|
+
$log.level = Logger::DEBUG
|
|
53
|
+
catch(:close) do
|
|
54
|
+
tp = SetupMessagebox.new()
|
|
55
|
+
buttonindex = tp.run
|
|
56
|
+
$log.debug "XXX: MESSAGEBOX retirned #{buttonindex} "
|
|
57
|
+
end
|
|
58
|
+
rescue => ex
|
|
59
|
+
ensure
|
|
60
|
+
VER::stop_ncurses
|
|
61
|
+
p ex if ex
|
|
62
|
+
p(ex.backtrace.join("\n")) if ex
|
|
63
|
+
$log.debug( ex) if ex
|
|
64
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# this is a test program, tests out widget shortcuts. type C-q to exit
|
|
2
|
+
#
|
|
3
|
+
require 'rbcurse'
|
|
4
|
+
require 'rbcurse/core/util/widgetshortcuts'
|
|
5
|
+
|
|
6
|
+
include RubyCurses
|
|
7
|
+
include RubyCurses::Utils
|
|
8
|
+
|
|
9
|
+
class SetupMessagebox
|
|
10
|
+
include RubyCurses::WidgetShortcuts
|
|
11
|
+
def initialize config={}, &block
|
|
12
|
+
@window = VER::Window.root_window
|
|
13
|
+
@form = Form.new @window
|
|
14
|
+
end
|
|
15
|
+
def run
|
|
16
|
+
_create_form
|
|
17
|
+
@form.repaint
|
|
18
|
+
@window.wrefresh
|
|
19
|
+
catch(:close) do
|
|
20
|
+
while ((ch = @window.getchar()) != 999)
|
|
21
|
+
break if ch == ?\C-q.getbyte(0)
|
|
22
|
+
@form.handle_key ch
|
|
23
|
+
@window.wrefresh
|
|
24
|
+
end
|
|
25
|
+
end # catch
|
|
26
|
+
end
|
|
27
|
+
def _create_form
|
|
28
|
+
widget_shortcuts_init
|
|
29
|
+
stack :margin_top => 1, :width => :expand do
|
|
30
|
+
label :text => " Details ", :color => :cyan, :attr => :reverse, :width => :expand, :justify => :center
|
|
31
|
+
flow :margin_top => 1, :margin_left => 4, :item_width => 50 do
|
|
32
|
+
stack :margin_top => 0, :margin_left => 3, :width => 50 , :color => :cyan, :bgcolor => :black do
|
|
33
|
+
box do
|
|
34
|
+
field :text => "steve", :attr => :reverse, :label => "%15s" % ["Name: "]
|
|
35
|
+
field :label => "%15s" % ["Address: "], :width => 15, :attr => :reverse
|
|
36
|
+
blank
|
|
37
|
+
check :text => "Using version control", :value => true, :onvalue => "yes", :offvalue => "no" do |eve|
|
|
38
|
+
unless eve.item.value
|
|
39
|
+
alert "NO VC! We need to talk"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
check :text => "Upgraded to Lion", :value => false, :onvalue => "yes", :offvalue => "no" do |eve|
|
|
43
|
+
unless eve.item.value
|
|
44
|
+
alert "You goin back to Snow Leopard?"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end # box
|
|
48
|
+
end
|
|
49
|
+
stack :margin_top => 0, :margin_left => 3, :width => 50 , :color => :cyan, :bgcolor => :black do
|
|
50
|
+
box :title => "OS Maintenance", :margin_left => 2 do
|
|
51
|
+
radio :text => "Linux", :value => "LIN", :group => :os
|
|
52
|
+
radio :text => "OSX", :value => "OSX", :group => :os
|
|
53
|
+
radio :text => "Window", :value => "Win", :group => :os
|
|
54
|
+
blank
|
|
55
|
+
flow :item_width => 15 do
|
|
56
|
+
button :text => "Install" do
|
|
57
|
+
# you can avoid this by giving the radio buttons your own Variable (see test2.rb)
|
|
58
|
+
choice = @variables[:os].value
|
|
59
|
+
case choice
|
|
60
|
+
when ""
|
|
61
|
+
alert "Select an OS"
|
|
62
|
+
when "OSX", "LIN"
|
|
63
|
+
alert "Good choice"
|
|
64
|
+
else
|
|
65
|
+
alert "Pfft !"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
button :text => "Uninstall"
|
|
69
|
+
button :text => "Delete"
|
|
70
|
+
end
|
|
71
|
+
end # box
|
|
72
|
+
end
|
|
73
|
+
end # flow
|
|
74
|
+
#button :text => "Execute"
|
|
75
|
+
text = [" #[reverse]Unix Philosophy #[end] ",
|
|
76
|
+
"#[fg=green, underline]Eric Raymond#[end] in his book, #[fg=green, underline]The Art of Unix Programming#[end] summarized the Unix philosophy.",
|
|
77
|
+
" ",
|
|
78
|
+
"Rule of #[fg=yellow]Modularity#[end]: Write simple parts connected by clean interfaces.",
|
|
79
|
+
"Rule of #[fg=blue]Clarity#[end]: #[bold]Clarity#[end] is better than cleverness.",
|
|
80
|
+
"Rule of #[fg=red]Separation#[end]: Separate #[bold]policy#[end] from mechanism; separate interfaces from engines.",
|
|
81
|
+
"Rule of #[fg=green]Simplicity#[end]: Design for #[bold]simplicity;#[end] add complexity only where you must.",
|
|
82
|
+
"Rule of #[fg=magenta]Parsimony#[end]: Write a big program only when it is clear by demonstration that nothing else will do.",
|
|
83
|
+
"Rule of #[fg=cyan]Representation#[end]: Fold knowledge into #[bold]data#[end] so program logic can be stupid and robust"]
|
|
84
|
+
text << "For more check: #[underline]http://en.wikipedia.org/wiki/Unix_philosophy#Eric_Raymond#[end]"
|
|
85
|
+
formatted = []
|
|
86
|
+
#text.each { |line| formatted << @window.convert_to_chunk(line) }
|
|
87
|
+
|
|
88
|
+
#textview :text => formatted
|
|
89
|
+
#textview do |t| t.formatted_text(text, :tmux) end
|
|
90
|
+
t = textview :title => 'tmux format'
|
|
91
|
+
t.formatted_text(text, :tmux)
|
|
92
|
+
t1 = textview :title => 'ansi formatted document'
|
|
93
|
+
text = File.open("data/color.2","r").readlines
|
|
94
|
+
#text = `ri -f bs String`.split("\n")
|
|
95
|
+
t1.formatted_text(text, :ansi)
|
|
96
|
+
|
|
97
|
+
flow do
|
|
98
|
+
#box do
|
|
99
|
+
button :text => " Ok " do alert "Pressed okay" end
|
|
100
|
+
button :text => "Cancel" do confirm "Do you wish to Quit?" ; throw :close; end
|
|
101
|
+
button :text => "Apply "
|
|
102
|
+
#end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
if $0 == __FILE__
|
|
110
|
+
# Initialize curses
|
|
111
|
+
begin
|
|
112
|
+
# XXX update with new color and kb
|
|
113
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
|
114
|
+
$log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
|
|
115
|
+
$log.level = Logger::DEBUG
|
|
116
|
+
tp = SetupMessagebox.new()
|
|
117
|
+
buttonindex = tp.run
|
|
118
|
+
$log.debug "XXX: MESSAGEBOX retirned #{buttonindex} "
|
|
119
|
+
rescue => ex
|
|
120
|
+
ensure
|
|
121
|
+
VER::stop_ncurses
|
|
122
|
+
p ex if ex
|
|
123
|
+
p(ex.backtrace.join("\n")) if ex
|
|
124
|
+
$log.debug( ex) if ex
|
|
125
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
126
|
+
end
|
|
127
|
+
end
|
data/lib/rbcurse.rb
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
G E N E R A L H E L P
|
|
2
|
+
<q> to quit this window. <Space> to scroll.
|
|
3
|
+
|
|
4
|
+
==============================================================================
|
|
5
|
+
1. General Help
|
|
6
|
+
|
|
7
|
+
F10 - exit application. Also, <C-q>
|
|
8
|
+
F1 - Help
|
|
9
|
+
|
|
10
|
+
In some applications, the following may have been provided:
|
|
11
|
+
|
|
12
|
+
Alt-x - additional commands
|
|
13
|
+
: - additional commands
|
|
14
|
+
:! - system command
|
|
15
|
+
<C-x>c - system command
|
|
16
|
+
|
|
17
|
+
==============================================================================
|
|
18
|
+
2. Form
|
|
19
|
+
|
|
20
|
+
<Tab> and <backtab> navigate between widgets.
|
|
21
|
+
|
|
22
|
+
==============================================================================
|
|
23
|
+
3. Multiline widgets
|
|
24
|
+
|
|
25
|
+
In most widgets such as _list_, _textview_, _table_, and _tree_ the
|
|
26
|
+
following vim-bindings are applicable.
|
|
27
|
+
|
|
28
|
+
j,k,l,h, gg, G, C-d, C-b
|
|
29
|
+
|
|
30
|
+
<space> scrolls in _textview_.
|
|
31
|
+
|
|
32
|
+
Some multiline widgets such as _list_ and _tree_ may move to first item
|
|
33
|
+
starting with j or k or <char> on pressing char. To get vim-bindings use
|
|
34
|
+
<Alt-v>. Now to go to first row with <char>, type f<char>. This behavior
|
|
35
|
+
is modified using the flag one_key_selection.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
==============================================================================
|
|
39
|
+
4. Editable Widgets
|
|
40
|
+
|
|
41
|
+
In _field_ and editable _textarea_, some emacs/Pine keys such as C-e,
|
|
42
|
+
C-a, C-k (delete till end) are available.
|
|
43
|
+
|
|
44
|
+
<C-a> - start of line
|
|
45
|
+
<C-e> - end of line
|
|
46
|
+
<C-k> - delete till end of line
|
|
47
|
+
<M-i> - toggle overwrite mode
|
|
48
|
+
|
|
49
|
+
==============================================================================
|
|
50
|
+
5. Buttons
|
|
51
|
+
|
|
52
|
+
_Button_ can be fired using <space> or <ENTER>. The default button, if
|
|
53
|
+
declared, is shown with as > Ok < as against other buttons, shown as [
|
|
54
|
+
Cancel ]. This can be fired by hitting <ENTER> anywhere on the form
|
|
55
|
+
(unless the current widget traps <ENTER>).
|
|
56
|
+
|
|
57
|
+
Hotkeys are available using Alt-<key>.
|
|
58
|
+
|
|
59
|
+
==============================================================================
|
|
60
|
+
6. Selection in lists
|
|
61
|
+
|
|
62
|
+
<space> - toggle selection
|
|
63
|
+
<C-Space> - range select
|
|
64
|
+
<a> - select all
|
|
65
|
+
<u> - unselect all (should be changed, as conflicts with
|
|
66
|
+
vim undo)
|
|
67
|
+
<*> - invert selection
|
|
68
|
+
|
|
69
|
+
<-> - ask unselect
|
|
70
|
+
<+> - ask select
|
|
71
|
+
|
|
72
|
+
-----------------------------------------------------------------------------
|
|
73
|
+
q to quit, gg to goto top.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'rbcurse/core/widgets/rwidget'
|
|
2
|
+
#include Ncurses # FFI 2011-09-8
|
|
3
|
+
include RubyCurses
|
|
4
|
+
module RubyCurses
|
|
5
|
+
## encapsulates behaviour allowing centralization
|
|
6
|
+
# == Example
|
|
7
|
+
# a = Action.new("&New Row") { commands }
|
|
8
|
+
# a.accelerator "Alt N"
|
|
9
|
+
# menu.add(a)
|
|
10
|
+
# b = Button.new form do
|
|
11
|
+
# action a
|
|
12
|
+
# ...
|
|
13
|
+
# end
|
|
14
|
+
class Action < Proc
|
|
15
|
+
include EventHandler
|
|
16
|
+
include ConfigSetup
|
|
17
|
+
# name used on button or menu
|
|
18
|
+
dsl_property :name
|
|
19
|
+
dsl_property :enabled
|
|
20
|
+
dsl_accessor :tooltip_text
|
|
21
|
+
dsl_accessor :help_text
|
|
22
|
+
dsl_accessor :mnemonic
|
|
23
|
+
dsl_accessor :accelerator
|
|
24
|
+
|
|
25
|
+
def initialize name, config={}, &block
|
|
26
|
+
super &block
|
|
27
|
+
@name = name
|
|
28
|
+
@name.freeze
|
|
29
|
+
@enabled = true
|
|
30
|
+
config_setup config # @config.each_pair { |k,v| variable_set(k,v) }
|
|
31
|
+
@_events = [:FIRE]
|
|
32
|
+
end
|
|
33
|
+
def call
|
|
34
|
+
return unless @enabled
|
|
35
|
+
fire_handler :FIRE, self
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
end # class
|
|
39
|
+
end # module
|
|
40
|
+
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module RubyCurses
|
|
2
|
+
module Utils
|
|
3
|
+
private
|
|
4
|
+
def _suspend clear=true
|
|
5
|
+
return unless block_given?
|
|
6
|
+
Ncurses.def_prog_mode
|
|
7
|
+
if clear
|
|
8
|
+
Ncurses.endwin
|
|
9
|
+
# NOTE: avoid false since screen remains half off
|
|
10
|
+
# too many issues
|
|
11
|
+
else
|
|
12
|
+
system "/bin/stty sane"
|
|
13
|
+
end
|
|
14
|
+
yield if block_given?
|
|
15
|
+
Ncurses.reset_prog_mode
|
|
16
|
+
if !clear
|
|
17
|
+
# Hope we don't screw your terminal up with this constantly.
|
|
18
|
+
VER::stop_ncurses
|
|
19
|
+
VER::start_ncurses
|
|
20
|
+
#@form.reset_all # not required
|
|
21
|
+
end
|
|
22
|
+
@form.repaint if @form
|
|
23
|
+
@window.wrefresh if @window
|
|
24
|
+
Ncurses::Panel.update_panels
|
|
25
|
+
end
|
|
26
|
+
#
|
|
27
|
+
# Suspends to shell so user can execute commands.
|
|
28
|
+
# Maybe not be able to get your prompt correctly.
|
|
29
|
+
#
|
|
30
|
+
public
|
|
31
|
+
def suspend
|
|
32
|
+
_suspend(false) do
|
|
33
|
+
system("tput cup 26 0")
|
|
34
|
+
system("tput ed")
|
|
35
|
+
system("echo Enter C-d to return to application")
|
|
36
|
+
system (ENV['PS1']='\s-\v\$ ') if ENV['SHELL']== '/bin/bash'
|
|
37
|
+
system(ENV['SHELL']);
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Displays application help using either array provided
|
|
43
|
+
# or checking for :help_text method
|
|
44
|
+
# @param [Array] help text
|
|
45
|
+
def display_app_help help_array= nil
|
|
46
|
+
if help_array
|
|
47
|
+
arr = help_array
|
|
48
|
+
elsif respond_to? :help_text
|
|
49
|
+
arr = help_text
|
|
50
|
+
else
|
|
51
|
+
arr = []
|
|
52
|
+
arr << " NO HELP SPECIFIED FOR APP #{self} "
|
|
53
|
+
arr << " "
|
|
54
|
+
arr << " --- General help --- "
|
|
55
|
+
arr << " F10 - exit application "
|
|
56
|
+
arr << " Alt-x - select commands "
|
|
57
|
+
arr << " : - select commands "
|
|
58
|
+
arr << " "
|
|
59
|
+
end
|
|
60
|
+
case arr
|
|
61
|
+
when String
|
|
62
|
+
arr = arr.split("\n")
|
|
63
|
+
when Array
|
|
64
|
+
end
|
|
65
|
+
w = arr.max_by(&:length).length
|
|
66
|
+
|
|
67
|
+
require 'rbcurse/core/util/viewer'
|
|
68
|
+
RubyCurses::Viewer.view(arr, :layout => [2, 10, [4+arr.size, 24].min, w+2],:close_key => KEY_ENTER, :title => "<Enter> to close", :print_footer => true) do |t|
|
|
69
|
+
# you may configure textview further here.
|
|
70
|
+
#t.suppress_borders true
|
|
71
|
+
#t.color = :black
|
|
72
|
+
#t.bgcolor = :white
|
|
73
|
+
# or
|
|
74
|
+
t.attr = :reverse
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
#
|
|
78
|
+
# prompts user for unix command and displays output in viewer
|
|
79
|
+
#
|
|
80
|
+
def shell_output
|
|
81
|
+
cmd = get_string("Enter shell command:", 50)
|
|
82
|
+
if cmd && !cmd.empty?
|
|
83
|
+
run_command cmd
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# executes given command and displays in viewer
|
|
89
|
+
# @param [String] unix command, e.g., git -st
|
|
90
|
+
def run_command cmd
|
|
91
|
+
# http://whynotwiki.com/Ruby_/_Process_management#What_happens_to_standard_error_.28stderr.29.3F
|
|
92
|
+
require 'rbcurse/core/util/viewer'
|
|
93
|
+
begin
|
|
94
|
+
res = `#{cmd} 2>&1`
|
|
95
|
+
rescue => ex
|
|
96
|
+
res = ex.to_s
|
|
97
|
+
res << ex.backtrace.join("\n")
|
|
98
|
+
end
|
|
99
|
+
res.gsub!("\t"," ")
|
|
100
|
+
RubyCurses::Viewer.view(res.split("\n"), :close_key => KEY_ENTER, :title => "<Enter> to close, M-l M-h to scroll")
|
|
101
|
+
end
|
|
102
|
+
def shell_out command
|
|
103
|
+
@window.hide
|
|
104
|
+
Ncurses.endwin
|
|
105
|
+
system command
|
|
106
|
+
Ncurses.refresh
|
|
107
|
+
#Ncurses.curs_set 0 # why ?
|
|
108
|
+
@window.show
|
|
109
|
+
end
|
|
110
|
+
end # utils
|
|
111
|
+
end # module RubyC
|
|
112
|
+
include RubyCurses::Utils
|