rndk 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -4
  3. data/TODO +21 -1
  4. data/demos/appointment.rb +279 -299
  5. data/demos/clock.rb +13 -8
  6. data/demos/rss-reader.rb +84 -0
  7. data/examples/01-hello-world.rb +13 -11
  8. data/examples/02-colors.rb +14 -21
  9. data/examples/03-markup.rb +7 -7
  10. data/examples/04-quick-widgets.rb +2 -2
  11. data/examples/05-position-widget.rb +50 -31
  12. data/examples/06-callbacks.rb +77 -0
  13. data/examples/07-traverse.rb +90 -0
  14. data/examples/10-all-widgets.rb +165 -0
  15. data/examples/calendar.rb +20 -32
  16. data/examples/entry.rb +15 -20
  17. data/examples/label.rb +11 -11
  18. data/examples/scroll.rb +16 -60
  19. data/examples/slider.rb +18 -19
  20. data/examples/viewer.rb +65 -0
  21. data/lib/rndk.rb +28 -7
  22. data/lib/rndk/alphalist.rb +309 -313
  23. data/lib/rndk/button.rb +239 -157
  24. data/lib/rndk/buttonbox.rb +136 -103
  25. data/lib/rndk/calendar.rb +246 -203
  26. data/lib/rndk/core/color.rb +63 -13
  27. data/lib/rndk/core/display.rb +1 -1
  28. data/lib/rndk/core/draw.rb +11 -11
  29. data/lib/rndk/core/markup.rb +21 -21
  30. data/lib/rndk/core/quick_widgets.rb +75 -96
  31. data/lib/rndk/core/screen.rb +145 -102
  32. data/lib/rndk/core/traverse.rb +150 -136
  33. data/lib/rndk/core/utils.rb +5 -6
  34. data/lib/rndk/core/widget.rb +207 -191
  35. data/lib/rndk/core/widget_bind.rb +108 -0
  36. data/lib/rndk/dialog.rb +88 -56
  37. data/lib/rndk/entry.rb +79 -64
  38. data/lib/rndk/fscale.rb +38 -20
  39. data/lib/rndk/fslider.rb +38 -23
  40. data/lib/rndk/graph.rb +92 -53
  41. data/lib/rndk/itemlist.rb +80 -62
  42. data/lib/rndk/label.rb +111 -77
  43. data/lib/rndk/radio.rb +138 -128
  44. data/lib/rndk/scale.rb +123 -122
  45. data/lib/rndk/scroll.rb +444 -391
  46. data/lib/rndk/scroller.rb +21 -21
  47. data/lib/rndk/slider.rb +149 -140
  48. data/lib/rndk/template.rb +74 -61
  49. data/lib/rndk/version.rb +1 -1
  50. data/lib/rndk/viewer.rb +499 -298
  51. metadata +8 -14
  52. data/demos/fileview.rb +0 -141
  53. data/lib/rndk/dscale.rb +0 -13
  54. data/lib/rndk/fselect.rb +0 -938
  55. data/lib/rndk/histogram.rb +0 -412
  56. data/lib/rndk/marquee.rb +0 -244
  57. data/lib/rndk/matrix.rb +0 -1189
  58. data/lib/rndk/mentry.rb +0 -619
  59. data/lib/rndk/menu.rb +0 -478
  60. data/lib/rndk/selection.rb +0 -630
  61. data/lib/rndk/swindow.rb +0 -766
  62. data/lib/rndk/uscale.rb +0 -14
  63. data/lib/rndk/uslider.rb +0 -14
@@ -10,18 +10,44 @@ module RNDK
10
10
  # The only methods you should worry about are:
11
11
  #
12
12
  # * Screen#initialize
13
- # * Screen#end_rndk
13
+ # * Screen#finish
14
14
  # * Screen#draw or #refresh
15
15
  # * Screen#erase
16
16
  #
17
17
  # ## Developer Notes
18
18
  #
