canis 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +45 -0
- data/CHANGES +52 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +2 -0
- data/canis.gemspec +25 -0
- data/examples/alpmenu.rb +46 -0
- data/examples/app.sample +19 -0
- data/examples/appemail.rb +191 -0
- data/examples/atree.rb +105 -0
- data/examples/bline.rb +181 -0
- data/examples/common/devel.rb +319 -0
- data/examples/common/file.rb +93 -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 +59 -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 +16 -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 +506 -0
- data/examples/dirtree.rb +177 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/newtesttabp.rb +92 -0
- data/examples/tabular.rb +212 -0
- data/examples/tasks.rb +179 -0
- data/examples/term2.rb +88 -0
- data/examples/testbuttons.rb +307 -0
- data/examples/testcombo.rb +102 -0
- data/examples/testdb.rb +182 -0
- data/examples/testfields.rb +208 -0
- data/examples/testflowlayout.rb +43 -0
- data/examples/testkeypress.rb +98 -0
- data/examples/testlistbox.rb +187 -0
- data/examples/testlistbox1.rb +199 -0
- data/examples/testmessagebox.rb +144 -0
- data/examples/testprogress.rb +116 -0
- data/examples/testree.rb +107 -0
- data/examples/testsplitlayout.rb +53 -0
- data/examples/testsplitlayout1.rb +49 -0
- data/examples/teststacklayout.rb +48 -0
- data/examples/testwsshortcuts.rb +68 -0
- data/examples/testwsshortcuts2.rb +129 -0
- data/lib/canis.rb +16 -0
- data/lib/canis/core/docs/index.txt +104 -0
- data/lib/canis/core/docs/list.txt +16 -0
- data/lib/canis/core/docs/style_help.yml +34 -0
- data/lib/canis/core/docs/tabbedpane.txt +15 -0
- data/lib/canis/core/docs/table.txt +31 -0
- data/lib/canis/core/docs/textpad.txt +48 -0
- data/lib/canis/core/docs/tree.txt +23 -0
- data/lib/canis/core/include/.DS_Store +0 -0
- data/lib/canis/core/include/action.rb +83 -0
- data/lib/canis/core/include/actionmanager.rb +49 -0
- data/lib/canis/core/include/appmethods.rb +179 -0
- data/lib/canis/core/include/bordertitle.rb +49 -0
- data/lib/canis/core/include/canisparser.rb +100 -0
- data/lib/canis/core/include/colorparser.rb +437 -0
- data/lib/canis/core/include/defaultfilerenderer.rb +64 -0
- data/lib/canis/core/include/io.rb +320 -0
- data/lib/canis/core/include/layouts/SplitLayout.rb +161 -0
- data/lib/canis/core/include/layouts/abstractlayout.rb +213 -0
- data/lib/canis/core/include/layouts/flowlayout.rb +104 -0
- data/lib/canis/core/include/layouts/stacklayout.rb +109 -0
- data/lib/canis/core/include/listbindings.rb +89 -0
- data/lib/canis/core/include/listeditable.rb +319 -0
- data/lib/canis/core/include/listoperations.rb +61 -0
- data/lib/canis/core/include/listselectionmodel.rb +388 -0
- data/lib/canis/core/include/multibuffer.rb +173 -0
- data/lib/canis/core/include/ractionevent.rb +73 -0
- data/lib/canis/core/include/rchangeevent.rb +27 -0
- data/lib/canis/core/include/rhistory.rb +95 -0
- data/lib/canis/core/include/rinputdataevent.rb +47 -0
- data/lib/canis/core/include/textdocument.rb +111 -0
- data/lib/canis/core/include/vieditable.rb +175 -0
- data/lib/canis/core/include/widgetmenu.rb +66 -0
- data/lib/canis/core/system/colormap.rb +165 -0
- data/lib/canis/core/system/keydefs.rb +32 -0
- data/lib/canis/core/system/ncurses.rb +237 -0
- data/lib/canis/core/system/panel.rb +129 -0
- data/lib/canis/core/system/window.rb +1081 -0
- data/lib/canis/core/util/ansiparser.rb +119 -0
- data/lib/canis/core/util/app.rb +696 -0
- data/lib/canis/core/util/basestack.rb +412 -0
- data/lib/canis/core/util/defaultcolorparser.rb +84 -0
- data/lib/canis/core/util/extras/README +5 -0
- data/lib/canis/core/util/extras/bottomline.rb +1815 -0
- data/lib/canis/core/util/extras/padreader.rb +192 -0
- data/lib/canis/core/util/focusmanager.rb +31 -0
- data/lib/canis/core/util/helpmanager.rb +160 -0
- data/lib/canis/core/util/oldwidgetshortcuts.rb +304 -0
- data/lib/canis/core/util/promptmenu.rb +235 -0
- data/lib/canis/core/util/rcommandwindow.rb +933 -0
- data/lib/canis/core/util/rdialogs.rb +520 -0
- data/lib/canis/core/util/textutils.rb +74 -0
- data/lib/canis/core/util/viewer.rb +238 -0
- data/lib/canis/core/util/widgetshortcuts.rb +508 -0
- data/lib/canis/core/widgets/applicationheader.rb +103 -0
- data/lib/canis/core/widgets/box.rb +58 -0
- data/lib/canis/core/widgets/divider.rb +310 -0
- data/lib/canis/core/widgets/extras/README.md +12 -0
- data/lib/canis/core/widgets/extras/rtextarea.rb +960 -0
- data/lib/canis/core/widgets/extras/stackflow.rb +474 -0
- data/lib/canis/core/widgets/keylabelprinter.rb +194 -0
- data/lib/canis/core/widgets/listbox.rb +326 -0
- data/lib/canis/core/widgets/listfooter.rb +86 -0
- data/lib/canis/core/widgets/rcombo.rb +210 -0
- data/lib/canis/core/widgets/rcontainer.rb +415 -0
- data/lib/canis/core/widgets/rlink.rb +30 -0
- data/lib/canis/core/widgets/rmenu.rb +970 -0
- data/lib/canis/core/widgets/rmenulink.rb +30 -0
- data/lib/canis/core/widgets/rmessagebox.rb +400 -0
- data/lib/canis/core/widgets/rprogress.rb +118 -0
- data/lib/canis/core/widgets/rtabbedpane.rb +631 -0
- data/lib/canis/core/widgets/rtabbedwindow.rb +70 -0
- data/lib/canis/core/widgets/rwidget.rb +3634 -0
- data/lib/canis/core/widgets/scrollbar.rb +147 -0
- data/lib/canis/core/widgets/statusline.rb +113 -0
- data/lib/canis/core/widgets/table.rb +1072 -0
- data/lib/canis/core/widgets/tabular.rb +264 -0
- data/lib/canis/core/widgets/textpad.rb +1674 -0
- data/lib/canis/core/widgets/tree.rb +690 -0
- data/lib/canis/core/widgets/tree/treecellrenderer.rb +150 -0
- data/lib/canis/core/widgets/tree/treemodel.rb +432 -0
- data/lib/canis/version.rb +3 -0
- metadata +229 -0
@@ -0,0 +1,520 @@
|
|
1
|
+
=begin
|
2
|
+
* Name: dialogs so user can do basic stuff in one line.
|
3
|
+
* Description:
|
4
|
+
* Author: jkepler
|
5
|
+
|
6
|
+
--------
|
7
|
+
* Date: 2008-12-30 12:22
|
8
|
+
* 2011-10-1 : moving print_error and print_status methods here as alternatives
|
9
|
+
to alert and confirm. Anyone who has included those will get these.
|
10
|
+
And this file is included in the base file.
|
11
|
+
|
12
|
+
Shucks, this file has no module. It's bare !
|
13
|
+
* License:
|
14
|
+
Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
15
|
+
|
16
|
+
# CHANGES:
|
17
|
+
# -- moving to the new Messagebox 2011-11-19 v 1.5.0
|
18
|
+
TODO:
|
19
|
+
Add select_one (message, values, default)
|
20
|
+
=end
|
21
|
+
require 'canis/core/widgets/rwidget'
|
22
|
+
#require 'canis/deprecated/widgets/rmessagebox'
|
23
|
+
require 'canis/core/widgets/rmessagebox'
|
24
|
+
require 'canis/core/widgets/listbox'
|
25
|
+
|
26
|
+
# -- moving to the new Messagebox 2011-11-19 v 1.5.0
|
27
|
+
# Alert user with a one line message
|
28
|
+
#
|
29
|
+
def alert text, config={}
|
30
|
+
|
31
|
+
if text.is_a? Canis::Variable
|
32
|
+
text = text.get_value
|
33
|
+
end
|
34
|
+
_title = config[:title] || "Alert"
|
35
|
+
tp = MessageBox.new config do
|
36
|
+
title _title
|
37
|
+
button_type :ok
|
38
|
+
message text
|
39
|
+
#text mess
|
40
|
+
end
|
41
|
+
tp.run
|
42
|
+
end
|
43
|
+
|
44
|
+
# Alert user with a block of text. This will popup a textview in which the user can scroll
|
45
|
+
# Use this if you are not sure of the size of the text, such as printing a stack trace,
|
46
|
+
# exception
|
47
|
+
# 2011-12-25 just pass in an exceptino object and we do the rest
|
48
|
+
def textdialog mess, config={}
|
49
|
+
if mess.is_a? Exception
|
50
|
+
mess = [mess.to_s, *mess.backtrace]
|
51
|
+
config[:title] ||= "Exception"
|
52
|
+
end
|
53
|
+
config[:title] ||= "Alert"
|
54
|
+
tp = MessageBox.new config do
|
55
|
+
button_type :ok
|
56
|
+
text mess
|
57
|
+
end
|
58
|
+
tv = tp.form.by_name["message_label"]
|
59
|
+
# 2014-04-15 so that ENTER can hit okay without tabbing to button. FIX IN RBC
|
60
|
+
tv.unbind_key(KEY_ENTER)
|
61
|
+
tp.run
|
62
|
+
end
|
63
|
+
#
|
64
|
+
# This uses the new messagebox 2011-11-19 v 1.5.0
|
65
|
+
# NOTE: The earlier get_string had only an OK button, this seems to have a CANCEL
|
66
|
+
# @param [String] a label such as "Enter name:"
|
67
|
+
# @return [String] value entered by user, nil if cancel pressed
|
68
|
+
# @yield [Field] field created by messagebox
|
69
|
+
def get_string label, config={} # yield Field
|
70
|
+
config[:title] ||= "Entry"
|
71
|
+
label_config = config[:label_config] || {}
|
72
|
+
label_config[:row] ||= 2
|
73
|
+
label_config[:col] ||= 2
|
74
|
+
label_config[:text] = label
|
75
|
+
|
76
|
+
field_config = config[:field_config] || {}
|
77
|
+
field_config[:row] ||= 3
|
78
|
+
field_config[:col] ||= 2
|
79
|
+
field_config[:attr] = :reverse
|
80
|
+
field_config[:maxlen] ||= config[:maxlen]
|
81
|
+
field_config[:default] ||= config[:default]
|
82
|
+
field_config[:default] = field_config[:default].chomp if field_config[:default]
|
83
|
+
field_config[:name] = :name
|
84
|
+
#field_config[:width] ||= 50 # i want it to extend since i don't know the actual width
|
85
|
+
#field_config[:width] ||= 50 # i want it to extend since i don't know the actual width
|
86
|
+
field_config[:width] ||= (field_config[:width] || 50)
|
87
|
+
|
88
|
+
defwid = config[:default].nil? ? 30 : config[:default].size + 13
|
89
|
+
w = [label.size + 8, defwid, field_config[:width]+13 ].max
|
90
|
+
config[:width] ||= w
|
91
|
+
## added history 2013-03-06 - 14:25 : we could keep history based on prompt
|
92
|
+
$get_string_history ||= []
|
93
|
+
#$log.debug "XXX: FIELD SIZE #{w} "
|
94
|
+
#$log.debug "XXX: FIELD CONFIG #{field_config} "
|
95
|
+
tp = MessageBox.new config do
|
96
|
+
button_type :ok_cancel
|
97
|
+
default_button 0
|
98
|
+
item Label.new nil, label_config
|
99
|
+
fld = Field.new nil, field_config
|
100
|
+
item fld
|
101
|
+
## added field history 2013-03-06 - 14:24
|
102
|
+
require 'canis/core/include/rhistory'
|
103
|
+
fld.extend(FieldHistory)
|
104
|
+
# We need to manually set history each time, since the field is recreated
|
105
|
+
# with the messagebox. Otherwise, field can on its own handle history
|
106
|
+
fld.history($get_string_history)
|
107
|
+
end
|
108
|
+
# added yield to override settings
|
109
|
+
yield tp.form.by_name[:name] if block_given?
|
110
|
+
index = tp.run
|
111
|
+
if index == 0 # OK
|
112
|
+
## added field history 2013-03-06 - 14:24
|
113
|
+
t = tp.form.by_name[:name].text
|
114
|
+
$get_string_history << t if t && !$get_string_history.include?(t)
|
115
|
+
return t
|
116
|
+
else # CANCEL
|
117
|
+
# Should i use nil or blank. I am currently opting for nil, as this may imply to caller
|
118
|
+
# that user does not wish to override whatever value is being prompted for.
|
119
|
+
return nil
|
120
|
+
end
|
121
|
+
end
|
122
|
+
# new version using new messagebox
|
123
|
+
# @param [String] question
|
124
|
+
# @return [Boolean] true or false
|
125
|
+
# @yield [Label]
|
126
|
+
#
|
127
|
+
def confirm text, config={}, &block
|
128
|
+
title = config['title'] || "Confirm"
|
129
|
+
config[:default_button] ||= 0
|
130
|
+
|
131
|
+
mb = Canis::MessageBox.new config do
|
132
|
+
title title
|
133
|
+
message text, &block
|
134
|
+
button_type :yes_no
|
135
|
+
end
|
136
|
+
index = mb.run
|
137
|
+
return index == 0
|
138
|
+
end
|
139
|
+
##
|
140
|
+
# pops up a modal box with a message and an OK button.
|
141
|
+
# No return value.
|
142
|
+
# Usage:
|
143
|
+
# alert("You did not enter anything!")
|
144
|
+
# alert("You did not enter anything!", "title"=>"Wake Up")
|
145
|
+
# alert("You did not enter anything!", {"title"=>"Wake Up", "bgcolor"=>"blue", "color"=>"white"})
|
146
|
+
# block currently ignored. don't know what to do, can't pass it to MB since alread sending in a block
|
147
|
+
#
|
148
|
+
|
149
|
+
# ------------------------ We've Moved here from window class ---------------- #
|
150
|
+
# #
|
151
|
+
# Moving some methods from window. They no longer require having a window. #
|
152
|
+
# #
|
153
|
+
# ---------------------------------------------------------------------------- #
|
154
|
+
#
|
155
|
+
#
|
156
|
+
|
157
|
+
# new version with a window created on 2011-10-1 12:37 AM
|
158
|
+
# Now can be separate from window class, needing nothing, just a util class
|
159
|
+
# prints a status message and pauses for a char
|
160
|
+
# @param [String] text to print
|
161
|
+
# @param [Hash] config: :color :bgcolor :color_pair
|
162
|
+
# :wait (numbr of seconds to wait for a key press and then close) if not givn
|
163
|
+
# will keep waiting for keypress (the default)
|
164
|
+
def print_status_message text, aconfig={}, &block
|
165
|
+
_print_message :status, text, aconfig, &block
|
166
|
+
end
|
167
|
+
alias :rb_puts print_status_message
|
168
|
+
alias :say print_status_message
|
169
|
+
|
170
|
+
# new version with a window created on 2011-10-1 12:30 AM
|
171
|
+
# Now can be separate from window class, needing nothing, just a util class
|
172
|
+
# @param [String] text to print
|
173
|
+
# @param [Hash] config: :color :bgcolor :color_pair
|
174
|
+
# :wait (numbr of seconds to wait for a key press and then close) if not givn
|
175
|
+
# will keep waiting for keypress (the default)
|
176
|
+
def print_error_message text, aconfig={}, &block
|
177
|
+
_print_message :error, text, aconfig, &block
|
178
|
+
end
|
179
|
+
private
|
180
|
+
def _create_footer_window h = 2 , w = Ncurses.COLS, t = Ncurses.LINES-2, l = 0 #:nodoc:
|
181
|
+
ewin = Canis::Window.new(h, w , t, l)
|
182
|
+
end
|
183
|
+
# @param [:symbol] :error or :status kind of message
|
184
|
+
#private
|
185
|
+
def _print_message type, text, aconfig={}, &block #:nodoc:
|
186
|
+
case text
|
187
|
+
when Canis::Variable # added 2011-09-20 incase variable passed
|
188
|
+
text = text.get_value
|
189
|
+
when Exception
|
190
|
+
text = text.to_s
|
191
|
+
end
|
192
|
+
# NOTE we are polluting global namespace
|
193
|
+
# fixed on 2011-12-6 . to test
|
194
|
+
#aconfig.each_pair { |k,v| instance_variable_set("@#{k}",v) }
|
195
|
+
color = aconfig[:color]
|
196
|
+
bgcolor = aconfig[:bgcolor]
|
197
|
+
ewin = _create_footer_window #*@layout
|
198
|
+
r = 0; c = 1;
|
199
|
+
case type
|
200
|
+
when :error
|
201
|
+
color ||= 'red'
|
202
|
+
bgcolor ||= 'black'
|
203
|
+
else
|
204
|
+
color ||= :white
|
205
|
+
bgcolor ||= :black
|
206
|
+
end
|
207
|
+
color_pair = get_color($promptcolor, color, bgcolor)
|
208
|
+
color_pair = aconfig[:color_pair] || color_pair
|
209
|
+
ewin.bkgd(Ncurses.COLOR_PAIR(color_pair));
|
210
|
+
ewin.printstring r, c, text, color_pair
|
211
|
+
ewin.printstring(r+1, c, "Press a key ", color_pair) unless aconfig[:wait]
|
212
|
+
ewin.wrefresh
|
213
|
+
if aconfig[:wait]
|
214
|
+
#try this out, if user wants a wait, then it will wait for 5 seconds, or if a key is pressed sooner
|
215
|
+
value = aconfig[:wait]
|
216
|
+
if value.is_a? Fixnum
|
217
|
+
value = value * 10
|
218
|
+
else
|
219
|
+
value = 50
|
220
|
+
end
|
221
|
+
Ncurses::halfdelay(tenths = value)
|
222
|
+
ewin.getch
|
223
|
+
Ncurses::halfdelay(tenths = 10)
|
224
|
+
else
|
225
|
+
ewin.getchar
|
226
|
+
end
|
227
|
+
ewin.destroy
|
228
|
+
end
|
229
|
+
#
|
230
|
+
# Alternative to +confirm+ dialog, if you want this look and feel, at last 2 lines of screen
|
231
|
+
# @param [String] text to prompt
|
232
|
+
# @return [true, false] 'y' is true, all else if false
|
233
|
+
public
|
234
|
+
def rb_confirm text, aconfig={}, &block
|
235
|
+
# backward compatibility with agree()
|
236
|
+
if aconfig == true || aconfig == false
|
237
|
+
default = aconfig
|
238
|
+
aconfig = {}
|
239
|
+
else
|
240
|
+
default = aconfig[:default]
|
241
|
+
end
|
242
|
+
case text
|
243
|
+
when Canis::Variable # added 2011-09-20 incase variable passed
|
244
|
+
text = text.get_value
|
245
|
+
when Exception
|
246
|
+
text = text.to_s
|
247
|
+
end
|
248
|
+
ewin = _create_footer_window
|
249
|
+
r = 0; c = 1;
|
250
|
+
#aconfig.each_pair { |k,v| instance_variable_set("@#{k}",v) }
|
251
|
+
# changed on 2011-12-6
|
252
|
+
color = aconfig[:color]
|
253
|
+
bgcolor = aconfig[:bgcolor]
|
254
|
+
color ||= :white
|
255
|
+
bgcolor ||= :black
|
256
|
+
color_pair = get_color($promptcolor, color, bgcolor)
|
257
|
+
ewin.bkgd(Ncurses.COLOR_PAIR(color_pair));
|
258
|
+
ewin.printstring r, c, text, color_pair
|
259
|
+
ewin.printstring r+1, c, "[y/n]", color_pair
|
260
|
+
ewin.wrefresh
|
261
|
+
#retval = :NO # consistent with confirm # CHANGE TO TRUE FALSE NOW
|
262
|
+
retval = false
|
263
|
+
begin
|
264
|
+
ch = ewin.getchar
|
265
|
+
retval = (ch == 'y'.ord || ch == 'Y'.ord )
|
266
|
+
# if caller passed a default value and user pressed ENTER return that
|
267
|
+
# can be true or false so don't change this to "if default". 2011-12-8
|
268
|
+
if !default.nil?
|
269
|
+
if ch == 13 || ch == KEY_ENTER
|
270
|
+
retval = default
|
271
|
+
end
|
272
|
+
end
|
273
|
+
#retval = :YES if ch.chr == 'y'
|
274
|
+
ensure
|
275
|
+
ewin.destroy
|
276
|
+
end
|
277
|
+
retval
|
278
|
+
end
|
279
|
+
alias :agree :rb_confirm
|
280
|
+
# class created to display multiple messages without asking for user to hit a key
|
281
|
+
# returns a window to which one can keep calling printstring with 0 or 1 as row.
|
282
|
+
# destroy when finished.
|
283
|
+
# Also, one can pause if one wants, or linger.
|
284
|
+
# This is meant to be a replacement for the message_immediate and message_raw
|
285
|
+
# I was trying out in App.rb. 2011-10-1 1:27 AM
|
286
|
+
# Testing from test2.rb
|
287
|
+
# TODO: add option of putting progress_bar
|
288
|
+
class StatusWindow # --- {{{
|
289
|
+
attr_reader :h, :w, :top, :left # height, width, top row, left col of window
|
290
|
+
attr_reader :win
|
291
|
+
attr_accessor :color_pair
|
292
|
+
def initialize config={}, &block
|
293
|
+
@color_pair = config[:color_pair]
|
294
|
+
@row_offset = config[:row_offset] || 0
|
295
|
+
@col_offset = config[:col_offset] || 0
|
296
|
+
create_window *config[:layout]
|
297
|
+
end
|
298
|
+
def create_window h = 2 , w = Ncurses.COLS-0, t = Ncurses.LINES-2, l = 0
|
299
|
+
return @win if @win
|
300
|
+
@win = Canis::Window.new(h, w , t, l)
|
301
|
+
@h = h ; @w = w; @top = t ; @left = l
|
302
|
+
@color_pair ||= get_color($promptcolor, 'white','black')
|
303
|
+
@win.bkgd(Ncurses.COLOR_PAIR(@color_pair));
|
304
|
+
@win
|
305
|
+
end
|
306
|
+
# creates a color pair based on given bg and fg colors as strings
|
307
|
+
#def set_colors bgcolor, fgcolor='white'
|
308
|
+
#@color_pair = get_color($datacolor, 'white','black')
|
309
|
+
#end
|
310
|
+
# prints a string on given row (0 or 1)
|
311
|
+
def printstring r, c, text, color_pair=@color_pair
|
312
|
+
create_window unless @win
|
313
|
+
show unless @visible
|
314
|
+
r = @h-1 if r > @h-1
|
315
|
+
#@win.printstring r, c, ' '*@w, @color_pair
|
316
|
+
# FIXME this padding overwrites the border and the offset means next line wiped
|
317
|
+
# However, now it may now totally clear a long line.
|
318
|
+
@win.printstring r+@row_offset, c+@col_offset, "%-*s" % [@w-(@col_offset*2)-c, text], color_pair
|
319
|
+
@win.wrefresh
|
320
|
+
end
|
321
|
+
# print given strings from first first column onwards
|
322
|
+
def print *textarray
|
323
|
+
create_window unless @win
|
324
|
+
show unless @visible
|
325
|
+
c = 1
|
326
|
+
textarray.each_with_index { |s, i|
|
327
|
+
@win.printstring i+@row_offset, c+@col_offset, "%-*s" % [@w-(@col_offset*2)-c, s], @color_pair
|
328
|
+
}
|
329
|
+
@win.wrefresh
|
330
|
+
end
|
331
|
+
def pause; @win.getchar; end
|
332
|
+
# pauses with the message, but doesn't ask the user to press a key.
|
333
|
+
# If he does, the key should be used by underlying window.
|
334
|
+
# Do not call destroy if you call linger, it does the destroy.
|
335
|
+
def linger caller_window=nil
|
336
|
+
begin
|
337
|
+
if caller_window
|
338
|
+
ch = @win.getchar
|
339
|
+
caller_window.ungetch(ch) # will this be available to underlying window XXX i think not !!
|
340
|
+
else
|
341
|
+
sleep 1
|
342
|
+
end
|
343
|
+
ensure
|
344
|
+
destroy
|
345
|
+
end
|
346
|
+
end
|
347
|
+
# caller must destroy after he's finished printing messages, unless
|
348
|
+
# user calls linger
|
349
|
+
def destroy; @win.destroy if @win; @win = nil; end
|
350
|
+
def hide
|
351
|
+
@win.hide
|
352
|
+
@visible = false
|
353
|
+
end
|
354
|
+
def show
|
355
|
+
@win.show unless @visible
|
356
|
+
@visible = true
|
357
|
+
end
|
358
|
+
end # }}}
|
359
|
+
# returns instance of a status_window for sending multiple
|
360
|
+
# statuses during some process
|
361
|
+
def status_window aconfig={}, &block
|
362
|
+
return StatusWindow.new aconfig
|
363
|
+
end
|
364
|
+
# this is a popup dialog box on which statuses can be printed as a process is taking place.
|
365
|
+
# I am reusing StatusWindow and so there's an issue since I've put a box, so in clearing
|
366
|
+
# the line, I might overwrite the box
|
367
|
+
def progress_dialog aconfig={}, &block
|
368
|
+
aconfig[:layout] = [10,60,10,20]
|
369
|
+
window = status_window aconfig
|
370
|
+
height = 10; width = 60
|
371
|
+
window.win.print_border_mb 1,2, height, width, $normalcolor, FFI::NCurses::A_REVERSE
|
372
|
+
return window
|
373
|
+
end
|
374
|
+
#
|
375
|
+
# Display a popup and return the seliected index from list
|
376
|
+
# Config includes row and col and title of window
|
377
|
+
# You may also pass bgcolor and color
|
378
|
+
# Returns index of selected row on pressing ENTER or space
|
379
|
+
# In case of multiple selection, returns array of selected indices only on ENTER
|
380
|
+
# Returns nil if C-q pressed
|
381
|
+
# 2014-04-15 - 17:05 replaced rlist with listbox
|
382
|
+
def popuplist list, config={}, &block
|
383
|
+
raise ArgumentError, "Nil list received by popuplist" unless list
|
384
|
+
#require 'canis/core/widgets/rlist'
|
385
|
+
|
386
|
+
max_visible_items = config[:max_visible_items]
|
387
|
+
# FIXME have to ensure that row and col don't exceed FFI::NCurses.LINES and cols that is the window
|
388
|
+
# should not FINISH outside or padrefresh will fail.
|
389
|
+
row = config[:row] || 5
|
390
|
+
col = config[:col] || 5
|
391
|
+
relative_to = config[:relative_to]
|
392
|
+
if relative_to
|
393
|
+
layout = relative_to.form.window.layout
|
394
|
+
row += layout[:top]
|
395
|
+
col += layout[:left]
|
396
|
+
end
|
397
|
+
config.delete :relative_to
|
398
|
+
width = config[:width] || longest_in_list(list)+2 # borders take 2
|
399
|
+
if config[:title]
|
400
|
+
width = config[:title].size + 2 if width < config[:title].size
|
401
|
+
end
|
402
|
+
height = config[:height]
|
403
|
+
height ||= [max_visible_items || 10+2, list.length+2].min
|
404
|
+
#layout(1+height, width+4, row, col)
|
405
|
+
layout = { :height => 0+height, :width => 0+width, :top => row, :left => col }
|
406
|
+
window = Canis::Window.new(layout)
|
407
|
+
form = Canis::Form.new window
|
408
|
+
|
409
|
+
listconfig = config[:listconfig] || {}
|
410
|
+
listconfig[:list] = list
|
411
|
+
listconfig[:width] = width
|
412
|
+
listconfig[:height] = height
|
413
|
+
listconfig[:selection_mode] ||= :single
|
414
|
+
listconfig.merge!(config)
|
415
|
+
listconfig.delete(:row);
|
416
|
+
listconfig.delete(:col);
|
417
|
+
# trying to pass populists block to listbox
|
418
|
+
lb = Canis::Listbox.new form, listconfig, &block
|
419
|
+
|
420
|
+
# added next line so caller can configure listbox with
|
421
|
+
# events such as ENTER_ROW, LEAVE_ROW or LIST_SELECTION_EVENT or PRESS
|
422
|
+
# 2011-11-11
|
423
|
+
#yield lb if block_given? # No it won't work since this returns
|
424
|
+
window.bkgd(Ncurses.COLOR_PAIR($reversecolor));
|
425
|
+
window.wrefresh
|
426
|
+
Ncurses::Panel.update_panels
|
427
|
+
form.repaint
|
428
|
+
window.wrefresh
|
429
|
+
begin
|
430
|
+
while((ch = window.getchar()) != 999 )
|
431
|
+
case ch
|
432
|
+
when -1
|
433
|
+
next
|
434
|
+
when ?\C-q.getbyte(0)
|
435
|
+
break
|
436
|
+
else
|
437
|
+
lb.handle_key ch
|
438
|
+
form.repaint
|
439
|
+
if ch == 13 || ch == 10
|
440
|
+
return lb.current_index if lb.selection_mode != :multiple
|
441
|
+
|
442
|
+
x = lb.selected_indices
|
443
|
+
# now returns empty array not nil
|
444
|
+
return x if x and !x.empty?
|
445
|
+
x = lb.current_index
|
446
|
+
return [x]
|
447
|
+
# if multiple selection, then return list of selected_indices and don't catch 32
|
448
|
+
elsif ch == $row_selector # if single selection, earlier 32
|
449
|
+
return lb.current_index if lb.selection_mode != :multiple
|
450
|
+
end
|
451
|
+
#yield ch if block_given?
|
452
|
+
end
|
453
|
+
end
|
454
|
+
ensure
|
455
|
+
window.destroy
|
456
|
+
end
|
457
|
+
return nil
|
458
|
+
end
|
459
|
+
# returns length of longest
|
460
|
+
def longest_in_list list #:nodoc:
|
461
|
+
raise ArgumentError, "rdialog.rb: longest_in_list recvd nil list" unless list
|
462
|
+
longest = list.inject(0) do |memo,word|
|
463
|
+
memo >= word.length ? memo : word.length
|
464
|
+
end
|
465
|
+
longest
|
466
|
+
end
|
467
|
+
# this routine prints help_text for an application
|
468
|
+
# If help_text has been set using install_help_text
|
469
|
+
# it will be displayed. Else, general help will be
|
470
|
+
# displayed. Even when custom help is displayed,
|
471
|
+
# user may use <next> to see general help.
|
472
|
+
#
|
473
|
+
# earlier in app.rb
|
474
|
+
def display_app_help form=@form
|
475
|
+
raise "This is now deprecated, pls use @form.help_manager.display_help "
|
476
|
+
if form
|
477
|
+
hm = form.help_manager
|
478
|
+
if !hm.help_text
|
479
|
+
arr = nil
|
480
|
+
# these 2 only made sense from app.rb and should be removed, too implicit
|
481
|
+
if respond_to? :help_text
|
482
|
+
arr = help_text
|
483
|
+
end
|
484
|
+
hm.help_text(arr) if arr
|
485
|
+
end
|
486
|
+
form.help_manager.display_help
|
487
|
+
else
|
488
|
+
raise "Form needed by display_app_help. Use form.help_manager instead"
|
489
|
+
end
|
490
|
+
end
|
491
|
+
#
|
492
|
+
=begin
|
493
|
+
http://www.kammerl.de/ascii/AsciiSignature.php
|
494
|
+
___
|
495
|
+
|__ \
|
496
|
+
) |
|
497
|
+
/ /
|
498
|
+
|_|
|
499
|
+
(_)
|
500
|
+
|
501
|
+
_
|
502
|
+
| |
|
503
|
+
| |
|
504
|
+
| |
|
505
|
+
|_|
|
506
|
+
(_)
|
507
|
+
|
508
|
+
|
509
|
+
_____ _ _____
|
510
|
+
| __ \ | | / ____|
|
511
|
+
| |__) | _| |__ _ _ | | _ _ _ __ ___ ___ ___
|
512
|
+
| _ / | | | '_ \| | | | | | | | | | '__/ __|/ _ \/ __|
|
513
|
+
| | \ \ |_| | |_) | |_| | | |___| |_| | | \__ \ __/\__ \
|
514
|
+
|_| \_\__,_|_.__/ \__, | \_____\__,_|_| |___/\___||___/
|
515
|
+
__/ |
|
516
|
+
|___/
|
517
|
+
|
518
|
+
=end
|
519
|
+
|
520
|
+
|