ncumbra 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG +14 -0
- data/README.md +21 -6
- data/examples/data/atp_matches_2017.csv +2887 -0
- data/examples/data/atp_matches_2018.csv +460 -0
- data/examples/data/import.sh +13 -0
- data/examples/data/schema.txt +51 -0
- data/examples/ex1.rb +2 -0
- data/examples/ex2.rb +1 -0
- data/examples/ex5.rb +1 -1
- data/examples/exbox.rb +3 -2
- data/examples/exm1.rb +1 -2
- data/examples/extab2.rb +170 -0
- data/examples/extab3.rb +306 -0
- data/examples/extabular.rb +123 -0
- data/examples/tasks.csv +88 -0
- data/lib/umbra/box.rb +38 -21
- data/lib/umbra/checkbox.rb +2 -2
- data/lib/umbra/dialog.rb +1 -2
- data/lib/umbra/eventhandler.rb +52 -4
- data/lib/umbra/field.rb +7 -3
- data/lib/umbra/form.rb +119 -55
- data/lib/umbra/keymappinghandler.rb +4 -4
- data/lib/umbra/label.rb +31 -17
- data/lib/umbra/labeledfield.rb +7 -8
- data/lib/umbra/listbox.rb +114 -341
- data/lib/umbra/messagebox.rb +93 -42
- data/lib/umbra/multiline.rb +476 -0
- data/lib/umbra/pad.rb +20 -14
- data/lib/umbra/radiobutton.rb +2 -2
- data/lib/umbra/table.rb +260 -0
- data/lib/umbra/tabular.rb +431 -0
- data/lib/umbra/textbox.rb +36 -223
- data/lib/umbra/togglebutton.rb +3 -5
- data/lib/umbra/version.rb +1 -1
- data/lib/umbra/widget.rb +72 -13
- data/lib/umbra/window.rb +59 -15
- data/lib/umbra.rb +82 -11
- data/umbra.gemspec +2 -2
- metadata +18 -4
data/lib/umbra/listbox.rb
CHANGED
@@ -1,178 +1,121 @@
|
|
1
|
-
require 'umbra/
|
1
|
+
require 'umbra/multiline'
|
2
2
|
# ----------------------------------------------------------------------------- #
|
3
3
|
# File: listbox.rb
|
4
|
-
# Description: list widget that displays a list of items
|
5
|
-
# Author: j kepler http://github.com/mare-imbrium/
|
4
|
+
# Description: list widget that displays a scrollable list of items that is selectable.
|
5
|
+
# Author: j kepler http://github.com/mare-imbrium/umbra
|
6
6
|
# Date: 2018-03-19
|
7
7
|
# License: MIT
|
8
|
-
# Last update: 2018-
|
8
|
+
# Last update: 2018-05-18 14:16
|
9
9
|
# ----------------------------------------------------------------------------- #
|
10
10
|
# listbox.rb Copyright (C) 2012-2018 j kepler
|
11
11
|
# == TODO
|
12
|
-
# currently only do single selection, we may do multiple at a later date.
|
12
|
+
# currently only do single selection, we may do multiple at a later date. TODO
|
13
13
|
# insert/delete a row ??
|
14
|
+
## Other selection functions: select_all, select(n), deselect(n), selected?(n), select(m,n,o...), select(String),
|
15
|
+
## select(Range). Same with deselect.
|
14
16
|
# ----------------
|
15
17
|
module Umbra
|
16
|
-
class Listbox < Widget
|
17
|
-
attr_reader :list # list containing data
|
18
|
-
#
|
19
|
-
# index of focussed row, starting 0, index into the list supplied
|
20
|
-
attr_reader :current_index
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
attr_accessor :selected_mark # row selected character
|
27
|
-
attr_accessor :unselected_mark # row unselected character (usually blank)
|
28
|
-
attr_accessor :current_mark # row current character (default is >)
|
19
|
+
## Display a list of items.
|
20
|
+
## Adds selection capability to the Scrollable widget.
|
21
|
+
#
|
22
|
+
class Listbox < Multiline
|
29
23
|
|
24
|
+
attr_accessor :selection_allowed # does this class allow row selection (should be class level)
|
25
|
+
attr_accessor :selection_key # key used to select a row
|
26
|
+
attr_accessor :selected_index # row selected, may change to plural
|
27
|
+
attr_property :selected_color_pair # row selected color_pair
|
28
|
+
attr_property :selected_attr # row selected color_pair
|
29
|
+
attr_accessor :selected_mark # row selected character
|
30
|
+
attr_accessor :unselected_mark # row unselected character (usually blank)
|
31
|
+
attr_accessor :current_mark # row current character (default is >)
|
30
32
|
|
31
|
-
|
32
|
-
@focusable = false
|
33
|
-
@editable = false
|
34
|
-
@pstart = 0 # which row does printing start from
|
35
|
-
@current_index = 0 # index of row on which cursor is
|
36
|
-
@selected_index = nil # index of row selected
|
37
|
-
@selection_key = ?s.getbyte(0) # 's' used to select/deselect
|
38
|
-
@selected_color_pair = CP_RED
|
39
|
-
@selected_attr = REVERSE
|
40
|
-
@row_offset = 0
|
41
|
-
@selected_mark = 'x' # row selected character
|
42
|
-
@unselected_mark = ' ' # row unselected character (usually blank)
|
43
|
-
@current_mark = '>' # row current character (default is >)
|
44
|
-
register_events([:LEAVE_ROW, :ENTER_ROW, :LIST_SELECTION_EVENT])
|
45
|
-
super
|
33
|
+
def initialize config={}, &block
|
46
34
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
$log.debug " setting focusable to false in listbox "
|
58
|
-
self.focusable=(false)
|
59
|
-
# should we return here
|
60
|
-
else
|
61
|
-
$log.debug " setting focusable to true in listbox #{alist.count} "
|
62
|
-
self.focusable=(true)
|
35
|
+
@selection_allowed = true # does this class allow selection of row
|
36
|
+
@selected_index = nil # index of row selected
|
37
|
+
@selection_key = ?s.getbyte(0) # 's' used to select/deselect
|
38
|
+
@selected_color_pair = CP_RED
|
39
|
+
@selected_attr = REVERSE
|
40
|
+
@selected_mark = 'x' # row selected character
|
41
|
+
@unselected_mark = ' ' # row unselected character (usually blank)
|
42
|
+
@current_mark = '>' # row current character (default is >)
|
43
|
+
register_events([:LIST_SELECTION_EVENT])
|
44
|
+
super
|
63
45
|
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
fire_handler(:CHANGED, alist)
|
70
|
-
end
|
71
|
-
# Calculate dimensions as late as possible, since we can have some other container such as a box,
|
72
|
-
# determine the dimensions after creation.
|
73
|
-
private def _calc_dimensions
|
74
|
-
raise "Dimensions not supplied to listbox" if @row.nil? or @col.nil? or @width.nil? or @height.nil?
|
75
|
-
@_calc_dimensions = true
|
76
|
-
@int_width = @width # internal width NOT USED ELSEWHERE
|
77
|
-
@int_height = @height # internal height USED HERE ONLy REDUNDANT FIXME
|
78
|
-
@scroll_lines ||= @int_height/2
|
79
|
-
@page_lines = @int_height
|
80
|
-
end
|
81
|
-
# Each row can be in one of the following states:
|
82
|
-
# 1. HIGHLIGHTED: cursor is on the row, and the list is focussed (user is in it)
|
83
|
-
# 2. CURRENT : cursor was on this row, now user has exited the list
|
84
|
-
# 3. SELECTED : user has selected this row (this can also have above two states actually)
|
85
|
-
# 4. NORMAL : All other rows: not selected, not under cursor
|
86
|
-
# returns color, attrib and left marker for given row
|
87
|
-
# @param index of row in the list
|
88
|
-
# @param state of row in the list (see above states)
|
89
|
-
def _format_color index, state
|
90
|
-
arr = case state
|
91
|
-
when :SELECTED
|
92
|
-
[@selected_color_pair, @selected_attr]
|
93
|
-
when :HIGHLIGHTED
|
94
|
-
[@highlight_color_pair || CP_WHITE, @highlight_attr || REVERSE]
|
95
|
-
when :CURRENT
|
96
|
-
[@color_pair, @attr]
|
97
|
-
when :NORMAL
|
98
|
-
#@alt_color_pair ||= create_color_pair(COLOR_BLUE, COLOR_WHITE)
|
99
|
-
_color = CP_CYAN
|
100
|
-
_color = CP_WHITE if index % 2 == 0
|
101
|
-
#_color = @alt_color_pair if index % 2 == 0
|
102
|
-
[@color_pair || _color, @attr || NORMAL]
|
46
|
+
|
47
|
+
|
48
|
+
def list=(alist)
|
49
|
+
super
|
50
|
+
clear_selection
|
103
51
|
end
|
104
|
-
return arr
|
105
|
-
end
|
106
|
-
# do the actual printing of the row, depending on index and state
|
107
|
-
# This method starts with underscore since it is only required to be overriden
|
108
|
-
# if an object has special printing needs.
|
109
|
-
def _print_row(win, row, col, str, index, state)
|
110
|
-
arr = _format_color index, state
|
111
|
-
win.printstring(row, col, str, arr[0], arr[1])
|
112
|
-
end
|
113
|
-
def _format_mark index, state
|
114
|
-
mark = case state
|
115
|
-
when :SELECTED
|
116
|
-
@selected_mark
|
117
|
-
when :HIGHLIGHTED, :CURRENT
|
118
|
-
@current_mark
|
119
|
-
else
|
120
|
-
@unselected_mark
|
121
|
-
end
|
122
|
-
end
|
123
52
|
|
124
|
-
def repaint
|
125
|
-
_calc_dimensions unless @_calc_dimensions
|
126
53
|
|
127
|
-
|
128
|
-
|
129
|
-
r,c = @row, @col
|
130
|
-
_attr = @attr || NORMAL
|
131
|
-
_color = @color_pair || CP_WHITE
|
132
|
-
curpos = 1
|
133
|
-
coffset = 0
|
134
|
-
width = @width
|
135
|
-
#files = @list
|
136
|
-
files = getvalue
|
137
|
-
|
138
|
-
ht = @height
|
139
|
-
cur = @current_index
|
140
|
-
st = pstart = @pstart # previous start
|
141
|
-
pend = pstart + ht -1 # previous end
|
142
|
-
if cur > pend
|
143
|
-
st = (cur -ht) + 1
|
144
|
-
elsif cur < pstart
|
145
|
-
st = cur
|
54
|
+
def clear_selection
|
55
|
+
@selected_index = nil
|
146
56
|
end
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
# cursor was on this row, but now user has tabbed out
|
164
|
-
_st = :CURRENT
|
165
|
-
end
|
166
|
-
curpos = ctr
|
57
|
+
|
58
|
+
def map_keys
|
59
|
+
return if @keys_mapped
|
60
|
+
if @selection_allowed and @selection_key
|
61
|
+
bind_key(@selection_key, 'toggle_selection') { toggle_selection }
|
62
|
+
end
|
63
|
+
super
|
64
|
+
end
|
65
|
+
|
66
|
+
## Toggle current row's selection status.
|
67
|
+
def toggle_selection
|
68
|
+
@repaint_required = true
|
69
|
+
if @selected_index == @current_index
|
70
|
+
@selected_index = nil
|
71
|
+
else
|
72
|
+
@selected_index = @current_index
|
167
73
|
end
|
168
|
-
|
74
|
+
fire_handler :LIST_SELECTION_EVENT, self # use selected_index to know which one
|
75
|
+
end
|
76
|
+
|
77
|
+
## Paint the row.
|
78
|
+
## For any major customization of Listbox output, this method would be overridden.
|
79
|
+
## This method determines state, mark, slice of line item to show.
|
80
|
+
## listbox adds a mark on the side, whether a row is selected or not, and whether it is current.
|
81
|
+
## @param win - window pointer for printing
|
82
|
+
## @param [Integer] - row offset on screen
|
83
|
+
## @param [Integer] - col offset on screen
|
84
|
+
## @param [String] - line to print
|
85
|
+
## @param [Integer] - offset in List array
|
86
|
+
def paint_row(win, row, col, line, index)
|
87
|
+
|
88
|
+
state = state_of_row(index)
|
89
|
+
|
90
|
+
f = value_of_row(line, index, state)
|
91
|
+
|
92
|
+
mark = mark_of_row(index, state)
|
93
|
+
ff = "#{mark}#{f}"
|
94
|
+
|
95
|
+
ff = _truncate_to_width( ff ) ## truncate and handle panning
|
96
|
+
|
97
|
+
print_row(win, row, col, ff, index, state)
|
98
|
+
end
|
99
|
+
|
100
|
+
## Determine state of the row
|
101
|
+
## Listbox adds :SELECTED state to Multiline.
|
102
|
+
## @param [Integer] offset of row in data
|
103
|
+
def state_of_row index
|
104
|
+
_st = super
|
105
|
+
if index == @selected_index
|
169
106
|
_st = :SELECTED
|
170
|
-
end #
|
171
|
-
|
107
|
+
end #
|
108
|
+
_st
|
109
|
+
end
|
172
110
|
|
173
|
-
|
174
|
-
|
175
|
-
|
111
|
+
|
112
|
+
## Determine the mark on the left of the row.
|
113
|
+
## The mark depends on the state: :SELECTED :HIGHLIGHTED :CURRENT :NORMAL
|
114
|
+
## Listbox adds :SELECTED state to Multiline.
|
115
|
+
## @param [Integer] offset of row in data
|
116
|
+
## @return character to be displayed inside left margin
|
117
|
+
def mark_of_row index, state
|
118
|
+
mark = case state
|
176
119
|
when :SELECTED
|
177
120
|
@selected_mark
|
178
121
|
when :HIGHLIGHTED, :CURRENT
|
@@ -180,131 +123,26 @@ class Listbox < Widget
|
|
180
123
|
else
|
181
124
|
@unselected_mark
|
182
125
|
end
|
183
|
-
|
184
|
-
|
185
|
-
ff = "#{mark} #{f}"
|
186
|
-
# truncate string to width, and handle panning {{{
|
187
|
-
if ff
|
188
|
-
if ff.size > width
|
189
|
-
# pcol can be greater than width then we get null
|
190
|
-
if @pcol < ff.size
|
191
|
-
ff = ff[@pcol..@pcol+width-1]
|
192
|
-
else
|
193
|
-
ff = ""
|
194
|
-
end
|
195
|
-
else
|
196
|
-
if @pcol < ff.size
|
197
|
-
ff = ff[@pcol..-1]
|
198
|
-
else
|
199
|
-
ff = ""
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end # }}}
|
203
|
-
ff = "" unless ff
|
204
|
-
|
205
|
-
win.printstring(ctr + r, coffset+c, filler, _color ) # print filler
|
206
|
-
#win.printstring(ctr + r, coffset+c, ff, colr, attr)
|
207
|
-
_print_row(win, ctr + r, coffset+c, ff, y, _st)
|
208
|
-
ctr += 1
|
209
|
-
@pstart = st
|
210
|
-
break if ctr >= ht
|
211
|
-
}
|
212
|
-
## if counter < ht then we need to clear the rest in case there was data earlier {{{
|
213
|
-
if ctr < ht
|
214
|
-
while ctr < ht
|
215
|
-
win.printstring(ctr + r, coffset+c, filler, _color )
|
216
|
-
ctr += 1
|
217
|
-
end
|
218
|
-
end # }}}
|
219
|
-
@row_offset = curpos #+ border_offset
|
220
|
-
@col_offset = coffset
|
221
|
-
@repaint_required = false
|
222
|
-
end
|
223
|
-
|
224
|
-
def getvalue
|
225
|
-
@list
|
226
|
-
end
|
227
|
-
|
228
|
-
#
|
229
|
-
# how to convert the line of the array to a simple String.
|
230
|
-
# This is only required to be overridden if the list passed in is not an array of Strings.
|
231
|
-
# @param the current row which could be a string or array or whatever was passed in in +list=()+.
|
232
|
-
# @return [String] string to print. A String must be returned.
|
233
|
-
def _format_value line
|
234
|
-
line
|
235
|
-
end
|
236
|
-
#alias :_format_value :getvalue_for_paint
|
237
|
-
|
126
|
+
end
|
127
|
+
alias :_format_mark :mark_of_row
|
238
128
|
|
239
|
-
def map_keys
|
240
|
-
bind_keys([?k,FFI::NCurses::KEY_UP], "Up") { cursor_up }
|
241
|
-
bind_keys([?j,FFI::NCurses::KEY_DOWN], "Down") { cursor_down }
|
242
|
-
bind_keys([?l,FFI::NCurses::KEY_RIGHT], "Right") { cursor_forward }
|
243
|
-
bind_keys([?h,FFI::NCurses::KEY_LEFT], "Left") { cursor_backward }
|
244
|
-
bind_key(?g, 'goto_start') { goto_start }
|
245
|
-
bind_key(?G, 'goto_end') { goto_end }
|
246
|
-
bind_key(FFI::NCurses::KEY_CTRL_A, 'cursor_home') { cursor_home }
|
247
|
-
bind_key(FFI::NCurses::KEY_CTRL_E, 'cursor_end') { cursor_end }
|
248
|
-
bind_key(FFI::NCurses::KEY_CTRL_F, 'page_forward') { page_forward }
|
249
|
-
bind_key(32, 'page_forward') { page_forward }
|
250
|
-
bind_key(FFI::NCurses::KEY_CTRL_B, 'page_backward'){ page_backward }
|
251
|
-
bind_key(FFI::NCurses::KEY_CTRL_U, 'scroll_up') { scroll_up }
|
252
|
-
bind_key(FFI::NCurses::KEY_CTRL_D, 'scroll_down') { scroll_down }
|
253
|
-
return if @keys_mapped
|
254
|
-
end
|
255
129
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
touch ; repaint
|
267
|
-
end
|
268
|
-
# called when object leaves a row and when object is exited.
|
269
|
-
def on_leave_row index
|
270
|
-
fire_handler(:LEAVE_ROW, [index]) # 2018-03-26 - improve this
|
271
|
-
end
|
272
|
-
# called whenever a row entered.
|
273
|
-
# Call when object entered, also.
|
274
|
-
def on_enter_row index
|
275
|
-
fire_handler(:ENTER_ROW, [@current_index]) # 2018-03-26 - improve this
|
276
|
-
end
|
277
|
-
def cursor_up
|
278
|
-
@current_index -= 1
|
279
|
-
end
|
280
|
-
# go to next row
|
281
|
-
def cursor_down
|
282
|
-
@current_index += 1
|
283
|
-
end
|
284
|
-
# position cursor at start of field
|
285
|
-
def cursor_home
|
286
|
-
@curpos = 0 # UNUSED RIGHT NOW
|
287
|
-
@pcol = 0
|
288
|
-
end
|
289
|
-
# goto end of line.
|
290
|
-
# This should be consistent with moving the cursor to the end of the row with right arrow
|
291
|
-
def cursor_end
|
292
|
-
blen = current_row().length
|
293
|
-
if blen < @width
|
294
|
-
@pcol = 0
|
295
|
-
else
|
296
|
-
@pcol = blen-@width+2 # 2 is due to mark and space
|
130
|
+
## Determine color and attribute of row.
|
131
|
+
## Overriding this allows application to have customized row colors based on data
|
132
|
+
## which can be determined using +index+.
|
133
|
+
## Listbox adds :SELECTED state to +Multiline+.
|
134
|
+
## @param [Integer] offset of row in data
|
135
|
+
## @return [Array] color_pair and attrib constant
|
136
|
+
def color_of_row index, state
|
137
|
+
arr = super
|
138
|
+
if state == :SELECTED
|
139
|
+
arr = [@selected_color_pair, @selected_attr]
|
297
140
|
end
|
298
|
-
|
299
|
-
# regardless of pcol (panning)
|
300
|
-
end
|
301
|
-
# returns current row as String
|
302
|
-
# 2018-04-11 - NOTE this may not be a String so we convert it to string before returning
|
303
|
-
# @return [String] row the cursor/user is on
|
304
|
-
def current_row
|
305
|
-
s = @list[@current_index]
|
306
|
-
_format_value s
|
141
|
+
arr
|
307
142
|
end
|
143
|
+
|
144
|
+
|
145
|
+
=begin
|
308
146
|
def cursor_forward
|
309
147
|
blen = current_row().size-1
|
310
148
|
@pcol += 1 if @pcol < blen
|
@@ -312,73 +150,8 @@ class Listbox < Widget
|
|
312
150
|
def cursor_backward
|
313
151
|
@pcol -= 1 if @pcol > 0
|
314
152
|
end
|
315
|
-
|
316
|
-
def goto_start
|
317
|
-
@current_index = 0
|
318
|
-
@pcol = @curpos = 0
|
319
|
-
end
|
320
|
-
# go to end of file (last line)
|
321
|
-
def goto_end
|
322
|
-
@current_index = @list.size-1
|
323
|
-
@pcol = @curpos = 0
|
324
|
-
end
|
325
|
-
def scroll_down
|
326
|
-
@current_index += @scroll_lines
|
327
|
-
end
|
328
|
-
def scroll_up
|
329
|
-
@current_index -= @scroll_lines
|
330
|
-
end
|
331
|
-
def page_backward
|
332
|
-
@current_index -= @page_lines
|
333
|
-
end
|
334
|
-
def page_forward
|
335
|
-
@current_index += @page_lines
|
336
|
-
end
|
337
|
-
# listbox key handling
|
338
|
-
def handle_key ch
|
339
|
-
old_current_index = @current_index
|
340
|
-
old_pcol = @pcol
|
341
|
-
case ch
|
342
|
-
when @selection_key
|
343
|
-
@repaint_required = true
|
344
|
-
if @selected_index == @current_index
|
345
|
-
@selected_index = nil
|
346
|
-
else
|
347
|
-
@selected_index = @current_index
|
348
|
-
end
|
349
|
-
fire_handler :LIST_SELECTION_EVENT, self # use selected_index to know which one
|
350
|
-
else
|
351
|
-
ret = super
|
352
|
-
return ret
|
353
|
-
end
|
354
|
-
ensure
|
355
|
-
@current_index = 0 if @current_index < 0
|
356
|
-
@current_index = @list.size-1 if @current_index >= @list.size
|
357
|
-
if @current_index != old_current_index
|
358
|
-
on_leave_row old_current_index
|
359
|
-
on_enter_row @current_index
|
360
|
-
@repaint_required = true
|
361
|
-
end
|
362
|
-
@repaint_required = true if old_pcol != @pcol
|
363
|
-
end
|
153
|
+
=end
|
364
154
|
|
365
|
-
def command *args, &block
|
366
|
-
bind_event :ENTER_ROW, *args, &block
|
367
|
-
end
|
368
|
-
def print_border row, col, height, width, color, att=FFI::NCurses::A_NORMAL
|
369
|
-
raise "deprecated"
|
370
|
-
pointer = @graphic.pointer
|
371
|
-
FFI::NCurses.wattron(pointer, FFI::NCurses.COLOR_PAIR(color) | att)
|
372
|
-
FFI::NCurses.mvwaddch pointer, row, col, FFI::NCurses::ACS_ULCORNER
|
373
|
-
FFI::NCurses.mvwhline( pointer, row, col+1, FFI::NCurses::ACS_HLINE, width-2)
|
374
|
-
FFI::NCurses.mvwaddch pointer, row, col+width-1, FFI::NCurses::ACS_URCORNER
|
375
|
-
FFI::NCurses.mvwvline( pointer, row+1, col, FFI::NCurses::ACS_VLINE, height-2)
|
376
155
|
|
377
|
-
|
378
|
-
FFI::NCurses.mvwhline(pointer, row+height-1, col+1, FFI::NCurses::ACS_HLINE, width-2)
|
379
|
-
FFI::NCurses.mvwaddch pointer, row+height-1, col+width-1, FFI::NCurses::ACS_LRCORNER
|
380
|
-
FFI::NCurses.mvwvline( pointer, row+1, col+width-1, FFI::NCurses::ACS_VLINE, height-2)
|
381
|
-
FFI::NCurses.wattroff(pointer, FFI::NCurses.COLOR_PAIR(color) | att)
|
382
|
-
end
|
383
|
-
end
|
156
|
+
end
|
384
157
|
end # module
|