19
- # If you want to create your own Widget, you'll need to
20
- # call some methods in here to register/unregister it
21
- # to a Screen.
19
+ # When a Widget is created, it calls Screen#register with it's
20
+ # type and self pointer.
21
+ #
22
+ # That adds the widget pointer to an Array `@widget` that
23
+ # contains all the widgets inside this screen.
24
+ #
25
+ # During it's lifetime, most widgets would call only Screen#erase
26
+ # and Screen#refresh.
27
+ #
28
+ # When Widget#destroy is called, we call Screen#unregister to
29
+ # remove it from the `@widget` array.
30
+ #
31
+ # Now, what happens when the Ruby garbage collector kills the
32
+ # widget?
22
33
  #
23
34
  class Screen
24
- attr_accessor :object_focus, :object_count, :object_limit, :object, :window
35
+ # Index of the current focused widget
36
+ attr_accessor :widget_focus
37
+
38
+ # How many widgets we currently have
39
+ attr_accessor :widget_count
40
+
41
+ # Maximum widget capacity of the screen (always expands)
42
+ attr_accessor :widget_limit
43
+
44
+ # Array with all the widgets currently on the screen
45
+ attr_accessor :widget
46
+
47
+ # Raw Ncurses window that represents this Screen
48
+ attr_accessor :window
49
+
50
+ # Nothing... for now
25
51
  attr_accessor :exit_status
26
52
 
27
53
  NOEXIT = 0
@@ -47,7 +73,7 @@ module RNDK
47
73
 
48
74
  # If the user didn't start Ncurses for us,
49
75
  # we'll do it anyway.
50
- if RNDK::ALL_SCREENS.size == 0 or ncurses_window.nil?
76
+ if RNDK::ALL_SCREENS.empty? or ncurses_window.nil?
51
77
 
52
78
  ## Why is this here?
53
79
  # Set up basic curses settings.
@@ -58,18 +84,30 @@ module RNDK
58
84
  ncurses_window = Ncurses.initscr
59
85
  Ncurses.noecho
60
86
  Ncurses.cbreak
87
+ Ncurses.keypad(ncurses_window, true)
61
88
  end
62
89
 
63
90
  RNDK::ALL_SCREENS << self
64
- @object_count = 0
65
- @object_limit = 2
66
- @object = Array.new(@object_limit, nil)
91
+ @widget_count = 0
92
+ @widget_limit = 2
93
+ @widget = Array.new(@widget_limit, nil)
67
94
  @window = ncurses_window
68
- @object_focus = 0
95
+ @widget_focus = 0
69
96
  end
70
97
 
71
- # Shuts down RNDK and Ncurses.
72
- def self.end_rndk
98
+ # Shuts down RNDK and Ncurses, plus destroying all the
99
+ # widgets ever created.
100
+ def self.finish
101
+
102
+ ## If I do this it gives me a segmentation fault.
103
+ ## I guess that would happen because of the
104
+ ## ruby garbage collector.
105
+ ##
106
+ ## What should I do instead?
107
+ #
108
+ # RNDK::ALL_WIDGETS.each { |obj| obj.destroy }
109
+ # RNDK::ALL_SCREENS.each { |scr| scr.destroy }
110
+
73
111
  Ncurses.echo
74
112
  Ncurses.nocbreak
75
113
  Ncurses.endwin
@@ -79,87 +117,62 @@ module RNDK
79
117
  #
80
118
  # @note This is called automatically when a widget is created.
81
119
  #
82
- # `rndktype` states what RNDK Widget type this object is.
83
- # `object` is a pointer to the Widget itself.
120
+ # * `rndktype` states what RNDK Widget type this widget is.
121
+ # * `widget` is a pointer to the Widget itself.
84
122
  #
85
- def register(rndktype, object)
86
- if @object_count + 1 >= @object_limit
87
- @object_limit += 2
88
- @object_limit *= 2
89
- @object.concat Array.new(@object_limit - @object.size, nil)
123
+ def register(rndktype, widget)
124
+
125
+ # Expanding the limit by 2
126
+ if (@widget_count + 1) >= @widget_limit
127
+ @widget_limit += 2
128
+ @widget_limit *= 2
129
+ @widget.concat Array.new(@widget_limit - @widget.size, nil)
90
130
  end
