canis 0.0.4

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.
Files changed (134) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +45 -0
  3. data/CHANGES +52 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +24 -0
  7. data/Rakefile +2 -0
  8. data/canis.gemspec +25 -0
  9. data/examples/alpmenu.rb +46 -0
  10. data/examples/app.sample +19 -0
  11. data/examples/appemail.rb +191 -0
  12. data/examples/atree.rb +105 -0
  13. data/examples/bline.rb +181 -0
  14. data/examples/common/devel.rb +319 -0
  15. data/examples/common/file.rb +93 -0
  16. data/examples/data/README.markdown +9 -0
  17. data/examples/data/brew.txt +38 -0
  18. data/examples/data/color.2 +37 -0
  19. data/examples/data/gemlist.txt +59 -0
  20. data/examples/data/lotr.txt +12 -0
  21. data/examples/data/ports.txt +136 -0
  22. data/examples/data/table.txt +37 -0
  23. data/examples/data/tasks.csv +88 -0
  24. data/examples/data/tasks.txt +27 -0
  25. data/examples/data/todo.txt +16 -0
  26. data/examples/data/todocsv.csv +28 -0
  27. data/examples/data/unix1.txt +21 -0
  28. data/examples/data/unix2.txt +11 -0
  29. data/examples/dbdemo.rb +506 -0
  30. data/examples/dirtree.rb +177 -0
  31. data/examples/newtabbedwindow.rb +100 -0
  32. data/examples/newtesttabp.rb +92 -0
  33. data/examples/tabular.rb +212 -0
  34. data/examples/tasks.rb +179 -0
  35. data/examples/term2.rb +88 -0
  36. data/examples/testbuttons.rb +307 -0
  37. data/examples/testcombo.rb +102 -0
  38. data/examples/testdb.rb +182 -0
  39. data/examples/testfields.rb +208 -0
  40. data/examples/testflowlayout.rb +43 -0
  41. data/examples/testkeypress.rb +98 -0
  42. data/examples/testlistbox.rb +187 -0
  43. data/examples/testlistbox1.rb +199 -0
  44. data/examples/testmessagebox.rb +144 -0
  45. data/examples/testprogress.rb +116 -0
  46. data/examples/testree.rb +107 -0
  47. data/examples/testsplitlayout.rb +53 -0
  48. data/examples/testsplitlayout1.rb +49 -0
  49. data/examples/teststacklayout.rb +48 -0
  50. data/examples/testwsshortcuts.rb +68 -0
  51. data/examples/testwsshortcuts2.rb +129 -0
  52. data/lib/canis.rb +16 -0
  53. data/lib/canis/core/docs/index.txt +104 -0
  54. data/lib/canis/core/docs/list.txt +16 -0
  55. data/lib/canis/core/docs/style_help.yml +34 -0
  56. data/lib/canis/core/docs/tabbedpane.txt +15 -0
  57. data/lib/canis/core/docs/table.txt +31 -0
  58. data/lib/canis/core/docs/textpad.txt +48 -0
  59. data/lib/canis/core/docs/tree.txt +23 -0
  60. data/lib/canis/core/include/.DS_Store +0 -0
  61. data/lib/canis/core/include/action.rb +83 -0
  62. data/lib/canis/core/include/actionmanager.rb +49 -0
  63. data/lib/canis/core/include/appmethods.rb +179 -0
  64. data/lib/canis/core/include/bordertitle.rb +49 -0
  65. data/lib/canis/core/include/canisparser.rb +100 -0
  66. data/lib/canis/core/include/colorparser.rb +437 -0
  67. data/lib/canis/core/include/defaultfilerenderer.rb +64 -0
  68. data/lib/canis/core/include/io.rb +320 -0
  69. data/lib/canis/core/include/layouts/SplitLayout.rb +161 -0
  70. data/lib/canis/core/include/layouts/abstractlayout.rb +213 -0
  71. data/lib/canis/core/include/layouts/flowlayout.rb +104 -0
  72. data/lib/canis/core/include/layouts/stacklayout.rb +109 -0
  73. data/lib/canis/core/include/listbindings.rb +89 -0
  74. data/lib/canis/core/include/listeditable.rb +319 -0
  75. data/lib/canis/core/include/listoperations.rb +61 -0
  76. data/lib/canis/core/include/listselectionmodel.rb +388 -0
  77. data/lib/canis/core/include/multibuffer.rb +173 -0
  78. data/lib/canis/core/include/ractionevent.rb +73 -0
  79. data/lib/canis/core/include/rchangeevent.rb +27 -0
  80. data/lib/canis/core/include/rhistory.rb +95 -0
  81. data/lib/canis/core/include/rinputdataevent.rb +47 -0
  82. data/lib/canis/core/include/textdocument.rb +111 -0
  83. data/lib/canis/core/include/vieditable.rb +175 -0
  84. data/lib/canis/core/include/widgetmenu.rb +66 -0
  85. data/lib/canis/core/system/colormap.rb +165 -0
  86. data/lib/canis/core/system/keydefs.rb +32 -0
  87. data/lib/canis/core/system/ncurses.rb +237 -0
  88. data/lib/canis/core/system/panel.rb +129 -0
  89. data/lib/canis/core/system/window.rb +1081 -0
  90. data/lib/canis/core/util/ansiparser.rb +119 -0
  91. data/lib/canis/core/util/app.rb +696 -0
  92. data/lib/canis/core/util/basestack.rb +412 -0
  93. data/lib/canis/core/util/defaultcolorparser.rb +84 -0
  94. data/lib/canis/core/util/extras/README +5 -0
  95. data/lib/canis/core/util/extras/bottomline.rb +1815 -0
  96. data/lib/canis/core/util/extras/padreader.rb +192 -0
  97. data/lib/canis/core/util/focusmanager.rb +31 -0
  98. data/lib/canis/core/util/helpmanager.rb +160 -0
  99. data/lib/canis/core/util/oldwidgetshortcuts.rb +304 -0
  100. data/lib/canis/core/util/promptmenu.rb +235 -0
  101. data/lib/canis/core/util/rcommandwindow.rb +933 -0
  102. data/lib/canis/core/util/rdialogs.rb +520 -0
  103. data/lib/canis/core/util/textutils.rb +74 -0
  104. data/lib/canis/core/util/viewer.rb +238 -0
  105. data/lib/canis/core/util/widgetshortcuts.rb +508 -0
  106. data/lib/canis/core/widgets/applicationheader.rb +103 -0
  107. data/lib/canis/core/widgets/box.rb +58 -0
  108. data/lib/canis/core/widgets/divider.rb +310 -0
  109. data/lib/canis/core/widgets/extras/README.md +12 -0
  110. data/lib/canis/core/widgets/extras/rtextarea.rb +960 -0
  111. data/lib/canis/core/widgets/extras/stackflow.rb +474 -0
  112. data/lib/canis/core/widgets/keylabelprinter.rb +194 -0
  113. data/lib/canis/core/widgets/listbox.rb +326 -0
  114. data/lib/canis/core/widgets/listfooter.rb +86 -0
  115. data/lib/canis/core/widgets/rcombo.rb +210 -0
  116. data/lib/canis/core/widgets/rcontainer.rb +415 -0
  117. data/lib/canis/core/widgets/rlink.rb +30 -0
  118. data/lib/canis/core/widgets/rmenu.rb +970 -0
  119. data/lib/canis/core/widgets/rmenulink.rb +30 -0
  120. data/lib/canis/core/widgets/rmessagebox.rb +400 -0
  121. data/lib/canis/core/widgets/rprogress.rb +118 -0
  122. data/lib/canis/core/widgets/rtabbedpane.rb +631 -0
  123. data/lib/canis/core/widgets/rtabbedwindow.rb +70 -0
  124. data/lib/canis/core/widgets/rwidget.rb +3634 -0
  125. data/lib/canis/core/widgets/scrollbar.rb +147 -0
  126. data/lib/canis/core/widgets/statusline.rb +113 -0
  127. data/lib/canis/core/widgets/table.rb +1072 -0
  128. data/lib/canis/core/widgets/tabular.rb +264 -0
  129. data/lib/canis/core/widgets/textpad.rb +1674 -0
  130. data/lib/canis/core/widgets/tree.rb +690 -0
  131. data/lib/canis/core/widgets/tree/treecellrenderer.rb +150 -0
  132. data/lib/canis/core/widgets/tree/treemodel.rb +432 -0
  133. data/lib/canis/version.rb +3 -0
  134. metadata +229 -0
