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/lib/umbra/tabular.rb CHANGED
@@ -10,7 +10,7 @@
10
10
  * :
11
11
  * Author : jkepler
12
12
  * Date :
13
- * Last Update : 2018-05-20 14:24
13
+ * Last Update : 2018-05-31 16:16
14
14
  * License : MIT
15
15
  =end
16
16
 
@@ -241,7 +241,7 @@ module Umbra
241
241
  buffer << str
242
242
  #puts "-" * str.length
243
243
  buffer << separator if @use_separator
244
- if @list ## XXX why wasn't this done in _prepare_format ???? FIXME
244
+ if @list ## XXX why wasn't numbering done in _prepare_format ???? FIXME
245
245
  if @numbering
246
246
  fmstr = "%#{rows}d "+ @y + fmstr
247
247
  end
@@ -268,6 +268,9 @@ module Umbra
268
268
  end
269
269
 
270
270
  ## render_row
271
+ ## @param [Array] row as Array
272
+ ## @param [String] format string
273
+ ## @param [Integer] row offset in data
271
274
  def convert_value_to_text r, fmstr, index
272
275
  return fmstr % r;
273
276
  end
data/lib/umbra/textbox.rb CHANGED
@@ -4,38 +4,34 @@
4
4
  # Author: j kepler http://github.com/mare-imbrium/canis/
5
5
  # Date: 2018-03-24 - 12:39
6
6
  # License: MIT
7
- # Last update: 2018-05-10 11:06
7
+ # Last update: 2018-05-30 12:47
8
8
  # ----------------------------------------------------------------------------- #
9
9
  # textbox.rb Copyright (C) 2012-2018 j kepler
10
- ## TODO -----------------------------------
11
- # improve the object sent when row change or cursor movement
12
- ## 2018-05-08 - extend Multiline
10
+ ## Todo -----------------------------------
11
+ ## TODO w and b for next and previous word movement
13
12
  #
14
13
  # ----------------------------------------
15
14
  ## CHANGELOG
16
- #
15
+ # 2018-05-30 - giving self during cursor movement
17
16
  # ----------------------------------------
18
17
  require 'umbra/multiline'
19
18
  module Umbra
20
19
  class Textbox < Multiline
21
20
  attr_accessor :file_name # filename passed in for reading
22
21
  #attr_accessor :cursor # position of cursor in line ??
23
- =begin
24
- attr_accessor :selected_mark # row selected character
25
- attr_accessor :unselected_mark # row unselected character (usually blank)
26
- attr_accessor :current_mark # row current character (default is >)
27
- =end
28
22
 
29
23
  def initialize config={}, &block
30
24
  @highlight_attr = FFI::NCurses::A_BOLD
31
25
  @row_offset = 0
32
26
  @col_offset = 0
33
27
  @curpos = 0 # current cursor position in buffer (NOT screen/window/field)
34
- #register_events([:ENTER_ROW, :LEAVE_ROW, :CURSOR_MOVE]) #
35
- register_events([:CURSOR_MOVE]) #
28
+
29
+ register_events([:CURSOR_MOVE]) # movement of cursor left or right, up down or panning.
36
30
  super
37
31
 
38
32
  end
33
+
34
+
39
35
  # set list of data to be displayed from filename. {{{
40
36
  # NOTE this can be called again and again, so we need to take care of change in size of data
41
37
  # as well as things like current_index and selected_index or indices.
@@ -81,150 +77,15 @@ class Textbox < Multiline
81
77
  return ret
82
78
  ensure
83
79
  if @repaint_required