91
131
 
92
- if object.validObjType(rndktype)
93
- self.setScreenIndex(@object_count, object)
94
- @object_count += 1
132
+ if widget.valid_type?
133
+ self.set_screen_index(@widget_count, widget)
134
+ @widget_count += 1
95
135
  end
96
136
  end
97
137
 
98
- # Removes a Widget from the Screen.
138
+ # Removes a Widget from this Screen.
99
139
  #
100
140
  # @note This is called automatically when a widget is destroyed.
101
141
  #
102
- # This does NOT destroy the object, it removes the Widget
142
+ # This does NOT destroy the widget, it removes the Widget
103
143
  # from any further refreshes by Screen#refresh.
104
144
  #
105
- # `rndktype` states what RNDK Widget type this object is.
106
- # `object` is a pointer to the Widget itself.
145
+ # `rndktype` states what RNDK Widget type this widget is.
146
+ # `widget` is a pointer to the Widget itself.
107
147
  #
108
- def self.unregister(rndktype, object)
109
- return if not (object.validObjType(rndktype) && object.screen_index >= 0)
110
-
111
- screen = object.screen
112
- return if screen.nil?
148
+ def unregister widget
149
+ return unless (widget.valid_type? and (widget.screen_index >= 0))
113
150
 
114
- index = object.screen_index
115
- object.screen_index = -1
151
+ index = widget.screen_index
152
+ widget.screen_index = -1
116
153
 
117
- # Resequence the objects
118
- (index...screen.object_count - 1).each do |x|
119
- screen.setScreenIndex(x, screen.object[x+1])
154
+ # Resequence the widgets
155
+ (index...self.widget_count - 1).each do |x|
156
+ self.set_screen_index(x, self.widget[x+1])
120
157
  end
121
158
 
122
- if screen.object_count <= 1
123
- # if no more objects, remove the array
124
- screen.object = []
125
- screen.object_count = 0
126
- screen.object_limit = 0
127
- else
128
- screen.object[screen.object_count] = nil
129
- screen.object_count -= 1
130
-
131
- # Update the object-focus
132
- if screen.object_focus == index
133
- screen.object_focus -= 1
134
- Traverse.setRNDKFocusNext(screen)
135
-
136
- elsif screen.object_focus > index
137
- screen.object_focus -= 1
138
- end
139
- end
140
- end
159
+ if self.widget_count <= 1
160
+ # if no more widgets, remove the array
161
+ self.widget = []
162
+ self.widget_count = 0
163
+ self.widget_limit = 0
141
164
 
142
- def setScreenIndex(number, obj)
143
- obj.screen_index = number
144
- obj.screen = self
145
- @object[number] = obj
146
- end
165
+ else
166
+ self.widget[self.widget_count] = nil
167
+ self.widget_count -= 1
147
168
 
148
- def validIndex(n)
149
- n >= 0 && n < @object_count
150
- end
169
+ # Update the widget-focus
170
+ if self.widget_focus == index
171
+ self.widget_focus -= 1
172
+ Traverse.set_next_focus(screen)
151
173
 
152
- def swapRNDKIndices(n1, n2)
153
- if n1 != n2 && self.validIndex(n1) && self.validIndex(n2)
154
- o1 = @object[n1]
155
- o2 = @object[n2]
156
- self.setScreenIndex(n1, o2)
157
- self.setScreenIndex(n2, o1)
158
-
159
- if @object_focus == n1
160
- @object_focus = n2
161
- elsif @object_focus == n2
162
- @object_focus = n1
174
+ elsif self.widget_focus > index
175
+ self.widget_focus -= 1
163
176
  end
164
177
  end
165
178
  end
@@ -167,21 +180,21 @@ module RNDK
167
180
  # Raises the Widget to the top of the screen.
168
181
  # It will now overlap any other obstructing Widgets.
169
182
  #
170
- # `rndktype` states what RNDK Widget type this object is.
171
- # `object` is a pointer to the Widget itself.
183
+ # `rndktype` states what RNDK Widget type this widget is.
184
+ # `widget` is a pointer to the Widget itself.
172
185
  #
