rndk 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/demos/appointment.rb +40 -25
  3. data/demos/clock.rb +22 -11
  4. data/demos/fileview.rb +141 -0
  5. data/examples/01-hello-world.rb +1 -2
  6. data/examples/02-colors.rb +58 -0
  7. data/examples/03-markup.rb +70 -0
  8. data/examples/04-quick-widgets.rb +72 -0
  9. data/examples/05-position-widget.rb +3 -6
  10. data/examples/calendar.rb +104 -0
  11. data/examples/scroll.rb +106 -0
  12. data/lib/rndk/alphalist.rb +14 -14
  13. data/lib/rndk/button.rb +21 -21
  14. data/lib/rndk/buttonbox.rb +18 -18
  15. data/lib/rndk/calendar.rb +333 -240
  16. data/lib/rndk/core/color.rb +136 -0
  17. data/lib/rndk/core/display.rb +23 -12
  18. data/lib/rndk/core/draw.rb +32 -26
  19. data/lib/rndk/core/markup.rb +561 -0
  20. data/lib/rndk/core/quick_widgets.rb +232 -12
  21. data/lib/rndk/core/screen.rb +16 -17
  22. data/lib/rndk/core/utils.rb +143 -0
  23. data/lib/rndk/core/widget.rb +133 -92
  24. data/lib/rndk/dialog.rb +17 -17
  25. data/lib/rndk/entry.rb +21 -21
  26. data/lib/rndk/fselect.rb +16 -16
  27. data/lib/rndk/graph.rb +10 -10
  28. data/lib/rndk/histogram.rb +10 -10
  29. data/lib/rndk/itemlist.rb +20 -20
  30. data/lib/rndk/label.rb +66 -45
  31. data/lib/rndk/marquee.rb +10 -10
  32. data/lib/rndk/matrix.rb +27 -27
  33. data/lib/rndk/mentry.rb +22 -22
  34. data/lib/rndk/menu.rb +14 -14
  35. data/lib/rndk/radio.rb +19 -19
  36. data/lib/rndk/scale.rb +21 -21
  37. data/lib/rndk/scroll.rb +19 -19
  38. data/lib/rndk/scroller.rb +2 -0
  39. data/lib/rndk/selection.rb +20 -20
  40. data/lib/rndk/slider.rb +21 -21
  41. data/lib/rndk/swindow.rb +20 -20
  42. data/lib/rndk/template.rb +21 -21
  43. data/lib/rndk/version.rb +1 -1
  44. data/lib/rndk/viewer.rb +18 -18
  45. data/lib/rndk.rb +99 -777
  46. data/rndk.gemspec +1 -1
  47. metadata +12 -3
data/lib/rndk.rb CHANGED
@@ -1,25 +1,39 @@
1
- # Welcome to the Ruby Ncurses Development Kit!
2
-
1
+ # The main RNDK module - contains everything we need.
2
+ #
3
+ # There's a lot of functionality inside RNDK. Besides
4
+ # each Widget having it's own file, some methods were
5
+ # splitted on several files:
6
+ #
7
+ # rndk/core/draw:: Common draw functions between Widgets.
8
+ # rndk/core/draw:: Color initialization and handling.
9
+ # rndk/core/display:: (??)
10
+ # rndk/core/traverse::
11
+ # rndk/core/widget:: Common functionality shared between widgets.
12
+ # rndk/core/screen::
13
+ # rndk/core/markup:: Functions to decode RNDK's markup language.
14
+ # rndk/core/utils:: Utility functions, not urgent or anything.
15
+ #
16
+ # ## Developer Notes
17
+ #
18
+ # * Any questions on what a `Ncurses.*` function do, check it's man
19
+ # page with `man lowercase_function_name`.
20
+ #
3
21
  require 'ffi-ncurses'
4
22
  require 'scanf'
5
23
 
6
24
  require 'rndk/core/draw'
25
+ require 'rndk/core/color'
7
26
  require 'rndk/core/display'
8
27
  require 'rndk/core/traverse'
9
28
  require 'rndk/core/widget'
10
29
  require 'rndk/core/screen'
30
+ require 'rndk/core/markup'
31
+ require 'rndk/core/utils'
11
32
 
12
33
  # Shortcut to avoid typing FFI::NCurses all the time.
13
34
  # You can use it too!