84
- fire_handler(:CURSOR_MOVE, [@col_offset, @current_index, @curpos, @pcol, ch ]) # 2018-03-25 - improve this
85
- end
86
- end
87
- end
88
- def OLDhandle_key ch # {{{
89
- return :UNHANDLED unless @list
90
- # save old positions so we know movement has happened
91
- old_current_index = @current_index
92
- old_pcol = @pcol
93
- old_col_offset = @col_offset
94
-
95
- begin
96
- ret = super
97
- return ret
98
- ensure
99
- @current_index = 0 if @current_index < 0
100
- @current_index = @list.size-1 if @current_index >= @list.size
101
- @repaint_required = true if @current_index != old_current_index
102
- if @current_index != old_current_index or @pcol != old_pcol or @col_offset != old_col_offset
103
- if @current_index != old_current_index
104
- on_leave_row old_current_index
105
- on_enter_row @current_index
106
- end
107
- @repaint_required = true
108
- fire_handler(:CURSOR_MOVE, [@col_offset, @current_index, @curpos, @pcol, ch ]) # 2018-03-25 - improve this
109
- end
110
- end
111
- end # }}}
112
- # advance col_offset (where cursor will be displayed on screen) {{{
113
- # @param [Integer] advance by n (can be negative or positive)
114
- # @return -1 if cannot advance
115
- private def OLDadd_col_offset num
116
- x = @col_offset + num
117
- return -1 if x < 0
118
- return -1 if x > @int_width
119
- # is it a problem that i am directly changing col_offset ??? XXX
120
- @col_offset += num
121
- end
122
-
123
- # move cursor forward one character, called with KEY_RIGHT action.
124
- def OLDcursor_forward
125
- blen = current_row().size-1
126
- if @curpos < blen
127
- if add_col_offset(1)==-1 # go forward if you can, else scroll
128
- #@pcol += 1 if @pcol < @width
129
- @pcol += 1 if @pcol < blen
130
- end
131
- @curpos += 1
132
- end
133
- end
134
- def OLDcursor_backward
135
-
136
- if @col_offset > 0
137
- @curpos -= 1
138
- add_col_offset -1
139
- else
140
- # cur is on the first col, then scroll left
141
- if @pcol > 0
142
- @pcol -= 1
143
- @curpos -= 1
144
- else
145
- # do nothing
80
+ ## this could get fired even if color changed or something not related to cursor moving. FIXME
81
+ ## Should this fire if users scrolls but does not change cursor position
82
+ #fire_handler(:CURSOR_MOVE, [@col_offset, @current_index, @curpos, @panned_cols, ch ]) # 2018-03-25 - improve this
83
+ fire_handler(:CURSOR_MOVE, self) ## 2018-05-30 - made this like most others yielding self
146
84
  end
147
85
  end
148
86
  end
149
- # position cursor at start of field
150
- def OLDcursor_home
151
- @curpos = 0
152
- @pcol = 0
153
- set_col_offset 0
154
- end
155
- # goto end of line.
156
- # This should be consistent with moving the cursor to the end of the row with right arrow
157
- def OLDcursor_end
158
- blen = current_row().length
159
- if blen < @int_width
160
- set_col_offset blen # just after the last character
161
- @pcol = 0
162
- else
163
- @pcol = blen-@int_width
164
- set_col_offset blen
165
- end
166
- @curpos = blen # this is position in array where editing or motion is to happen regardless of what you see
167
- # regardless of pcol (panning)
168
- end
169
- # go to start of file (first line)
170
- def OLDgoto_start
171
- @current_index = 0
172
- @pcol = @curpos = 0
173
- set_col_offset 0
174
- end
175
- # go to end of file (last line)
176
- def OLDgoto_end
177
- @current_index = @list.size-1
178
- end
179
- # sets the visual cursor on the window at correct place
180
- # NOTE be careful of curpos - pcol being less than 0
181
- # @param [Integer] position in data on the line
182
- private def OLD_set_col_offset x=@curpos
183
- @curpos = x || 0 # NOTE we set the index of cursor here - WHY TWO THINGS ??? XXX
184
- #return -1 if x < 0
185
- #return -1 if x > @width
186
- if x >= @int_width
187
- x = @int_width
188
- @col_offset = @int_width
189
- return
190
- end
191
- @col_offset = x
192
- @col_offset = @int_width if @col_offset > @int_width
193
- return
194
- end
195
- # called whenever a row entered.
196
- # Call when object entered, also.
197
- def OLD_on_enter_row index
198
- #fire_handler(:ENTER_ROW, [old_current_index, @current_index, ch ]) # 2018-03-26 - improve this
199
- fire_handler(:ENTER_ROW, [@current_index]) # 2018-03-26 - improve this
200
- # if cursor ahead of blen then fix it
201
- blen = current_row().size-1
202
- if @curpos > blen
203
- @col_offset = blen - @pcol
204
- @curpos = blen
205
- if @pcol > blen
206
- @pcol = blen - @int_width
207
- @pcol = 0 if @pcol < 0
208
- @col_offset = blen - @pcol
209
- end
210
- end
211
- @col_offset = 0 if @col_offset < 0
212
- end # }}}
213
- ## border {{{
214
- private def print_border row, col, height, width, color, att=FFI::NCurses::A_NORMAL
215
- raise
216
- pointer = @graphic.pointer
217
- FFI::NCurses.wattron(pointer, FFI::NCurses.COLOR_PAIR(color) | att)
218
- FFI::NCurses.mvwaddch pointer, row, col, FFI::NCurses::ACS_ULCORNER
219
- FFI::NCurses.mvwhline( pointer, row, col+1, FFI::NCurses::ACS_HLINE, width-2)
220
- FFI::NCurses.mvwaddch pointer, row, col+width-1, FFI::NCurses::ACS_URCORNER
221
- FFI::NCurses.mvwvline( pointer, row+1, col, FFI::NCurses::ACS_VLINE, height-2)
222
87
 