173
- def self.raise_widget(rndktype, object)
174
- if object.validObjType(rndktype)
175
- screen = object.screen
176
- screen.swapRNDKIndices(object.screen_index, screen.object_count - 1)
177
- end
186
+ def self.raise_widget widget
187
+ return unless widget.valid_type?
188
+
189
+ screen = widget.screen
190
+ screen.swap_indexes(widget.screen_index, screen.widget_count - 1)
178
191
  end
179
192
 
180
193
  # Has the opposite effect of #raise_widget.
181
- def self.lower_widget(rndktype, object)
182
- if object.validObjType(rndktype)
183
- object.screen.swapRNDKIndices(object.screen_index, 0)
184
- end
194
+ def self.lower_widget widget
195
+ return unless widget.valid_type?
196
+
197
+ widget.screen.swap_indexes(widget.screen_index, 0)
185
198
  end
186
199
 
187
200
  # Redraws all Widgets inside this Screen.
@@ -196,12 +209,12 @@ module RNDK
196
209
 
197
210
  RNDK.window_refresh(@window)
198
211
 
199
- # We erase all the invisible objects, then only draw it all back, so
200
- # that the objects can overlap, and the visible ones will always be
212
+ # We erase all the invisible widgets, then only draw it all back, so
213
+ # that the widgets can overlap, and the visible ones will always be
201
214
  # drawn after all the invisible ones are erased
202
- (0...@object_count).each do |x|
203
- obj = @object[x]
204
- if obj.validObjType(obj.object_type)
215
+ (0...@widget_count).each do |x|
216
+ obj = @widget[x]
217
+ if obj.valid_type?
205
218
  if obj.is_visible
206
219
  if visible < 0
207
220
  visible = x
@@ -215,14 +228,14 @@ module RNDK
215
228
  end
216
229
  end
217
230
 
218
- (0...@object_count).each do |x|
219
- obj = @object[x]
231
+ (0...@widget_count).each do |x|
232
+ obj = @widget[x]
220
233
 
221
- if obj.validObjType(obj.object_type)
234
+ if obj.valid_type?
222
235
  obj.has_focus = (x == focused)
223
236
 
224
237
  if obj.is_visible
225
- obj.draw(obj.box)
238
+ obj.draw
226
239
  end
227
240
  end
228
241
  end
@@ -234,28 +247,29 @@ module RNDK
234
247
  # characters on the terminal screen.
235
248
  # This does NOT destroy any widgets.
236
249
  def erase
237
- (0...@object_count).each do |x|
238
- obj = @object[x]
239
- obj.erase if obj.validObjType obj.object_type
250
+ (0...@widget_count).each do |x|
251
+ obj = @widget[x]
252
+ obj.erase if obj.valid_type?
240
253
  end
241
254
  Ncurses.wrefresh(@window)
242
255
  end
243
256
 
244
257
  # Destroys all the Widgets inside this Screen.
245
258
  def destroy_widgets
246
- (0...@object_count).each do |x|
247
- obj = @object[x]
248
- before = @object_count
259
+ (0...@widget_count).each do |x|
260
+ obj = @widget[x]
261
+ before = @widget_count
249
262
 
250
- if obj.validObjType(obj.object_type)
263
+ if obj.valid_type?
251
264
  obj.erase
252
265
  obj.destroy
253
- x -= (@object_count - before)
266
+ x -= (@widget_count - before)
254
267
  end
255
268
  end
256
269
  end
257
270
 
258
271
  # Destroys this Screen.
272
+ #
259
273
  # @note It does nothing to the widgets inside it.
260
274
  # You must either destroy them separatedly
261
275
  # or call #destroy_widgets before.
@@ -263,6 +277,35 @@ module RNDK
263
277
  RNDK::ALL_SCREENS.delete self
264
278
  end
265
279
 
