slithernix-cdk 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.
- checksums.yaml +7 -0
- data/COPYING +131 -0
- data/README.md +45 -0
- data/lib/cdk/alphalist.rb +561 -0
- data/lib/cdk/buttonbox.rb +355 -0
- data/lib/cdk/calendar.rb +770 -0
- data/lib/cdk/cdk_objs.rb +463 -0
- data/lib/cdk/dialog.rb +727 -0
- data/lib/cdk/display.rb +63 -0
- data/lib/cdk/draw.rb +233 -0
- data/lib/cdk/dscale.rb +13 -0
- data/lib/cdk/entry.rb +556 -0
- data/lib/cdk/fscale.rb +44 -0
- data/lib/cdk/fselect.rb +940 -0
- data/lib/cdk/fslider.rb +61 -0
- data/lib/cdk/histogram.rb +410 -0
- data/lib/cdk/itemlist.rb +475 -0
- data/lib/cdk/label.rb +207 -0
- data/lib/cdk/marquee.rb +241 -0
- data/lib/cdk/matrix.rb +1176 -0
- data/lib/cdk/mentry.rb +616 -0
- data/lib/cdk/menu.rb +448 -0
- data/lib/cdk/radio.rb +533 -0
- data/lib/cdk/scale.rb +529 -0
- data/lib/cdk/screen.rb +281 -0
- data/lib/cdk/scroll.rb +996 -0
- data/lib/cdk/scroller.rb +183 -0
- data/lib/cdk/selection.rb +619 -0
- data/lib/cdk/slider.rb +542 -0
- data/lib/cdk/swindow.rb +762 -0
- data/lib/cdk/template.rb +562 -0
- data/lib/cdk/traverse.rb +289 -0
- data/lib/cdk/uscale.rb +14 -0
- data/lib/cdk/uslider.rb +14 -0
- data/lib/cdk/viewer.rb +812 -0
- data/lib/cdk.rb +1015 -0
- metadata +149 -0
@@ -0,0 +1,355 @@
|
|
1
|
+
require_relative 'cdk_objs'
|
2
|
+
|
3
|
+
module CDK
|
4
|
+
class BUTTONBOX < CDK::CDKOBJS
|
5
|
+
attr_reader :current_button
|
6
|
+
|
7
|
+
def initialize(cdkscreen, x_pos, y_pos, height, width, title, rows, cols,
|
8
|
+
buttons, button_count, highlight, box, shadow)
|
9
|
+
super()
|
10
|
+
parent_width = cdkscreen.window.maxx
|
11
|
+
parent_height = cdkscreen.window.maxy
|
12
|
+
col_width = 0
|
13
|
+
current_button = 0
|
14
|
+
@button = []
|
15
|
+
@button_len = []
|
16
|
+
@button_pos = []
|
17
|
+
@column_widths = []
|
18
|
+
|
19
|
+
if button_count <= 0
|
20
|
+
self.destroy
|
21
|
+
return nil
|
22
|
+
end
|
23
|
+
|
24
|
+
self.setBox(box)
|
25
|
+
|
26
|
+
# Set some default values for the widget.
|
27
|
+
@row_adjust = 0
|
28
|
+
@col_adjust = 0
|
29
|
+
|
30
|
+
# If the height is a negative value, the height will be
|
31
|
+
# ROWS-height, otherwise the height will be the given height.
|
32
|
+
box_height = CDK.setWidgetDimension(parent_height, height, rows + 1)
|
33
|
+
|
34
|
+
# If the width is a negative value, the width will be
|
35
|
+
# COLS-width, otherwise the width will be the given width.
|
36
|
+
box_width = CDK.setWidgetDimension(parent_width, width, 0)
|
37
|
+
|
38
|
+
box_width = self.setTitle(title, box_width)
|
39
|
+
|
40
|
+
# Translate the buttons string to a chtype array
|
41
|
+
(0...button_count).each do |x|
|
42
|
+
button_len = []
|
43
|
+
@button << CDK.char2Chtype(buttons[x], button_len ,[])
|
44
|
+
@button_len << button_len[0]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Set the button positions.
|
48
|
+
(0...cols).each do |x|
|
49
|
+
max_col_width = -2**31
|
50
|
+
|
51
|
+
# Look for the widest item in this column.
|
52
|
+
(0...rows).each do |y|
|
53
|
+
if current_button < button_count
|
54
|
+
max_col_width = [@button_len[current_button], max_col_width].max
|
55
|
+
current_button += 1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Keep the maximum column width for this column.
|
60
|
+
@column_widths << max_col_width
|
61
|
+
col_width += max_col_width
|
62
|
+
end
|
63
|
+
box_width += 1
|
64
|
+
|
65
|
+
# Make sure we didn't extend beyond the dimensions of the window.
|
66
|
+
box_width = [box_width, parent_width].min
|
67
|
+
box_height = [box_height, parent_height].min
|
68
|
+
|
69
|
+
# Now we have to readjust the x and y positions
|
70
|
+
xtmp = [x_pos]
|
71
|
+
ytmp = [y_pos]
|
72
|
+
CDK.alignxy(cdkscreen.window, xtmp, ytmp, box_width, box_height)
|
73
|
+
xpos = xtmp[0]
|
74
|
+
ypos = ytmp[0]
|
75
|
+
|
76
|
+
# Set up the buttonbox box attributes.
|
77
|
+
@screen = cdkscreen
|
78
|
+
@parent = cdkscreen.window
|
79
|
+
@win = Curses::Window.new(box_height, box_width, ypos, xpos)
|
80
|
+
@shadow_win = nil
|
81
|
+
@button_count = button_count
|
82
|
+
@current_button = 0
|
83
|
+
@rows = rows
|
84
|
+
@cols = [button_count, cols].min
|
85
|
+
@box_height = box_height
|
86
|
+
@box_width = box_width
|
87
|
+
@highlight = highlight
|
88
|
+
@accepts_focus = true
|
89
|
+
@input_window = @win
|
90
|
+
@shadow = shadow
|
91
|
+
@button_attrib = Curses::A_NORMAL
|
92
|
+
|
93
|
+
# Set up the row adjustment.
|
94
|
+
if box_height - rows - @title_lines > 0
|
95
|
+
@row_adjust = (box_height - rows - @title_lines) / @rows
|
96
|
+
end
|
97
|
+
|
98
|
+
# Set the col adjustment
|
99
|
+
if box_width - col_width > 0
|
100
|
+
@col_adjust = ((box_width - col_width) / @cols) - 1
|
101
|
+
end
|
102
|
+
|
103
|
+
# If we couldn't create the window, we should return a null value.
|
104
|
+
if @win.nil?
|
105
|
+
self.destroy
|
106
|
+
return nil
|
107
|
+
end
|
108
|
+
@win.keypad(true)
|
109
|
+
|
110
|
+
# Was there a shadow?
|
111
|
+
if shadow
|
112
|
+
@shadow_win = Curses::Window.new(box_height, box_width,
|
113
|
+
ypos + 1, xpos + 1)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Register this baby.
|
117
|
+
cdkscreen.register(:BUTTONBOX, self)
|
118
|
+
end
|
119
|
+
|
120
|
+
# This activates the widget.
|
121
|
+
def activate(actions)
|
122
|
+
# Draw the buttonbox box.
|
123
|
+
self.draw(@box)
|
124
|
+
|
125
|
+
if actions.nil? || actions.size == 0
|
126
|
+
while true
|
127
|
+
input = self.getch([])
|
128
|
+
|
129
|
+
# Inject the characer into the widget.
|
130
|
+
ret = self.inject(input)
|
131
|
+
if @exit_type != :EARLY_EXIT
|
132
|
+
return ret
|
133
|
+
end
|
134
|
+
end
|
135
|
+
else
|
136
|
+
# Inject each character one at a time.
|
137
|
+
actions.each do |action|
|
138
|
+
ret = self.inject(action)
|
139
|
+
if @exit_type != :EARLY_EXIT
|
140
|
+
return ret
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Set the exit type and exit
|
146
|
+
self.setExitType(0)
|
147
|
+
return -1
|
148
|
+
end
|
149
|
+
|
150
|
+
# This injects a single character into the widget.
|
151
|
+
def inject(input)
|
152
|
+
first_button = 0
|
153
|
+
last_button = @button_count - 1
|
154
|
+
pp_return = 1
|
155
|
+
ret = -1
|
156
|
+
complete = false
|
157
|
+
|
158
|
+
# Set the exit type
|
159
|
+
self.setExitType(0)
|
160
|
+
|
161
|
+
unless @pre_process_func.nil?
|
162
|
+
pp_return = @pre_process_func.call(:BUTTONBOX, self,
|
163
|
+
@pre_process_data, input)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Should we continue?
|
167
|
+
if pp_return != 0
|
168
|
+
# Check for a key binding.
|
169
|
+
if self.checkBind(:BUTTONBOX, input)
|
170
|
+
complete = true
|
171
|
+
else
|
172
|
+
case input
|
173
|
+
when Curses::KEY_LEFT, Curses::KEY_BTAB, Curses::KEY_BACKSPACE
|
174
|
+
if @current_button - @rows < first_button
|
175
|
+
@current_button = last_button
|
176
|
+
else
|
177
|
+
@current_button -= @rows
|
178
|
+
end
|
179
|
+
when Curses::KEY_RIGHT, CDK::KEY_TAB, ' '
|
180
|
+
if @current_button + @rows > last_button
|
181
|
+
@current_button = first_button
|
182
|
+
else
|
183
|
+
@current_button += @rows
|
184
|
+
end
|
185
|
+
when Curses::KEY_UP
|
186
|
+
if @current_button -1 < first_button
|
187
|
+
@current_button = last_button
|
188
|
+
else
|
189
|
+
@current_button -= 1
|
190
|
+
end
|
191
|
+
when Curses::KEY_DOWN
|
192
|
+
if @current_button + 1 > last_button
|
193
|
+
@current_button = first_button
|
194
|
+
else
|
195
|
+
@current_button += 1
|
196
|
+
end
|
197
|
+
when CDK::REFRESH
|
198
|
+
@screen.erase
|
199
|
+
@screen.refresh
|
200
|
+
when CDK::KEY_ESC
|
201
|
+
self.setExitType(input)
|
202
|
+
complete = true
|
203
|
+
when Curses::Error
|
204
|
+
self.setExitType(input)
|
205
|
+
complete = true
|
206
|
+
when CDK::KEY_RETURN, Curses::KEY_ENTER
|
207
|
+
self.setExitType(input)
|
208
|
+
ret = @current_button
|
209
|
+
complete = true
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
if !complete && !(@post_process_func.nil?)
|
214
|
+
@post_process_func.call(:BUTTONBOX, self, @post_process_data,
|
215
|
+
input)
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
unless complete
|
221
|
+
self.drawButtons
|
222
|
+
self.setExitType(0)
|
223
|
+
end
|
224
|
+
|
225
|
+
@result_data = ret
|
226
|
+
return ret
|
227
|
+
end
|
228
|
+
|
229
|
+
# This sets multiple attributes of the widget.
|
230
|
+
def set(highlight, box)
|
231
|
+
self.setHighlight(highlight)
|
232
|
+
self.setBox(box)
|
233
|
+
end
|
234
|
+
|
235
|
+
# This sets the highlight attribute for the buttonboxes
|
236
|
+
def setHighlight(highlight)
|
237
|
+
@highlight = highlight
|
238
|
+
end
|
239
|
+
|
240
|
+
def getHighlight
|
241
|
+
return @highlight
|
242
|
+
end
|
243
|
+
|
244
|
+
# This sets th background attribute of the widget.
|
245
|
+
def setBKattr(attrib)
|
246
|
+
@win.wbkgd(attrib)
|
247
|
+
end
|
248
|
+
|
249
|
+
# This draws the buttonbox box widget.
|
250
|
+
def draw(box)
|
251
|
+
# Is there a shadow?
|
252
|
+
unless @shadow_win.nil?
|
253
|
+
Draw.drawShadow(@shadow_win)
|
254
|
+
end
|
255
|
+
|
256
|
+
# Box the widget if they asked.
|
257
|
+
if box
|
258
|
+
Draw.drawObjBox(@win, self)
|
259
|
+
end
|
260
|
+
|
261
|
+
# Draw in the title if there is one.
|
262
|
+
self.drawTitle(@win)
|
263
|
+
|
264
|
+
# Draw in the buttons.
|
265
|
+
self.drawButtons
|
266
|
+
end
|
267
|
+
|
268
|
+
# This draws the buttons on the button box widget.
|
269
|
+
def drawButtons
|
270
|
+
row = @title_lines + 1
|
271
|
+
col = @col_adjust / 2
|
272
|
+
current_button = 0
|
273
|
+
cur_row = -1
|
274
|
+
cur_col = -1
|
275
|
+
|
276
|
+
# Draw the buttons.
|
277
|
+
while current_button < @button_count
|
278
|
+
(0...@cols).each do |x|
|
279
|
+
row = @title_lines + @border_size
|
280
|
+
|
281
|
+
(0...@rows).each do |y|
|
282
|
+
attr = @button_attrib
|
283
|
+
if current_button == @current_button
|
284
|
+
attr = @highlight
|
285
|
+
cur_row = row
|
286
|
+
cur_col = col
|
287
|
+
end
|
288
|
+
Draw.writeChtypeAttrib(@win, col, row,
|
289
|
+
@button[current_button], attr, CDK::HORIZONTAL, 0,
|
290
|
+
@button_len[current_button])
|
291
|
+
row += (1 + @row_adjust)
|
292
|
+
current_button += 1
|
293
|
+
end
|
294
|
+
col += @column_widths[x] + @col_adjust + @border_size
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
# This seems to just cause the window display to be all messed up
|
299
|
+
#if cur_row >= 0 && cur_col >= 0
|
300
|
+
# @win.move(cur_row, cur_col)
|
301
|
+
#end
|
302
|
+
@win.refresh
|
303
|
+
end
|
304
|
+
|
305
|
+
# This erases the buttonbox box from the screen.
|
306
|
+
def erase
|
307
|
+
if self.validCDKObject
|
308
|
+
CDK.eraseCursesWindow(@win)
|
309
|
+
CDK.eraseCursesWindow(@shadow_win)
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# This destroys the widget
|
314
|
+
def destroy
|
315
|
+
self.cleanTitle
|
316
|
+
|
317
|
+
CDK.deleteCursesWindow(@shadow_win)
|
318
|
+
CDK.deleteCursesWindow(@win)
|
319
|
+
|
320
|
+
self.cleanBindings(:BUTTONBOX)
|
321
|
+
|
322
|
+
CDK::SCREEN.unregister(:BUTTONBOX, self)
|
323
|
+
end
|
324
|
+
|
325
|
+
def setCurrentButton(button)
|
326
|
+
if button >= 0 && button < @button_count
|
327
|
+
@current_button = button
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
def getCurrentButton
|
332
|
+
@current_button
|
333
|
+
end
|
334
|
+
|
335
|
+
def getButtonCount
|
336
|
+
@button_count
|
337
|
+
end
|
338
|
+
|
339
|
+
def focus
|
340
|
+
self.draw(@box)
|
341
|
+
end
|
342
|
+
|
343
|
+
def unfocus
|
344
|
+
self.draw(@box)
|
345
|
+
end
|
346
|
+
|
347
|
+
def object_type
|
348
|
+
:BUTTONBOX
|
349
|
+
end
|
350
|
+
|
351
|
+
def position
|
352
|
+
super(@win)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|