223
- FFI::NCurses.mvwaddch pointer, row+height-1, col, FFI::NCurses::ACS_LLCORNER
224
- FFI::NCurses.mvwhline(pointer, row+height-1, col+1, FFI::NCurses::ACS_HLINE, width-2)
225
- FFI::NCurses.mvwaddch pointer, row+height-1, col+width-1, FFI::NCurses::ACS_LRCORNER
226
- FFI::NCurses.mvwvline( pointer, row+1, col+width-1, FFI::NCurses::ACS_VLINE, height-2)
227
- FFI::NCurses.wattroff(pointer, FFI::NCurses.COLOR_PAIR(color) | att)
228
- end # }}}
229
88
  end
230
89
  end # module
90
+
91
+ # vim: comments=sr\:##,mb\:##,el\:#/,\:## :
@@ -6,133 +6,96 @@ require 'umbra/button'
6
6
  # Author: j kepler http://github.com/mare-imbrium/umbra/
7
7
  # Date: 2018-03-17 - 22:50
8
8
  # License: MIT
9
- # Last update: 2018-05-14 14:35
9
+ # Last update: 2018-05-27 14:21
10
10
  # ----------------------------------------------------------------------------- #
11
- # togglebutton.rb Copyright (C) 2012-2018 j kepler
11
+ # togglebutton.rb Copyright (C) 2018 j kepler
12
12
  #
13
13
  #
14
14
  module Umbra
15
- ##
16
- # an event fired when an item that can be selected is toggled/selected
17
- class ItemEvent # {{{
18
- # http://java.sun.com/javase/6/docs/api/java/awt/event/ItemEvent.html
19
- attr_reader :state # :SELECTED :DESELECTED
20
- attr_reader :item # the item pressed such as toggle button
21
- attr_reader :item_selectable # item originating event such as list or collection
22
- attr_reader :item_first # if from a list
23
- attr_reader :item_last #
24
- attr_reader :param_string # for debugging etc
25
- =begin
26
- def initialize item, item_selectable, state, item_first=-1, item_last=-1, paramstring=nil
27
- @item, @item_selectable, @state, @item_first, @item_last =
28
- item, item_selectable, state, item_first, item_last
29
- @param_string = "Item event fired: #{item}, #{state}"
30
- end
31
- =end
32
- # i think only one is needed per object, so create once only
33
- def initialize item, item_selectable
34
- @item, @item_selectable =
35
- item, item_selectable
36
- end
37
- def set state, item_first=-1, item_last=-1, param_string=nil
38
- @state, @item_first, @item_last, @param_string =
39
- state, item_first, item_last, param_string
40
- @param_string = "Item event fired: #{item}, #{state}" if param_string.nil?
41
- end
42
- end # }}}
43
- # A button that may be switched off an on.
44
- # Extended by RadioButton and checkbox.
45
- # WARNING, pls do not override +text+ otherwise checkboxes etc will stop functioning.
46
- # TODO: add editable here nd prevent toggling if not so.
47
- class ToggleButton < Button
48
- # text for on value and off value
49
- attr_accessor :onvalue, :offvalue
50
- # boolean, which value to use currently, onvalue or offvalue
51
- attr_accessor :value
52
- # characters to use for surround, array, default square brackets
53
- attr_property :surround_chars
54
- # 2018-04-02 - removing variable
55
- #attr_accessor :variable # value linked to this variable which is a boolean
56
- # background to use when selected, if not set then default
57
- # 2018-04-02 - unused so commenting off. color_pair is not used here or in checkbox
58
- attr_property :selected_color_pair
59
15
 
60
- def initialize config={}, &block
61
- super
16
+ # A button that may be switched off an on.
17
+ # Extended by RadioButton and checkbox.
18
+ # WARNING, pls do not override +text+ otherwise checkboxes etc will stop functioning.
19
+ # TODO: add editable here and prevent toggling if not so.
20
+ class ToggleButton < Button
21
+ # text to display for on value and off value
22
+ attr_accessor :onvalue, :offvalue
23
+ # boolean, which value to use currently, onvalue or offvalue
24
+ attr_property :value
25
+ # characters to use for surround, array, default square brackets
26
+ #attr_property :surround_chars already in button
27
+ # 2018-04-02 - removing variable
28
+ # background to use when selected, if not set then default
29
+ # 2018-04-02 - unused so commenting off. color_pair is not used here or in checkbox
30
+ #attr_property :selected_color_pair
62
31
 
