ncumbra 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +5 -0
- data/README.md +42 -0
- data/examples/ex3.rb +1 -1
- data/lib/umbra/box.rb +21 -17
- data/lib/umbra/button.rb +6 -4
- data/lib/umbra/buttongroup.rb +84 -76
- data/lib/umbra/field.rb +5 -3
- data/lib/umbra/label.rb +3 -2
- data/lib/umbra/labeledfield.rb +25 -13
- data/lib/umbra/listbox.rb +21 -10
- data/lib/umbra/pad.rb +3 -1
- data/lib/umbra/radiobutton.rb +15 -8
- data/lib/umbra/togglebutton.rb +23 -13
- data/lib/umbra/version.rb +1 -1
- data/lib/umbra/widget.rb +118 -81
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca4311543d96466d546a976b01991af75abb649575d862cd6d9c9b94bd7a3833
|
4
|
+
data.tar.gz: 6f56247dc1b5dfd77cb1d8fa0de95b275010ca276906c3ec88ac8119b6df134b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 749b3f931e2fbf3fc32176711207edb52f0794082f579b037f942a7e2cb47bdbd3136035faceb395f3f55015a9ec212c6ac7995a0d0e10197932e04e0c1bc4b4
|
7
|
+
data.tar.gz: c0e1e0e7bf83fa0a16f91b26495ffb93823ba614f6216438337beb3ab31958775e79b240aab1277fdab2d03cec6c2279c405a95b811dd2be2b1c527412079374
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -440,8 +440,50 @@ The above is similar to:
|
|
440
440
|
|
441
441
|
### RadioButton
|
442
442
|
|
443
|
+
A +ToggleButton+ button that may have an on or off value. Usually, several related radio buttons are created and only one may be +on+.
|
444
|
+
Here, we create a +ButtonGroup+ and then `add` radio buttons to it.
|
443
445
|
|
446
|
+
```ruby
|
447
|
+
radio1 = RadioButton.new text: "Red", value: "R", row: 5, col: 20
|
448
|
+
radio2 = RadioButton.new text: "Green", value: "G", row: 6, col: 20
|
449
|
+
group = ButtonGroup.new "Color"
|
450
|
+
group.add(radio1).add(radio2)
|
451
|
+
form.add_widget radio1, radio2
|
452
|
+
```
|
453
|
+
|
454
|
+
By default, the button prints the selector or box on the left as `( )`. By setting `align_right` the box will be printed on the right.
|
455
|
+
|
456
|
+
A block may be attached to the group which will be called if any of its buttons is clicked.
|
457
|
+
|
458
|
+
|
459
|
+
```ruby
|
460
|
+
group.command do
|
461
|
+
message_label.text = "#{group.name} #{group.value} has been selected"
|
462
|
+
end
|
463
|
+
```
|
444
464
|
|
465
|
+
### ButtonGroup
|
466
|
+
|
467
|
+
A ButtonGroup is a collection of RadioButtons.
|
468
|
+
|
469
|
+
group = ButtonGroup.new "Color"
|
470
|
+
|
471
|
+
Methods:
|
472
|
+
|
473
|
+
- `add` - add a +RadioButton+ to the group.
|
474
|
+
- `selection` - return the button that is selected
|
475
|
+
- `value` - get the value of the selected button
|
476
|
+
- `select?` - ask if given button is selected
|
477
|
+
- `select` - select the given button
|
478
|
+
- `elements` - get an array of buttons added
|
479
|
+
- `command` - supply a block to be called whenever a button in the group is clicked.
|
480
|
+
|
481
|
+
|
482
|
+
```ruby
|
483
|
+
group.command do
|
484
|
+
alert "#{group.name} #{group.value} has been selected"
|
485
|
+
end
|
486
|
+
```
|
445
487
|
|
446
488
|
### Multiline
|
447
489
|
|
data/examples/ex3.rb
CHANGED
@@ -105,7 +105,7 @@ begin
|
|
105
105
|
form.add_widget radio1, radio2
|
106
106
|
group.command do
|
107
107
|
message_label.text = "#{group.name} #{group.value} has been selected"
|
108
|
-
message_label.repaint_required = true
|
108
|
+
#message_label.repaint_required = true
|
109
109
|
end
|
110
110
|
|
111
111
|
ok_butt = Button.new( :name => 'ok', :text => 'Ok', :row => row+2, :col => col, :width => 10 , :color_pair => 0, :mnemonic => 'O')
|
data/lib/umbra/box.rb
CHANGED
@@ -4,38 +4,42 @@
|
|
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-
|
7
|
+
# Last update: 2018-06-02 19:01
|
8
8
|
# ----------------------------------------------------------------------------- #
|
9
9
|
# box.rb Copyright (C) 2018 j kepler
|
10
10
|
module Umbra
|
11
11
|
##
|
12
|
-
# A box is a container around one,
|
12
|
+
# A box is a container around one, or more, widgets.
|
13
|
+
# Properties include #visible, #justify and #title.
|
13
14
|
## FIXME box needs to resize components if it's dimensions are changed.
|
14
|
-
##
|
15
|
+
## Or should components have a link to parent, so they can resize themselves ?
|
15
16
|
#
|
16
17
|
class Box < Widget
|
18
|
+
# @param title [String] set and return title of box
|
17
19
|
attr_property :title
|
18
|
-
#
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
attr_reader :
|
24
|
-
|
25
|
-
attr_property :justify
|
20
|
+
# @param visible [true, false] set and return border visibility
|
21
|
+
attr_property :visible # Is the border visible or not
|
22
|
+
# @return [Array<Widget>] return widgets added to this box
|
23
|
+
attr_reader :widgets # widgets added to this box
|
24
|
+
# @return [Widget] return widget added to this box
|
25
|
+
attr_reader :widget # single widget component
|
26
|
+
# @param justify [Symbol] set and return alignment of box :right :left :center
|
27
|
+
attr_property :justify
|
26
28
|
|
27
29
|
def initialize config={}, &block
|
28
30
|
@focusable = false
|
29
31
|
@visible = true
|
30
32
|
super
|
31
|
-
|
33
|
+
|
32
34
|
@int_height = self.height - 2
|
33
|
-
|
35
|
+
|
34
36
|
@int_width = self.width - 2
|
35
37
|
@hlines = []
|
36
38
|
#@vlines = [] # UNUSED. TODO ???
|
37
39
|
end
|
38
|
-
|
40
|
+
|
41
|
+
# paint border and title, called by +Form+.
|
42
|
+
def repaint #:nodoc:
|
39
43
|
return unless @visible
|
40
44
|
print_border self.row, self.col, self.height, self.width, @color_pair || CP_BLACK, @attr || NORMAL
|
41
45
|
print_title @title
|
@@ -47,7 +51,7 @@ module Umbra
|
|
47
51
|
|
48
52
|
##
|
49
53
|
## Add a variable list of components to a box, which are stacked horizontally by the box.
|
50
|
-
## @param comma separated list of widgets
|
54
|
+
## @param w [Array<Widget>] comma separated list of widgets
|
51
55
|
def add *w
|
52
56
|
@widgets = w
|
53
57
|
num = w.size
|
@@ -71,8 +75,8 @@ module Umbra
|
|
71
75
|
|
72
76
|
##
|
73
77
|
## Horizontally place an array of widgets
|
74
|
-
## @param comma separated list of widgets
|
75
|
-
##
|
78
|
+
## @param w [Array<Widget>] comma separated list of widgets
|
79
|
+
## @note this is best used for widgets that can be resized.
|
76
80
|
# Prefer not to use for buttons since the looks gets messed (inconsistency between button and highlight).
|
77
81
|
# Therefore now, button calculates its own width which means that this program cannot determine what the width is
|
78
82
|
# and thus cannot center it.
|
data/lib/umbra/button.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
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-06-
|
8
|
+
# Last update: 2018-06-02 19:28
|
9
9
|
# ----------------------------------------------------------------------------- #
|
10
10
|
# button.rb Copyright (C) 2012-2018 j kepler
|
11
11
|
# == Todo
|
@@ -16,6 +16,7 @@ require 'umbra/widget'
|
|
16
16
|
module Umbra
|
17
17
|
|
18
18
|
|
19
|
+
## Widget that has an action associated with `:PRESS` event.
|
19
20
|
class Button < Widget
|
20
21
|
attr_accessor :surround_chars # characters to use to surround the button, def is square brackets
|
21
22
|
|
@@ -41,7 +42,7 @@ module Umbra
|
|
41
42
|
|
42
43
|
##
|
43
44
|
# set button based on Action
|
44
|
-
# 2018-03-22 - is this still used ?
|
45
|
+
# 2018-03-22 - is this still used ?
|
45
46
|
# This allows action objects to be used in multiple places such as buttons, menus, popups etc.
|
46
47
|
def action a
|
47
48
|
text a.name
|
@@ -95,12 +96,13 @@ module Umbra
|
|
95
96
|
@repaint_required = false
|
96
97
|
end
|
97
98
|
|
98
|
-
## fires PRESS event of button
|
99
|
+
## fires `PRESS` event of button
|
99
100
|
def fire
|
100
101
|
fire_handler :PRESS, ActionEvent.new(self, :PRESS, text)
|
101
102
|
end
|
102
103
|
|
103
104
|
# for campatibility with all buttons, will apply to radio buttons mostly
|
105
|
+
# @return [false]
|
104
106
|
def selected?; false; end
|
105
107
|
|
106
108
|
def map_keys
|
@@ -108,7 +110,7 @@ module Umbra
|
|
108
110
|
bind_key(32, "fire") { fire } if respond_to? :fire
|
109
111
|
end
|
110
112
|
|
111
|
-
# Button
|
113
|
+
# Button's key handler, just calls super
|
112
114
|
def handle_key ch
|
113
115
|
super
|
114
116
|
end
|
data/lib/umbra/buttongroup.rb
CHANGED
@@ -4,93 +4,101 @@
|
|
4
4
|
# Author: j kepler http://github.com/mare-imbrium/canis/
|
5
5
|
# Date: 2018-04-02 - 08:47
|
6
6
|
# License: MIT
|
7
|
-
# Last update: 2018-
|
7
|
+
# Last update: 2018-06-03 12:18
|
8
8
|
# ----------------------------------------------------------------------------- #
|
9
9
|
# buttongroup.rb Copyright (C) 2012-2018 j kepler
|
10
|
-
|
11
|
-
# This class allows us to attach several RadioButtons to it, so it can maintain which one is the
|
12
|
-
# selected one. It also allows for assigning of commands to be executed whenever a button is pressed,
|
13
|
-
# akin to binding to the +fire+ of the button, except that one would not have to bind to each button,
|
14
|
-
# but only once here.
|
15
|
-
#
|
16
|
-
# @example
|
17
|
-
# group = ButtonGroup.new
|
18
|
-
# group.add(r1).add(r2).add(r3)
|
19
|
-
# group.command(somelabel) do |grp, label| label.text = grp.value; end
|
10
|
+
|
20
11
|
#
|
21
|
-
|
12
|
+
module Umbra
|
22
13
|
|
23
|
-
#
|
24
|
-
|
25
|
-
#
|
26
|
-
|
14
|
+
# This is not a visual class or a widget.
|
15
|
+
# This class allows us to attach several RadioButtons to it, so it can maintain which one is the
|
16
|
+
# selected one. It also allows for assigning of commands to be executed whenever a button is pressed,
|
17
|
+
# akin to binding to the +fire+ of the button, except that one would not have to bind to each button,
|
18
|
+
# but only once here.
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# group = ButtonGroup.new
|
22
|
+
# group.add(r1).add(r2).add(r3)
|
23
|
+
# group.command(somelabel) do |grp, label| label.text = grp.value; end
|
24
|
+
class ButtonGroup
|
27
25
|
|
28
|
-
|
29
|
-
|
26
|
+
# Array of buttons that have been added.
|
27
|
+
attr_reader :elements
|
28
|
+
# name for group, can be used in messages
|
29
|
+
attr_accessor :name
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
@hash = {}
|
34
|
-
@name = name
|
35
|
-
end
|
31
|
+
# the value of the radio button that is selected. To get the button itself, use +selection+.
|
32
|
+
attr_reader :value
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
# remove button from group
|
45
|
-
def remove e
|
46
|
-
@elements.delete e
|
47
|
-
@hash.delete e.value
|
48
|
-
self
|
49
|
-
end
|
34
|
+
# @param name [String] a name which is used more for documenting/debugging.
|
35
|
+
def initialize name="Buttongroup"
|
36
|
+
@elements = []
|
37
|
+
@hash = {}
|
38
|
+
@name = name
|
39
|
+
end
|
50
40
|
|
51
|
-
|
52
|
-
|
53
|
-
@
|
54
|
-
|
41
|
+
# Add a radio button to the group.
|
42
|
+
# @note Maybe we should allow adding multiple, and alias to add_widget.
|
43
|
+
# @param e [RadioButton] button to add.
|
44
|
+
def add e
|
45
|
+
@elements << e
|
46
|
+
@hash[e.value] = e
|
47
|
+
e.button_group=(self)
|
48
|
+
self
|
49
|
+
end
|
55
50
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
51
|
+
# remove button from group
|
52
|
+
def remove e
|
53
|
+
@elements.delete e
|
54
|
+
@hash.delete e.value
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return the radiobutton that is selected
|
59
|
+
def selection
|
60
|
+
@hash[@value]
|
61
|
+
end
|
62
|
+
|
63
|
+
# @param val [String, RadioButton] +value+ of a button, or +Button+ itself to check if selected.
|
64
|
+
# @return [true or false] for whether the given value or button is the selected one
|
65
|
+
def selected? val
|
66
|
+
if val.is_a? String
|
67
|
+
@value == val
|
68
|
+
else
|
69
|
+
@hash[@value] == val
|
70
|
+
end
|
71
|
+
end
|
72
|
+
# install trigger to call whenever a value is updated
|
73
|
+
# @public called by user components
|
74
|
+
def command *args, &block
|
75
|
+
@commands ||= []
|
76
|
+
@args ||= []
|
77
|
+
@commands << block
|
78
|
+
@args << args
|
63
79
|
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
# select the given button or value.
|
74
|
-
# This may be called by user programs to programmatically select a button
|
75
|
-
def select button
|
76
|
-
if button.is_a? String
|
77
|
-
;
|
78
|
-
else
|
79
|
-
button = button.value
|
80
|
+
# select the given button or value.
|
81
|
+
# This may be called by user programs to programmatically select a button
|
82
|
+
def select button
|
83
|
+
if button.is_a? String
|
84
|
+
;
|
85
|
+
else
|
86
|
+
button = button.value
|
87
|
+
end
|
88
|
+
self.value = button
|
80
89
|
end
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
# 2018-04-02 - need to repaint all the radio buttons so they become off
|
88
|
-
@elements.each {|e| e.repaint_required = true }
|
90
|
+
# whenever a radio button is pressed, it updates the value of the group with it;s value.
|
91
|
+
# since only one is true at a time.
|
92
|
+
def value=(value)
|
93
|
+
@value = value
|
94
|
+
# 2018-04-02 - need to repaint all the radio buttons so they become off
|
95
|
+
@elements.each {|e| e.repaint_required = true }
|
89
96
|
|
90
|
-
|
91
|
-
|
92
|
-
|
97
|
+
return unless @commands
|
98
|
+
@commands.each_with_index do |comm, ix|
|
99
|
+
comm.call(self, *@args[ix]) unless comm.nil?
|
100
|
+
end
|
93
101
|
end
|
94
|
-
end
|
95
102
|
|
96
|
-
end
|
103
|
+
end
|
104
|
+
end # module
|
data/lib/umbra/field.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
# ----------------------------------------------------------------------------- #
|
2
2
|
# File: field.rb
|
3
3
|
# Description: text input field or widget
|
4
|
-
# Author: j kepler http://github.com/mare-imbrium/
|
4
|
+
# Author: j kepler http://github.com/mare-imbrium/
|
5
5
|
# Date: 2018-03
|
6
6
|
# License: MIT
|
7
|
-
# Last update: 2018-
|
7
|
+
# Last update: 2018-06-02 10:26
|
8
8
|
# ----------------------------------------------------------------------------- #
|
9
9
|
# field.rb Copyright (C) 2012-2018 j kepler
|
10
10
|
#
|
11
11
|
|
12
|
+
module Umbra
|
12
13
|
class InputDataEvent # {{{
|
13
14
|
attr_accessor :index0, :index1, :source, :type, :row, :text
|
14
15
|
def initialize index0, index1, source, type, row, text
|
@@ -35,7 +36,8 @@ class InputDataEvent # {{{
|
|
35
36
|
def getvalue
|
36
37
|
@source.getvalue
|
37
38
|
end
|
38
|
-
end # }}}
|
39
|
+
end # class }}}
|
40
|
+
end # module
|
39
41
|
# Text edit field
|
40
42
|
# Todo :
|
41
43
|
# NOTE: +width+ is the length of the display whereas +maxlen+ is the maximum size that the value
|
data/lib/umbra/label.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
# Author: j kepler http://github.com/mare-imbrium/canis/
|
6
6
|
# Date: 2018-03-08 - 14:04
|
7
7
|
# License: MIT
|
8
|
-
# Last update: 2018-
|
8
|
+
# Last update: 2018-06-02 19:25
|
9
9
|
# ----------------------------------------------------------------------------- #
|
10
10
|
# label.rb Copyright (C) 2018- j kepler
|
11
11
|
#
|
@@ -15,7 +15,8 @@ module Umbra
|
|
15
15
|
# when creating use +text=+ to set text. Optionally use +justify+ and +width+.
|
16
16
|
class Label < Widget
|
17
17
|
|
18
|
-
# justify
|
18
|
+
# @note `justify` requires a display length, esp if center.
|
19
|
+
# @param justify [true, false] aliignment of label :right, :left or :center
|
19
20
|
attr_property :justify #:right, :left, :center
|
20
21
|
attr_accessor :mnemonic # alt-key that passes focus to related field
|
21
22
|
attr_accessor :related_widget # field related to this label. See +mnemonic+.
|
data/lib/umbra/labeledfield.rb
CHANGED
@@ -4,12 +4,12 @@
|
|
4
4
|
# Author: j kepler http://github.com/mare-imbrium/canis/
|
5
5
|
# Date: 2018-04-12 - 23:35
|
6
6
|
# License: MIT
|
7
|
-
# Last update: 2018-
|
7
|
+
# Last update: 2018-06-03 09:58
|
8
8
|
# ----------------------------------------------------------------------------- #
|
9
9
|
# labeledfield.rb Copyright (C) 2018 j kepler
|
10
10
|
require 'umbra/field'
|
11
11
|
module Umbra
|
12
|
-
# TODO we should consider creating a Label
|
12
|
+
# TODO we should consider creating a `Label`, so user can have more control. Or allow user
|
13
13
|
# to supply a Label i/o a String ???
|
14
14
|
#
|
15
15
|
# NOTE: If using LabeledField in a messagebox, pls specify messagebox width explicitly
|
@@ -20,23 +20,34 @@ module Umbra
|
|
20
20
|
# This could contain a Labal and a Field and extend Widget. Actually, it could be LabeledWidget
|
21
21
|
# so that any other widget is sent in and associated with a a label.
|
22
22
|
#
|
23
|
+
|
24
|
+
## A widget that has an entry +Field+ and an associated +String+.
|
25
|
+
# This stores a +String+ and prints it before the +Field+.
|
26
|
+
# This label is gauranteed to print to the left of the Field.
|
27
|
+
# This label prints on +lrow+ and +lcol+ if supplied, else it will print on the left of the field
|
28
|
+
# at +col+ minus the width of the label.
|
29
|
+
#
|
30
|
+
# It is initialized exactly like a Field, with the addition of `:label` (and optionally label_color_pair,
|
31
|
+
# label_attr, and lcol, lrow)
|
23
32
|
class LabeledField < Field
|
24
|
-
|
25
|
-
|
26
|
-
# This label prints on +lrow+ and +lcol+ if supplied, else it will print on the left of the field
|
27
|
-
# at +col+ minus the width of the label.
|
28
|
-
#
|
29
|
-
# It is initialized exactly like a Field, with the addition of label (and optionally label_color_pair,
|
30
|
-
# label_attr, and lcol, lrow)
|
31
|
-
#
|
33
|
+
|
34
|
+
## @param label [String] a string to use and a label
|
32
35
|
attr_property :label # label of field, just a String
|
36
|
+
|
33
37
|
# if lrow and lcol are specified then label is printed exactly at that spot.
|
34
38
|
# If they are omitted, then label is printed on left of field. Omit the lcol if you want
|
35
|
-
#
|
36
|
-
|
39
|
+
# the fields to be aligned, one under another, with the labels right-aligned.
|
40
|
+
# @param lrow [Integer] row for label to print on
|
41
|
+
attr_property :lrow # coordinates of the label
|
42
|
+
# @param lcol [Integer] column for label to print on
|
43
|
+
attr_property :lcol # coordinates of the label
|
44
|
+
# @param label_color_pair [Integer] color_pair of label
|
37
45
|
attr_property :label_color_pair # label of field color_pair
|
46
|
+
# @param label_attr [Integer] attribute of label (NORMAL, BOLD, REVERSE ...)
|
38
47
|
attr_property :label_attr # label of field attribute
|
48
|
+
# @param label_highlight_color_pair [Integer] color_pair of label when field in focus
|
39
49
|
attr_property :label_highlight_color_pair # label of field high color_pair
|
50
|
+
# @param label_highlight_attr [Integer] attribute of label when field in focus
|
40
51
|
attr_property :label_highlight_attr # label of field high attribute
|
41
52
|
attr_accessor :mnemonic # mnemonic of field which shows up on label
|
42
53
|
attr_accessor :related_widget # to keep sync with label
|
@@ -45,7 +56,8 @@ module Umbra
|
|
45
56
|
super
|
46
57
|
end
|
47
58
|
|
48
|
-
|
59
|
+
# paint the widget, called by +Form+.
|
60
|
+
def repaint #:nodoc:
|
49
61
|
return unless @repaint_required
|
50
62
|
_lrow = @lrow || @row
|
51
63
|
# the next was nice, but in some cases this goes out of screen. and the container
|
data/lib/umbra/listbox.rb
CHANGED
@@ -5,7 +5,7 @@ require 'umbra/multiline'
|
|
5
5
|
# Author: j kepler http://github.com/mare-imbrium/umbra
|
6
6
|
# Date: 2018-03-19
|
7
7
|
# License: MIT
|
8
|
-
# Last update: 2018-
|
8
|
+
# Last update: 2018-06-03 10:39
|
9
9
|
# ----------------------------------------------------------------------------- #
|
10
10
|
# listbox.rb Copyright (C) 2012-2018 j kepler
|
11
11
|
# == TODO
|
@@ -25,7 +25,9 @@ module Umbra
|
|
25
25
|
attr_accessor :selection_allowed # does this class allow row selection (should be class level)
|
26
26
|
attr_accessor :selection_key # key used to select a row
|
27
27
|
attr_reader :selected_index # row selected, may change to plural
|
28
|
+
# @param selected_color_pair [Integer] color pair of row selected
|
28
29
|
attr_property :selected_color_pair # row selected color_pair
|
30
|
+
# @param selected_attr [Integer] attribute of row selected (default REVERSE)
|
29
31
|
attr_property :selected_attr # row selected color_pair
|
30
32
|
attr_accessor :selected_mark # row selected character
|
31
33
|
attr_accessor :unselected_mark # row unselected character (usually blank)
|
@@ -47,16 +49,20 @@ module Umbra
|
|
47
49
|
end
|
48
50
|
|
49
51
|
|
52
|
+
# set the list
|
53
|
+
# @param alist [Array<String>] string array to display as a list
|
50
54
|
def list=(alist)
|
51
55
|
super
|
52
56
|
clear_selection
|
53
57
|
end
|
54
58
|
|
55
59
|
|
60
|
+
# clear selected index/indices
|
56
61
|
def clear_selection
|
57
62
|
@selected_index = nil
|
58
63
|
end
|
59
64
|
|
65
|
+
# Binds selection key to +toggle_selection+ if selection enabled. All others pass to parent class.
|
60
66
|
def map_keys
|
61
67
|
return if @keys_mapped
|
62
68
|
if @selection_allowed and @selection_key
|
@@ -66,6 +72,7 @@ module Umbra
|
|
66
72
|
end
|
67
73
|
|
68
74
|
## Toggle current row's selection status.
|
75
|
+
## @param _row [Integer] row to toggle, default to current row
|
69
76
|
def toggle_selection _row=@current_index
|
70
77
|
@repaint_required = true
|
71
78
|
if @selected_index == _row
|
@@ -75,13 +82,15 @@ module Umbra
|
|
75
82
|
end
|
76
83
|
end
|
77
84
|
|
78
|
-
## select given row
|
85
|
+
## select given row, and fire SELECT_ROW handler
|
86
|
+
## @param _row [Integer] row to select, default to current row
|
79
87
|
def select_row _row=@current_index
|
80
88
|
@selected_index = _row
|
81
89
|
fire_handler :SELECT_ROW, self # use selected_index to know which one
|
82
90
|
end
|
83
91
|
|
84
|
-
## unselect given row
|
92
|
+
## unselect given row, and fire SELECT_ROW handler
|
93
|
+
## @param _row [Integer] row to unselect, default to current row
|
85
94
|
def unselect_row _row=@current_index
|
86
95
|
if _row == @selected_index
|
87
96
|
@selected_index = nil
|
@@ -93,11 +102,11 @@ module Umbra
|
|
93
102
|
## For any major customization of Listbox output, this method would be overridden.
|
94
103
|
## This method determines state, mark, slice of line item to show.
|
95
104
|
## listbox adds a mark on the side, whether a row is selected or not, and whether it is current.
|
96
|
-
## @param win - window pointer for printing
|
97
|
-
## @param [Integer] - row offset on screen
|
98
|
-
## @param [Integer] - col offset on screen
|
99
|
-
## @param [String] - line to print
|
100
|
-
## @param [Integer] - offset in List array
|
105
|
+
## @param win [Window] - window pointer for printing
|
106
|
+
## @param row [Integer] - row offset on screen
|
107
|
+
## @param col [Integer] - col offset on screen
|
108
|
+
## @param line [String] - line to print
|
109
|
+
## @param index [Integer] - offset in List array
|
101
110
|
def paint_row(win, row, col, line, index)
|
102
111
|
|
103
112
|
state = state_of_row(index)
|
@@ -127,8 +136,9 @@ module Umbra
|
|
127
136
|
## Determine the mark on the left of the row.
|
128
137
|
## The mark depends on the state: :SELECTED :HIGHLIGHTED :CURRENT :NORMAL
|
129
138
|
## Listbox adds :SELECTED state to Multiline.
|
130
|
-
## @param [Integer] offset of row in data
|
131
|
-
## @
|
139
|
+
## @param index [Integer] offset of row in data
|
140
|
+
## @param state [Symbol] state of current row
|
141
|
+
## @return [String] aracter to be displayed inside left margin
|
132
142
|
def mark_of_row index, state
|
133
143
|
mark = case state
|
134
144
|
when :SELECTED
|
@@ -147,6 +157,7 @@ module Umbra
|
|
147
157
|
## which can be determined using +index+.
|
148
158
|
## Listbox adds :SELECTED state to +Multiline+.
|
149
159
|
## @param [Integer] offset of row in data
|
160
|
+
## @param state [Symbol] state of current row
|
150
161
|
## @return [Array] color_pair and attrib constant
|
151
162
|
def color_of_row index, state
|
152
163
|
arr = super
|
data/lib/umbra/pad.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
* Author: jkepler
|
8
8
|
* Date: 2018-03-28 14:30
|
9
9
|
* License: MIT
|
10
|
-
* Last update: 2018-06-
|
10
|
+
* Last update: 2018-06-02 10:22
|
11
11
|
|
12
12
|
== CHANGES
|
13
13
|
== Todo
|
@@ -21,6 +21,7 @@
|
|
21
21
|
=end
|
22
22
|
require 'ffi-ncurses'
|
23
23
|
|
24
|
+
module Umbra
|
24
25
|
class Pad
|
25
26
|
|
26
27
|
# You may pass height, width, row and col for creating a window otherwise a fullscreen window
|
@@ -346,3 +347,4 @@ if __FILE__ == $PROGRAM_NAME
|
|
346
347
|
FFI::NCurses.curs_set 1 # cursor visible again
|
347
348
|
end
|
348
349
|
end
|
350
|
+
end # module
|
data/lib/umbra/radiobutton.rb
CHANGED
@@ -1,26 +1,33 @@
|
|
1
1
|
# ----------------------------------------------------------------------------- #
|
2
2
|
# File: radiobutton.rb
|
3
3
|
# Description: a member of a group of buttons, only one can be selected at a time.
|
4
|
-
# Author: j kepler http://github.com/mare-imbrium/
|
4
|
+
# Author: j kepler http://github.com/mare-imbrium/
|
5
5
|
# Date: 2018-04-02 - 10:37
|
6
6
|
# License: MIT
|
7
|
-
# Last update: 2018-06-
|
7
|
+
# Last update: 2018-06-03 11:27
|
8
8
|
# ----------------------------------------------------------------------------- #
|
9
9
|
# radiobutton.rb Copyright (C) 2012-2018 j kepler
|
10
10
|
|
11
11
|
module Umbra
|
12
12
|
##
|
13
|
-
# A selectable button that has a text value. It is
|
14
|
-
# is shared by other radio buttons. Only one is selected at a time, unlike
|
15
|
-
# +text+ is the value to display, which can include an ampersand for a hotkey
|
16
|
-
# +value+ is the value returned if selected, which usually is similar to text (or a short word)
|
13
|
+
# A selectable button that has a text value. It is linked to a +ButtonGroup+ that
|
14
|
+
# is shared by other radio buttons. Only one is selected at a time, unlike +Checkbox+.
|
15
|
+
# +text+ is the value to display, which can include an ampersand for a hotkey.
|
16
|
+
# +value+ is the value returned if selected, which usually is similar to text (or a short word).
|
17
17
|
# +width+ is helpful if placing the brackets to right of text, used to align round brackets
|
18
18
|
# By default, radio buttons place the button on the left of the text.
|
19
19
|
#
|
20
|
-
# Typically, the
|
20
|
+
# Typically, the +ButtonGroup+'s `command` is passed a block to execute whenever any of the
|
21
21
|
# radiobuttons of this group is fired.
|
22
|
-
|
22
|
+
# @example
|
23
|
+
# radio1 = RadioButton.new text: "Red", value: "Red", row: 10, col: 20
|
24
|
+
# radio2 = RadioButton.new text: "Blue", value: "Blue", row: 11, col: 20
|
25
|
+
# group = ButtonGroup.new "Color"
|
26
|
+
# group.add(radio1).add(radio2)
|
27
|
+
# form.add_widget radio1, radio2
|
28
|
+
#
|
23
29
|
class RadioButton < ToggleButton
|
30
|
+
# @param align_right [true, false] set whether button should be on right of text, default false.
|
24
31
|
attr_property :align_right # the button will be on the right
|
25
32
|
attr_accessor :button_group # group that this button belongs to.
|
26
33
|
|
data/lib/umbra/togglebutton.rb
CHANGED
@@ -6,7 +6,7 @@ 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-
|
9
|
+
# Last update: 2018-06-03 09:33
|
10
10
|
# ----------------------------------------------------------------------------- #
|
11
11
|
# togglebutton.rb Copyright (C) 2018 j kepler
|
12
12
|
#
|
@@ -14,25 +14,30 @@ require 'umbra/button'
|
|
14
14
|
module Umbra
|
15
15
|
|
16
16
|
# A button that may be switched off an on.
|
17
|
-
# Extended by RadioButton and
|
17
|
+
# Extended by `RadioButton` and `Checkbox`.
|
18
18
|
# WARNING, pls do not override +text+ otherwise checkboxes etc will stop functioning.
|
19
19
|
# TODO: add editable here and prevent toggling if not so.
|
20
20
|
class ToggleButton < Button
|
21
|
-
|
21
|
+
|
22
|
+
# set or get text to display for on value and off value
|
22
23
|
attr_accessor :onvalue, :offvalue
|
23
|
-
|
24
|
+
|
25
|
+
# @param value [true, false] Which value to use currently, onvalue or offvalue
|
26
|
+
# @return [true, false] current value
|
24
27
|
attr_property :value
|
25
|
-
|
26
|
-
#attr_property :surround_chars already in button
|
27
|
-
# 2018-04-02 - removing variable
|
28
|
+
|
28
29
|
# background to use when selected, if not set then default
|
29
30
|
# 2018-04-02 - unused so commenting off. color_pair is not used here or in checkbox
|
30
31
|
#attr_property :selected_color_pair
|
31
32
|
|
33
|
+
## Just calls super.
|
34
|
+
## @param config [Hash] config values such as row, col, onvalue, offvalue and value.
|
32
35
|
def initialize config={}, &block
|
33
36
|
super
|
34
37
|
|
35
38
|
end
|
39
|
+
|
40
|
+
# @return [onvalue, offvalue] returns on or off value depending on +@value+.
|
36
41
|
def getvalue
|
37
42
|
@value ? @onvalue : @offvalue
|
38
43
|
end
|
@@ -42,9 +47,11 @@ module Umbra
|
|
42
47
|
# added for some standardization 2010-09-07 20:28
|
43
48
|
# alias :text :getvalue # NEXT VERSION
|
44
49
|
# change existing text to label
|
50
|
+
|
51
|
+
|
45
52
|
##
|
46
53
|
# is the button on or off
|
47
|
-
#
|
54
|
+
# @return [true, false] returns +@value+, has the button been checked or not.
|
48
55
|
def checked?
|
49
56
|
@value
|
50
57
|
end
|
@@ -62,8 +69,8 @@ module Umbra
|
|
62
69
|
@surround_chars[0] + buttontext + @surround_chars[1]
|
63
70
|
end
|
64
71
|
|
65
|
-
# toggle button handle key
|
66
|
-
# @param [
|
72
|
+
# toggle button handle key. Handles only `space` (32), all others are passed to parent classes.
|
73
|
+
# @param ch [Integer] key received
|
67
74
|
#
|
68
75
|
def handle_key ch
|
69
76
|
if ch == 32
|
@@ -75,12 +82,14 @@ module Umbra
|
|
75
82
|
end
|
76
83
|
|
77
84
|
##
|
78
|
-
# toggle the button value
|
85
|
+
# toggle the button value. Calls +fire+.
|
79
86
|
def toggle
|
80
87
|
fire
|
81
88
|
end
|
82
89
|
|
83
|
-
#
|
90
|
+
# Toggles the button's value.
|
91
|
+
# Called by +toggle+ (when users pressed +SPACE+).
|
92
|
+
# Calls :PRESS event
|
84
93
|
def fire
|
85
94
|
checked(!@value)
|
86
95
|
#@item_event = ItemEvent.new self, self if @item_event.nil?
|
@@ -89,7 +98,8 @@ module Umbra
|
|
89
98
|
## 2018-05-27 - trying to use self in most cases. Above was not needed.
|
90
99
|
fire_handler :PRESS, self
|
91
100
|
end
|
92
|
-
|
101
|
+
|
102
|
+
|
93
103
|
# set the value to true or false
|
94
104
|
# user may programmatically want to check or uncheck
|
95
105
|
# ## duplicate of value ??? 2018-05-26 -
|
data/lib/umbra/version.rb
CHANGED
data/lib/umbra/widget.rb
CHANGED
@@ -9,6 +9,10 @@ require 'umbra/keymappinghandler' # for bind_key and process_key
|
|
9
9
|
|
10
10
|
class Module # {{{
|
11
11
|
|
12
|
+
# dsl method for declaring attribute setters which result in widget
|
13
|
+
# being repainted. Also, fire a #fire_property_change event.
|
14
|
+
# @param symbols [Symbol] value to be set
|
15
|
+
# @return [Widget] self
|
12
16
|
def attr_property(*symbols)
|
13
17
|
symbols.each { |sym|
|
14
18
|
class_eval %{
|
@@ -37,58 +41,76 @@ class Module # {{{
|
|
37
41
|
end # def
|
38
42
|
end # module }}}
|
39
43
|
module Umbra
|
40
|
-
|
41
|
-
|
42
|
-
class
|
44
|
+
|
45
|
+
## Exception thrown by Field if validation fails
|
46
|
+
class FieldValidationException < RuntimeError
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
## Parent class of all widgets/controls that are displayed on the screen/window
|
51
|
+
## and are managed by +Form+.
|
52
|
+
## Many attributes use `attr_property` instead of `attr_accessor`. This is used for elements
|
53
|
+
## that must repaint the widget whenever updated. They also fire a property change event.
|
54
|
+
## These properties may not show up in the generated RDoc.
|
55
|
+
## This class will not be instantiated by programs, only its subclasses will be.
|
56
|
+
## Widget registers `:ENTER` `:LEAVE` `:CHANGED` and `:PROPERTY_CHANGE` events.
|
57
|
+
## Widget defines three states: `:NORMAL` `:HIGHLIGHTED` and `:SELECTED`.
|
58
|
+
## `HIGHLIGHTED` refers to the single widget that is focussed.
|
59
|
+
## `SELECTED` is only for Togglebuttons that may be in `SELECTED` state.
|
60
|
+
## `NORMAL` state is for all others (the default state).
|
61
|
+
class Widget
|
43
62
|
include EventHandler
|
44
63
|
include KeyMappingHandler
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
#
|
73
|
-
|
74
|
-
|
64
|
+
|
65
|
+
## @param text [String] common interface for text related to a field, label, textview, button etc
|
66
|
+
attr_property :text
|
67
|
+
## @param width [Integer] width of widget, same for +height+
|
68
|
+
attr_property :width, :height ## width and height of widget
|
69
|
+
|
70
|
+
# foreground and background colors when focussed. Currently used with buttons and field
|
71
|
+
# Form checks and repaints on entry if these are set.
|
72
|
+
## @param highlight_color_pair [Integer] color pair of widget when focussed
|
73
|
+
attr_property :highlight_color_pair
|
74
|
+
## @param highlight_attr [Integer] visual attribute of widget when focussed
|
75
|
+
attr_property :highlight_attr
|
76
|
+
|
77
|
+
attr_accessor :col # location of object (column)
|
78
|
+
attr_writer :row # location of object
|
79
|
+
|
80
|
+
## @param color_pair [Integer] color pair of widget (when not focussed)
|
81
|
+
attr_property :color_pair # instead of colors give just color_pair
|
82
|
+
## @param attr [Integer] visual attribute of widget when not focussed
|
83
|
+
attr_property :attr # attribute bold, normal, reverse
|
84
|
+
|
85
|
+
attr_accessor :name # documentation, used in print statements
|
86
|
+
attr_accessor :curpos # cursor position inside object - column, not row.
|
87
|
+
|
88
|
+
|
89
|
+
attr_accessor :graphic # window which should be set by form when adding
|
90
|
+
attr_accessor :state # :NORMAL, :SELECTED, :HIGHLIGHTED
|
91
|
+
attr_reader :row_offset, :col_offset # where should the cursor be placed to start with
|
92
|
+
|
93
|
+
## @param attr [true, false] should the widget be displayed or not
|
94
|
+
attr_property :visible
|
95
|
+
|
96
|
+
attr_reader :focusable # boolean can this get focus or not.
|
97
|
+
|
98
|
+
attr_accessor :modified # boolean, value modified or not
|
75
99
|
|
76
100
|
#attr_accessor :parent_component # added 2010-01-12 23:28 BUFFERED - to bubble up
|
77
101
|
|
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
|
80
102
|
|
81
|
-
|
82
|
-
|
103
|
+
# @return [String] descriptions for each key set in _key_map, NOT YET displayed TODO
|
104
|
+
attr_reader :key_label
|
83
105
|
|
84
|
-
|
85
|
-
|
86
|
-
attr_reader :key_label
|
87
|
-
attr_reader :handler # event handler
|
88
|
-
# adding as attr_accessor 2018-03-22 -
|
89
|
-
# is a repaint required or not, boolean
|
90
|
-
attr_accessor :repaint_required
|
106
|
+
# @return [Hash] event handler hash containing key and block association
|
107
|
+
attr_reader :handler
|
91
108
|
|
109
|
+
# @param repaint_required [true, false] is a repaint required or not, boolean
|
110
|
+
attr_accessor :repaint_required
|
111
|
+
|
112
|
+
# @param aconfig [Hash] initialization parameters such as row, col, height, width, color_pair, text.
|
113
|
+
# @yield [Widget] self
|
92
114
|
def initialize aconfig={}, &block
|
93
115
|
@row_offset ||= 0
|
94
116
|
@col_offset ||= 0
|
@@ -112,24 +134,25 @@ class Widget
|
|
112
134
|
end
|
113
135
|
end
|
114
136
|
|
115
|
-
def variable_set var, val
|
137
|
+
def variable_set var, val #:nodoc:
|
116
138
|
send("#{var}=", val)
|
117
139
|
end
|
118
|
-
|
140
|
+
|
141
|
+
## Initialise internal variables
|
142
|
+
def init_vars #:nodoc:
|
119
143
|
# just in case anyone does a super. Not putting anything here
|
120
144
|
# since i don't want anyone accidentally overriding
|
121
145
|
end
|
122
146
|
|
123
|
-
# modified
|
124
|
-
|
125
|
-
#
|
126
|
-
# getter and setter for modified (added 2009-01-18 12:31 )
|
147
|
+
# Widget modified or not.
|
148
|
+
# typically will be overridden to check if value changed from what it was on enter.
|
149
|
+
# @return [true, false] modified since on_enter or not
|
127
150
|
def modified?
|
128
151
|
@modified
|
129
152
|
end
|
130
153
|
|
131
154
|
# triggered whenever a widget is entered.
|
132
|
-
|
155
|
+
## Will invoke `:ENTER` handler/event
|
133
156
|
def on_enter
|
134
157
|
## Form has already set this, and set modified to false
|
135
158
|
@state = :HIGHLIGHTED # duplicating since often these are inside containers
|
@@ -138,7 +161,9 @@ class Widget
|
|
138
161
|
fire_handler :ENTER, self
|
139
162
|
end
|
140
163
|
end
|
164
|
+
|
141
165
|
## Called when user exits a widget
|
166
|
+
## Will invoke `:LEAVE` handler/event
|
142
167
|
def on_leave
|
143
168
|
@state = :NORMAL # duplicating since often these are inside containers
|
144
169
|
#@focussed = false
|
@@ -146,25 +171,32 @@ class Widget
|
|
146
171
|
fire_handler :LEAVE, self
|
147
172
|
end
|
148
173
|
end
|
174
|
+
|
175
|
+
|
149
176
|
##
|
150
|
-
#
|
151
|
-
# row and col is where a widget starts. offsets usually take into account borders.
|
177
|
+
# Returns row and col is where a widget starts. offsets usually take into account borders.
|
152
178
|
# the offsets typically are where the cursor should be positioned inside, upon on_enter.
|
179
|
+
# @return [Integer] row of widget where painting data actually starts
|
180
|
+
# @return [Integer] col of widget where painting data actually starts
|
153
181
|
def rowcol
|
154
182
|
return self.row+@row_offset, self.col+@col_offset
|
155
183
|
end
|
156
|
-
|
184
|
+
|
185
|
+
## @return [String] the value of the widget.
|
157
186
|
def getvalue
|
158
187
|
@text
|
159
188
|
end
|
189
|
+
|
160
190
|
##
|
161
191
|
# Am making a separate method since often value for print differs from actual value
|
192
|
+
## @return [String] the value of the widget for painting.
|
162
193
|
def getvalue_for_paint
|
163
194
|
getvalue
|
164
195
|
end
|
196
|
+
|
165
197
|
##
|
166
|
-
#
|
167
|
-
#
|
198
|
+
# Default repaint method. Called by form for all widgets.
|
199
|
+
# widget does not have display_length. This should be overriden by concrete subclasses.
|
168
200
|
def repaint
|
169
201
|
r,c = rowcol
|
170
202
|
$log.debug("widget repaint : r:#{r} c:#{c} col:#{@color_pair}" )
|
@@ -174,25 +206,18 @@ class Widget
|
|
174
206
|
@graphic.printstring r, c, "%-*s" % [len, value], acolor, attr()
|
175
207
|
end
|
176
208
|
|
177
|
-
def destroy
|
178
|
-
raise "what is this dong here still SHOULD Not be CALLED"
|
179
|
-
$log.debug "DESTROY : widget #{@name} "
|
180
|
-
panel = @window.panel
|
181
|
-
Ncurses::Panel.del_panel(panel.pointer) if !panel.nil?
|
182
|
-
@window.delwin if !@window.nil?
|
183
|
-
end
|
184
209
|
|
185
|
-
|
186
|
-
def set_form_row
|
210
|
+
def set_form_row #:nodoc:
|
187
211
|
raise "uncalled set_form_row"
|
188
212
|
r, c = rowcol
|
189
213
|
setrowcol row, nil # does not exist any longer
|
190
214
|
end
|
215
|
+
|
191
216
|
# set cursor on correct column, widget
|
192
217
|
# Ideally, this should be overriden, as it is not likely to be correct.
|
193
218
|
# NOTE: this is okay for some widgets but NOT for containers
|
194
219
|
# that will call their own components SFR and SFC
|
195
|
-
#Currently, Field has overriden this. +setrowcol+ does not exist any longer.
|
220
|
+
# Currently, Field has overriden this. +setrowcol+ does not exist any longer.
|
196
221
|
def set_form_col col1=@curpos
|
197
222
|
@curpos = col1 || 0 # 2010-01-14 21:02
|
198
223
|
#@form.col = @col + @col_offset + @curpos
|
@@ -201,8 +226,11 @@ class Widget
|
|
201
226
|
setrowcol nil, c
|
202
227
|
end
|
203
228
|
|
204
|
-
|
205
|
-
#
|
229
|
+
# Handle keys entered by user when this widget is focussed. Executes blocks bound to given key or
|
230
|
+
# else returns control to +Form+.
|
231
|
+
# To be called at end of `handle_key` of widgets so installed actions can be executed.
|
232
|
+
# @param ch [Integer] keystroke entered
|
233
|
+
# @return [0, :UNHANDLED] return value of block executed for given keystroke
|
206
234
|
def handle_key(ch)
|
207
235
|
ret = process_key ch, self
|
208
236
|
return :UNHANDLED if ret == :UNHANDLED
|
@@ -211,23 +239,23 @@ class Widget
|
|
211
239
|
|
212
240
|
# is the entire widget to be repainted including things like borders and titles
|
213
241
|
# earlier took a default of true, now must be explicit. Perhaps, not used currently.
|
214
|
-
def repaint_all(tf)
|
242
|
+
def repaint_all(tf) #:nodoc:
|
215
243
|
# NOTE NOT USED
|
216
244
|
raise " not used repaint all"
|
217
245
|
@repaint_all = tf
|
218
246
|
@repaint_required = tf
|
219
247
|
end
|
220
|
-
|
221
|
-
#
|
248
|
+
|
249
|
+
# Shortcut for users to indicate that a widget should be redrawn since some property has been changed.
|
250
|
+
# Now that I have created +attr_property+ this may not be needed
|
222
251
|
def touch
|
223
252
|
@repaint_required = true
|
224
253
|
end
|
225
254
|
|
226
255
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
# 2018-03-08 - NOT_SURE
|
256
|
+
## A general method for all widgets to override with their favorite or most meaninful event
|
257
|
+
## This is a convenience method. Widgets that have a `PRESS` event will bind the given block to PRESS,
|
258
|
+
## all others to the `CHANGED` event.
|
231
259
|
def command *args, &block
|
232
260
|
if event? :PRESS
|
233
261
|
bind_event :PRESS, *args, &block
|
@@ -235,24 +263,31 @@ class Widget
|
|
235
263
|
bind_event :CHANGED, *args, &block
|
236
264
|
end
|
237
265
|
end
|
238
|
-
|
266
|
+
|
267
|
+
def _form=(aform) #:nodoc:
|
239
268
|
@_form = aform
|
240
269
|
end
|
270
|
+
|
271
|
+
## set focusable property to true or false
|
272
|
+
## Also updates the focusables array.
|
241
273
|
def focusable=(bool)
|
242
274
|
#$log.debug " inside focusable= with #{bool} "
|
243
275
|
@focusable = bool
|
244
276
|
@_form.update_focusables if @_form
|
245
277
|
end
|
246
278
|
|
247
|
-
##
|
279
|
+
## Get width of widget, treating negatives as relative width.
|
280
|
+
## @return [Integer, nil] returns width of widget
|
248
281
|
def width
|
249
282
|
return nil unless @width ## this is required otherwise checking for nil will fail
|
250
283
|
if @width < 0
|
251
284
|
return ( FFI::NCurses.COLS + @width ) - self.col + 1
|
252
|
-
#return ( FFI::NCurses.COLS + @width ) #- self.col + 1
|
253
285
|
end
|
254
286
|
@width
|
255
287
|
end
|
288
|
+
|
289
|
+
## Get height of widget. Used only for +Multline+ widgets
|
290
|
+
## @return [Integer, nil] height of widget if applicable
|
256
291
|
def height
|
257
292
|
return nil unless @height
|
258
293
|
if @height < 0
|
@@ -261,6 +296,9 @@ class Widget
|
|
261
296
|
end
|
262
297
|
@height
|
263
298
|
end
|
299
|
+
|
300
|
+
## get row of widget
|
301
|
+
## @return [Integer, nil] row of widget
|
264
302
|
def row
|
265
303
|
return nil unless @row
|
266
304
|
if @row < 0
|
@@ -268,7 +306,6 @@ class Widget
|
|
268
306
|
end
|
269
307
|
@row
|
270
308
|
end
|
271
|
-
|
272
|
-
|
273
|
-
end #
|
309
|
+
|
310
|
+
end # class
|
274
311
|
end # module
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ncumbra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kepler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|