rbcurse-extras 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +75 -0
- data/VERSION +1 -0
- data/examples/data/list.txt +300 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/table.txt +36 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/unix1.txt +21 -0
- data/examples/inc/qdfilechooser.rb +70 -0
- data/examples/inc/rfe_renderer.rb +121 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/rfe.rb +1236 -0
- data/examples/test2.rb +670 -0
- data/examples/testeditlist.rb +78 -0
- data/examples/testtable.rb +270 -0
- data/examples/testvimsplit.rb +141 -0
- data/lib/rbcurse/extras/include/celleditor.rb +112 -0
- data/lib/rbcurse/extras/include/checkboxcellrenderer.rb +57 -0
- data/lib/rbcurse/extras/include/comboboxcellrenderer.rb +30 -0
- data/lib/rbcurse/extras/include/defaultlistselectionmodel.rb +79 -0
- data/lib/rbcurse/extras/include/listkeys.rb +37 -0
- data/lib/rbcurse/extras/include/listselectable.rb +144 -0
- data/lib/rbcurse/extras/include/tableextended.rb +40 -0
- data/lib/rbcurse/extras/widgets/horizlist.rb +203 -0
- data/lib/rbcurse/extras/widgets/menutree.rb +63 -0
- data/lib/rbcurse/extras/widgets/multilinelabel.rb +142 -0
- data/lib/rbcurse/extras/widgets/rcomboedit.rb +256 -0
- data/lib/rbcurse/extras/widgets/rlink.rb.moved +27 -0
- data/lib/rbcurse/extras/widgets/rlistbox.rb +1247 -0
- data/lib/rbcurse/extras/widgets/rmenulink.rb.moved +21 -0
- data/lib/rbcurse/extras/widgets/rmulticontainer.rb +304 -0
- data/lib/rbcurse/extras/widgets/rmultisplit.rb +722 -0
- data/lib/rbcurse/extras/widgets/rmultitextview.rb +306 -0
- data/lib/rbcurse/extras/widgets/rpopupmenu.rb +755 -0
- data/lib/rbcurse/extras/widgets/rtable.rb +1758 -0
- data/lib/rbcurse/extras/widgets/rvimsplit.rb +800 -0
- data/lib/rbcurse/extras/widgets/table/tablecellrenderer.rb +86 -0
- data/lib/rbcurse/extras/widgets/table/tabledatecellrenderer.rb +98 -0
- metadata +94 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'rbcurse/core/util/app'
|
2
|
+
require 'rbcurse/core/include/appmethods'
|
3
|
+
require 'rbcurse/extras/widgets/rlistbox'
|
4
|
+
|
5
|
+
def my_help_text
|
6
|
+
<<-eos
|
7
|
+
File : testeditlist.rb
|
8
|
+
|
9
|
+
=========================================================================
|
10
|
+
Basic Usage
|
11
|
+
|
12
|
+
This simple example shows the old editable list. This was the original
|
13
|
+
list, but pretty complicated due to editing. You can switch off the editing.
|
14
|
+
|
15
|
+
Type Alt-: to see customization menu. You may select:
|
16
|
+
|
17
|
+
* edit_toggle: when false you are always in insert mode.
|
18
|
+
when true, you are in command mode, but can go into
|
19
|
+
edit/insert mode by pressing <edit_toggle_key> currently
|
20
|
+
C-e. You can also complete edit using <ESC>.
|
21
|
+
You may cancel edit using C-c or C-g.
|
22
|
+
|
23
|
+
* one_key_selection : if you are not in insert mode you can switch this on, so pressing
|
24
|
+
any alphabet takes you to first row starting with that char.
|
25
|
+
If false, then you are in so-called "vim" mode, so u can use j/k/gg/G etc keys.
|
26
|
+
To get the same functionality of one-key, use f<char>.
|
27
|
+
|
28
|
+
Navigation: use arrow keys, or C-n, C-p, C-d, C-f. In command mode, pressing '?' displays
|
29
|
+
key-bindings.
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
=========================================================================
|
34
|
+
:n or Alt-n for next buffer. 'q' to quit.
|
35
|
+
|
36
|
+
eos
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
App.new do
|
42
|
+
#
|
43
|
+
# general purpose command to catch miscellaneous actions that can be
|
44
|
+
# executed in the same way. Or even take complex command lines
|
45
|
+
# such as what vim has.
|
46
|
+
def execute_this *cmd
|
47
|
+
f = @form.get_current_field
|
48
|
+
w = f
|
49
|
+
name = w.text.split()[0]
|
50
|
+
cmd = cmd[0].to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
colors = Ncurses.COLORS
|
54
|
+
back = :blue
|
55
|
+
back = 234 if colors >= 256
|
56
|
+
header = app_header "rbcurse #{Rbcurse::VERSION}", :text_center => "Listbox Demo", :text_right =>"New Improved!", :color => :white, :bgcolor => back #, :attr => :bold
|
57
|
+
message "F10 - Exit, F1 - Help, : - Menu"
|
58
|
+
install_help_text my_help_text
|
59
|
+
|
60
|
+
alist = File.open("data/list.txt",'r').readlines.map{|i| i.chomp }
|
61
|
+
#atable = File.open("data/table.txt",'r').readlines
|
62
|
+
|
63
|
+
#stack :margin_top => 1, :width => :expand, :height => FFI::NCurses.LINES-2 do
|
64
|
+
max = FFI::NCurses.LINES-2
|
65
|
+
lb = Listbox.new @form, :list => alist, :suppress_borders => false, :title => "[ brew packages ]",
|
66
|
+
:left_margin => 1, :width => 100, :name => 'lb1', :height => max, :row => 1, :col => 1, :cell_editing_allowed => true
|
67
|
+
lb.show_selector = false
|
68
|
+
#require 'rbcurse/core/include/widgetmenu'
|
69
|
+
#lb.extend(WidgetMenu)
|
70
|
+
#lb.add_menu_item('z', 'test from app', 'some desc', Proc.new { alert "Hello world" } )
|
71
|
+
lb.action_manager().add_action( Action.new("&Testing from app"){ alert "testing from app" } )
|
72
|
+
|
73
|
+
#end
|
74
|
+
status_line :row => FFI::NCurses.LINES-1
|
75
|
+
#label({:text => "F1 Help, F10 Quit. : for menu. Press F4 and F5 to test popup, space or enter to select", :row => Ncurses.LINES-1, :col => 0})
|
76
|
+
|
77
|
+
|
78
|
+
end # app
|
@@ -0,0 +1,270 @@
|
|
1
|
+
require 'rbcurse'
|
2
|
+
require 'rbcurse/core/widgets/rcombo'
|
3
|
+
require 'rbcurse/extras/widgets/rtable'
|
4
|
+
require 'rbcurse/extras/include/celleditor'
|
5
|
+
#require 'rbcurse/table/tablecellrenderer'
|
6
|
+
require 'rbcurse/extras/include/comboboxcellrenderer'
|
7
|
+
require 'rbcurse/core/include/action'
|
8
|
+
|
9
|
+
##
|
10
|
+
# a renderer which paints alternate lines with
|
11
|
+
# another color, for people with _poor_ taste.
|
12
|
+
class MyRenderer < TableCellRenderer
|
13
|
+
def initialize text="", config={}, &block
|
14
|
+
super
|
15
|
+
@orig_bgcolor = @bgcolor
|
16
|
+
@orig_color = @color
|
17
|
+
end
|
18
|
+
def repaint graphic, r=@row,c=@col, value=@text, focussed=false, selected=false
|
19
|
+
@bgcolor = @orig_bgcolor
|
20
|
+
@color = @orig_color
|
21
|
+
if !focussed and !selected
|
22
|
+
@bgcolor = r % 2 == 0 ? "green" : @orig_bgcolor
|
23
|
+
@color = r % 2 == 0 ? "black" : @orig_color
|
24
|
+
end
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
if $0 == __FILE__
|
29
|
+
include RubyCurses
|
30
|
+
include RubyCurses::Utils
|
31
|
+
|
32
|
+
begin
|
33
|
+
# Initialize curses
|
34
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
35
|
+
$log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
|
36
|
+
$log.level = Logger::DEBUG
|
37
|
+
|
38
|
+
@window = VER::Window.root_window
|
39
|
+
|
40
|
+
catch(:close) do
|
41
|
+
colors = Ncurses.COLORS
|
42
|
+
$log.debug "START #{colors} colors ---------"
|
43
|
+
@form = Form.new @window
|
44
|
+
@window.printstring 0,30,"Demo of Ruby Curses Table: Edit, Resize, Insert, Move, Delete Row/Col", $datacolor
|
45
|
+
r = 1; c = 1;
|
46
|
+
data = [
|
47
|
+
["Blood Diamond",3,"Hanz Zimmer",3.47, true, "WIP"],
|
48
|
+
["Wish you were here",92,"Pink Floyd",412, true, "Fin"],
|
49
|
+
["You're beautiful",3,"James Blunt",3.21, true, "WIP"],
|
50
|
+
["I believe in love",4,"Paula Cole",110.0, false, "Cancel"],
|
51
|
+
["Red Sky at night",4,"Dave Gilmour",102.72, false, "Postp"],
|
52
|
+
["Midnight and you",8,"Barry White",12.72, false, "Todo"],
|
53
|
+
["Run Like Hell",18,"Roger Waters",12.72, false, "Todo"],
|
54
|
+
["Let the music play",9,"Barry White",12.2, false, "WIP"],
|
55
|
+
["Titanic",nil,"Celine Dion",112.7, true, "Cancel"],
|
56
|
+
["Believe",9,"Elton John",12.2, false, "Todo"],
|
57
|
+
["Once upon a time",9,"Dire Straits",12.2, false, "Todo"],
|
58
|
+
["Circle Of Life",9,"Elton John",12.2, false, "Todo"],
|
59
|
+
["Money",10,"Dark Side",12.2, false, "Todo"],
|
60
|
+
["Like a prayer",163,"Charlotte Perrelli",5.4, false, "WIP"]]
|
61
|
+
|
62
|
+
colnames = %w[ Song Cat Artist Ratio Flag Status]
|
63
|
+
statuses = ["Todo", "WIP", "Fin", "Cancel", "Postp"]
|
64
|
+
|
65
|
+
texta = Table.new @form do
|
66
|
+
name "mytext"
|
67
|
+
row r
|
68
|
+
col c
|
69
|
+
width 78
|
70
|
+
height Ncurses.LINES-10
|
71
|
+
title "Randomly picked songs"
|
72
|
+
#title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
|
73
|
+
cell_editing_allowed true
|
74
|
+
#editing_policy :EDITING_AUTO
|
75
|
+
set_data data, colnames
|
76
|
+
end
|
77
|
+
require 'rbcurse/core/include/widgetmenu'
|
78
|
+
texta.extend(WidgetMenu)
|
79
|
+
sel_col = Variable.new 0
|
80
|
+
sel_col.value = 0
|
81
|
+
tcm = texta.get_table_column_model
|
82
|
+
selcolname = texta.get_column_name sel_col.value
|
83
|
+
#
|
84
|
+
## key bindings fo texta
|
85
|
+
# column widths
|
86
|
+
tcm.column(0).width 24
|
87
|
+
tcm.column(1).width 5
|
88
|
+
tcm.column(2).width 18
|
89
|
+
#tcm.column(2).editable false
|
90
|
+
tcm.column(3).width 7
|
91
|
+
tcm.column(4).width 5
|
92
|
+
tcm.column(5).width 8
|
93
|
+
texta.configure() do
|
94
|
+
bind_key(330, 'delete column') { texta.remove_column(tcm.column(texta.focussed_col)) rescue "" }
|
95
|
+
bind_key(?+, 'widen column') {
|
96
|
+
acolumn = texta.get_column selcolname
|
97
|
+
w = acolumn.width + 1
|
98
|
+
acolumn.width w
|
99
|
+
#texta.table_structure_changed
|
100
|
+
}
|
101
|
+
bind_key(?-, 'reduce width') {
|
102
|
+
acolumn = texta.get_column selcolname
|
103
|
+
w = acolumn.width - 1
|
104
|
+
if w > 3
|
105
|
+
acolumn.width w
|
106
|
+
#texta.table_structure_changed
|
107
|
+
end
|
108
|
+
}
|
109
|
+
bind_key(?>, 'move column right') {
|
110
|
+
colcount = tcm.column_count-1
|
111
|
+
#texta.move_column sel_col.value, sel_col.value+1 unless sel_col.value == colcount
|
112
|
+
col = texta.focussed_col
|
113
|
+
texta.move_column col, col+1 unless col == colcount
|
114
|
+
}
|
115
|
+
bind_key(?<, 'move column left') {
|
116
|
+
col = texta.focussed_col
|
117
|
+
texta.move_column col, col-1 unless col == 0
|
118
|
+
#texta.move_column sel_col.value, sel_col.value-1 unless sel_col.value == 0
|
119
|
+
}
|
120
|
+
#bind_key(KEY_RIGHT) { sel_col.value = sel_col.value+1; current_column sel_col.value}
|
121
|
+
#bind_key(KEY_LEFT) { sel_col.value = sel_col.value-1;current_column sel_col.value}
|
122
|
+
end
|
123
|
+
keylabel = RubyCurses::Label.new @form, {'text' => "", "row" => Ncurses.LINES-6, "col" => c, "color" => "yellow", "bgcolor"=>"blue", "display_length"=>Ncurses.COLS-1, "height"=>2}
|
124
|
+
eventlabel = RubyCurses::Label.new @form, {'text' => "Events:", "row" => Ncurses.LINES-5, "col" => c, "color" => "white", "bgcolor"=>"blue", "display_length"=>Ncurses.COLS-1, "height"=>2}
|
125
|
+
|
126
|
+
# report some events
|
127
|
+
texta.table_model.bind(:TABLE_MODEL_EVENT){|e| eventlabel.text = "Event: #{e}"}
|
128
|
+
texta.get_table_column_model.bind(:TABLE_COLUMN_MODEL_EVENT){|e| eventlabel.text = "Event: #{e}"}
|
129
|
+
texta.bind(:TABLE_TRAVERSAL_EVENT){|e| eventlabel.text = "Event: #{e}"}
|
130
|
+
|
131
|
+
@help = "C-q to quit. M-? Keys, ENTER - edit toggle, M-Tab (exit table) C-n C-p M-0 M-9 Columns:- Narrow, + expand, > < switch"
|
132
|
+
RubyCurses::Label.new @form, {'text' => @help, "row" => Ncurses.LINES-3, "col" => 2, "color" => "yellow", "height"=>2}
|
133
|
+
|
134
|
+
str_renderer = TableCellRenderer.new ""
|
135
|
+
num_renderer = TableCellRenderer.new "", { "justify" => :right }
|
136
|
+
bool_renderer = CheckBoxCellRenderer.new "", {"parent" => texta, "display_length"=>5}
|
137
|
+
combo_renderer = RubyCurses::ComboBoxCellRenderer.new nil, {"parent" => texta, "display_length"=> 8}
|
138
|
+
combo_editor = RubyCurses::CellEditor.new(RubyCurses::ComboBox.new nil, {"focusable"=>false, "visible"=>false, "list"=>statuses, "display_length"=>8})
|
139
|
+
texta.set_default_cell_renderer_for_class "String", str_renderer
|
140
|
+
texta.set_default_cell_renderer_for_class "Fixnum", num_renderer
|
141
|
+
texta.set_default_cell_renderer_for_class "Float", num_renderer
|
142
|
+
texta.set_default_cell_renderer_for_class "TrueClass", bool_renderer
|
143
|
+
texta.set_default_cell_renderer_for_class "FalseClass", bool_renderer
|
144
|
+
texta.get_table_column_model.column(5).cell_editor = combo_editor
|
145
|
+
=begin
|
146
|
+
field = Field.new @form do
|
147
|
+
name "value"
|
148
|
+
row r+18
|
149
|
+
col c
|
150
|
+
display_length 30
|
151
|
+
bgcolor "cyan"
|
152
|
+
set_label Label.new @form, {'text' => "Value", 'mnemonic'=> 'V'}
|
153
|
+
# bind :ENTER do $editing = true end
|
154
|
+
# bind :LEAVE do $editing = false end
|
155
|
+
end
|
156
|
+
=end
|
157
|
+
buttrow = Ncurses.LINES-4
|
158
|
+
b_newrow = Button.new @form do
|
159
|
+
text "&New"
|
160
|
+
row buttrow
|
161
|
+
col c
|
162
|
+
bind(:ENTER) { eventlabel.text "New button adds a new row at the bottom " }
|
163
|
+
end
|
164
|
+
tm = texta.table_model
|
165
|
+
b_newrow.command {
|
166
|
+
cc = texta.get_table_column_model.column_count
|
167
|
+
# need to get datatypes etc, this is just a junk test
|
168
|
+
tmp=[]
|
169
|
+
#0.upto(cc-1) { tmp << "" }
|
170
|
+
0.upto(cc-1) { tmp << nil }
|
171
|
+
tm << tmp
|
172
|
+
#texta.table_data_changed
|
173
|
+
keylabel.text = "Added a row"
|
174
|
+
alert("Added a row at bottom of table")
|
175
|
+
|
176
|
+
}
|
177
|
+
|
178
|
+
# using ampersand to set mnemonic
|
179
|
+
b_delrow = Button.new @form do
|
180
|
+
text "&Delete"
|
181
|
+
row buttrow
|
182
|
+
col c+10
|
183
|
+
bind(:ENTER) { eventlabel.text "Deletes focussed row" }
|
184
|
+
end
|
185
|
+
b_delrow.command { |form|
|
186
|
+
row = texta.focussed_row
|
187
|
+
if confirm("Do your really want to delete row #{row}?")
|
188
|
+
tm.delete_at row
|
189
|
+
#texta.table_data_changed
|
190
|
+
else
|
191
|
+
#$message.value = "Quit aborted"
|
192
|
+
end
|
193
|
+
}
|
194
|
+
b_change = Button.new @form do
|
195
|
+
text "&Lock"
|
196
|
+
row buttrow
|
197
|
+
col c+20
|
198
|
+
command {
|
199
|
+
r = texta.focussed_row
|
200
|
+
c = sel_col.value
|
201
|
+
#$log.debug " Update gets #{field.getvalue.class}"
|
202
|
+
#texta.set_value_at(r, c, field.getvalue)
|
203
|
+
toggle = texta.column(texta.focussed_col()).editable
|
204
|
+
if toggle.nil? or toggle==true
|
205
|
+
toggle = false
|
206
|
+
text "Un&lock"
|
207
|
+
else
|
208
|
+
toggle = true
|
209
|
+
text "&Lock "
|
210
|
+
end
|
211
|
+
eventlabel.text "Set column #{texta.focussed_col()} editable to #{toggle}"
|
212
|
+
texta.column(texta.focussed_col()).editable toggle
|
213
|
+
alert("Set column #{texta.focussed_col()} editable to #{toggle}")
|
214
|
+
}
|
215
|
+
bind(:ENTER) { eventlabel.text "Toggles editable state of current column " }
|
216
|
+
end
|
217
|
+
b_insert = Button.new @form do
|
218
|
+
text "&Insert"
|
219
|
+
row buttrow
|
220
|
+
col c+32
|
221
|
+
command {
|
222
|
+
# this does not trigger a data change since we are not updating model. so update
|
223
|
+
# on pressing up or down
|
224
|
+
#0.upto(100) { |i| data << ["test", rand(100), "abc:#{i}", rand(100)/2.0]}
|
225
|
+
#texta.table_data_changed
|
226
|
+
}
|
227
|
+
bind(:ENTER) { eventlabel.text "Does nothing " }
|
228
|
+
end
|
229
|
+
|
230
|
+
|
231
|
+
@form.repaint
|
232
|
+
@window.wrefresh
|
233
|
+
Ncurses::Panel.update_panels
|
234
|
+
while((ch = @window.getchar()) != ?\C-q.getbyte(0) )
|
235
|
+
break if ch == KEY_F10
|
236
|
+
begin
|
237
|
+
colcount = tcm.column_count-1
|
238
|
+
s = keycode_tos ch
|
239
|
+
keylabel.text = "Pressed #{ch} , #{s}"
|
240
|
+
@form.handle_key(ch)
|
241
|
+
|
242
|
+
sel_col.value = tcm.column_count-1 if sel_col.value > tcm.column_count-1
|
243
|
+
sel_col.value = 0 if sel_col.value < 0
|
244
|
+
selcolname = texta.get_column_name sel_col.value
|
245
|
+
keylabel.text = "Pressed #{ch} , #{s}. Column selected #{texta.focussed_col}: Width:#{tcm.column(sel_col.value).width} #{selcolname}. Focussed Row: #{texta.focussed_row}, Rows: #{texta.table_model.row_count}, Cols: #{colcount}"
|
246
|
+
s = texta.get_value_at(texta.focussed_row, texta.focussed_col)
|
247
|
+
#s = s.to_s
|
248
|
+
## $log.debug " updating Field #{s}, #{s.class}"
|
249
|
+
## field.set_buffer s unless field.state == :HIGHLIGHTED # $editing
|
250
|
+
|
251
|
+
@form.repaint
|
252
|
+
@window.wrefresh
|
253
|
+
rescue => ex
|
254
|
+
$log.debug( ex) if ex
|
255
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
256
|
+
#alert ex.to_s
|
257
|
+
textdialog ex
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
rescue => ex
|
262
|
+
ensure
|
263
|
+
@window.destroy if !@window.nil?
|
264
|
+
VER::stop_ncurses
|
265
|
+
p ex if ex
|
266
|
+
p(ex.backtrace.join("\n")) if ex
|
267
|
+
$log.debug( ex) if ex
|
268
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
269
|
+
end
|
270
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# This is a new kind of splitpane, inspired by the vim editor.
|
2
|
+
# I was deeply frustrated with the Java kind of splitpane,
|
3
|
+
# which requires splitpanes within splitpanes to get several split.
|
4
|
+
# This is an attempt at getting many splits, keeping them at one level
|
5
|
+
# and keeping the interface as simple as possible, with minimal input
|
6
|
+
# from user.
|
7
|
+
# It usually takes a listbox or textview or textarea.
|
8
|
+
# It can also take an array, or string or hash.
|
9
|
+
# It supports moving the split, and increasing or decreasing the current box to some extent.
|
10
|
+
# Typically if the split is vertical, add stacks the components, one below the other.
|
11
|
+
# If horizontal, if will flow the components, to the right of previous. This can be overriden by passing
|
12
|
+
# type as :STACK or :FLOW.
|
13
|
+
#
|
14
|
+
# This does not support changing the orientation at run time, that's nice for demos, but a pain
|
15
|
+
# to get right, and results in a lot of extra code, meaning more bugs.
|
16
|
+
# TODO: create a class that contains component array and a pointer so it can give next/prev
|
17
|
+
# i am tired of maintaining this everywhere.
|
18
|
+
require 'rbcurse'
|
19
|
+
require 'rbcurse/extras/widgets/rlistbox'
|
20
|
+
require 'rbcurse/core/widgets/rtextview'
|
21
|
+
require 'rbcurse/extras/widgets/rvimsplit'
|
22
|
+
|
23
|
+
require 'rbcurse/core/include/appmethods'
|
24
|
+
def my_help_text
|
25
|
+
<<-eos
|
26
|
+
File: testvimsplit.rb
|
27
|
+
|
28
|
+
Basic Usage
|
29
|
+
|
30
|
+
An example of a vimsplit containing various objects, which have been placed
|
31
|
+
with weightages. The vimsplit has one main split which is either horizontal
|
32
|
+
or vertical with a divider. You can activate the divider using F3. It then becomes
|
33
|
+
focusable. Using the arrows keys one can then move the divider up or down (or right
|
34
|
+
left for a vertical divider). F3 will toggles focusable.
|
35
|
+
|
36
|
+
This allows us to have master-detail relationships as in mail clients, or file managers
|
37
|
+
that show directories on one side and files on the other. One can place more dividers (as
|
38
|
+
in appemail.rb), so as to resize deeper splits and one may bind to the divider's DRAG event
|
39
|
+
to get all one's components to resize correctly. See appemail.rb in the old rbcurse examples folder,
|
40
|
+
I may not keep it updated since it relies on mbox and thus may not be easy for others to test.
|
41
|
+
|
42
|
+
Pressing '?' shows key-bindings for the vimplit, sadly not for underlying component.
|
43
|
+
|
44
|
+
=========================================================================
|
45
|
+
:n or Alt-n for next buffer. 'q' or even <Esc-Esc> to quit.
|
46
|
+
|
47
|
+
eos
|
48
|
+
end
|
49
|
+
if $0 == __FILE__
|
50
|
+
class Tester
|
51
|
+
def initialize
|
52
|
+
acolor = $reversecolor
|
53
|
+
end
|
54
|
+
def run
|
55
|
+
@window = VER::Window.root_window
|
56
|
+
@form = Form.new @window
|
57
|
+
install_help_text my_help_text
|
58
|
+
@form.bind_key(FFI::NCurses::KEY_F1, 'help') { display_app_help }
|
59
|
+
|
60
|
+
|
61
|
+
h = 20; w = 75; t = 3; l = 4
|
62
|
+
|
63
|
+
vf = :H
|
64
|
+
@vim = VimSplit.new @form, {:row => 2, :col => 5, :width => :EXPAND, :height => 25, :orientation => vf, :weight => 0.6}
|
65
|
+
lb = Listbox.new nil, :list => ["ruby","perl","lisp","java", "scala"] , :name => "mylist"
|
66
|
+
lb1 = Listbox.new nil, :list => ["roger","borg","laver","edberg", "sampras","ashe"] , :name => "mylist1"
|
67
|
+
|
68
|
+
lb2 = Listbox.new nil, :list => `gem list --local`.split("\n") , :name => "mylist2"
|
69
|
+
|
70
|
+
alist = %w[ ruby perl python java jruby macruby rubinius rails rack sinatra gawk zsh bash groovy]
|
71
|
+
str = "Hello people of this world.\nThis is a textbox.\nUse arrow keys, j/k/h/l/gg/G/C-a/C-e/C-d/C-b\n"
|
72
|
+
str << alist.join("\n")
|
73
|
+
stfl = vf == :V ? :FLOW : :STACK
|
74
|
+
@vim.add lb, :FIRST, :AUTO
|
75
|
+
@vim.add lb1, :FIRST, :AUTO #nil #0.7:AUTO
|
76
|
+
@vim.add ["mercury","venus","earth","mars","jupiter", "saturn"], :FIRST, :AUTO
|
77
|
+
@vim.add alist, :FIRST, 0.4, stfl
|
78
|
+
#@vim.add alist, :FIRST, nil, stfl
|
79
|
+
@vim.add alist.shuffle, :FIRST, 0.6, stfl
|
80
|
+
@vim.add lb2, :SECOND, :AUTO
|
81
|
+
@vim.add str, :SECOND, :AUTO
|
82
|
+
ok_button = Button.new @form do
|
83
|
+
text "+"
|
84
|
+
name "+"
|
85
|
+
row 27
|
86
|
+
col 10
|
87
|
+
end
|
88
|
+
#ok_button.command { |form| @vim.weight(@vim.weight + 0.1) }
|
89
|
+
ok_button.command { @vim.increase_weight }
|
90
|
+
|
91
|
+
|
92
|
+
k_button = Button.new @form do
|
93
|
+
text "-"
|
94
|
+
name "-"
|
95
|
+
row 27
|
96
|
+
col 17
|
97
|
+
end
|
98
|
+
#k_button.command { |form| @vim.weight( @vim.weight - 0.1) }
|
99
|
+
k_button.command { |form| @vim.decrease_weight }
|
100
|
+
|
101
|
+
#
|
102
|
+
@help = "F10 to quit. "
|
103
|
+
RubyCurses::Label.new @form, {'text' => @help, "row" => 1, "col" => 2, "color" => "yellow"}
|
104
|
+
@form.repaint
|
105
|
+
@window.wrefresh
|
106
|
+
Ncurses::Panel.update_panels
|
107
|
+
ctr = 0
|
108
|
+
row = 2
|
109
|
+
while((ch = @window.getchar()) != Ncurses::KEY_F10 )
|
110
|
+
ret = @form.handle_key(ch)
|
111
|
+
@window.wrefresh
|
112
|
+
#ret = @vim.handle_key ch
|
113
|
+
if ret == :UNHANDLED
|
114
|
+
str = keycode_tos ch
|
115
|
+
$log.debug " UNHANDLED #{str} by Vim #{ret} "
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
@window.destroy
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
123
|
+
include RubyCurses
|
124
|
+
include RubyCurses::Utils
|
125
|
+
# Initialize curses
|
126
|
+
begin
|
127
|
+
# XXX update with new color and kb
|
128
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
129
|
+
$log = Logger.new("rbc13.log")
|
130
|
+
$log.level = Logger::DEBUG
|
131
|
+
n = Tester.new
|
132
|
+
n.run
|
133
|
+
rescue => ex
|
134
|
+
ensure
|
135
|
+
VER::stop_ncurses
|
136
|
+
p ex if ex
|
137
|
+
puts(ex.backtrace.join("\n")) if ex
|
138
|
+
$log.debug( ex) if ex
|
139
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
140
|
+
end
|
141
|
+
end
|