63
- #@value ||= (@variable.nil? ? false : @variable.get_value(@name)==true)
64
- # TODO may need to do this when this is added to button_group
65
- end
66
- def getvalue
67
- @value ? @onvalue : @offvalue
68
- end
32
+ def initialize config={}, &block
33
+ super
69
34
 
70
- # WARNING, pls do not override +text+ otherwise checkboxes etc will stop functioning.
35
+ end
36
+ def getvalue
37
+ @value ? @onvalue : @offvalue
38
+ end
39
+
40
+ # WARNING, pls do not override +text+ otherwise checkboxes etc will stop functioning.
71
41
 
72
- # added for some standardization 2010-09-07 20:28
73
- # alias :text :getvalue # NEXT VERSION
74
- # change existing text to label
75
- ##
76
- # is the button on or off
77
- # added 2008-12-09 19:05
78
- def checked?
79
- @value
80
- end
81
- alias :selected? :checked?
42
+ # added for some standardization 2010-09-07 20:28
43
+ # alias :text :getvalue # NEXT VERSION
44
+ # change existing text to label
45
+ ##
46
+ # is the button on or off
47
+ # added 2008-12-09 19:05
48
+ def checked?
49
+ @value
50
+ end
51
+ alias :selected? :checked?
82
52
 
83
- def getvalue_for_paint
84
- # when the width is set externally then the surround chars sit outside the width
85
- #unless @width
53
+ def getvalue_for_paint
54
+ # when the width is set externally then the surround chars sit outside the width
55
+ #unless @width
86
56
  if @onvalue && @offvalue
87
57
  @width = [ @onvalue.length, @offvalue.length ].max
88
58
  end
89
- #end
90
- buttontext = getvalue().center(@width)
91
- @text_offset = @surround_chars[0].length
92
- @surround_chars[0] + buttontext + @surround_chars[1]
93
- end
94
-
95
- # toggle button handle key
96
- # @param [int] key received
97
- #
98
- def handle_key ch
99
- if ch == 32
100
- toggle
101
- @repaint_required = true # need to change the label
102
- else
103
- super
59
+ #end
60
+ buttontext = getvalue().center(@width)
61
+ @text_offset = @surround_chars[0].length
62
+ @surround_chars[0] + buttontext + @surround_chars[1]
104
63
  end
105
- end
106
64
 
107
- ##
108
- # toggle the button value
109
- def toggle
110
- fire
111
- end
112
-
113
- # called on :PRESS event
114
- # caller should check state of itemevent passed to block
115
- # NOTE i have not brought ItemEvent in here.
116
- def fire
117
- checked(!@value)
118
- @item_event = ItemEvent.new self, self if @item_event.nil?
119
- @item_event.set(@value ? :SELECTED : :DESELECTED)
120
- fire_handler :PRESS, @item_event # should the event itself be ITEM_EVENT
121
- end
122
- ##
123
- # set the value to true or false
124
- # user may programmatically want to check or uncheck
125
- def checked tf
126
- @value = tf
127
- =begin
128
- if @variable
129
- if @value
130
- @variable.set_value((@onvalue || 1), @name)
65
+ # toggle button handle key
66
+ # @param [int] key received
67
+ #
68
+ def handle_key ch
69
+ if ch == 32
70
+ toggle
71
+ @repaint_required = true # need to change the label
131
72
  else
132
- @variable.set_value((@offvalue || 0), @name)
73
+ super
133
74
  end
134
75
  end
135
- =end
136
- end
137
- end # class
76
+
77
+ ##
78
+ # toggle the button value
79
+ def toggle
80
+ fire
81
+ end
82
+
83
+ # called on :PRESS event
84
+ def fire
85
+ checked(!@value)
86
+ #@item_event = ItemEvent.new self, self if @item_event.nil?
87
+ #@item_event.set(@value ? :SELECTED : :DESELECTED)
88
+ #fire_handler :PRESS, @item_event # should the event itself be ITEM_EVENT
89
+ ## 2018-05-27 - trying to use self in most cases. Above was not needed.
90
+ fire_handler :PRESS, self
91
+ end
92
+ ##
93
+ # set the value to true or false
94
+ # user may programmatically want to check or uncheck
95
+ # ## duplicate of value ??? 2018-05-26 -
96
+ def checked tf
97
+ @value = tf
98
+ @repaint_required = true
99
+ end
100
+ end # class
138
101
  end # module