280
+ protected
281
+
282
+ def set_screen_index(number, obj)
283
+ obj.screen_index = number
284
+ obj.screen = self
285
+ @widget[number] = obj
286
+ end
287
+
288
+ def valid_index? n
289
+ (n >= 0) and (n < @widget_count)
290
+ end
291
+
292
+ # Swap positions of widgets with indexes `n1` and `n2`.
293
+ def swap_indexes(n1, n2)
294
+ return unless (n1 != n2) and (self.valid_index? n1) and (self.valid_index? n2)
295
+
296
+ o1 = @widget[n1]
297
+ o2 = @widget[n2]
298
+ self.set_screen_index(n1, o2)
299
+ self.set_screen_index(n2, o1)
300
+
301
+ if @widget_focus == n1
302
+ @widget_focus = n2
303
+
304
+ elsif @widget_focus == n2
305
+ @widget_focus = n1
306
+ end
307
+ end
308
+
266
309
  end
267
310
  end
268
311
 
@@ -1,43 +1,128 @@
1
1
  module RNDK
2
+
3
+ #
4
+ #
2
5
  module Traverse
3
- def Traverse.resetRNDKScreen(screen)
4
- refreshDataRNDKScreen(screen)
6
+
7
+ # Traverse the screen just one time.
8
+ def Traverse.once(screen,
9
+ curobj,
10
+ key_code,
11
+ function_key,
12
+ func_menu_key)
13
+
14
+ case key_code
15
+ when Ncurses::KEY_BTAB
16
+ switch_focus(set_previous_focus(screen), curobj)
17
+
18
+ when RNDK::KEY_TAB
19
+ switch_focus(set_next_focus(screen), curobj)
20
+
21
+ when RNDK.KEY_F(10)
22
+ # save data and exit
23
+ exit_ok(screen)
24
+
25
+ when RNDK.CTRL('X')
26
+ exit_cancel screen
27
+
28
+ when RNDK.CTRL('R')
29
+ # reset data to defaults
30
+ reset(screen)
31
+ set_focus(curobj)
32
+
33
+ when RNDK::REFRESH
34
+ # redraw screen
35
+ screen.refresh
36
+ set_focus(curobj)
37
+
38
+ else
39
+ # not everyone wants menus, so we make them optional here
40
+ if !(func_menu_key.nil?) &&
41
+ (func_menu_key.call(key_code, function_key))
42
+ # find and enable drop down menu
43
+ screen.widget.each do |widget|
44
+ if !(widget.nil?) && widget.widget_type == :MENU
45
+ Traverse.handleMenu(screen, widget, curobj)
46
+ end
47
+ end
48
+
49
+ else
50
+ curobj.inject(key_code)
51
+ end
52
+ end
53
+ end
54
+
55
+ # Traverse continuously the widgets on a screen.
56
+ def Traverse.over screen
57
+ result = 0
58
+ curobj = set_first_focus(screen)
59
+
60
+ unless curobj.nil?
61
+ refresh_data(screen)
62
+
63
+ screen.exit_status = RNDK::Screen::NOEXIT
64
+
65
+ while !((curobj = get_current_focus(screen)).nil?) &&
66
+ screen.exit_status == RNDK::Screen::NOEXIT
67
+ function = []
68
+ key = curobj.getch(function)
69
+
70
+ # TODO look at more direct way to do this
71
+ check_menu_key = lambda do |key_code, function_key|
72
+ Traverse.checkMenuKey(key_code, function_key)
73
+ end
74
+
75
+
76
+ Traverse.once(screen, curobj, key,
77
+ function[0], check_menu_key)
78
+ end
79
+
80
+ if screen.exit_status == RNDK::Screen::EXITOK
81
+ save_data(screen)
82
+ result = 1
83
+ end
84
+ end
85
+ return result
86
+ end
87
+
88
+ def Traverse.reset screen
89
+ refresh_data(screen)
5
90
  end
6
91
 
7
- def Traverse.exitOKRNDKScreen(screen)
92
+ def Traverse.exit_ok screen
8
93
  screen.exit_status = RNDK::Screen::EXITOK
9
94
  end
10
95
 
