ncumbra 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/examples/ex1.rb CHANGED
@@ -70,18 +70,17 @@ begin
70
70
  when FFI::NCurses::KEY_UP
71
71
  when FFI::NCurses::KEY_DOWN
72
72
  end
73
- #FIXME after scrolling, pointer is showing wrong file here
74
73
  statusline(win, "Pressed #{ch} on ", 70)
75
74
  win.wrefresh
76
75
  end
77
76
 
78
77
  rescue Object => e
79
- @window.destroy if @window
78
+ win.destroy if win
80
79
  FFI::NCurses.endwin
81
80
  puts e
82
81
  puts e.backtrace.join("\n")
83
82
  ensure
84
- @window.destroy if @window
83
+ win.destroy if win
85
84
  FFI::NCurses.endwin
86
85
  puts
87
86
  end
data/examples/ex3.rb CHANGED
@@ -84,18 +84,17 @@ begin
84
84
  message_label.text = "UNToggle button was pressed"
85
85
  end
86
86
  # we need this since we have done away with dsl_property
87
- message_label.repaint_required = true
87
+ #message_label.repaint_required = true
88
88
  end
89
89
  form.add_widget togglebutton
90
90
 
91
- check = Checkbox.new text: "No Frames", value: true, row: row+1, col: col, mnemonic: "N"
91
+ check = Checkbox.new text: "No Frames", value: true, row: row+1, col: col, mnemonic: "N"
92
92
  check1 = Checkbox.new text: "Use https", value: false, row: row+2, col: col, mnemonic: "U"
93
93
  row += 2
94
94
  form.add_widget check, check1
95
95
  [ check, check1 ].each do |cb|
96
96
  cb.command do
97
97
  message_label.text = "#{cb.text} is now #{cb.value}"
98
- message_label.repaint_required = true
99
98
  end
100
99
  end
101
100
 
data/examples/ex4.rb CHANGED
@@ -66,7 +66,6 @@ begin
66
66
  #lb.border false
67
67
  box.title = "Untoggled"
68
68
  end
69
- box.repaint_required = true
70
69
  end
71
70
  # bind the most common event for a listbox which is ENTER_ROW
72
71
  lb.command do |ix|
@@ -105,7 +104,7 @@ begin
105
104
  end
106
105
  # bind to another event of listbox
107
106
  lb.bind_event(:LEAVE_ROW) { |ix| statusline(win, "LEFT ROW #{ix.first}", 50) }
108
- lb.bind_event(:LIST_SELECTION_EVENT) { |w| alert("You selected row #{w.selected_index || "none"} ") }
107
+ lb.bind_event(:SELECT_ROW) { |w| alert("You selected row #{w.selected_index || "none"} ") }
109
108
  form.add_widget box, lb
110
109
  form.add_widget tb
111
110
  form.add_widget ab
data/examples/ex5.rb CHANGED
@@ -62,10 +62,11 @@ begin
62
62
  else
63
63
  box.justify = :left
64
64
  end
65
- box.repaint_required = true
65
+ #box.repaint_required = true
66
66
  end