@@ -0,0 +1,213 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: abstractlayout.rb
3
+ # Description: An abstract class for other concrete layouts to subclass
4
+ # Author: j kepler http://github.com/mare-imbrium/canis/
5
+ # Date: 2014-05-09 - 17:15
6
+ # License: MIT
7
+ # Last update: 2014-05-09 20:38
8
+ # ----------------------------------------------------------------------------- #
9
+ # abstractlayout.rb Copyright (C) 2012-2014 j kepler
10
+
11
+
12
+ class AbstractLayout
13
+ attr_accessor :form
14
+ # top and left are actually row and col in widgets
15
+ #
16
+ attr_accessor :top_margin, :left_margin, :right_margin, :bottom_margin
17
+ # if width percent is given, then it calculates and overwrites width. Same for height_pc
18
+ # The _pc values should be between 0 and 1, e.g 0.8 for 80 percent
19
+ # height and width can be negaive. -1 will stretch the stack to one less than end. 0 will stretch till end.
20
+ attr_accessor :width, :height, :width_pc, :height_pc
21
+ # gp between objects
22
+ attr_accessor :gap
23
+ attr_accessor :components
24
+ attr_accessor :ignore_list
25
+
26
+ # @param [Form] optional give a form
27
+ # @param [Hash] optional give settings/attributes which will be set into variables
28
+ def initialize form, config={}, &block
29
+ @width = @height = 0
30
+ @top_margin = @left_margin = @right_margin = @bottom_margin = 0
31
+ # weightages of each object
32
+ #@wts = {}
33
+ # item_config is a hash which contains a hash of attibs for each item.
34
+ @item_config = Hash.new do |hash, key| hash[key]={}; end
35
+
36
+ if form.is_a? Hash
37
+ @config = form
38
+ elsif form.is_a? Form
39
+ @form = form
40
+ end
41
+ @gap = 0
42
+ @ignore_list = ["canis::statusline", "canis::applicationheader"]
43
+ @config.each_pair { |k,v| instance_variable_set("@#{k}",v) }
44
+ #@ignore_list = [Canis::StatusLine, Canis::ApplicationHeader]
45
+ instance_eval &block if block_given?
46
+ end
47
+
48
+ # add one more items for this layout to lay out
49
+ # If no items are given, this program will take all visible widgets from the form
50
+ # and stack them, ignoring statusline and applicationheader
51
+ def push *items
52
+ @components ||= []
53
+ @components.push items
54
+ self
55
+ end
56
+ alias :<< :push
57
+
58
+ # add a widget giving a hash of attributes to be used later.
59
+ def add item, config={}
60
+ @components ||= []
61
+ @components << item
62
+ if config
63
+ @item_config[item] = config
64
+ end
65
+ self
66
+ end
67
+
68
+ def configure_item item, config={}
69
+ @item_config[item].merge( config )
70
+ self
71
+ end
72
+ # return the config value for a key for an item.
73
+ # The keys are decided by the layout manager itself, such as :weight.
74
+ # @param [Widget] item for which some attribute is required
75
+ # @param [Symbol, String] the key
76
+ def cget item, key
77
+ return @item_config[item][key]
78
+ end
79
+
80
+ # set a value for an item and key
81
+ # This is similar to configure_item which takes multiple pairs ( a hash).
82
+ # I am seeing which will be more useful.
83
+ def cset item, key, val
84
+ @item_config[item][key] = val
85
+ self
86
+ end
87
+
88
+
89
+ # Add a component, giving a weightage for height
90
+ # @param [Fixnum, Float] give absolute weight, or fraction of layouts height
91
+ # if wt is >= 1 then it is absolute height, else if between 0 and 1 ,
92
+ # it is a percentage.
93
+ def add_with_weight item, weight
94
+ @components ||= []
95
+ @components << item
96
+ cfg[item][:weight] = weight
97
+ end
98
+
99
+ # remove given item from components list
100
+ # This could happen if the item has been removed from the form
101
+ def remove item
102
+ @components.remove item
103
+ end
104
+
105
+ # clear the list of items the layout has.
106
+ # Usually, the layout fills this list only once. However, if the list of items has changed
107
+ # then this can be used to clear the list, so it is fetched again.
108
+ def clear
109
+ @components.clear
110
+ end
111
+
112
+ # does some initial common calculations that hopefully should be common across layouters
113
+ # so that do_layout can be ovveridden while calling this.
114
+ def _init_layout
115
+ # when user gives a negative value, we recalc and overwrite so the need to save, for a redraw.
116
+ @saved_width ||= @width
117
+ @saved_height ||= @height
118
+
119
+ lines = Ncurses.LINES - 1
120
+ columns = Ncurses.COLS - 1
121
+ if @height_pc
122
+ @height = ((lines - @top_margin - @bottom_margin) * @height_pc).floor
123
+ elsif @saved_height <= 0
124
+ @height = lines - @saved_height - @top_margin - @bottom_margin
125
+ end
126
+ $log.debug " layout height = #{@height} "
127
+ if @width_pc
128
+ @width = ((columns - @left_margin - @right_margin) * width_pc).floor
129
+ elsif @saved_width <= 0
130
+ # if width was -1 we have overwritten it so now we cannot recalc it. it remains the same
131
+ @width = columns - @saved_width - @left_margin - @right_margin
132
+ end
133
+ $log.debug " layout wid = #{@width} "
134
+ # if user has not specified, then get all the objects
135
+ @components ||= @form.widgets.select do |w| w.visible != false && !@ignore_list.include?(w.class.to_s.downcase); end
136
+ $log.debug " components #{@components.count} "
137
+ end
138
+
139
+ # This program lays out the widgets deciding their row and columm and height and weight.
140
+ # This program is called once at start of application, and again whenever a RESIZE event happens.
141
+ def do_layout
142
+ $log.debug " inside do_layout"
143
+ _init_layout
144
+ raise "please implement this in your subclass "
145
+ c = @left_margin
146
+ # determine fixed widths and how much is left to share with others,
147
+ # and how many variable width components there are.
148
+ ht = 0 # accumulate fixed height
149
+ fixed_ctr = 0 # how many items have a fixed wt
150
+ var_ctr = 0
151
+ var_wt = 0.0
152
+ @components.each do |e|
153
+ $log.debug " looping 1 #{e.name} "
154
+ _tmpwt = @wts[e] || 0
155
+ # what of field and button placed side by side
156
+ if e.is_a? Field or e.is_a? Button or e.is_a? Label
157
+ @wts[e] ||= 1
158
+ ht += @wts[e] || 1
159
+ fixed_ctr += 1
160
+ elsif _tmpwt >= 1
161
+ ht += @wts[e] || 0
162
+ fixed_ctr += 1
163
+ elsif _tmpwt > 0 and _tmpwt <= 1
164
+ # FIXME how to specify 100 % ???
165
+ var_ctr += 1
166
+ var_wt += @wts[e]
167
+ end
168
+ end
169
+ unaccounted = @components.count - (fixed_ctr + var_ctr)
170
+ $log.debug " unacc #{unaccounted} , fixed #{fixed_ctr} , var : #{var_ctr} , ht #{ht} height #{@height} "
171
+ balance_ht = @height - ht # use this for those who have specified a %
172
+ balance_ht1 = balance_ht * (1 - var_wt )
173
+ average_ht = (balance_ht1 / unaccounted).floor # give this to those who have not specified ht
174
+ average_ht = (balance_ht1 / unaccounted) # give this to those who have not specified ht
175
+ $log.debug " #{balance_ht} , #{balance_ht1} , #{average_ht} "
176
+ # not accounted for gap in heights
177
+ rem = 0 # remainder to be carried over
178
+ @components.each do |e|
179
+ $log.debug " looping 2 #{e.name} #{e.class.to_s.downcase} "
180
+ next if @ignore_list.include? e.class.to_s.downcase
181
+ $log.debug " looping 3 #{e.name} "
182
+ e.row = r
183
+ e.col = c
184
+ wt = @wts[e]
185
+ if wt
186
+ if wt.is_a? Fixnum
187
+ e.height = wt
188
+ elsif wt.is_a? Float
189
+ e.height = (wt * balance_ht).floor
190
+ end
191
+ else
192
+ # no wt specified, give average of balance wt
193
+ e.height = average_ht
194
+ hround = e.height.floor
195
+
196
+ rem += e.height - hround
197
+ e.height = hround
198
+ # see comment in prev block regarding remaininder
199
+ if rem >= 1
200
+ e.height += 1
201
+ rem = 0
202
+ end
203
+ end
204
+ $log.debug " layout #{e.name} , h: #{e.height} r: #{e.row} , c = #{e.col} "
205
+
206
+ e.width = @width
207
+ r += e.height.floor
208
+ r += @gap
209
+ end
210
+ $log.debug " layout finished "
211
+ end
212
+
213
+ end
@@ -0,0 +1,104 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: stacklayout.rb
3
+ # Description:
4
+ # Author: j kepler http://github.com/mare-imbrium/canis/
5
+ # Date: 2014-05-08 - 18:33
6
+ # License: MIT
7
+ # Last update: 2014-05-09 20:58
8
+ # ----------------------------------------------------------------------------- #
9
+ # stacklayout.rb Copyright (C) 2012-2014 j kepler
10
+ require 'canis/core/include/layouts/abstractlayout'
11
+ # ----
12
+ # This does a simple left to right stacking of objects.
13
+ # if no objects are passed to it, it will take all widgets from the form.
14
+ #
15
+ # Individual objects may be configured by setting :weight using +cset+.
16
+ # layout = FlowLayout.new :height => -1, :top_margin => 1, :bottom_margin => 1, :left_margin => 1
17
+ # layout.cset(obj, :weight, 15) # fixed width of 15
18
+ # layout.cset(obj1, :weight, 0.50) # takes 50% of balance area (area not fixed)
19
+ #
20
+ class FlowLayout < AbstractLayout
21
+
22
+ # @param [Form] optional give a form
23
+ # @param [Hash] optional give settings/attributes which will be set into variables
24
+ def initialize arg, config={}, &block
25
+ super
26
+ end
27
+
28
+
29
+ # This program lays out the widgets deciding their row and columm and height and weight.
30
+ # This program is called once at start of application, and again whenever a RESIZE event happens.
31
+ def do_layout
32
+ _init_layout
33
+ r = @top_margin
34
+ c = @left_margin
35
+ #
36
+ # determine fixed widths and how much is left to share with others,
37
+ # and how many variable width components there are.
38
+ ht = 0 # accumulate fixed height
39
+ fixed_ctr = 0 # how many items have a fixed wt
40
+ var_ctr = 0
41
+ var_wt = 0.0
42
+ @components.each do |e|
43
+ $log.debug " looping 1 #{e.name} "
44
+ _tmpwt = cget(e, :weight) || 0
45
+ # what of field and button placed side by side
46
+ if e.is_a? Field or e.is_a? Button or e.is_a? Label
47
+ # what to do here ?
48
+ @wts[e] ||= 1
49
+ ht += @wts[e] || 1
50
+ fixed_ctr += 1
51
+ elsif _tmpwt >= 1
52
+ ht += _tmpwt || 0
53
+ fixed_ctr += 1
54
+ elsif _tmpwt > 0 and _tmpwt <= 1
55
+ # FIXME how to specify 100 % ???
56
+ var_ctr += 1
57
+ var_wt += _tmpwt
58
+ end
59
+ end
60
+ unaccounted = @components.count - (fixed_ctr + var_ctr)
61
+ $log.debug " unacc #{unaccounted} , fixed #{fixed_ctr} , var : #{var_ctr} , ht #{ht} height #{@height} "
62
+ balance_ht = @width - ht # use this for those who have specified a %
63
+ balance_ht1 = balance_ht * (1 - var_wt )
64
+ average_ht = (balance_ht1 / unaccounted).floor # give this to those who have not specified ht
65
+ average_ht = (balance_ht1 / unaccounted) # give this to those who have not specified ht
66
+ $log.debug " #{balance_ht} , #{balance_ht1} , #{average_ht} "
67
+ # not accounted for gap in heights
68
+ rem = 0 # remainder to be carried over
69
+ @components.each do |e|
70
+ $log.debug " looping 2 #{e.name} #{e.class.to_s.downcase} "
71
+ next if @ignore_list.include? e.class.to_s.downcase
72
+ $log.debug " looping 3 #{e.name} "
73
+ e.row = r
74
+ e.col = c
75
+ wt = cget(e, :weight)
76
+ if wt
77
+ if wt.is_a? Fixnum
78
+ e.width = wt
79
+ elsif wt.is_a? Float
80
+ e.width = (wt * balance_ht).floor
81
+ end
82
+ else
83
+ # no wt specified, give average of balance wt
84
+ e.width = average_ht
85
+ hround = e.width.floor
86
+
87
+ rem += e.width - hround
88
+ e.width = hround
89
+ # see comment in prev block regarding remaininder
90
+ if rem >= 1
91
+ e.width += 1
92
+ rem = 0
93
+ end
94
+ end
95
+ $log.debug " layout #{e.name} , w: #{e.width} r: #{e.row} , c = #{e.col} "
96
+
97
+ e.height = @height
98
+ c += e.width.floor
99
+ c += @gap
100
+ end
101
+ $log.debug " layout finished "
102
+ end
103
+
104
+ end
@@ -0,0 +1,109 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: stacklayout.rb
3
+ # Description:
4
+ # Author: j kepler http://github.com/mare-imbrium/canis/
5
+ # Date: 2014-05-08 - 18:33
6
+ # License: MIT
7
+ # Last update: 2014-05-09 19:58
8
+ # ----------------------------------------------------------------------------- #
9
+ # stacklayout.rb Copyright (C) 2012-2014 j kepler
10
+ require 'canis/core/include/layouts/abstractlayout'
11
+ # ----
12
+ # This does a simple stacking of objects. Or all objects.
13
+ # Some simple layout managers may not require objects to be passed to
14
+ # it, others that are complex may require the same.
15
+ class StackLayout < AbstractLayout
16
+
17
+ # @param [Form] optional give a form
18
+ # @param [Hash] optional give settings/attributes which will be set into variables
19
+ def initialize arg, config={}, &block
20
+ @wts = {}
21
+ super
22
+ end
23
+
24
+
25
+ # in case user does not wish to add objects, but wishes to specify the weightage on one,
26
+ # send in the widget and its weightage.
27
+ #
28
+ # @param [Widget] widget whose weightage is to be specified
29
+ # @param [Float, Fixnum] weightage for the given widget (@see add_with_weight)
30
+ def weightage item, wt
31
+ @wts[item] = wt
32
+ end
33
+
34
+
35
+ # This program lays out the widgets deciding their row and columm and height and weight.
36
+ # This program is called once at start of application, and again whenever a RESIZE event happens.
37
+ def do_layout
38
+ _init_layout
39
+ r = @top_margin
40
+ c = @left_margin
41
+ #
42
+ # determine fixed widths and how much is left to share with others,
43
+ # and how many variable width components there are.
44
+ ht = 0 # accumulate fixed height
45
+ fixed_ctr = 0 # how many items have a fixed wt
46
+ var_ctr = 0
47
+ var_wt = 0.0
48
+ @components.each do |e|
49
+ $log.debug " looping 1 #{e.name} "
50
+ _tmpwt = @wts[e] || 0
51
+ # what of field and button placed side by side
52
+ if e.is_a? Field or e.is_a? Button or e.is_a? Label
53
+ @wts[e] ||= 1
54
+ ht += @wts[e] || 1
55
+ fixed_ctr += 1
56
+ elsif _tmpwt >= 1
57
+ ht += @wts[e] || 0
58
+ fixed_ctr += 1
59
+ elsif _tmpwt > 0 and _tmpwt <= 1
60
+ # FIXME how to specify 100 % ???
61
+ var_ctr += 1
62
+ var_wt += @wts[e]
63
+ end
64
+ end
65
+ unaccounted = @components.count - (fixed_ctr + var_ctr)
66
+ $log.debug " unacc #{unaccounted} , fixed #{fixed_ctr} , var : #{var_ctr} , ht #{ht} height #{@height} "
67
+ balance_ht = @height - ht # use this for those who have specified a %
68
+ balance_ht1 = balance_ht * (1 - var_wt )
69
+ average_ht = (balance_ht1 / unaccounted).floor # give this to those who have not specified ht
70
+ average_ht = (balance_ht1 / unaccounted) # give this to those who have not specified ht
71
+ $log.debug " #{balance_ht} , #{balance_ht1} , #{average_ht} "
72
+ # not accounted for gap in heights
73
+ rem = 0 # remainder to be carried over
74
+ @components.each do |e|
75
+ $log.debug " looping 2 #{e.name} #{e.class.to_s.downcase} "
76
+ next if @ignore_list.include? e.class.to_s.downcase
77
+ $log.debug " looping 3 #{e.name} "
78
+ e.row = r
79
+ e.col = c
80
+ wt = @wts[e]
81
+ if wt
82
+ if wt.is_a? Fixnum
83
+ e.height = wt
84
+ elsif wt.is_a? Float
85
+ e.height = (wt * balance_ht).floor
86
+ end
87
+ else
88
+ # no wt specified, give average of balance wt
89
+ e.height = average_ht
90
+ hround = e.height.floor
91
+
92
+ rem += e.height - hround
93
+ e.height = hround
94
+ # see comment in prev block regarding remaininder
95
+ if rem >= 1
96
+ e.height += 1
97
+ rem = 0
98
+ end
99
+ end
100
+ $log.debug " layout #{e.name} , h: #{e.height} r: #{e.row} , c = #{e.col} "
101
+
102
+ e.width = @width
103
+ r += e.height.floor
104
+ r += @gap
105
+ end
106
+ $log.debug " layout finished "
107
+ end
108
+
109
+ end
@@ -0,0 +1,89 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: listbindings.rb
3
+ # Description: bindings for multi-row widgets such as listbox, table,
4
+ # Author: jkepler http://github.com/mare-imbrium/canis/
5
+ # Date: 2011-12-11 - 12:58
6
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
7
+ # Last update: 2014-06-03 14:10
8
+ # ----------------------------------------------------------------------------- #
9
+ #
10
+ module Canis
11
+ #
12
+ # bindings for multi-row widgets such as listbox, table,
13
+ #
14
+ module ListBindings
15
+ extend self
16
+ def bindings
17
+ $log.debug "YYYY: INSIDE LISTBINDING FOR #{self.class} "
18
+ bind_key(Ncurses::KEY_LEFT, 'cursor backward'){ cursor_backward } if respond_to? :cursor_backward
19
+ bind_key(Ncurses::KEY_RIGHT, 'cursor_forward'){ cursor_forward } if respond_to? :cursor_forward
20
+ # very irritating when user pressed up arrow, commented off 2012-01-4 can be made optional
21
+ bind_key(Ncurses::KEY_UP, 'previous row'){ ret = up; } #get_window.ungetch(KEY_BTAB) if ret == :NO_PREVIOUS_ROW }
22
+ # the next was irritating if user wanted to add a row ! 2011-10-10
23
+ #bind_key(Ncurses::KEY_DOWN){ ret = down ; get_window.ungetch(KEY_TAB) if ret == :NO_NEXT_ROW }
24
+ bind_key(Ncurses::KEY_DOWN, 'next row'){ ret = down ; }
25
+ bind_key(279, 'goto_start'){ goto_start }
26
+ bind_key(277, 'goto end'){ goto_end }
27
+ bind_key(338, 'scroll forward'){ scroll_forward() }
28
+ bind_key(339, 'scroll backward'){ scroll_backward() }
29
+
30
+ # this allows us to set on a component basis, or global basis
31
+ # Motivation was mainly for textarea which needs emacs keys
32
+ kmap = $key_map_type || :both
33
+ if kmap == :emacs || kmap == :both
34
+ bind_key(?\C-v, 'scroll forward'){ scroll_forward }
35
+ # clashes with M-v for toggle one key selection, i guess you can set it as you like
36
+ bind_key(?\M-v, 'scroll backward'){ scroll_backward }
37
+ bind_key(?\C-s, 'ask search'){ ask_search() }
38
+ bind_key(?\C-n, 'next row'){ down() }
39
+ bind_key(?\C-p, 'previous row'){ down() }
40
+ bind_key(?\M->, 'goto bottom'){ goto_end() }
41
+ bind_key(?\M-<, 'goto top'){ goto_start() }
42
+ bind_key([?\C-x, ?>], :scroll_right)
43
+ bind_key([?\C-x, ?<], :scroll_left)
44
+ end
45
+ if kmap == :vim || kmap == :both
46
+ # some of these will not have effect in textarea such as j k, gg and G, search
47
+ bind_key(?j, 'next row'){ down() }
48
+ bind_key(?k, 'previous row'){ up() }
49
+ bind_key(?w, 'forward_word'){ forward_word }
50
+ bind_key(?b, 'backward_word'){ backward_word }
51
+ bind_key(?W, 'forward WORD'){ forward_regex :WORD }
52
+ bind_key(?B, 'backward WORD'){ backward_regex :WORD }
53
+ bind_key(?\C-d, 'scroll forward'){ scroll_forward() }
54
+ bind_key(32, 'scroll forward'){ scroll_forward() } unless $row_selector == 32
55
+ bind_key(0, 'scroll backward'){ scroll_backward() } unless $range_selector == 0
56
+ bind_key(?\C-b, 'scroll backward'){ scroll_backward() }
57
+ bind_key(?\C-e, "Scroll Window Down"){ scroll_window_down }
58
+ bind_key(?\C-y, "Scroll Window Up"){ scroll_window_up }
59
+ bind_key([?g,?g], 'goto start'){ goto_start } # mapping double keys like vim
60
+ bind_key(?G, 'goto end'){ goto_end() }
61
+
62
+ # textpad has removed this since it messes with bookmarks which are on single-quote
63
+ bind_key([?',?'], 'goto last position'){ goto_last_position } # vim , goto last row position (not column)
64
+ bind_key(?L, :bottom_of_window)
65
+ bind_key(?M, :middle_of_window)
66
+ bind_key(?H, :top_of_window)
67
+
68
+ bind_key(?/, :ask_search)
69
+ bind_key(?n, :find_more)
70
+ bind_key(?h, 'cursor backward'){ cursor_backward } if respond_to? :cursor_backward
71
+ bind_key(?l, 'cursor forward'){ cursor_forward } if respond_to? :cursor_forward
72
+ bind_key(?$, :cursor_eol)
73
+ end
74
+ bind_key(?\C-a, 'start of line'){ cursor_bol } if respond_to? :cursor_bol
75
+ bind_key(?\C-e, 'end of line'){ cursor_eol } if respond_to? :cursor_eol
76
+ bind_key(?\M-l, :scroll_right)
77
+ bind_key(?\M-h, :scroll_left)
78
+ bind_key(KEY_ENTER, :fire_action_event)
79
+
80
+ # save as and edit_external are only in tv and textarea
81
+ # save_as can be given to list's also and tables
82
+ # put them someplace so the code can be shared.
83
+ bind_key([?\C-x, ?\C-s], :saveas)
84
+ bind_key([?\C-x, ?e], :edit_external)
85
+
86
+ end # def
87
+ end
88
+ end
89
+ include Canis::ListBindings