data/lib/umbra/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Umbra
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/umbra/widget.rb CHANGED
@@ -44,7 +44,7 @@ class Widget
44
44
  include KeyMappingHandler
45
45
  # common interface for text related to a field, label, textview, button etc
46
46
  attr_property :text
47
- attr_property :width, :height ## FIXME this won't trigger repaint or property !!!
47
+ attr_property :width, :height ## width and height of widget
48
48
 
49
49
  # foreground and background colors when focussed. Currently used with buttons and field
50
50
  # Form checks and repaints on entry if these are set.
@@ -54,13 +54,12 @@ class Widget
54
54
  # NOTE: 2018-03-04 - user will have to call repaint_required if he changes color or coordinates.
55
55
  attr_accessor :col # location of object
56
56
  attr_writer :row # location of object
57
- #attr_writer :color, :bgcolor # normal foreground and background 2018-03-08 - now color_pair
58
57
  # moved to a method which calculates color 2011-11-12
59
58
  attr_property :color_pair # instead of colors give just color_pair
60
59
  attr_property :attr # attribute bold, normal, reverse
61
60
  attr_accessor :name # name to refr to or recall object by_name
62
61
  attr_accessor :curpos # cursor position inside object - column, not row.
63
- attr_reader :config # can be used for popping user objects too. NOTE unused
62
+ #attr_reader :config # can be used for popping user objects too. NOTE unused
64
63
  #attr_accessor :form # made accessor 2008-11-27 22:32 so menu can set
65
64
  attr_accessor :graphic # window which should be set by form when adding 2018-03-19
66
65
  attr_accessor :state # normal, selected, highlighted
@@ -76,8 +75,8 @@ class Widget
76
75
 
77
76
  #attr_accessor :parent_component # added 2010-01-12 23:28 BUFFERED - to bubble up
78
77
 
79
- # NOTE state takes care of this and is set by form. boolean
80
- attr_reader :focussed # is this widget in focus, so they may paint differently
78
+ # NOTE state takes care of this and is set by form. boolean 2018-05-26 - commented since unused
79
+ #attr_reader :focussed # is this widget in focus, so they may paint differently
81
80
 
82
81
  # height percent and width percent used in stacks and flows.
83
82
  #attr_accessor :height_pc, :width_pc # may bring this back
@@ -99,9 +98,8 @@ class Widget
99
98
  # These are standard events for most widgets which will be fired by
100
99
  # Form. In the case of CHANGED, form fires if it's editable property is set, so
101
100
  # it does not apply to all widgets.
102
- # 2018-03-18 - proporty change is deprecated since we don't use dsl_property any longer
103
101
  register_events( [:ENTER, :LEAVE, :CHANGED, :PROPERTY_CHANGE])
104
- @repaint_required = true # added 2018-03-20 - so all widgets get it
102
+ @repaint_required = true
105
103
 
106
104
  aconfig.each_pair { |k,v| variable_set(k,v) }
107
105
  #instance_eval &block if block_given?
@@ -129,25 +127,21 @@ class Widget
129
127
  def modified?
130
128
  @modified
131
129
  end
132
- #def set_modified tf=true
133
- #@modified = tf
134
- #end
135
- #alias :modified :set_modified
136
130
 
137
131
  # triggered whenever a widget is entered.
138
132
  # NOTE should we not fix cursor at this point (on_enter) ?
139
133
  def on_enter
134
+ ## Form has already set this, and set modified to false
140
135
  @state = :HIGHLIGHTED # duplicating since often these are inside containers
141
- @focussed = true
136
+ #@focussed = true
142
137
  if @handler && @handler.has_key?(:ENTER)
143
138
  fire_handler :ENTER, self
144
139
  end
145
140
  end
146
141
  ## Called when user exits a widget
147
- # 2018-03-04 - Are we keeping this at all, can we avoid NOT_SURE
148
142
  def on_leave
149
143
  @state = :NORMAL # duplicating since often these are inside containers
150
- @focussed = false
144
+ #@focussed = false
151
145
  if @handler && @handler.has_key?(:LEAVE)
152
146
  fire_handler :LEAVE, self
153
147
  end
@@ -268,6 +262,7 @@ class Widget
268
262
  @height
269
263
  end
270
264
  def row
265
+ return nil unless @row
271
266
  if @row < 0
272
267
  return FFI::NCurses.LINES + @row
273
268
  end