14
35
  Ncurses = FFI::NCurses
15
36
 
16
- # The main RNDK module - contains everything we need.
17
- #
18
- # ## Developer Notes
19
- #
20
- # * Any questions on what a `Ncurses.*` function do, check it's man
21
- # page with `man lowercase_function_name`.
22
- #
23
37
  module RNDK
24
38
 
25
39
  # Some nice global constants.
@@ -75,7 +89,7 @@ module RNDK
75
89
  ALL_SCREENS = []
76
90
  ALL_OBJECTS = []
77
91
 
78
- # This beeps then flushes the stdout stream.
92
+ # Beeps then flushes the stdout stream.
79
93
  #
80
94
  # Normally it emits an audible bell - if that's not
81
95
  # possible it flashes the screen.
@@ -84,630 +98,65 @@ module RNDK
84
98
  $stdout.flush
85
99
  end
86
100
 
87
- # This sets a blank string to be len of the given characer.
88
- def RNDK.cleanChar(s, len, character)
89
- s << character * len
90
- end
91
-
92
- def RNDK.cleanChtype(s, len, character)
93
- s.concat(character * len)
94
- end
95
-
96
- # This takes an x and y position and realigns the values iff they sent in
97
- # values like CENTER, LEFT, RIGHT
98
- #
99
- # window is an Ncurses::WINDOW object
100
- # xpos, ypos is an array with exactly one value, an integer
101
- # box_width, box_height is an integer
102
- def RNDK.alignxy (window, xpos, ypos, box_width, box_height)
103
- first = Ncurses.getbegx window
104
- last = Ncurses.getmaxx window
105
- if (gap = (last - box_width)) < 0
106
- gap = 0
107
- end
108
- last = first + gap
109
-
110
- case xpos[0]
111
- when LEFT
112
- xpos[0] = first
113
- when RIGHT
114
- xpos[0] = first + gap
115
- when CENTER
116
- xpos[0] = first + (gap / 2)
117
- else
118
- if xpos[0] > last
119
- xpos[0] = last
120
- elsif xpos[0] < first
121
- xpos[0] = first
122
- end
123
- end
124
-
125
- first = Ncurses.getbegy window
126
- last = Ncurses.getmaxy window
127
- if (gap = (last - box_height)) < 0
128
- gap = 0
129
- end
130
- last = first + gap
131
-
132
- case ypos[0]
133
- when TOP
134
- ypos[0] = first
135
- when BOTTOM
136
- ypos[0] = first + gap
137
- when CENTER
138
- ypos[0] = first + (gap / 2)
139
- else
140
- if ypos[0] > last
141
- ypos[0] = last
142
- elsif ypos[0] < first
143
- ypos[0] = first
144
- end
145
- end
146
- end
147
-
148
- # This takes a string, a field width, and a justification type
149
- # and returns the adjustment to make, to fill the justification
150
- # requirement
151
- def RNDK.justifyString (box_width, mesg_length, justify)
152
-
153
- # make sure the message isn't longer than the width
154
- # if it is, return 0
155
- if mesg_length >= box_width
156
- return 0
157
- end
158
-
159
- # try to justify the message
160
- case justify
161
- when LEFT
162
- 0
163
- when RIGHT
164
- box_width - mesg_length
165
- when CENTER
166
- (box_width - mesg_length) / 2
167
- else
168
- justify
169
- end
170
- end
171
-
172
- # This reads a file and sticks it into the list provided.
173
- def RNDK.readFile(filename, array)
174
- begin
175
- fd = File.new(filename, "r")
176
- rescue
177
- return -1
178
- end
179
-
180
- lines = fd.readlines.map do |line|
181
- if line.size > 0 && line[-1] == "\n"
182
- line[0...-1]
183
- else
184
- line
185
- end
186
- end
187
- array.concat(lines)
188
- fd.close
189
- array.size
190
- end
191
-
192
- def RNDK.encodeAttribute (string, from, mask)
193
- mask << 0
194
- case string[from + 1]
195
- when 'B'
196
- mask[0] = Ncurses::A_BOLD
197
- when 'D'
198
- mask[0] = Ncurses::A_DIM
199
- when 'K'
200
- mask[0] = Ncurses::A_BLINK
201
- when 'R'
202
- mask[0] = Ncurses::A_REVERSE
203
- when 'S'
204
- mask[0] = Ncurses::A_STANDOUT
205
- when 'U'
206
- mask[0] = Ncurses::A_UNDERLINE
207
- end
208
-
209
- if mask[0] != 0
210
- from += 1
211
- elsif RNDK.digit?(string[from+1]) and RNDK.digit?(string[from + 2])
212
- if Ncurses.has_colors
213
- # XXX: Only checks if terminal has colours not if colours are started
214
- pair = string[from + 1..from + 2].to_i
215
- mask[0] = Ncurses.COLOR_PAIR(pair)
216
- else
217
- mask[0] = Ncurses.A_BOLD
218
- end
219
-
220
- from += 2
221
- elsif RNDK.digit?(string[from + 1])
222
- if Ncurses.has_colors
223
- # XXX: Only checks if terminal has colours not if colours are started
224
- pair = string[from + 1].to_i
225
- mask[0] = Ncurses.COLOR_PAIR(pair)
226
- else
227
- mask[0] = Ncurses.A_BOLD
228
- end
229
-
230
- from += 1
231
- end
232
-
233
- return from
234
- end
235
-
236
- # The reverse of encodeAttribute
237
- # Well, almost. If attributes such as bold and underline are combined in the
238
- # same string, we do not necessarily reconstruct them in the same order.
239
- # Also, alignment markers and tabs are lost.
240
-
241
- def RNDK.decodeAttribute (string, from, oldattr, newattr)
242
- table = {
243
- 'B' => Ncurses::A_BOLD,
244
- 'D' => Ncurses::A_DIM,
245
- 'K' => Ncurses::A_BLINK,
246
- 'R' => Ncurses::A_REVERSE,
247
- 'S' => Ncurses::A_STANDOUT,
248
- 'U' => Ncurses::A_UNDERLINE
249
- }
250
-
251
- result = if string.nil? then '' else string end
252
- base_len = result.size
253
- tmpattr = oldattr & Ncurses::A_ATTRIBUTES
254
-
255
- newattr &= Ncurses::A_ATTRIBUTES
256
- if tmpattr != newattr
257
- while tmpattr != newattr
258
- found = false
259
- table.keys.each do |key|
260
- if (table[key] & tmpattr) != (table[key] & newattr)
261
- found = true
262
- result << RNDK::L_MARKER
263
- if (table[key] & tmpattr).nonzero?
264
- result << '!'
265
- tmpattr &= ~(table[key])
266
- else
267
- result << '/'
268
- tmpattr |= table[key]
269
- end
270
- result << key
271
- break
272
- end
273
- end
274
- # XXX: Only checks if terminal has colours not if colours are started
275
- if Ncurses.has_colors
276
- if (tmpattr & Ncurses::A_COLOR) != (newattr & Ncurses::A_COLOR)
277
- oldpair = Ncurses.PAIR_NUMBER(tmpattr)
278
- newpair = Ncurses.PAIR_NUMBER(newattr)
279
- if !found
280
- found = true
281
- result << RNDK::L_MARKER
282
- end
283
- if newpair.zero?
284
- result << '!'
285
- result << oldpair.to_s
286
- else
287
- result << '/'
288
- result << newpair.to_s
289
- end
290
- tmpattr &= ~(Ncurses::A_COLOR)
291
- newattr &= ~(Ncurses::A_COLOR)
292
- end
293
- end
294
-
295
- if found
296
- result << RNDK::R_MARKER
297
- else
298
- break
299
- end
300
- end
301
- end
302
-
303
- return from + result.size - base_len
304
- end
305
-
306
- # This function takes a string, full of format markers and translates
307
- # them into a chtype array. This is better suited to curses because
308
- # curses uses chtype almost exclusively
309
- def RNDK.char2Chtype (string, to, align)
310
- to << 0
311
- align << LEFT
312
- result = []
313
-
314
- if string.size > 0
315
- used = 0
316
-
317
- # The original code makes two passes since it has to pre-allocate space but
318
- # we should be able to make do with one since we can dynamically size it
319
- adjust = 0
320
- attrib = Ncurses::A_NORMAL
321
- last_char = 0
322
- start = 0
323
- used = 0
324
- x = 3
325
-
326
- # Look for an alignment marker.
327
- if string[0] == L_MARKER
328
- if string[1] == 'C' && string[2] == R_MARKER
329
- align[0] = CENTER
330
- start = 3
331
- elsif string[1] == 'R' && string[2] == R_MARKER
332
- align[0] = RIGHT
333
- start = 3
334
- elsif string[1] == 'L' && string[2] == R_MARKER
335
- start = 3
336
- elsif string[1] == 'B' && string[2] == '='
337
- # Set the item index value in the string.
338
- result = [' '.ord, ' '.ord, ' '.ord]
339
-
340
- # Pull out the bullet marker.
341
- while x < string.size and string[x] != R_MARKER
342
- result << (string[x].ord | Ncurses::A_BOLD)
343
- x += 1
344
- end
345
- adjust = 1
346
-
347
- # Set the alignment variables
348
- start = x
349
- used = x
350
- elsif string[1] == 'I' && string[2] == '='
351
- from = 3
352
- x = 0
353
-
354
- while from < string.size && string[from] != Ncurses.R_MARKER
355
- if RNDK.digit?(string[from])
356
- adjust = adjust * 10 + string[from].to_i
357
- x += 1
358
- end
359
- from += 1
360
- end
361
-
362
- start = x + 4
363
- end
364
- end
365
-
366
- while adjust > 0
367
- adjust -= 1
368
- result << ' '
369
- used += 1
370
- end
371
-
372
- # Set the format marker boolean to false
373
- inside_marker = false
374
-
375
- # Start parsing the character string.
376
- from = start
377
- while from < string.size
378
- # Are we inside a format marker?
379
- if !inside_marker
380
- if string[from] == L_MARKER &&
381
- ['/', '!', '#'].include?(string[from + 1])
382
- inside_marker = true
383
- elsif string[from] == "\\" && string[from + 1] == L_MARKER
384
- from += 1
385
- result << (string[from].ord | attrib)
386
- used += 1
387
- from += 1
388
- elsif string[from] == "\t"
389
- begin
390
- result << ' '
391
- used += 1
392
- end while (used & 7).nonzero?
393
- else
394
- result << (string[from].ord | attrib)
395
- used += 1
396
- end
397
- else
398
- case string[from]
399
- when R_MARKER
400
- inside_marker = false
401
- when '#'
402
- last_char = 0
403
- case string[from + 2]
404
- when 'L'
405
- case string[from + 1]
406
- when 'L'
407
- last_char = Ncurses::ACS_LLCORNER
408
- when 'U'
409
- last_char = Ncurses::ACS_ULCORNER
410
- when 'H'
411
- last_char = Ncurses::ACS_HLINE
412
- when 'V'
413
- last_char = Ncurses::ACS_VLINE
414
- when 'P'
415
- last_char = Ncurses::ACS_PLUS
416
- end
417
- when 'R'
418
- case string[from + 1]
419
- when 'L'
420
- last_char = Ncurses::ACS_LRCORNER
421
- when 'U'
422
- last_char = Ncurses::ACS_URCORNER
423
- end
424
- when 'T'
425
- case string[from + 1]
426
- when 'T'
427
- last_char = Ncurses::ACS_TTEE
428
- when 'R'
429
- last_char = Ncurses::ACS_RTEE
430
- when 'L'
431
- last_char = Ncurses::ACS_LTEE
432
- when 'B'
433
- last_char = Ncurses::ACS_BTEE
434
- end
435
- when 'A'
436
- case string[from + 1]
437
- when 'L'
438
- last_char = Ncurses::ACS_LARROW
439
- when 'R'
440
- last_char = Ncurses::ACS_RARROW
441
- when 'U'
442
- last_char = Ncurses::ACS_UARROW
443
- when 'D'
444
- last_char = Ncurses::ACS_DARROW
445
- end
446
- else
447
- case [string[from + 1], string[from + 2]]
448
- when ['D', 'I']
449
- last_char = Ncurses::ACS_DIAMOND
450
- when ['C', 'B']
451
- last_char = Ncurses::ACS_CKBOARD
452
- when ['D', 'G']
453
- last_char = Ncurses::ACS_DEGREE
454
- when ['P', 'M']
455
- last_char = Ncurses::ACS_PLMINUS
456
- when ['B', 'U']
457
- last_char = Ncurses::ACS_BULLET
458
- when ['S', '1']
459
- last_char = Ncurses::ACS_S1
460
- when ['S', '9']
461
- last_char = Ncurses::ACS_S9
462
- end
463
- end
464
-
465
- if last_char.nonzero?
466
- adjust = 1
467
- from += 2
468
-
469
- if string[from + 1] == '('
470
- # check for a possible numeric modifier
471
- from += 2
472
- adjust = 0
473
-
474
- while from < string.size && string[from] != ')'
475
- if RNDK.digit?(string[from])
476
- adjust = (adjust * 10) + string[from].to_i
477
- end
478
- from += 1
479
- end
480
- end
481
- end
482
- (0...adjust).each do |x|
483
- result << (last_char | attrib)
484
- used += 1
485
- end
486
- when '/'
487
- mask = []
488
- from = RNDK.encodeAttribute(string, from, mask)
489
- attrib |= mask[0]
490
- when '!'
491
- mask = []
492
- from = RNDK.encodeAttribute(string, from, mask)
493
- attrib &= ~(mask[0])
494
- end
495
- end
496
- from += 1
497
- end
498
-
499
- if result.size == 0
500
- result << attrib
501
- end
502
- to[0] = used
503
- else
504
- result = []
505
- end
506
- return result
507
- end
508
-
509
- # Compare a regular string to a chtype string
510
- def RNDK.cmpStrChstr (str, chstr)
511
- i = 0
512
- r = 0
513
-
514
- if str.nil? && chstr.nil?
515
- return 0
516
- elsif str.nil?
517
- return 1
518
- elsif chstr.nil?
519
- return -1
520
- end
521
-
522
- while i < str.size && i < chstr.size
523
- if str[r].ord < chstr[r]
524
- return -1
525
- elsif str[r].ord > chstr[r]
526
- return 1
527
- end
528
- i += 1
529
- end
530
-
531
- if str.size < chstr.size
532
- return -1
533
- elsif str.size > chstr.size
534
- return 1
535
- else
536
- return 0
537
- end
538
- end
539
-
540
- def RNDK.CharOf(chtype)
541
- (chtype.ord & 255).chr
542
- end
543
-
544
- # This returns a string from a chtype array
545
- # Formatting codes are omitted.
546
- def RNDK.chtype2Char(string)
547
- newstring = ''
548
-
549
- unless string.nil?
550
- string.each do |char|
551
- newstring << RNDK.CharOf(char)
552
- end
553
- end
554
-
555
- return newstring
556
- end
557
-
558
- # This returns a string from a chtype array
559
- # Formatting codes are embedded
560
- def RNDK.chtype2String(string)
561
- newstring = ''
562
- unless string.nil?
563
- need = 0
564
- (0...string.size).each do |x|
565
- need = RNDK.decodeAttribute(newstring, need,
566
- x > 0 ? string[x - 1] : 0, string[x])
567
- newstring << string[x]
568
- end
569
- end
101
+ def RNDK.digit? character
102
+ return false if character.nil?
570
103
 