67
- lb.bind_event(:CURSOR_MOVE) {|arr|
68
- col_offset , current_index, curpos, pcol = arr
67
+ #lb.bind_event(:CURSOR_MOVE) {|arr|
68
+ lb.bind_event(:CURSOR_MOVE) {|lb|
69
+ col_offset , current_index, curpos, pcol = lb.col_offset, lb.current_index, lb.curpos, lb.panned_cols
69
70
  blen = lb.current_row().size
70
71
  statusline(win, "offset: #{col_offset} , curpos: #{curpos} , currind: #{current_index} , pcol #{pcol}, len:#{blen}.....", 20)
71
72
  }
data/examples/exbox.rb CHANGED
@@ -104,7 +104,7 @@ begin
104
104
  end
105
105
  # bind to another event of listbox
106
106
  lb.bind_event(:LEAVE_ROW) { |ix| statusline(win, "LEFT ROW #{ix.first}", 50) }
107
- lb.bind_event(:LIST_SELECTION_EVENT) { |w| alert("You selected row #{w.selected_index || "none"} ") }
107
+ lb.bind_event(:SELECT_ROW) { |w| alert("You selected row #{w.selected_index || "none"} ") }
108
108
  form.add_widget lb, lb2
109
109
  form.add_widget tb
110
110
  form.add_widget ab
data/examples/extab3.rb CHANGED
@@ -5,7 +5,7 @@
5
5
  # Author: j kepler http://github.com/mare-imbrium/umbra/
6
6
  # Date: 2018-05-11
7
7
  # License: MIT
8
- # Last update: 2018-05-23 08:34
8
+ # Last update: 2018-06-01 12:26
9
9
  # ----------------------------------------------------------------------------- #
10
10
  # extab3.rb Copyright (C) 2018 j kepler
11
11
  require 'umbra'
@@ -127,7 +127,6 @@ def _filter_table(lb, columns, fields)
127
127
  $log.debug " ibv: #{bind_vars.join ', '} "
128
128
  alist = @db.execute( sql, bind_vars)
129
129
  if alist #and !alist.empty?
130
- #lb.list = alist ## results in error, FIXME
131
130
  lb.data = alist
132
131
  else
133
132
  #alert "No rows returned. Check your query"
data/lib/umbra.rb CHANGED
@@ -65,6 +65,7 @@ module Umbra
65
65
  end
66
66
 
67
67
  ## create a logger instance given a path, return the logger
68
+ ## NOTE: Ideally would like to set $log here to this, but what if user creates multiple.
68
69
  def create_logger path, config={}
69
70
  require 'logger'
70
71
  _path = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
@@ -86,6 +87,7 @@ module Umbra
86
87
  while true
87
88
  catch :close do
88
89
  while( ch = win.getkey) != 999
90
+ next if ch == -1 ## should we put this here ???
89
91
  begin
90
92
  if ch == curses::KEY_CTRL_Q
91
93
  stopping = true
data/lib/umbra/box.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  # Author: j kepler http://github.com/mare-imbrium/canis/
5
5
  # Date: 2018-04-07
6
6
  # License: MIT
7
- # Last update: 2018-05-22 14:44
7
+ # Last update: 2018-05-27 16:14
8
8
  # ----------------------------------------------------------------------------- #
9
9
  # box.rb Copyright (C) 2018 j kepler
10
10
  module Umbra
@@ -33,7 +33,7 @@ module Umbra
33
33
  #@int_width = @width - 2
34
34
  @int_width = self.width - 2
35
35
  @hlines = []
36
- @vlines = []
36
+ #@vlines = [] # UNUSED. TODO ???
37
37
  end
38
38
  def repaint
39
39
  return unless @visible
@@ -44,9 +44,10 @@ module Umbra
44
44
  end
45
45
  # what about asking for painting of widgets
46
46
  end
47
- # should we take in an array and apportion them
48
- # since we are keeping a row in between as divider, need to adjust heights.
49
- # Depending on how many components
47
+
48
+ ##
49
+ ## Add a variable list of components to a box, which are stacked horizontally by the box.
50
+ ## @param comma separated list of widgets
50
51
  def add *w
51
52
  @widgets = w
52
53
  num = w.size
@@ -65,8 +66,14 @@ module Umbra
65
66
  # FIXME there will be one additional hline in the end.
66
67
  w[-1].height -= (num-1)
67
68
  end
68
- # this is best used for widgets that can be resized.
69
- # Prefer not to use for buttons since the looks gets messed (inconsistency betwewn button and highlight).
69
+ alias :stack :add
70
+
71
+
72
+ ##
73
+ ## Horizontally place an array of widgets
74
+ ## @param comma separated list of widgets
75
+ ## NOTE: this is best used for widgets that can be resized.
76
+ # Prefer not to use for buttons since the looks gets messed (inconsistency between button and highlight).
70
77
  # Therefore now, button calculates its own width which means that this program cannot determine what the width is
71
78
  # and thus cannot center it.
72
79
  def flow *w
@@ -90,7 +97,11 @@ module Umbra
90
97
  # we added 1 to the scol each time, so decrement
91
98
  w[-1].width -= (num-1)
92
99
  end
93
- # use if only one widget will expand into this box
100
+
101
+
102
+ ## Fill out a single widget into the entire box leaving an inset of 1.
103
+ ## @param [Widget]
104
+ # NOTE: use if only one widget will expand into this box
94
105
  def fill w
95
106
  # should have been nice if I could add widget to form, but then order might get wrong
96
107
  w.row = self.row + 1
@@ -111,6 +122,10 @@ module Umbra
111
122
  end
112
123
  @widget = w
113
124
  end
125
+
126
+ ## paint a horizontal line, as a separator between widgets
127
+ ## param [Integer] row - row
128
+ ## param [Integer] col - column
114
129
  def hline row, col
115
130
  return if row >= self.row + self.height
116
131
  $log.debug " hline: #{row} ... #{@row} #{@height} "
@@ -118,7 +133,6 @@ module Umbra
118
133
  end
119
134
 
120
135
  # print a title over the box on zeroth row
121
- # TODO right or left or center align
122
136
  private def print_title stitle
123
137
  return unless stitle
124
138
  stitle = "| #{stitle} |"
data/lib/umbra/button.rb CHANGED
@@ -5,39 +5,43 @@
5
5
  # Author: j kepler http://github.com/mare-imbrium/canis/
6
6
  # Date: 2018-03-16
7
7
  # License: MIT
8
- # Last update: 2018-04-07 23:07
8
+ # Last update: 2018-06-01 12:37
9
9
  # ----------------------------------------------------------------------------- #
10
10
  # button.rb Copyright (C) 2012-2018 j kepler
11
- # == TODO
11
+ # == Todo
12
12
  # - mnemonics with highlighting
13
13
  # - default button
14
14
  require 'umbra/widget'
15
15
  # ----------------
16
16
  module Umbra
17
+
18
+
17
19
  class Button < Widget
18
20
  attr_accessor :surround_chars # characters to use to surround the button, def is square brackets
21
+
19
22
  # char to be underlined, and bound to Alt-char
20
23
  attr_accessor :mnemonic
24
+
25
+
21
26
  def initialize config={}, &block
22
27
  @focusable = true
23
28
  @editable = false
24
29
  @highlight_attr = REVERSE
25
- # hotkey denotes we should bind the key itself not alt-key (for menulinks)
26
- #@hotkey = config.delete(:hotkey) 2018-03-22 -
27
- # 2018-03-18 - FORM_ATTACHED deprecated to keep things simple
30
+
28
31
  register_events([:PRESS])
29
- @default_chars = ['> ', ' <'] # a default button is painted differently
32
+ @default_chars = ['> ', ' <'] # a default button is painted differently. UNUSED. ???
30
33
  super
31
34
 
32
-
33
35
  @surround_chars ||= ['[ ', ' ]']
34
36
  @col_offset = @surround_chars[0].length
35
37
  @text_offset = 0 # used to determine where underline should fall TODO ???
36
38
  map_keys
37
39
  end
40
+
41
+
38
42
  ##
39
43
  # set button based on Action
40
- # 2018-03-22 - is this still used ?
44
+ # 2018-03-22 - is this still used ? XXX
41
45
  # This allows action objects to be used in multiple places such as buttons, menus, popups etc.
42
46
  def action a
43
47
  text a.name
@@ -91,16 +95,11 @@ module Umbra
91
95
  @repaint_required = false
92
96
  end
93
97
 
94
- ## command of button (invoked on press, hotkey, space)
95
- # added args 2008-12-20 19:22
96
- def command *args, &block
97
- bind_event :PRESS, *args, &block
98
- end
99
98
  ## fires PRESS event of button
100
99
  def fire
101
- #$log.debug "firing PRESS #{text}"
102
100
  fire_handler :PRESS, ActionEvent.new(self, :PRESS, text)
103
101
  end
102
+
104
103
  # for campatibility with all buttons, will apply to radio buttons mostly
105
104
  def selected?; false; end
106
105
 
@@ -4,7 +4,7 @@
4
4
  # Author: j kepler http://github.com/mare-imbrium/canis/
5
5
  # Date: 2018-04-01 - 16:08
6
6
  # License: MIT
7
- # Last update: 2018-05-14 14:34
7
+ # Last update: 2018-05-28 12:06
8
8
  # ----------------------------------------------------------------------------- #
9
9
  # checkbox.rb Copyright (C) 2012-2018 j kepler
10
10
  module Umbra
@@ -12,8 +12,8 @@ module Umbra
12
12
  # A checkbox, may be selected or unselected
13
13
  #
14
14
  class Checkbox < ToggleButton
15
- attr_property :align_right # the button will be on the right 2008-12-09 23:41
16
- # if a variable has been defined, off and on value will be set in it (default 0,1)
15
+ attr_property :align_right # the button will be on the right of the text
16
+
17
17
  def initialize config={}, &block
18
18
  @surround_chars = ['[', ']'] # 2008-12-23 23:16 added space in Button so overriding
19
19
  super
@@ -73,11 +73,10 @@ module Umbra
73
73
  raise pve
74
74
  rescue => ex
75
75
  ## some don't have name
76
- # FIXME this should be displayed somewhere. It just goes into log file quietly.
77
76
  $log.error "======= Error ERROR in block event #{self}: #{event}"
78
77
  $log.error ex
79
78
  $log.error(ex.backtrace.join("\n"))
80
- alert ex.to_s # added 2018-04-08 - 08:55 so it shows up
79
+ alert ex.to_s
81
80
  FFI::NCurses.beep # doesn't do anything, maybe switched off in preferences
82
81
  end
83
82
  end
@@ -112,8 +111,8 @@ module Umbra
112
111
  else
113
112
  @pce.set( self, text, oldvalue, newvalue)
114
113
  end
115
- fire_handler :PROPERTY_CHANGE, @pce
116
114
  @repaint_required = true
115
+ fire_handler :PROPERTY_CHANGE, @pce
117
116
  end
118
117
 
119
118
  ## Created and sent to all listeners whenever a property is changed
data/lib/umbra/field.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  # Author: j kepler http://github.com/mare-imbrium/canis/
5
5
  # Date: 2018-03
6
6
  # License: MIT
7
- # Last update: 2018-05-17 12:20
7
+ # Last update: 2018-05-26 11:21
8
8
  # ----------------------------------------------------------------------------- #
9
9
  # field.rb Copyright (C) 2012-2018 j kepler
10
10
  #
@@ -37,7 +37,7 @@ class InputDataEvent # {{{
37
37
  end
38
38
  end # }}}
39
39
  # Text edit field
40
- # TODO :
40
+ # Todo :
41
41
  # NOTE: +width+ is the length of the display whereas +maxlen+ is the maximum size that the value
42
42
  # can take. Thus, +maxlen+ can exceed +width+. Currently, +maxlen+ defaults to +width+ which
43
43
  # defaults to 20.
@@ -45,7 +45,11 @@ end # }}}
45
45
  # == Example
46
46
  # f = Field.new text: "Some value", row: 10, col: 2
47
47
  #
48
- # Field introduces an event :CHANGE which is fired for each character deleted or inserted
48
+ # Field introduces an event :CHANGE which is fired for each character deleted or inserted.
49
+ ##
50
+ # ## Use the :CHANGED event handler for custom validations and throw a +FieldValidationException+ if
51
+ # ## the validation fails. This is called in the +on_leave+. You may pass a block to the +command+ method
52
+ ## for the same functionality.
49
53
  #
50
54
  module Umbra
51
55
  class Field < Widget
@@ -82,10 +86,10 @@ end # }}}
82
86
  attr_accessor :overwrite_mode # true or false INSERT OVERWRITE MODE
83
87
 
84
88
  # column on which field printed, usually the same as +col+ unless +label+ used.
85
- # Required by +History+ to popup field history.
89
+ # Required by +History+ to popup field history. UNUSED.
86
90
  attr_reader :field_col # column on which field is printed
87
91
  # required due to labels. Is updated after printing
88
- # # so can be nil if accessed early 2011-12-8
92
+ # # so can be nil if accessed early
89
93
 
90
94
  def initialize config={}, &block
91
95
  @buffer = String.new
@@ -262,15 +266,12 @@ end # }}}
262
266
 
263
267
 
264
268
  public
265
- ## Note that some older widgets like Field repaint every time the form.repaint
266
- ##+ is called, whether updated or not. I can't remember why this is, but
267
- ##+ currently I've not implemented events with these widgets. 2010-01-03 15:00
268
269
 
269
270
  def repaint
270
- return unless @repaint_required # 2010-11-20 13:13 its writing over a window i think TESTING
271
+ return unless @repaint_required
271
272
  $log.debug("repaint FIELD: #{name}, r:#{row} c:#{col},wid:#{width},maxlen: #{@maxlen},pcol:#{@pcol}, #{focusable} st: #{@state} ")
272
273
  @width = 1 if width == 0
273
- printval = getvalue_for_paint().to_s # added 2009-01-06 23:27
274
+ printval = getvalue_for_paint().to_s
274
275
  printval = mask()*printval.length unless @mask.nil?
275
276
  if !printval.nil?
276
277
  if printval.length > width # only show maxlen
@@ -329,8 +330,10 @@ end # }}}
329
330
  return if @delete_buffer.nil?
330
331
  #oldvalue = @buffer
331
332
  @buffer.insert @curpos, @delete_buffer
332
- fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos+@delete_buffer.length, self, :INSERT, 0, @delete_buffer) # 2010-09-11 13:01
333
+ fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos+@delete_buffer.length, self, :INSERT, 0, @delete_buffer)
333
334
  end