11
- def Traverse.exitCancelRNDKScreen(screen)
96
+ def Traverse.exit_cancel screen
12
97
  screen.exit_status = RNDK::Screen::EXITCANCEL
13
98
  end
14
99
 
15
- def Traverse.exitOKRNDKScreenOf(obj)
16
- exitOKRNDKScreen(obj.screen)
100
+ def Traverse.exit_ok_of(obj)
101
+ exit_ok obj.screen
17
102
  end
18
103
 
19
- def Traverse.exitCancelRNDKScreenOf(obj)
20
- exitCancelRNDKScreen(obj.screen)
104
+ def Traverse.exit_cancel_of(obj)
105
+ exit_cancel obj.screen
21
106
  end
22
107
 
23
- def Traverse.resetRNDKScreenOf(obj)
24
- resetRNDKScreen(obj.screen)
108
+ def Traverse.reset_of(obj)
109
+ reset(obj.screen)
25
110
  end
26
111
 
27
- # Returns the object on which the focus lies.
28
- def Traverse.getRNDKFocusCurrent(screen)
112
+ # Returns the widget on which the focus lies.
113
+ def Traverse.get_current_focus(screen)
29
114
  result = nil
30
- n = screen.object_focus
115
+ n = screen.widget_focus
31
116
 
32
- if n >= 0 && n < screen.object_count
33
- result = screen.object[n]
117
+ if n >= 0 && n < screen.widget_count
118
+ result = screen.widget[n]
34
119
  end
35
120
 
36
121
  return result
37
122
  end
38
123
 
39
- # Set focus to the next object, returning it.
40
- def Traverse.setRNDKFocusNext(screen)
124
+ # Set focus to the next widget, returning it.
125
+ def Traverse.set_next_focus(screen)
41
126
  result = nil
42
127
  curobj = nil
43
128
  n = getFocusIndex(screen)
@@ -45,10 +130,10 @@ module RNDK
45
130
 
46
131
  while true
47
132
  n+= 1
48
- if n >= screen.object_count
133
+ if n >= screen.widget_count
49
134
  n = 0
50
135
  end
51
- curobj = screen.object[n]
136
+ curobj = screen.widget[n]
52
137
  if !(curobj.nil?) && curobj.accepts_focus
53
138
  result = curobj
54
139
  break
@@ -59,12 +144,12 @@ module RNDK
59
144
  end
60
145
  end
61
146
 
62
- setFocusIndex(screen, if !(result.nil?) then n else -1 end)
147
+ set_focusIndex(screen, if !(result.nil?) then n else -1 end)
63
148
  return result
64
149
  end
65
150
 
66
- # Set focus to the previous object, returning it.
67
- def Traverse.setRNDKFocusPrevious(screen)
151
+ # Set focus to the previous widget, returning it.
152
+ def Traverse.set_previous_focus(screen)
68
153
  result = nil
69
154
  curobj = nil
70
155
  n = getFocusIndex(screen)
@@ -73,9 +158,9 @@ module RNDK
73
158
  while true
74
159
  n -= 1
75
160
  if n < 0
76
- n = screen.object_count - 1
161
+ n = screen.widget_count - 1
77
162
  end
78
- curobj = screen.object[n]
163
+ curobj = screen.widget[n]
79
164
  if !(curobj.nil?) && curobj.accepts_focus
80
165
  result = curobj
81
166
  break
@@ -84,13 +169,13 @@ module RNDK
84
169
  end
85
170
  end
86
171
 
87
- setFocusIndex(screen, if !(result.nil?) then n else -1 end)
172
+ set_focusIndex(screen, if !(result.nil?) then n else -1 end)
88
173
  return result
89
174
  end
90
175
 
91
- # Set focus to a specific object, returning it.
92
- # If the object cannot be found, return nil.
93
- def Traverse.setRNDKFocusCurrent(screen, newobj)
176
+ # Set focus to a specific widget, returning it.
177
+ # If the widget cannot be found, return nil.
178
+ def Traverse.set_current_focus(screen, newobj)
94
179
  result = nil
95
180
  curobj = nil