571
- return newstring
104
+ not character.match(/^[[:digit:]]$/).nil?
572
105
  end
573
106
 
107
+ def RNDK.is_alpha? character
108
+ return false if character.nil?
574
109
 
575
-
576
- # This returns the length of the integer.
577
- #
578
- # Currently a wrapper maintained for easy of porting.
579
- def RNDK.intlen (value)
580
- value.to_str.size
110
+ not character.match(/^[[:alpha:]]$/).nil?
581
111
  end
582
112
 
583
- # This opens the current directory and reads the contents.
584
- def RNDK.getDirectoryContents(directory, list)
585
- counter = 0
113
+ def RNDK.is_char? character
114
+ return false if character.nil?
586
115
 
587
- # Open the directory.
588
- Dir.foreach(directory) do |filename|
589
- next if filename == '.'
590
- list << filename
591
- end
592
-
593
- list.sort!
594
- return list.size
116
+ (character >= 0) and (character < Ncurses::KEY_MIN)
595
117
  end
596
118
 
597
- # This looks for a subset of a word in the given list
598
- def RNDK.searchList(list, list_size, pattern)
599
- index = -1
600
-
601
- if pattern.size > 0
602
- (0...list_size).each do |x|
603
- len = [list[x].size, pattern.size].min
604
- ret = (list[x][0...len] <=> pattern)
605
-
606
- # If 'ret' is less than 0 then the current word is alphabetically
607
- # less than the provided word. At this point we will set the index
608
- # to the current position. If 'ret' is greater than 0, then the
609
- # current word is alphabetically greater than the given word. We
610
- # should return with index, which might contain the last best match.
611
- # If they are equal then we've found it.
612
- if ret < 0
613
- index = ret
614
- else
615
- if ret == 0
616
- index = x
617
- end
618
- break
619
- end
620
- end
621
- end
622
- return index
623
- end
624
-
625
- # This function checks to see if a link has been requested
626
- def RNDK.checkForLink (line, filename)
627
- f_pos = 0
628
- x = 3
629
- if line.nil?
630
- return -1
631
- end
632
-
633
- # Strip out the filename.
634
- if line[0] == L_MARKER && line[1] == 'F' && line[2] == '='
635
- while x < line.size
636
- if line[x] == R_MARKER
637
- break
638
- end
639
- if f_pos < RNDK_PATHMAX
640
- filename << line[x]
641
- f_pos += 1
642
- end
643
- x += 1
644
- end
645
- end
646
- return f_pos != 0
119
+ # Returns the function keys - F1, F2 ... F12 ...
120
+ def RNDK.KEY_F(n)
121
+ 264 + n
647
122
  end