335
+
336
+
334
337
  ##
335
338
  # position cursor at start of field
336
339
  def cursor_home
@@ -435,7 +438,7 @@ end # }}}
435
438
  addcol -1 if adjust # move visual cursor back
436
439
  @modified = true
437
440
  end
438
- # upon leaving a field
441
+ # Upon leaving a field
439
442
  # returns false if value not valid as per values or valid_regex
440
443
  # 2008-12-22 12:40 if null_allowed, don't validate, but do fire_handlers
441
444
  def on_leave
@@ -457,8 +460,13 @@ end # }}}
457
460
  if !in_range?(val)
458
461
  raise FieldValidationException, "Field not matching range #{@valid_range}, above #{@above} or below #{@below} "
459
462
  end
463
+
464
+ ## 2018-05-24 - seems we were not calling the :CHANGED listeners at all.
465
+ fire_handler :CHANGED, self
466
+
460
467
  end
461
468
  # here is where we should set the forms modified to true - 2009-01
469
+ ## 2018-05-26 - what is the point of this ?
462
470
  if modified?
463
471
  @modified = true
464
472
  end
@@ -488,6 +496,7 @@ end # }}}
488
496
  end
489
497
  ##
490
498
  # overriding widget, check for value change
499
+ # 2018-05-26 - WHAT IS THE POINT of setting @modified if we have a different logic here
491
500
  def modified?