96
181
  n = getFocusIndex(screen)
@@ -98,11 +183,11 @@ module RNDK
98
183
 
99
184
  while true
100
185
  n += 1
101
- if n >= screen.object_count
186
+ if n >= screen.widget_count
102
187
  n = 0
103
188
  end
104
189
 
105
- curobj = screen.object[n]
190
+ curobj = screen.widget[n]
106
191
  if curobj == newobj
107
192
  result = curobj
108
193
  break
@@ -111,95 +196,26 @@ module RNDK
111
196
  end
112
197
  end
113
198
 
114
- setFocusIndex(screen, if !(result.nil?) then n else -1 end)
199
+ set_focusIndex(screen, if !(result.nil?) then n else -1 end)
115
200
  return result
116
201
  end
117
202
 
118
- # Set focus to the first object in the screen.
119
- def Traverse.setRNDKFocusFirst(screen)
120
- setFocusIndex(screen, screen.object_count - 1)
121
- return switchFocus(setRNDKFocusNext(screen), nil)
203
+ # Set focus to the first widget in the screen.
204
+ def Traverse.set_first_focus(screen)
205
+ set_focusIndex(screen, screen.widget_count - 1)
206
+ return switch_focus(set_next_focus(screen), nil)
122
207
  end
123
208
 
124
- # Set focus to the last object in the screen.
125
- def Traverse.setRNDKFocusLast(screen)
126
- setFocusIndex(screen, 0)
127
- return switchFocus(setRNDKFocusPrevious(screen), nil)
128
- end
129
-
130
- def Traverse.traverseRNDKOnce(screen, curobj, key_code,
131
- function_key, func_menu_key)
132
- case key_code
133
- when Ncurses::KEY_BTAB
134
- switchFocus(setRNDKFocusPrevious(screen), curobj)
135
- when RNDK::KEY_TAB
136
- switchFocus(setRNDKFocusNext(screen), curobj)
137
- when RNDK.KEY_F(10)
138
- # save data and exit
139
- exitOKRNDKScreen(screen)
140
- when RNDK.CTRL('X')
141
- exitCancelRNDKScreen(screen)
142
- when RNDK.CTRL('R')
143
- # reset data to defaults
144
- resetRNDKScreen(screen)
145
- setFocus(curobj)
146
- when RNDK::REFRESH
147
- # redraw screen
148
- screen.refresh
149
- setFocus(curobj)
150
- else
151
- # not everyone wants menus, so we make them optional here
152
- if !(func_menu_key.nil?) &&
153
- (func_menu_key.call(key_code, function_key))
154
- # find and enable drop down menu
155
- screen.object.each do |object|
156
- if !(object.nil?) && object.object_type == :MENU
157
- Traverse.handleMenu(screen, object, curobj)
158
- end
159
- end
160
- else
161
- curobj.inject(key_code)
162
- end
163
- end
164
- end
165
-
166
- # Traverse the widgets on a screen.
167
- def Traverse.traverseRNDKScreen(screen)
168
- result = 0
169
- curobj = setRNDKFocusFirst(screen)
170
-
171
- unless curobj.nil?
172
- refreshDataRNDKScreen(screen)
173
-
174
- screen.exit_status = RNDK::Screen::NOEXIT
175
-
176
- while !((curobj = getRNDKFocusCurrent(screen)).nil?) &&
177
- screen.exit_status == RNDK::Screen::NOEXIT
178
- function = []
179
- key = curobj.getch(function)
180
-
181
- # TODO look at more direct way to do this
182
- check_menu_key = lambda do |key_code, function_key|
183
- Traverse.checkMenuKey(key_code, function_key)
184
- end
185
-
186
-
187
- Traverse.traverseRNDKOnce(screen, curobj, key,
188
- function[0], check_menu_key)
189
- end
190
-
191
- if screen.exit_status == RNDK::Screen::EXITOK
192
- saveDataRNDKScreen(screen)
193
- result = 1
194
- end
195
- end
196
- return result
209
+ # Set focus to the last widget in the screen.
210
+ def Traverse.set_last_focus(screen)
211
+ set_focusIndex(screen, 0)
212
+ return switch_focus(set_previous_focus(screen), nil)
197
213
  end