648
123
 
649
- # Returns the filename portion of the given pathname, i.e. after the last
650
- # slash
651
- # For now this function is just a wrapper for File.basename kept for ease of
652
- # porting and will be completely replaced in the future
653
- def RNDK.baseName (pathname)
654
- File.basename(pathname)
124
+ # This sets a blank string to be len of the given character.
125
+ def RNDK.cleanChar(s, len, character)
126
+ s << character * len
655
127
  end
656
128
 
657
- # Returns the directory for the given pathname, i.e. the part before the
658
- # last slash
659
- # For now this function is just a wrapper for File.dirname kept for ease of
660
- # porting and will be completely replaced in the future
661
- def RNDK.dirName (pathname)
662
- File.dirname(pathname)
129
+ def RNDK.cleanChtype(s, len, character)
130
+ s.concat(character * len)
663
131
  end
664
132
 
665
- # If the dimension is a negative value, the dimension will be the full
666
- # height/width of the parent window - the value of the dimension. Otherwise,
667
- # the dimension will be the given value.
668
- def RNDK.setWidgetDimension (parent_dim, proposed_dim, adjustment)
669
- # If the user passed in FULL, return the parents size
670
- if proposed_dim == FULL or proposed_dim == 0
671
- parent_dim
672
- elsif proposed_dim >= 0
673
- # if they gave a positive value, return it
674
-
675
- if proposed_dim >= parent_dim
676
- parent_dim
677
- else
678
- proposed_dim + adjustment
679
- end
680
- else
681
- # if they gave a negative value then return the dimension
682
- # of the parent plus the value given
683
- #
684
- if parent_dim + proposed_dim < 0
685
- parent_dim
686
- else
687
- parent_dim + proposed_dim
688
- end
689
- end
690
- end
133
+ # Functions that handle raw Ncurses windows.
134
+ # TODO perhaps change them when I create my dedicated
135
+ # Window class.
691
136
 