492
501
  getvalue() != @original_value
493
502
  end
@@ -495,6 +504,8 @@ end # }}}
495
504
  def text
496
505
  getvalue
497
506
  end
507
+
508
+ ## set default value of field
498
509
  def text=(val)
499
510
  return unless val # added 2010-11-17 20:11, dup will fail on nil
500
511
  # will bomb on integer or float etc !!
data/lib/umbra/form.rb CHANGED
@@ -41,6 +41,7 @@ class Form
41
41
  @active_index = nil
42
42
  @row = @col = 0 # 2018-03-07 - umbra
43
43
  @focusables = [] # focusable components
44
+ register_events(:RESIZE)
44
45
  instance_eval &block if block_given?
45
46
  @name ||= "" # for debugging
46
47
 
@@ -48,6 +49,8 @@ class Form
48
49
  #$error_message ||= Variable.new ""
49
50
 
50
51
  map_keys unless @keys_mapped
52
+ $log ||= create_logger '/dev/null' ## FIXME temporarily adding here. If user has not
53
+ ## specified a logger, create a quiet one.
51
54
  end
52
55
  ##
53
56
  # Add given widget to widget list and returns self
@@ -59,6 +62,7 @@ class Form
59
62
  next if @widgets.include? w
60
63
  # NOTE: if form created with nil window (messagebox), then this would have to happen later