198
214
 
199
215
  private
200
216
 
201
217
  def Traverse.limitFocusIndex(screen, value)
202
- if value >= screen.object_count || value < 0
218
+ if value >= screen.widget_count || value < 0
203
219
  0
204
220
  else
205
221
  value
@@ -207,33 +223,33 @@ module RNDK
207
223
  end
208
224
 
209
225
  def Traverse.getFocusIndex(screen)
210
- return limitFocusIndex(screen, screen.object_focus)
226
+ return limitFocusIndex(screen, screen.widget_focus)
211
227
  end
212
228
 
213
- def Traverse.setFocusIndex(screen, value)
214
- screen.object_focus = limitFocusIndex(screen, value)
229
+ def Traverse.set_focusIndex(screen, value)
230
+ screen.widget_focus = limitFocusIndex(screen, value)
215
231
  end
216
232
 
217
- def Traverse.unsetFocus(obj)
218
- Ncurses.curs_set(0)
233
+ def Traverse.unset_focus(obj)
234
+ RNDK::blink_cursor false
219
235
  unless obj.nil?
220
236
  obj.has_focus = false
221
237
  obj.unfocus
222
238
  end
223
239
  end
224
240
 
225
- def Traverse.setFocus(obj)
241
+ def Traverse.set_focus(obj)
226
242
  unless obj.nil?
227
243
  obj.has_focus = true
228
244
  obj.focus
229
245
  end
230
- Ncurses.curs_set(1)
246
+ RNDK::blink_cursor true
231
247
  end
232
248
 
233
- def Traverse.switchFocus(newobj, oldobj)
249
+ def Traverse.switch_focus(newobj, oldobj)
234
250
  if oldobj != newobj
235
- Traverse.unsetFocus(oldobj)
236
- Traverse.setFocus(newobj)
251
+ Traverse.unset_focus(oldobj)
252
+ Traverse.set_focus(newobj)
237
253
  end
238
254
  return newobj
239
255
  end
@@ -245,9 +261,9 @@ module RNDK
245
261
  def Traverse.handleMenu(screen, menu, oldobj)
246
262
  done = false
247
263
 
248
- switchFocus(menu, oldobj)
264
+ switch_focus(menu, oldobj)
249
265
  while !done
250
- key = menu.getch([])
266
+ key = menu.getch
251
267
 
252
268
  case key
253
269
  when RNDK::KEY_TAB
@@ -261,29 +277,27 @@ module RNDK
261
277
  end
262
278
  end
263
279
 
264
- if (newobj = Traverse.getRNDKFocusCurrent(screen)).nil?
265
- newobj = Traverse.setRNDKFocusNext(screen)
280
+ if (newobj = Traverse.get_current_focus(screen)).nil?
281
+ newobj = Traverse.set_next_focus(screen)
266
282
  end
267
283
 
268
- return switchFocus(newobj, menu)
284
+ return switch_focus(newobj, menu)
269
285
  end
270
286
 
271
- # Save data in widgets on a screen
272
- def Traverse.saveDataRNDKScreen(screen)
273
- screen.object.each do |object|
274
- unless object.nil?
275
- object.saveData
276
- end
287
+ # Calls Widget#save_data on all widgets of `screen`.
288
+ def Traverse.save_data screen
289
+ screen.widget.each do |widget|
290
+ widget.save_data unless widget.nil?
277
291
  end
278
292
  end
279
293
 
280
- # Refresh data in widgets on a screen
281
- def Traverse.refreshDataRNDKScreen(screen)
282
- screen.object.each do |object|
283
- unless object.nil?
284
- object.refreshData
285
- end
294
+ # Calls Widget#refresh_data on all widgets of `screen`.
295
+ def Traverse.refresh_data screen
296
+ screen.widget.each do |widget|
297
+ widget.refresh_data unless widget.nil?
286
298
  end
287
299
  end
300
+
288
301
  end
289
302
  end
303
+