692
- # This safely erases a given window
693
- def RNDK.eraseCursesWindow (window)
137
+ # Safely erases a raw Ncurses window.
138
+ def RNDK.window_erase window
694
139
  return if window.nil?
695
140
 
696
141
  Ncurses.werase window
697
142
  Ncurses.wrefresh window
698
143
  end
699
144
 
700
- # This safely deletes a given window.
701
- def RNDK.deleteCursesWindow (window)
145
+ # Safely deletes a raw Ncurses window.
146
+ def RNDK.window_delete window
702
147
  return if window.nil?
703
148
 
704
- RNDK.eraseCursesWindow(window)
149
+ RNDK.window_erase window
705
150
  Ncurses.delwin window
706
151
  end
707
152
 
708
- # This moves a given window (if we're able to set the window's beginning).
153
+ # Safely moves a raw Ncurses window.
154
+ #
155
+ # ## Developer Note:
156
+ #
157
+ # Moves a given window if we're able to set the window's beginning.
709
158
  # We do not use mvwin(), because it does not (usually) move subwindows.
710
- def RNDK.moveCursesWindow (window, xdiff, ydiff)
159
+ def RNDK.window_move(window, xdiff, ydiff)
711
160
  return if window.nil?
712
161
 
713
162
  xpos = []