61
64
  w.graphic = @window if @window # 2018-03-19 - prevent widget from needing to call form back
65
+ $log.warn "Window is nil in form.add_widget" unless @window
62
66
  w._form = self # 2018-04-20 - so that update_focusables can be called.
63
67
  @widgets << w
64
68
  end
@@ -72,12 +76,15 @@ class Form
72
76
  @widgets.delete widget
73
77
  @focusables.delete widget
74
78
  end
79
+
80
+
75
81
  # maintain a list of focusable objects so form can traverse between them easily.
76
82
  def update_focusables
77
83
  #$log.debug "1 inside update_focusables #{@focusables.count} "
78
84
  @focusables = @widgets.select { |w| w.focusable }
79
85
  #$log.debug "2 inside update_focusables #{@focusables.count} "
80
86
  end
87
+
81
88
  # Decide layout of objects. User has to call this after creating components
82
89
  # More may come here.
83
90
  def pack
@@ -117,7 +124,7 @@ class Form
117
124
  ## This ensures that whenever a widget is given focus, the on_leave of the previous widget
118
125
  ## is called, and the on_enter of this field is called.
119
126
  ## 2018-05-18 - rewrite of select_field which did not call on_leave
120
- def focussed_widget fld
127
+ def select_widget fld
121
128
 
