rbcurse-core 0.0.0 → 0.0.1
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/CHANGELOG +1945 -0
- data/README.md +6 -2
- data/VERSION +1 -1
- data/examples/abasiclist.rb +1 -1
- data/examples/bline.rb +135 -0
- data/examples/dbdemo.rb +26 -20
- data/examples/term2.rb +1 -1
- data/examples/testlistbox.rb +6 -4
- data/lib/rbcurse/core/include/appmethods.rb +5 -3
- data/lib/rbcurse/core/include/io.rb +176 -598
- data/lib/rbcurse/core/include/rhistory.rb +22 -5
- data/lib/rbcurse/core/system/ncurses.rb +3 -4
- data/lib/rbcurse/core/system/window.rb +0 -46
- data/lib/rbcurse/core/util/app.rb +35 -48
- data/lib/rbcurse/core/util/bottomline.rb +18 -11
- data/lib/rbcurse/core/util/padreader.rb +2 -1
- data/lib/rbcurse/core/util/rcommandwindow.rb +1 -0
- data/lib/rbcurse/core/util/rdialogs.rb +74 -164
- data/lib/rbcurse/core/util/viewer.rb +1 -1
- data/lib/rbcurse/core/widgets/rmessagebox.rb +14 -4
- data/lib/rbcurse/core/widgets/rtabbedwindow.rb +1 -1
- data/lib/rbcurse/core/widgets/rtextarea.rb +59 -9
- data/lib/rbcurse/core/widgets/rtextview.rb +48 -10
- data/lib/rbcurse/core/widgets/rwidget.rb +38 -6
- data/lib/rbcurse/core/widgets/tabular.rb +4 -4
- data/lib/rbcurse/core/widgets/tabularwidget.rb +1 -1
- data/lib/rbcurse/core/widgets/textpad.rb +2 -2
- data/rbcurse-core.gemspec +134 -0
- metadata +33 -36
@@ -29,8 +29,9 @@ module RubyCurses
|
|
29
29
|
bind_key($history_key) { _show_history }
|
30
30
|
# widget should have CHANGED event, or this will either give error, or just not work
|
31
31
|
# else please update history whenever you want a value to be retrieved
|
32
|
-
bind(:CHANGED) { @history << @text
|
32
|
+
bind(:CHANGED) { @history << @text if @text && (!@history.include? @text) }
|
33
33
|
end
|
34
|
+
def history=(x); history(x); end
|
34
35
|
|
35
36
|
# pass in some configuration for histroy such as row and column to show popup on
|
36
37
|
def history_config config={}
|
@@ -42,13 +43,29 @@ module RubyCurses
|
|
42
43
|
private
|
43
44
|
def _show_history
|
44
45
|
return unless @history
|
46
|
+
return if @history.empty?
|
45
47
|
list = @history
|
48
|
+
@_history_config ||= {}
|
49
|
+
#list = ["No history"] if @history.empty?
|
50
|
+
raise ArgumentError, "show_history got nil list" unless list
|
46
51
|
# calculate r and c
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
52
|
+
# col if fine, except for when there's a label.
|
53
|
+
c = @_history_config[:col] || @field_col || @col # this is also dependent on window coords, as in a status_window or messagebox
|
54
|
+
sz = @history.size
|
55
|
+
wrow = 0
|
56
|
+
wrow = self.form.window.top if self.form
|
57
|
+
crow = wrow + @row
|
58
|
+
# if list can be displayed above, then fit it just above
|
59
|
+
if crow > sz + 2
|
60
|
+
r = crow - sz - 2
|
61
|
+
else
|
62
|
+
# else fit it in next row
|
63
|
+
r = crow + 1
|
51
64
|
end
|
65
|
+
#r = @row - 10
|
66
|
+
#if @row < 10
|
67
|
+
#r = @row + 1
|
68
|
+
#end
|
52
69
|
r = @_history_config[:row] || r
|
53
70
|
ret = popuplist(list, :row => r, :col => c, :title => " History ")
|
54
71
|
if ret
|
@@ -99,10 +99,9 @@ module VER
|
|
99
99
|
#puts "curses over"
|
100
100
|
ensure
|
101
101
|
return unless error = @last_error
|
102
|
-
log =
|
103
|
-
|
104
|
-
Kernel.warn "
|
105
|
-
Kernel.warn "The most recent was:"
|
102
|
+
#log = RbConfig[:logfile].value
|
103
|
+
#Kernel.warn "There may have been fatal errors logged to: #{log}."
|
104
|
+
#Kernel.warn "The most recent was:"
|
106
105
|
|
107
106
|
$stderr.puts ''
|
108
107
|
$stderr.puts @last_error_message if @last_error_message
|
@@ -36,7 +36,6 @@ module VER
|
|
36
36
|
attr_reader :window_type # window or pad to distinguish 2009-11-02 23:11
|
37
37
|
attr_accessor :name # more for debugging log files. 2010-02-02 19:58
|
38
38
|
attr_accessor :modified # has it been modified and may need a refresh
|
39
|
-
#attr_reader :bottomline # experimental here 2010-11-03 22:19
|
40
39
|
|
41
40
|
# @param [Array, Hash] window coordinates (ht, w, top, left)
|
42
41
|
# or
|
@@ -729,51 +728,6 @@ module VER
|
|
729
728
|
mvwprintw(r, c, "%s", :string, string);
|
730
729
|
wattroff(Ncurses.COLOR_PAIR(color) | att)
|
731
730
|
end
|
732
|
-
# @deprecated
|
733
|
-
def print_error_message text=$error_message.get_value
|
734
|
-
alert text
|
735
|
-
end
|
736
|
-
# added by rk 2008-11-29 19:01
|
737
|
-
# @deprecated. use global method of same name in rdialog
|
738
|
-
def print_status_message text=$status_message
|
739
|
-
#VER::print_status_message text
|
740
|
-
alert text
|
741
|
-
end
|
742
|
-
# added by rk 2008-11-29 19:01
|
743
|
-
# Since these methods write directly to window they are not advised
|
744
|
-
# since clearing previous message we don't know how much to clear.
|
745
|
-
# Best to map error_message to a label.
|
746
|
-
# 2010-09-13 00:22 WE should not use these any longer.
|
747
|
-
# Application should create a label and map a Variable named
|
748
|
-
# $errormessage to it. We should only update the Variable
|
749
|
-
def DEPRECATED_print_error_message text=$error_message.get_value
|
750
|
-
r = $error_message_row || Ncurses.LINES-1
|
751
|
-
c = $error_message_col || (Ncurses.COLS-text.length)/2
|
752
|
-
|
753
|
-
$log.debug "got ERROR MESSAGE #{text} row #{r} "
|
754
|
-
clear_error r, $datacolor
|
755
|
-
printstring r, c, text, color = $promptcolor
|
756
|
-
$error_message_clear_pending = true
|
757
|
-
end
|
758
|
-
# added by rk 2008-11-29 19:01
|
759
|
-
# @deprecated. use global method of same name
|
760
|
-
def DEPRECATED_print_status_message text=$status_message
|
761
|
-
r = $status_message_row || Ncurses.LINES-1
|
762
|
-
clear_error r, $datacolor
|
763
|
-
# print it in centre
|
764
|
-
printstring r, (Ncurses.COLS-text.length)/2, text, color = $promptcolor
|
765
|
-
end
|
766
|
-
# Clear error message printed
|
767
|
-
# I am not only clearing if something was printed. This is since
|
768
|
-
# certain small forms like TabbedForm top form throw an error on printstring.
|
769
|
-
# @deprecated
|
770
|
-
def clear_error r = $error_message_row, color = $datacolor
|
771
|
-
return unless $error_message_clear_pending
|
772
|
-
c = $error_message_col || (Ncurses.COLS-text.length)/2
|
773
|
-
sz = $error_message_size || Ncurses.COLS
|
774
|
-
printstring(r, c, "%-*s" % [sz, " "], color)
|
775
|
-
$error_message_clear_pending = false
|
776
|
-
end
|
777
731
|
##
|
778
732
|
# NOTE : FOR MESSAGEBOXES ONLY !!!!
|
779
733
|
def print_border_mb row, col, height, width, color, attr
|
@@ -18,14 +18,6 @@ require 'logger'
|
|
18
18
|
require 'rbcurse'
|
19
19
|
require 'rbcurse/core/util/widgetshortcuts'
|
20
20
|
|
21
|
-
require 'rbcurse/core/util/bottomline'
|
22
|
-
$tt ||= RubyCurses::Bottomline.new
|
23
|
-
$tt.name = "$tt"
|
24
|
-
require 'forwardable'
|
25
|
-
module Kernel
|
26
|
-
extend Forwardable
|
27
|
-
def_delegators :$tt, :ask, :say, :agree, :choose, :numbered_menu, :display_text, :display_text_interactive, :display_list, :say_with_pause, :hide_bottomline, :say_with_wait
|
28
|
-
end
|
29
21
|
include RubyCurses
|
30
22
|
include RubyCurses::Utils
|
31
23
|
include Io
|
@@ -85,9 +77,6 @@ module RubyCurses
|
|
85
77
|
# the row on which to prompt user for any inputs
|
86
78
|
#attr_accessor :prompt_row # 2011-10-17 14:06:22
|
87
79
|
|
88
|
-
extend Forwardable
|
89
|
-
def_delegators :$tt, :ask, :say, :agree, :choose, :numbered_menu, :display_text, :display_text_interactive, :display_list
|
90
|
-
|
91
80
|
# TODO: i should be able to pass window coords here in config
|
92
81
|
# :title
|
93
82
|
def initialize config={}, &block
|
@@ -134,7 +123,7 @@ module RubyCurses
|
|
134
123
|
@window.destroy if !@window.nil?
|
135
124
|
$log.debug " INSIDE CLOSE, #{@stop_ncurses_on_close} "
|
136
125
|
if @stop_ncurses_on_close
|
137
|
-
$tt.destroy # added on 2011-10-9 since we created a window, but only hid it after use
|
126
|
+
$tt.destroy if $tt # added on 2011-10-9 since we created a window, but only hid it after use
|
138
127
|
VER::stop_ncurses
|
139
128
|
$log.debug " CLOSING NCURSES"
|
140
129
|
end
|
@@ -176,10 +165,10 @@ module RubyCurses
|
|
176
165
|
begin
|
177
166
|
@form.handle_key ch
|
178
167
|
rescue => err
|
179
|
-
alert err.to_s
|
180
168
|
$log.debug( "handle_key rescue reached ")
|
181
169
|
$log.debug( err)
|
182
170
|
$log.debug(err.backtrace.join("\n"))
|
171
|
+
textdialog [err.to_s, *err.backtrace], :title => "Exception"
|
183
172
|
end
|
184
173
|
#@form.repaint # was this duplicate ?? handle calls repaint not needed
|
185
174
|
@window.wrefresh
|
@@ -222,17 +211,13 @@ module RubyCurses
|
|
222
211
|
$status_message.value = text # trying out 2011-10-9
|
223
212
|
#@message.value = text # 2011-10-17 14:07:01
|
224
213
|
end
|
225
|
-
|
226
|
-
def message_row row
|
227
|
-
raise "Please use create_message_label first as message_label is no longer default behaviour" unless @message_label
|
228
|
-
@message_label.row = row
|
229
|
-
end
|
214
|
+
|
230
215
|
# during a process, when you wish to update status, since ordinarily the thread is busy
|
231
216
|
# and form does not get control back, so the window won't refresh.
|
232
217
|
# This will only update on keystroke since it uses statusline
|
233
218
|
# @deprecated please use {#status_line} instead of a message label
|
234
219
|
def message_immediate text
|
235
|
-
$log.warn "DEPRECATED, use message(),
|
220
|
+
$log.warn "DEPRECATED, use message(), or rb_puts or use status_window"
|
236
221
|
$status_message.value = text # trying out 2011-10-9 user needs to use in statusline command
|
237
222
|
# 2011-10-17 knocking off label, should be printed on status_line
|
238
223
|
end
|
@@ -334,46 +319,49 @@ module RubyCurses
|
|
334
319
|
# FIXME: why are we using rawmessage and then getchar when ask would suffice
|
335
320
|
def bind_global
|
336
321
|
opts = get_all_commands
|
337
|
-
cmd =
|
322
|
+
cmd = rb_gets("Select a command (<tab> for choices) : ", opts)
|
338
323
|
if cmd.nil? || cmd == ""
|
339
|
-
|
324
|
+
rb_puts "Aborted."
|
340
325
|
return
|
341
326
|
end
|
342
327
|
key = []
|
343
328
|
str = ""
|
344
|
-
raw_message "Enter one or 2 keys. Finish with ENTER. Enter first key:"
|
345
|
-
#
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
329
|
+
#raw_message "Enter one or 2 keys. Finish with ENTER. Enter first key:"
|
330
|
+
#ch = @window.getchar()
|
331
|
+
#raw_message_destroy
|
332
|
+
#if [KEY_ENTER, 10, 13, ?\C-g.getbyte(0)].include? ch
|
333
|
+
#say_with_pause "Aborted."
|
334
|
+
#return
|
335
|
+
#end
|
336
|
+
# the next is fine but does not allow user to enter a control or alt or function character
|
337
|
+
# since it uses Field. It is fine if you want to force alphanum input
|
338
|
+
ch = rb_getchar("Enter one or two keys. Finish with <ENTER>. Enter first key:")
|
339
|
+
unless ch
|
340
|
+
rb_puts "Aborted. <Press a key>"
|
350
341
|
return
|
351
342
|
end
|
352
343
|
key << ch
|
353
344
|
str << keycode_tos(ch)
|
354
|
-
|
355
|
-
ch
|
356
|
-
|
357
|
-
if ch == 3 || ch == ?\C-g.getbyte(0)
|
358
|
-
say_with_pause "Aborted."
|
345
|
+
ch = rb_getchar "Got #{str}. Enter second key or hit return:"
|
346
|
+
unless ch
|
347
|
+
rb_puts "Aborted. <Press a key>"
|
359
348
|
return
|
360
349
|
end
|
361
|
-
if ch ==
|
350
|
+
if ch == KEY_ENTER || ch == 13
|
362
351
|
else
|
363
352
|
key << ch
|
364
353
|
str << keycode_tos(ch)
|
365
354
|
end
|
366
355
|
if !key.empty?
|
367
|
-
|
356
|
+
rb_puts "Binding #{cmd} to #{str}. "
|
368
357
|
key = key[0] if key.size == 1
|
369
358
|
#@form.bind_key(key, cmd.to_sym) # not finding it, getting called by that comp
|
370
359
|
@form.bind_key(key){ send(cmd.to_sym) }
|
371
360
|
end
|
372
|
-
#message "Bound #{str} to #{cmd} "
|
373
|
-
raw_message_destroy
|
374
361
|
end
|
375
362
|
def bind_component
|
376
|
-
|
363
|
+
#rb_puts "Todo. ", :color_pair => get_color($promptcolor, :red, :black)
|
364
|
+
print_error_message "Todo this. "
|
377
365
|
# the idea here is to get the current component
|
378
366
|
# and bind some keys to some methods.
|
379
367
|
# however, how do we divine the methods we can map to
|
@@ -384,9 +372,10 @@ module RubyCurses
|
|
384
372
|
f = @form.get_current_field
|
385
373
|
if f.respond_to?('help_text')
|
386
374
|
h = f.help_text
|
387
|
-
|
375
|
+
h = "No help text defined for this field.\nTry F1, or press '?' for key-bindings." unless h
|
376
|
+
textdialog "#{h}", :title => "Widget Help Text"
|
388
377
|
else
|
389
|
-
alert "Could not get field #{f} or does not respond to helptext"
|
378
|
+
alert "Could not get field #{f} or does not respond to helptext. Try F1 or '?'"
|
390
379
|
end
|
391
380
|
end
|
392
381
|
# prompts user for a command. we need to get this back to the calling app
|
@@ -395,10 +384,8 @@ module RubyCurses
|
|
395
384
|
# or lines ??
|
396
385
|
# Also may want command completion, or help so all commands can be displayed
|
397
386
|
def get_command_from_user choices=["quit","help"]
|
398
|
-
|
399
|
-
|
400
|
-
@_command_history ||= Array.new
|
401
|
-
str = ask("Cmd: ", choices) { |q| q.default = @_previous_command; q.history = @_command_history }
|
387
|
+
@_command_history ||= Array.new
|
388
|
+
str = rb_gets("Cmd: ", choices) { |q| q.default = @_previous_command; q.history = @_command_history }
|
402
389
|
@_command_history << str unless @_command_history.include? str
|
403
390
|
# shell the command
|
404
391
|
if str =~ /^!/
|
@@ -437,7 +424,7 @@ module RubyCurses
|
|
437
424
|
ret = false
|
438
425
|
# what is this execute_this: some kind of general routine for all apps ?
|
439
426
|
ret = execute_this(cmd, *cmdline) if respond_to?(:execute_this, true)
|
440
|
-
|
427
|
+
rb_puts("#{self.class} does not respond to #{cmd} ", :color_pair => $promptcolor) unless ret
|
441
428
|
# should be able to say in red as error
|
442
429
|
end
|
443
430
|
end
|
@@ -988,7 +975,7 @@ module RubyCurses
|
|
988
975
|
opts = get_all_commands()
|
989
976
|
@_command_history ||= Array.new
|
990
977
|
# previous command should be in opts, otherwise it is not in this context
|
991
|
-
cmd =
|
978
|
+
cmd = rb_gets("Command: ", opts){ |q| q.default = @_previous_command; q.history = @_command_history }
|
992
979
|
if cmd.nil? || cmd == ""
|
993
980
|
else
|
994
981
|
@_command_history << cmd unless @_command_history.include? cmd
|
@@ -1000,7 +987,7 @@ module RubyCurses
|
|
1000
987
|
if rcmd.size == 1
|
1001
988
|
cmd = rcmd.first
|
1002
989
|
elsif !rcmd.empty?
|
1003
|
-
|
990
|
+
rb_puts "Cannot resolve #{cmd}. Matches are: #{rcmd} "
|
1004
991
|
end
|
1005
992
|
end
|
1006
993
|
if respond_to?(cmd, true)
|
@@ -1013,11 +1000,11 @@ module RubyCurses
|
|
1013
1000
|
if exc
|
1014
1001
|
$log.debug( exc)
|
1015
1002
|
$log.debug(exc.backtrace.join("\n"))
|
1016
|
-
|
1003
|
+
rb_puts exc.to_s
|
1017
1004
|
end
|
1018
1005
|
end
|
1019
1006
|
else
|
1020
|
-
|
1007
|
+
rb_puts("Command [#{cmd}] not supported by #{self.class} ", :color_pair => $promptcolor)
|
1021
1008
|
end
|
1022
1009
|
end
|
1023
1010
|
}
|
@@ -95,7 +95,6 @@ module RubyCurses
|
|
95
95
|
end
|
96
96
|
#
|
97
97
|
# create a window at bottom and show and hide it.
|
98
|
-
# Causing a stack overflow since Window creates a bottomline too !
|
99
98
|
#
|
100
99
|
def _create_footer_window h = 1 , w = Ncurses.COLS, t = Ncurses.LINES-1, l = 0
|
101
100
|
ewin = VER::Window.new(h, w , t, l)
|
@@ -320,7 +319,7 @@ module RubyCurses
|
|
320
319
|
#
|
321
320
|
# text to be shown if user presses M-h
|
322
321
|
#
|
323
|
-
attr_accessor :
|
322
|
+
attr_accessor :help_text
|
324
323
|
attr_accessor :color_pair
|
325
324
|
attr_accessor :history
|
326
325
|
|
@@ -984,7 +983,7 @@ module RubyCurses
|
|
984
983
|
@key_handler_proc = @question.key_handler_proc
|
985
984
|
@default = @question.default
|
986
985
|
$log.debug "XXX: ASK RBGETS got default: #{@default} "
|
987
|
-
@
|
986
|
+
@help_text = @question.help_text
|
988
987
|
@answer_type = @question.answer_type
|
989
988
|
if @question.answer_type.is_a? Array
|
990
989
|
@completion_proc = Proc.new{|str| @answer_type.dup.grep Regexp.new("^#{str}") }
|
@@ -1242,8 +1241,8 @@ module RubyCurses
|
|
1242
1241
|
str.slice!(curpos) #rescue next
|
1243
1242
|
clear_line len+maxlen+1, @prompt_length
|
1244
1243
|
when ?\M-h.getbyte(0) # HELP KEY
|
1245
|
-
|
1246
|
-
print_help(
|
1244
|
+
help_text = @help_text || "No help provided..."
|
1245
|
+
print_help(help_text)
|
1247
1246
|
clear_line len+maxlen+1
|
1248
1247
|
print_str @statement # UGH
|
1249
1248
|
#return 7, nil
|
@@ -1473,10 +1472,10 @@ module RubyCurses
|
|
1473
1472
|
print_str("%-*s" % [len," "], :y => from)
|
1474
1473
|
end
|
1475
1474
|
|
1476
|
-
def print_help(
|
1475
|
+
def print_help(help_text)
|
1477
1476
|
# best to popup a window and hsow that with ENTER to dispell
|
1478
|
-
print_str("%-*s" % [
|
1479
|
-
print_str("%s" %
|
1477
|
+
print_str("%-*s" % [help_text.length+2," "])
|
1478
|
+
print_str("%s" % help_text)
|
1480
1479
|
sleep(5)
|
1481
1480
|
end
|
1482
1481
|
def get_response
|
@@ -1592,7 +1591,7 @@ module RubyCurses
|
|
1592
1591
|
w = rc.window
|
1593
1592
|
rc.display_menu list1
|
1594
1593
|
# earlier wmove bombed, now move is (window.rb 121)
|
1595
|
-
str = ask(prompt) { |q| q.change_proc = Proc.new { |str| w.wmove(1,1) ; w.wclrtobot;
|
1594
|
+
str = ask(prompt) { |q| q.help_text = config[:help_text] ; q.change_proc = Proc.new { |str| w.wmove(1,1) ; w.wclrtobot;
|
1596
1595
|
|
1597
1596
|
l = list1.select{|e| e.index(str)==0} ; # select those starting with str
|
1598
1597
|
|
@@ -1776,6 +1775,14 @@ module RubyCurses
|
|
1776
1775
|
end
|
1777
1776
|
end # module
|
1778
1777
|
end # module
|
1778
|
+
#require 'rbcurse/core/util/bottomline'
|
1779
|
+
$tt ||= RubyCurses::Bottomline.new
|
1780
|
+
$tt.name = "$tt"
|
1781
|
+
require 'forwardable'
|
1782
|
+
module Kernel
|
1783
|
+
extend Forwardable
|
1784
|
+
def_delegators :$tt, :ask, :say, :agree, :choose, :numbered_menu, :display_text, :display_text_interactive, :display_list, :say_with_pause, :hide_bottomline, :say_with_wait
|
1785
|
+
end
|
1779
1786
|
if __FILE__ == $PROGRAM_NAME
|
1780
1787
|
|
1781
1788
|
#tabc = Proc.new {|str| Dir.glob(str +"*") }
|
@@ -1808,7 +1815,7 @@ if __FILE__ == $PROGRAM_NAME
|
|
1808
1815
|
entry = {}
|
1809
1816
|
entry[:file] = ask("File? ", Pathname) do |q|
|
1810
1817
|
q.completion_proc = Proc.new {|str| Dir.glob(str +"*") }
|
1811
|
-
q.
|
1818
|
+
q.help_text = "Enter start of filename and tab to get completion"
|
1812
1819
|
end
|
1813
1820
|
alert "file: #{entry[:file]} "
|
1814
1821
|
$log.debug "FILE: #{entry[:file]} "
|
@@ -1824,7 +1831,7 @@ if __FILE__ == $PROGRAM_NAME
|
|
1824
1831
|
entry[:state] = ask("State? ") do |q|
|
1825
1832
|
q._case = :up
|
1826
1833
|
q.validate = /\A[A-Z]{2}\Z/
|
1827
|
-
q.
|
1834
|
+
q.help_text = "Enter 2 characters for your state"
|
1828
1835
|
end
|
1829
1836
|
entry[:zip] = ask("Zip? ") do |q|
|
1830
1837
|
q.validate = /\A\d{5}(?:-?\d{4})?\Z/
|
@@ -163,7 +163,8 @@ class PadReader
|
|
163
163
|
rescue => err
|
164
164
|
$log.debug( err) if err
|
165
165
|
$log.debug(err.backtrace.join("\n")) if err
|
166
|
-
|
166
|
+
|
167
|
+
textdialog ["Error in padreader: #{err} ", *err.backtrace], :title => "Exception"
|
167
168
|
$error_message.value = ""
|
168
169
|
ensure
|
169
170
|
end
|
@@ -22,15 +22,6 @@ require 'rbcurse/core/widgets/rwidget'
|
|
22
22
|
#require 'rbcurse/deprecated/widgets/rmessagebox'
|
23
23
|
require 'rbcurse/core/widgets/rmessagebox'
|
24
24
|
|
25
|
-
# trying out 2011-12-4 so non-apps can get it.
|
26
|
-
require 'rbcurse/core/util/bottomline'
|
27
|
-
$tt ||= RubyCurses::Bottomline.new
|
28
|
-
$tt.name = "$tt"
|
29
|
-
require 'forwardable'
|
30
|
-
module Kernel
|
31
|
-
extend Forwardable
|
32
|
-
def_delegators :$tt, :ask, :say, :agree, :choose, :numbered_menu, :display_text, :display_text_interactive, :display_list, :say_with_pause, :hide_bottomline, :say_with_wait
|
33
|
-
end
|
34
25
|
# -- moving to the new Messagebox 2011-11-19 v 1.5.0
|
35
26
|
# Alert user with a one line message
|
36
27
|
#
|
@@ -66,7 +57,8 @@ end
|
|
66
57
|
# Are we doing anyhting to let caller know, cancel was pressed. FIXME
|
67
58
|
# @param [String] a label such as "Enter name:"
|
68
59
|
# @return [String] value entered by user
|
69
|
-
|
60
|
+
# @yield [Field] field created by messagebox
|
61
|
+
def get_string label, config={} # yield Field
|
70
62
|
config[:title] ||= "Entry"
|
71
63
|
label_config = config[:label_config] || {}
|
72
64
|
label_config[:row] ||= 2
|
@@ -97,6 +89,8 @@ def get_string label, config={}
|
|
97
89
|
item Label.new nil, label_config
|
98
90
|
item Field.new nil, field_config
|
99
91
|
end
|
92
|
+
# added yield to override settings
|
93
|
+
yield tp.form.by_name[:name] if block_given?
|
100
94
|
index = tp.run
|
101
95
|
if index == 0 # OK
|
102
96
|
return tp.form.by_name[:name].text
|
@@ -109,14 +103,15 @@ end
|
|
109
103
|
# new version using new messagebox
|
110
104
|
# @param [String] question
|
111
105
|
# @return [Boolean] true or false
|
112
|
-
#
|
106
|
+
# @yield [Label]
|
107
|
+
#
|
113
108
|
def confirm text, config={}, &block
|
114
109
|
title = config['title'] || "Confirm"
|
115
110
|
config[:default_button] ||= 0
|
116
|
-
|
111
|
+
|
117
112
|
mb = RubyCurses::MessageBox.new config do
|
118
113
|
title title
|
119
|
-
message text
|
114
|
+
message text, &block
|
120
115
|
button_type :yes_no
|
121
116
|
end
|
122
117
|
index = mb.run
|
@@ -131,140 +126,6 @@ end
|
|
131
126
|
# alert("You did not enter anything!", {"title"=>"Wake Up", "bgcolor"=>"blue", "color"=>"white"})
|
132
127
|
# block currently ignored. don't know what to do, can't pass it to MB since alread sending in a block
|
133
128
|
#
|
134
|
-
def DEPalert text, config={}, &block
|
135
|
-
title = config['title'] || "Alert"
|
136
|
-
#instance_eval &block if block_given?
|
137
|
-
if text.is_a? RubyCurses::Variable # added 2011-09-20 incase variable passed
|
138
|
-
text = text.get_value
|
139
|
-
end
|
140
|
-
mb = RubyCurses::MessageBox.new nil, config do
|
141
|
-
title title
|
142
|
-
message text
|
143
|
-
button_type :ok
|
144
|
-
end
|
145
|
-
end
|
146
|
-
# confirms from user returning :YES or :NO
|
147
|
-
# Darn, should have returned boolean, now have to live with it.
|
148
|
-
def OLDconfirm text, config={}, &block
|
149
|
-
title = config['title'] || "Confirm"
|
150
|
-
#instance_eval &block if block_given?
|
151
|
-
mb = RubyCurses::MessageBox.new nil, config do
|
152
|
-
title title
|
153
|
-
message text
|
154
|
-
button_type :yes_no
|
155
|
-
end
|
156
|
-
return mb.selected_index == 0 ? :YES : :NO
|
157
|
-
end
|
158
|
-
|
159
|
-
##
|
160
|
-
# allows user entry of a string.
|
161
|
-
# In config you may pass Field related properties such as chars_allowed, valid_regex, values, etc.
|
162
|
-
def DEPget_string(message, len=50, default="", config={})
|
163
|
-
|
164
|
-
config["input_config"] = {}
|
165
|
-
config["input_config"]["maxlen"] = len
|
166
|
-
config["maxlen"]=len
|
167
|
-
title = config["title"] || "Input required"
|
168
|
-
mb = RubyCurses::MessageBox.new nil, config do
|
169
|
-
title title
|
170
|
-
message message
|
171
|
-
type :input
|
172
|
-
button_type :ok
|
173
|
-
default_value default
|
174
|
-
end
|
175
|
-
return mb.input_value
|
176
|
-
end
|
177
|
-
|
178
|
-
##
|
179
|
-
# Added 2009-02-05 13:16
|
180
|
-
# get a string from user with some additional checkboxes and optionally supply default values
|
181
|
-
# Usage:
|
182
|
-
#sel, inp, hash = get_string_with_options("Enter a filter pattern", 20, "*", {"checkboxes" => ["case sensitive","reverse"], "checkbox_defaults"=>[true, false]})
|
183
|
-
# sel, inp, hash = get_string_with_options("Enter a filter pattern", 20, "*", {"checkboxes" => ["case sensitive","reverse"]})
|
184
|
-
# $log.debug " POPUP: #{sel}: #{inp}, #{hash['case sensitive']}, #{hash['reverse']}"
|
185
|
-
#
|
186
|
-
# @param: message to print,
|
187
|
-
# @param: length of entry field
|
188
|
-
# @param: default value of field
|
189
|
-
# @param: configuration of box or field
|
190
|
-
# checkboxes: array of strings to use as checkboxes
|
191
|
-
# checkbox_defaults : array of true/false default values for each cb
|
192
|
-
# @return: int 0 OK, 1 cancel pressed
|
193
|
-
# @return: string value entered
|
194
|
-
# @return: hash of strings and booleans for checkboxes and values
|
195
|
-
#
|
196
|
-
# @deprecated - user should be able to do this quite easily now.
|
197
|
-
def TODOget_string_with_options(message, len=20, default="", config={})
|
198
|
-
title = config["title"] || "Input required"
|
199
|
-
input_config = config["input_config"] || {}
|
200
|
-
checks = config["checkboxes"]
|
201
|
-
checkbox_defaults = config["checkbox_defaults"] || []
|
202
|
-
|
203
|
-
height = config["height"] || 1
|
204
|
-
display_length = config["display_length"] || 30
|
205
|
-
|
206
|
-
r = 3
|
207
|
-
c = 4
|
208
|
-
mform = RubyCurses::Form.new nil
|
209
|
-
message_label = RubyCurses::Label.new mform, {'text' => message, "name"=>"message_label","row" => r, "col" => c, "display_length" => display_length, "height" => height, "attr"=>"reverse"}
|
210
|
-
|
211
|
-
r += 1
|
212
|
-
input = RubyCurses::Field.new mform, input_config do
|
213
|
-
name "input"
|
214
|
-
row r
|
215
|
-
col c
|
216
|
-
display_length display_length
|
217
|
-
maxlen len
|
218
|
-
set_buffer default
|
219
|
-
end
|
220
|
-
if !checks.nil?
|
221
|
-
r += 2
|
222
|
-
checks.each_with_index do |cbtext,ix|
|
223
|
-
field = RubyCurses::CheckBox.new mform do
|
224
|
-
text cbtext
|
225
|
-
name cbtext
|
226
|
-
value checkbox_defaults[ix]||false
|
227
|
-
color 'black'
|
228
|
-
bgcolor 'white'
|
229
|
-
row r
|
230
|
-
col c
|
231
|
-
end
|
232
|
-
r += 1
|
233
|
-
end
|
234
|
-
end
|
235
|
-
radios = config["radiobuttons"]
|
236
|
-
if !radios.nil?
|
237
|
-
radio_default = config["radio_default"] || radios[0]
|
238
|
-
radio = RubyCurses::Variable.new radio_default
|
239
|
-
r += 2
|
240
|
-
radios.each_with_index do |cbtext,ix|
|
241
|
-
field = RubyCurses::RadioButton.new mform do
|
242
|
-
variable radio
|
243
|
-
text cbtext
|
244
|
-
value cbtext
|
245
|
-
color 'black'
|
246
|
-
bgcolor 'white'
|
247
|
-
row r
|
248
|
-
col c
|
249
|
-
end
|
250
|
-
r += 1
|
251
|
-
end
|
252
|
-
end
|
253
|
-
mb = RubyCurses::MessageBox.new mform do
|
254
|
-
title title
|
255
|
-
button_type :ok_cancel
|
256
|
-
default_button 0
|
257
|
-
end
|
258
|
-
hash = {}
|
259
|
-
if !checks.nil?
|
260
|
-
checks.each do |c|
|
261
|
-
hash[c] = mform.by_name[c].getvalue
|
262
|
-
end
|
263
|
-
end
|
264
|
-
hash["radio"] = radio.get_value unless radio.nil?
|
265
|
-
# returns button index (0 = OK), value of field, hash containing values of checkboxes
|
266
|
-
return mb.selected_index, mform.by_name['input'].getvalue, hash
|
267
|
-
end
|
268
129
|
|
269
130
|
# ------------------------ We've Moved here from window class ---------------- #
|
270
131
|
# #
|
@@ -277,22 +138,33 @@ end
|
|
277
138
|
# new version with a window created on 2011-10-1 12:37 AM
|
278
139
|
# Now can be separate from window class, needing nothing, just a util class
|
279
140
|
# prints a status message and pauses for a char
|
141
|
+
# @param [String] text to print
|
142
|
+
# @param [Hash] config: :color :bgcolor :color_pair
|
143
|
+
# :wait (numbr of seconds to wait for a key press and then close) if not givn
|
144
|
+
# will keep waiting for keypress (the default)
|
280
145
|
def print_status_message text, aconfig={}, &block
|
281
146
|
_print_message :status, text, aconfig, &block
|
282
147
|
end
|
148
|
+
alias :rb_puts print_status_message
|
149
|
+
|
283
150
|
# new version with a window created on 2011-10-1 12:30 AM
|
284
151
|
# Now can be separate from window class, needing nothing, just a util class
|
285
152
|
# Why are we dealing with $error_message, that was due to old idea which failed
|
286
153
|
# scrap it and send the message.
|
154
|
+
# @param [String] text to print
|
155
|
+
# @param [Hash] config: :color :bgcolor :color_pair
|
156
|
+
# :wait (numbr of seconds to wait for a key press and then close) if not givn
|
157
|
+
# will keep waiting for keypress (the default)
|
287
158
|
def print_error_message text, aconfig={}, &block
|
288
159
|
_print_message :error, text, aconfig, &block
|
289
160
|
end
|
290
|
-
|
161
|
+
private
|
162
|
+
def _create_footer_window h = 2 , w = Ncurses.COLS, t = Ncurses.LINES-2, l = 0 #:nodoc:
|
291
163
|
ewin = VER::Window.new(h, w , t, l)
|
292
164
|
end
|
293
165
|
# @param [:symbol] :error or :status kind of message
|
294
|
-
#
|
295
|
-
def _print_message type, text, aconfig={}, &block
|
166
|
+
#private
|
167
|
+
def _print_message type, text, aconfig={}, &block #:nodoc:
|
296
168
|
case text
|
297
169
|
when RubyCurses::Variable # added 2011-09-20 incase variable passed
|
298
170
|
text = text.get_value
|
@@ -300,30 +172,55 @@ def _print_message type, text, aconfig={}, &block
|
|
300
172
|
text = text.to_s
|
301
173
|
end
|
302
174
|
# NOTE we are polluting global namespace
|
303
|
-
|
175
|
+
# fixed on 2011-12-6 . to test
|
176
|
+
#aconfig.each_pair { |k,v| instance_variable_set("@#{k}",v) }
|
177
|
+
color = aconfig[:color]
|
178
|
+
bgcolor = aconfig[:bgcolor]
|
304
179
|
ewin = _create_footer_window #*@layout
|
305
180
|
r = 0; c = 1;
|
306
181
|
case type
|
307
182
|
when :error
|
308
|
-
|
309
|
-
|
183
|
+
color ||= 'red'
|
184
|
+
bgcolor ||= 'black'
|
310
185
|
else
|
311
|
-
|
312
|
-
|
186
|
+
color ||= :white
|
187
|
+
bgcolor ||= :black
|
313
188
|
end
|
314
|
-
color_pair = get_color($promptcolor,
|
189
|
+
color_pair = get_color($promptcolor, color, bgcolor)
|
190
|
+
color_pair = aconfig[:color_pair] || color_pair
|
315
191
|
ewin.bkgd(Ncurses.COLOR_PAIR(color_pair));
|
316
192
|
ewin.printstring r, c, text, color_pair
|
317
|
-
ewin.printstring
|
193
|
+
ewin.printstring(r+1, c, "Press a key ", color_pair) unless aconfig[:wait]
|
318
194
|
ewin.wrefresh
|
319
|
-
|
195
|
+
if aconfig[:wait]
|
196
|
+
#try this out, if user wants a wait, then it will wait for 5 seconds, or if a key is pressed sooner
|
197
|
+
value = aconfig[:wait]
|
198
|
+
if value.is_a? Fixnum
|
199
|
+
value = value * 10
|
200
|
+
else
|
201
|
+
value = 50
|
202
|
+
end
|
203
|
+
Ncurses::halfdelay(tenths = value)
|
204
|
+
ewin.getch
|
205
|
+
Ncurses::halfdelay(tenths = 10)
|
206
|
+
else
|
207
|
+
ewin.getchar
|
208
|
+
end
|
320
209
|
ewin.destroy
|
321
210
|
end
|
322
211
|
#
|
323
212
|
# Alternative to confirm dialog, if you want this look and feel, at last 2 lines of screen
|
324
213
|
# @param [String] text to prompt
|
325
214
|
# @return [true, false] 'y' is true, all else if false
|
326
|
-
|
215
|
+
public
|
216
|
+
def rb_confirm text, aconfig={}, &block
|
217
|
+
# backward compatibility with agree()
|
218
|
+
if aconfig == true || aconfig == false
|
219
|
+
default = aconfig
|
220
|
+
aconfig = {}
|
221
|
+
else
|
222
|
+
default = aconfig[:default]
|
223
|
+
end
|
327
224
|
case text
|
328
225
|
when RubyCurses::Variable # added 2011-09-20 incase variable passed
|
329
226
|
text = text.get_value
|
@@ -332,10 +229,13 @@ def confirm_window text, aconfig={}, &block
|
|
332
229
|
end
|
333
230
|
ewin = _create_footer_window
|
334
231
|
r = 0; c = 1;
|
335
|
-
aconfig.each_pair { |k,v| instance_variable_set("@#{k}",v) }
|
336
|
-
|
337
|
-
|
338
|
-
|
232
|
+
#aconfig.each_pair { |k,v| instance_variable_set("@#{k}",v) }
|
233
|
+
# changed on 2011-12-6
|
234
|
+
color = aconfig[:color]
|
235
|
+
bgcolor = aconfig[:bgcolor]
|
236
|
+
color ||= :white
|
237
|
+
bgcolor ||= :black
|
238
|
+
color_pair = get_color($promptcolor, color, bgcolor)
|
339
239
|
ewin.bkgd(Ncurses.COLOR_PAIR(color_pair));
|
340
240
|
ewin.printstring r, c, text, color_pair
|
341
241
|
ewin.printstring r+1, c, "[y/n]", color_pair
|
@@ -344,13 +244,21 @@ def confirm_window text, aconfig={}, &block
|
|
344
244
|
retval = false
|
345
245
|
begin
|
346
246
|
ch = ewin.getchar
|
247
|
+
retval = (ch == 'y'.ord || ch == 'Y'.ord )
|
248
|
+
# if caller passed a default value and user pressed ENTER return that
|
249
|
+
# can be true or false so don't change this to "if default". 2011-12-8
|
250
|
+
if !default.nil?
|
251
|
+
if ch == 13 || ch == KEY_ENTER
|
252
|
+
retval = default
|
253
|
+
end
|
254
|
+
end
|
347
255
|
#retval = :YES if ch.chr == 'y'
|
348
|
-
retval = (ch.chr == 'y' )
|
349
256
|
ensure
|
350
257
|
ewin.destroy
|
351
258
|
end
|
352
259
|
retval
|
353
260
|
end
|
261
|
+
alias :confirm_window :rb_confirm
|
354
262
|
# class created to display multiple messages without asking for user to hit a key
|
355
263
|
# returns a window to which one can keep calling printstring with 0 or 1 as row.
|
356
264
|
# destroy when finished.
|
@@ -451,6 +359,7 @@ end
|
|
451
359
|
# You may also pass bgcolor and color
|
452
360
|
# @since 1.4.1 2011-11-1
|
453
361
|
def popuplist list, config={}, &block
|
362
|
+
raise ArgumentError, "Nil list received by popuplist" unless list
|
454
363
|
require 'rbcurse/core/widgets/rlist'
|
455
364
|
|
456
365
|
max_visible_items = config[:max_visible_items]
|
@@ -522,6 +431,7 @@ def popuplist list, config={}, &block
|
|
522
431
|
end
|
523
432
|
# returns length of longest
|
524
433
|
def longest_in_list list #:nodoc:
|
434
|
+
raise ArgumentError, "rdialog.rb: longest_in_list recvd nil list" unless list
|
525
435
|
longest = list.inject(0) do |memo,word|
|
526
436
|
memo >= word.length ? memo : word.length
|
527
437
|
end
|