@@ -723,190 +172,63 @@ module RNDK
723
172
  end
724
173
  end
725
174
 
726
- def RNDK.digit? character
727
- false if character.nil?
728
- !(character.match(/^[[:digit:]]$/).nil?)
729
- end
730
-
731
- def RNDK.alpha? character
732
- false if character.nil?
733
- !(character.match(/^[[:alpha:]]$/).nil?)
734
- end
735
-
736
- def RNDK.isChar c
737
- false if c.nil?
738
- c >= 0 && c < Ncurses::KEY_MIN
739
- end
740
-
741
- # Returns the function keys - F1, F2 ... F12 ...
742
- def RNDK.KEY_F(n)
743
- 264 + n
744
- end
745
-
746
- def RNDK.getString(screen, title, label, init_value)
747
- # Create the widget.
748
- widget = RNDK::ENTRY.new(screen, RNDK::CENTER, RNDK::CENTER, title, label,
749
- Ncurses::A_NORMAL, '.', :MIXED, 40, 0, 5000, true, false)
750
-
751
- # Set the default value.
752
- widget.setValue(init_value)
753
-
754
- # Get the string.
755
- value = widget.activate([])
756
-
757
- # Make sure they exited normally.
758
- if widget.exit_type != :NORMAL
759
- widget.destroy
760
- return nil
761
- end
762
-
763
- # Return a copy of the string typed in.
764
- value = entry.getValue.clone
765
- widget.destroy
766
- return value
767
- end
768
-
769
- # This allows a person to select a file.
770
- def RNDK.selectFile(screen, title)
771
- # Create the file selector.
772
- fselect = RNDK::FSELECT.new(screen, RNDK::CENTER, RNDK::CENTER, -4, -20,
773
- title, 'File: ', Ncurses::A_NORMAL, '_', Ncurses::A_REVERSE,
774
- '</5>', '</48>', '</N>', '</N>', true, false)
775
-
776
- # Let the user play.
777
- filename = fselect.activate([])
778
-
779
- # Check the way the user exited the selector.
780
- if fselect.exit_type != :NORMAL
781
- fselect.destroy
782
- screen.refresh
783
- return nil
784
- end
785
-
786
- # Otherwise...
787
- fselect.destroy
788
- screen.refresh
789
- return filename
790
- end
791
-
792
- # This returns a selected value in a list
793
- def RNDK.getListindex(screen, title, list, list_size, numbers)
794
- selected = -1
795
- height = 10
796
- width = -1
797
- len = 0
798
-
799
- # Determine the height of the list.
800
- if list_size < 10
801
- height = list_size + if title.size == 0 then 2 else 3 end
802
- end
803
-
804
- # Determine the width of the list.
805
- list.each do |item|
806
- width = [width, item.size + 10].max
807
- end
808
-
809
- width = [width, title.size].max
810
- width += 5
811
-
812
- # Create the scrolling list.
813
- scrollp = RNDK::SCROLL.new(screen, RNDK::CENTER, RNDK::CENTER, RNDK::RIGHT,
814
- height, width, title, list, list_size, numbers, Ncurses::A_REVERSE,
815
- true, false)
816
-
817
- # Check if we made the lsit.
818
- if scrollp.nil?
819
- screen.refresh
820
- return -1
821
- end
822
-
823
- # Let the user play.
824
- selected = scrollp.activate([])
825
-
826
- # Check how they exited.
827
- if scrollp.exit_type != :NORMAL
828
- selected = -1
829
- end
830
-
831
- # Clean up.
832
- scrollp.destroy
833
- screen.refresh
834
- return selected
175
+ # Refreshes a raw Ncurses window.
176
+ #
177
+ # ## Developer Notes
178
+ #
179
+ # FIXME(original): this should be rewritten to use the panel library, so
180
+ # it would not be necessary to touch the window to ensure that it covers
181
+ # other windows.
182
+ def RNDK.window_refresh win
183
+ Ncurses.touchwin win
184
+ Ncurses.wrefresh win
835
185
  end