122
129
  return nil unless fld ## no focusable
123
130
 
@@ -147,7 +154,7 @@ class Form
147
154
  repaint # 2018-03-21 - handle_key calls repaint, is this for cases not involving keypress ?
148
155
  @window.refresh
149
156
  end
150
- alias :select_field :focussed_widget
157
+ alias :select_field :select_widget
151
158
 
152
159
 
153
160
  # form repaint,calls repaint on each widget which will repaint it only if it has been modified since last call.
@@ -175,29 +182,26 @@ class Form
175
182
  end
176
183
  @window.wrefresh
177
184
  end
185
+
186
+
187
+
178
188
  # @return [Widget, nil] current field, nil if no focusable field
179
189
  ## NOTE 2018-05-17 - this is called by form in the very beginning when no field is actually focussed
180
190
  ## but active_index has been set to 0, so the on_enter has not been executed, but the handle_key
181
191
  ## is invoked.
182
192
  def get_current_field
183
- =begin
184
- #select_next_field if @active_index == -1
185
- return nil if @active_index.nil? # for forms that have no focusable field 2009-01-08 12:22
186
- @focusables[@active_index]
187
- =end
188
-
189
193
 
190
194
  ## rewrite on 2018-05-18 - so that on_enter is called for first field
191
195
  if @_focussed_widget.nil? ## when form handle_key first called
192
- focussed_widget @focusables.first
196
+ select_widget @focusables.first
193
197
  end
194
198
  return @_focussed_widget
195
199
 
196
200
  end
197
201
  alias :current_widget :get_current_field
202
+
203
+
198
204
  # take focus to first focusable field
199
- # we shoud not send to select_next. have a separate method to avoid bugs.
200
- # but check current_field, in case called from anotehr field TODO FIXME
201
205
  def select_first_field
202
206
  select_field 0
203
207
  end
@@ -213,31 +217,6 @@ class Form
213
217
 
214
218
 
215
219
 
216
- ##
217
- # puts focus on the given field/widget index
218
- # @param index of field in @widgets (or can be a Widget too)
219
- # XXX if called externally will not run a on_leave of previous field
220
- def OLDselect_field ix0
221
- if ix0.is_a? Widget
222
- ix0 = @focusables.index(ix0)
223
- end
224
- return if @focusables.nil? or @focusables.empty?
225
- $log.debug "inside select_field : #{ix0} ai #{@active_index}"
226
- f = @focusables[ix0]
227
- return if !f.focusable
228
- if f.focusable
229
- @active_index = ix0
230
- @row, @col = f.rowcol
231
- on_enter f
232
- # the wmove will be overwritten by repaint later, better to set row col
233
- _setrowcol @row, @col # 2018-03-21 - maybe this should be set after the repaint
234
-
235
- repaint # 2018-03-21 - handle_key calls repaint, is this for cases not involving keypress ?
236
- @window.refresh
237
- else
238
- $log.debug "inside select field ENABLED FALSE : act #{@active_index} ix0 #{ix0}"
239
- end
240
- end
241
220
 