836
186
 
837
- # This allows the user to view information.
838
- def RNDK.viewInfo(screen, title, info, count, buttons, button_count,
839
- interpret)
840
- selected = -1
187
+ # Aligns a box on the given `window` with the width and height given.
188
+ #
189
+ # x and y position values are like `RNDK::CENTER`, `RNDK::LEFT`,
190
+ # `RNDK::RIGHT`.
191
+ #
192
+ # `xpos`, `ypos` is an Array with exactly one value, an integer.
193
+ #
194
+ # `box_width`, `box_height` is an integer.
195
+ #
196
+ def RNDK.alignxy (window, xpos, ypos, box_width, box_height)
841
197
 
842
- # Create the file viewer to view the file selected.
843
- viewer = RNDK::VIEWER.new(screen, RNDK::CENTER, RNDK::CENTER, -6, -16,
844
- buttons, button_count, Ncurses::A_REVERSE, true, true)
198
+ # Handling xpos
199
+ first = Ncurses.getbegx window
200
+ last = Ncurses.getmaxx window
845
201
 
846
- # Set up the viewer title, and the contents to the widget.
847
- viewer.set(title, info, count, Ncurses::A_REVERSE, interpret, true, true)
202
+ gap = 0 if (gap = (last - box_width)) < 0
848
203
 