242
221
  # put focus on next field
243
222
  # will cycle by default, unless navigation policy not :CYCLICAL
@@ -251,30 +230,10 @@ class Form
251
230
  end
252
231
  index = index ? index+1 : 0
253
232
  index = 0 if index >= @focusables.length # CYCLICAL 2018-03-11 -
254
- focussed_widget @focusables[index]
255
- =begin
256
- return :UNHANDLED if @focusables.nil? || @focusables.empty?
257
- if @active_index.nil? || @active_index == -1 # needs to be tested out A LOT
258
- @active_index = 0
259
- end
260
- f = @focusables[@active_index]
261
- # we need to call on_leave of this field or else state will never change back to normal
262
- on_leave f
263
- #index = @focusables.index(f)
264
- index = @active_index
265
- index = index ? index+1 : 0
266
- #f = @focusables[index]
267
- index = 0 if index >= @focusables.length # CYCLICAL 2018-03-11 -
268
- f = @focusables[index]
269
- if f
270
- select_field f
271
- return 0
272
- end
273
- #
274
- $log.debug "inside sele nxt field : NO NEXT #{@active_index} WL:#{@widgets.length}"
275
- return :NO_NEXT_FIELD
276
- =end
233
+ select_widget @focusables[index]
277
234
  end
235
+
236
+
278
237
  ##
279
238
  # put focus on previous field
280
239
  # will cycle by default, unless navigation policy not :CYCLICAL
@@ -291,27 +250,7 @@ class Form
291
250
  end
292
251
  index -= 1
293
252
  index = @focusables.length-1 if index < 0 # CYCLICAL 2018-03-11 -
294
- focussed_widget @focusables[index]
295
- =begin
296
- return :UNHANDLED if @focusables.nil? or @focusables.empty?
297
- #$log.debug "insdie sele prev field : #{@active_index} WL:#{@widgets.length}"
298
- if @active_index.nil?
299
- @active_index = @focusables.length
300
- end
301
-
302
- f = @focusables[@active_index]
303
- on_leave f
304
- index = @active_index
305
- index -= 1
306
- index = @focusables.length-1 if index < 0 # CYCLICAL 2018-03-11 -
307
- f = @focusables[index]
308
- if f
309
- select_field f
310
- return
311
- end
312
-
313
- return :NO_PREV_FIELD
314
- =end
253
+ select_widget @focusables[index]
315
254
  end
316
255
 
317
256
  private
@@ -366,37 +305,8 @@ class Form
366
305
  f.on_enter if f.respond_to? :on_enter
367
306
  end
368
307
 
369
- def OLD_process_key keycode, object, window
370
- return :UNHANDLED if @_key_map.nil?
371
- blk = @_key_map[keycode]
372
- $log.debug "XXX: _process key keycode #{keycode} #{blk.class}, #{self.class} "
373
- return :UNHANDLED if blk.nil?
374
-
375
- if blk.is_a? Symbol
376
- if respond_to? blk
377
- return send(blk, *@_key_args[keycode])
378
- else
379
- ## 2013-03-05 - 19:50 why the hell is there an alert here, nowhere else
380
- alert "This ( #{self.class} ) does not respond to #{blk.to_s} [PROCESS-KEY]"
381
- # added 2013-03-05 - 19:50 so called can know
382
- return :UNHANDLED
383
- end
384
- else
385
- $log.debug "rwidget BLOCK called _process_key " if $log.debug?
386
- return blk.call object, *@_key_args[keycode]
387
- end
388
- end # }}}
389
308
 
390
309
  public
391
- # e.g. process_key ch, self {{{
392
- # returns UNHANDLED if no block for it
393
- # after form handles basic keys, it gives unhandled key to current field, if current field returns
394
- # unhandled, then it checks this map.
395
- # Please update widget with any changes here.
396
-
397
- def OLDprocess_key keycode, object # already there in keymappinghandler
398
- return _process_key keycode, object, @window
399
- end # }}}
400
310
 
401
311
  #
402
312
  # NOTE: These mappings will only trigger if the current field