849
- # Activate the viewer widget.
850
- selected = viewer.activate([])
204
+ last = first + gap
851
205
 
852
- # Make sure they exited normally.
853
- if viewer.exit_type != :NORMAL
854
- viewer.destroy
855
- return -1
206
+ case xpos[0]
207
+ when LEFT then xpos[0] = first
208
+ when RIGHT then xpos[0] = first + gap
209
+ when CENTER then xpos[0] = first + (gap / 2)
210
+ else
211
+ xpos[0] = last if xpos[0] > last
212
+ xpos[0] = first if xpos[0] < first
856
213
  end
857
214
 
858
- # Clean up and return the button index selected
859
- viewer.destroy
860
- return selected
861
- end
215
+ # Handling ypos
216
+ first = Ncurses.getbegy window
217
+ last = Ncurses.getmaxy window
862
218
 
863
- # This allows the user to view a file.
864
- def RNDK.viewFile(screen, title, filename, buttons, button_count)
865
- info = []
866
- result = 0
219
+ gap = 0 if (gap = (last - box_height)) < 0
867
220
 
868
- # Open the file and read the contents.
869
- lines = RNDK.readFile(filename, info)
221
+ last = first + gap
870
222
 
871
- # If we couldn't read the file, return an error.
872
- if lines == -1
873
- result = lines
223
+ case ypos[0]
224
+ when TOP then ypos[0] = first
225
+ when BOTTOM then ypos[0] = first + gap
226
+ when CENTER then ypos[0] = first + (gap / 2)
874
227
  else
875
- result = RNDK.viewInfo(screen, title, info, lines, buttons,
876
- button_count, true)
228
+ ypos[0] = last if ypos[0] > last
229
+ ypos[0] = first if ypos[0] < first
877
230
  end
878
- return result
879
231
  end
880
- end
881
232
 
882
- # Why is this here?
883
- #
884
- # require 'rndk/alphalist'
885
- # require 'rndk/button'
886
- # require 'rndk/buttonbox'
887
- # require 'rndk/calendar'
888
- # require 'rndk/dialog'
889
- # require 'rndk/dscale'
890
- # require 'rndk/entry'
891
- # require 'rndk/fscale'
892
- # require 'rndk/fslider'
893
- # require 'rndk/fselect'
894
- # require 'rndk/graph'
895
- # require 'rndk/histogram'
896
- # require 'rndk/itemlist'
897
- # require 'rndk/label'
898
- # require 'rndk/marquee'
899
- # require 'rndk/matrix'
900
- # require 'rndk/mentry'
901
- # require 'rndk/menu'
902
- # require 'rndk/radio'
903
- # require 'rndk/scale'
904
- # require 'rndk/scroll'
905
- # require 'rndk/selection'
906
- # require 'rndk/slider'
907
- # require 'rndk/swindow'
908
- # require 'rndk/template'
909
- # require 'rndk/uscale'
910
- # require 'rndk/uslider'
911
- # require 'rndk/viewer'
233
+ end
912
234