canis 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +45 -0
- data/CHANGES +52 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +2 -0
- data/canis.gemspec +25 -0
- data/examples/alpmenu.rb +46 -0
- data/examples/app.sample +19 -0
- data/examples/appemail.rb +191 -0
- data/examples/atree.rb +105 -0
- data/examples/bline.rb +181 -0
- data/examples/common/devel.rb +319 -0
- data/examples/common/file.rb +93 -0
- data/examples/data/README.markdown +9 -0
- data/examples/data/brew.txt +38 -0
- data/examples/data/color.2 +37 -0
- data/examples/data/gemlist.txt +59 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/ports.txt +136 -0
- data/examples/data/table.txt +37 -0
- data/examples/data/tasks.csv +88 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/todo.txt +16 -0
- data/examples/data/todocsv.csv +28 -0
- data/examples/data/unix1.txt +21 -0
- data/examples/data/unix2.txt +11 -0
- data/examples/dbdemo.rb +506 -0
- data/examples/dirtree.rb +177 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/newtesttabp.rb +92 -0
- data/examples/tabular.rb +212 -0
- data/examples/tasks.rb +179 -0
- data/examples/term2.rb +88 -0
- data/examples/testbuttons.rb +307 -0
- data/examples/testcombo.rb +102 -0
- data/examples/testdb.rb +182 -0
- data/examples/testfields.rb +208 -0
- data/examples/testflowlayout.rb +43 -0
- data/examples/testkeypress.rb +98 -0
- data/examples/testlistbox.rb +187 -0
- data/examples/testlistbox1.rb +199 -0
- data/examples/testmessagebox.rb +144 -0
- data/examples/testprogress.rb +116 -0
- data/examples/testree.rb +107 -0
- data/examples/testsplitlayout.rb +53 -0
- data/examples/testsplitlayout1.rb +49 -0
- data/examples/teststacklayout.rb +48 -0
- data/examples/testwsshortcuts.rb +68 -0
- data/examples/testwsshortcuts2.rb +129 -0
- data/lib/canis.rb +16 -0
- data/lib/canis/core/docs/index.txt +104 -0
- data/lib/canis/core/docs/list.txt +16 -0
- data/lib/canis/core/docs/style_help.yml +34 -0
- data/lib/canis/core/docs/tabbedpane.txt +15 -0
- data/lib/canis/core/docs/table.txt +31 -0
- data/lib/canis/core/docs/textpad.txt +48 -0
- data/lib/canis/core/docs/tree.txt +23 -0
- data/lib/canis/core/include/.DS_Store +0 -0
- data/lib/canis/core/include/action.rb +83 -0
- data/lib/canis/core/include/actionmanager.rb +49 -0
- data/lib/canis/core/include/appmethods.rb +179 -0
- data/lib/canis/core/include/bordertitle.rb +49 -0
- data/lib/canis/core/include/canisparser.rb +100 -0
- data/lib/canis/core/include/colorparser.rb +437 -0
- data/lib/canis/core/include/defaultfilerenderer.rb +64 -0
- data/lib/canis/core/include/io.rb +320 -0
- data/lib/canis/core/include/layouts/SplitLayout.rb +161 -0
- data/lib/canis/core/include/layouts/abstractlayout.rb +213 -0
- data/lib/canis/core/include/layouts/flowlayout.rb +104 -0
- data/lib/canis/core/include/layouts/stacklayout.rb +109 -0
- data/lib/canis/core/include/listbindings.rb +89 -0
- data/lib/canis/core/include/listeditable.rb +319 -0
- data/lib/canis/core/include/listoperations.rb +61 -0
- data/lib/canis/core/include/listselectionmodel.rb +388 -0
- data/lib/canis/core/include/multibuffer.rb +173 -0
- data/lib/canis/core/include/ractionevent.rb +73 -0
- data/lib/canis/core/include/rchangeevent.rb +27 -0
- data/lib/canis/core/include/rhistory.rb +95 -0
- data/lib/canis/core/include/rinputdataevent.rb +47 -0
- data/lib/canis/core/include/textdocument.rb +111 -0
- data/lib/canis/core/include/vieditable.rb +175 -0
- data/lib/canis/core/include/widgetmenu.rb +66 -0
- data/lib/canis/core/system/colormap.rb +165 -0
- data/lib/canis/core/system/keydefs.rb +32 -0
- data/lib/canis/core/system/ncurses.rb +237 -0
- data/lib/canis/core/system/panel.rb +129 -0
- data/lib/canis/core/system/window.rb +1081 -0
- data/lib/canis/core/util/ansiparser.rb +119 -0
- data/lib/canis/core/util/app.rb +696 -0
- data/lib/canis/core/util/basestack.rb +412 -0
- data/lib/canis/core/util/defaultcolorparser.rb +84 -0
- data/lib/canis/core/util/extras/README +5 -0
- data/lib/canis/core/util/extras/bottomline.rb +1815 -0
- data/lib/canis/core/util/extras/padreader.rb +192 -0
- data/lib/canis/core/util/focusmanager.rb +31 -0
- data/lib/canis/core/util/helpmanager.rb +160 -0
- data/lib/canis/core/util/oldwidgetshortcuts.rb +304 -0
- data/lib/canis/core/util/promptmenu.rb +235 -0
- data/lib/canis/core/util/rcommandwindow.rb +933 -0
- data/lib/canis/core/util/rdialogs.rb +520 -0
- data/lib/canis/core/util/textutils.rb +74 -0
- data/lib/canis/core/util/viewer.rb +238 -0
- data/lib/canis/core/util/widgetshortcuts.rb +508 -0
- data/lib/canis/core/widgets/applicationheader.rb +103 -0
- data/lib/canis/core/widgets/box.rb +58 -0
- data/lib/canis/core/widgets/divider.rb +310 -0
- data/lib/canis/core/widgets/extras/README.md +12 -0
- data/lib/canis/core/widgets/extras/rtextarea.rb +960 -0
- data/lib/canis/core/widgets/extras/stackflow.rb +474 -0
- data/lib/canis/core/widgets/keylabelprinter.rb +194 -0
- data/lib/canis/core/widgets/listbox.rb +326 -0
- data/lib/canis/core/widgets/listfooter.rb +86 -0
- data/lib/canis/core/widgets/rcombo.rb +210 -0
- data/lib/canis/core/widgets/rcontainer.rb +415 -0
- data/lib/canis/core/widgets/rlink.rb +30 -0
- data/lib/canis/core/widgets/rmenu.rb +970 -0
- data/lib/canis/core/widgets/rmenulink.rb +30 -0
- data/lib/canis/core/widgets/rmessagebox.rb +400 -0
- data/lib/canis/core/widgets/rprogress.rb +118 -0
- data/lib/canis/core/widgets/rtabbedpane.rb +631 -0
- data/lib/canis/core/widgets/rtabbedwindow.rb +70 -0
- data/lib/canis/core/widgets/rwidget.rb +3634 -0
- data/lib/canis/core/widgets/scrollbar.rb +147 -0
- data/lib/canis/core/widgets/statusline.rb +113 -0
- data/lib/canis/core/widgets/table.rb +1072 -0
- data/lib/canis/core/widgets/tabular.rb +264 -0
- data/lib/canis/core/widgets/textpad.rb +1674 -0
- data/lib/canis/core/widgets/tree.rb +690 -0
- data/lib/canis/core/widgets/tree/treecellrenderer.rb +150 -0
- data/lib/canis/core/widgets/tree/treemodel.rb +432 -0
- data/lib/canis/version.rb +3 -0
- metadata +229 -0
@@ -0,0 +1,412 @@
|
|
1
|
+
# Common stack flow functionality
|
2
|
+
# * Name: basestack.rb
|
3
|
+
# * Description: Classes that allow user to stack and flow components
|
4
|
+
# This is currently used only by experimental. +core+ does not use this
|
5
|
+
# for stack and flow. it uses wsshortcuts which does not maintain objects.
|
6
|
+
# This maintains objects.
|
7
|
+
#
|
8
|
+
# * Date: 30.10.11 - 12:57
|
9
|
+
# * Last update: 2014-05-02 20:15
|
10
|
+
#
|
11
|
+
module RubyCurses
|
12
|
+
module ModStack
|
13
|
+
#
|
14
|
+
# Base class for stacks and flows.
|
15
|
+
# Will manage determining row col and width height of objects
|
16
|
+
# Stacks place objects one below another. Flows place objects to the
|
17
|
+
# right of the previous. Orientation can be reversed.
|
18
|
+
#
|
19
|
+
class BaseStack
|
20
|
+
attr_accessor :components
|
21
|
+
attr_reader :config
|
22
|
+
attr_accessor :form
|
23
|
+
def initialize config={}, components=[]
|
24
|
+
@config = config
|
25
|
+
config.each do |k, v|
|
26
|
+
instance_variable_set "@#{k}", v
|
27
|
+
end
|
28
|
+
@components = components
|
29
|
+
@calc_needed = true
|
30
|
+
end
|
31
|
+
# XXX if user sets later, we won't be checking the config
|
32
|
+
# We check the actual variables which config sets in init
|
33
|
+
%w[ parent_component width height weight row col orientation margin_top margin_bottom margin_left margin_right].each { |e|
|
34
|
+
eval(
|
35
|
+
"def #{e}
|
36
|
+
@config[:#{e}]
|
37
|
+
end
|
38
|
+
def #{e}=(val)
|
39
|
+
@config[:#{e}]=val
|
40
|
+
instance_variable_set \"@#{e}\", val
|
41
|
+
@calc_needed = true
|
42
|
+
end"
|
43
|
+
)
|
44
|
+
}
|
45
|
+
alias :parent :parent_component
|
46
|
+
#alias :parent= :parent_component
|
47
|
+
def repaint # stack
|
48
|
+
$log.debug "XXX: stack repaint recalc #{@calc_needed} "
|
49
|
+
@components.each { |e| e.form = @form unless e.form } #unless @calc_needed
|
50
|
+
recalc if @calc_needed
|
51
|
+
@components.each { |e| e.repaint }
|
52
|
+
end
|
53
|
+
def repaint_all x
|
54
|
+
@calc_needed = true
|
55
|
+
end
|
56
|
+
def override_graphic gr
|
57
|
+
@graphic = gr
|
58
|
+
end
|
59
|
+
def focusable; false; end
|
60
|
+
# Calculates row col and width height
|
61
|
+
# for each subc-omponent based on coords of Container
|
62
|
+
# This is to be called only when the container has got its coordinates (i.e
|
63
|
+
# Containers repaint). This should be in this objects repaint.
|
64
|
+
def recalc
|
65
|
+
@calc_needed = false
|
66
|
+
comp = self
|
67
|
+
if comp.is_a? BaseStack
|
68
|
+
check_coords comp
|
69
|
+
@margin_left ||= 0
|
70
|
+
@margin_right ||= 0
|
71
|
+
@margin_top ||= 0
|
72
|
+
@margin_bottom ||= 0
|
73
|
+
if comp.is_a? Stack
|
74
|
+
r = row + @margin_top
|
75
|
+
rem = 0
|
76
|
+
ht = height - (@margin_top + @margin_bottom)
|
77
|
+
if @orientation == :bottom
|
78
|
+
mult = -1
|
79
|
+
comps = @components.reverse
|
80
|
+
r = row + height - @margin_bottom
|
81
|
+
|
82
|
+
else
|
83
|
+
mult = 1
|
84
|
+
comps = @components
|
85
|
+
|
86
|
+
end
|
87
|
+
comps.each { |e|
|
88
|
+
# should only happen if expandable FIXME
|
89
|
+
e.margin_top ||= 0
|
90
|
+
e.margin_bottom ||= 0
|
91
|
+
e.height = 0.01 * e.weight * (ht - (e.margin_top + e.margin_bottom))
|
92
|
+
hround = e.height.floor
|
93
|
+
rem += e.height - hround
|
94
|
+
e.height = hround #- (@margin_top + @margin_bottom)
|
95
|
+
# rounding creates a problem, since 0.5 gets rounded up and we can exceed bound
|
96
|
+
# So i floor, and maintain the lost space, and add it back when it exceeds 1
|
97
|
+
# This way the last components gets stretched to meet the end, which is required
|
98
|
+
# when the height of the stack is odd and there's a left-over row
|
99
|
+
if rem >= 1
|
100
|
+
e.height += 1
|
101
|
+
rem = 0
|
102
|
+
end
|
103
|
+
# Item level margins have not been accounted for when calculating weightages, and
|
104
|
+
# should not be used on the weightage axis
|
105
|
+
r += e.margin_top
|
106
|
+
if @orientation == :bottom
|
107
|
+
r += e.height * mult
|
108
|
+
e.row = r
|
109
|
+
else
|
110
|
+
e.row = r
|
111
|
+
r += e.height + 0
|
112
|
+
end
|
113
|
+
e.margin_left ||= 0
|
114
|
+
e.margin_right ||= 0
|
115
|
+
e.width = width - (@margin_left + @margin_right + e.margin_left + e.margin_right)
|
116
|
+
e.col = col + @margin_left + e.margin_left # ??? XXX
|
117
|
+
#$log.debug "XXX: recalc stack #{e.widget.class} r:#{e.row} c:#{e.col} h:#{e.height} = we:#{e.weight} * h:#{height} "
|
118
|
+
#e.col_offset = col_offset # ??? XXX
|
119
|
+
check_coords e
|
120
|
+
e.repaint_all(true)
|
121
|
+
e.recalc if e.is_a? BaseStack
|
122
|
+
}
|
123
|
+
elsif comp.is_a? Flow
|
124
|
+
c = col + @margin_left #+ col_offset
|
125
|
+
rem = 0
|
126
|
+
wd = width - (@margin_left + @margin_right)
|
127
|
+
# right_to_left orientation
|
128
|
+
if @orientation == :right
|
129
|
+
mult = -1
|
130
|
+
comps = @components.reverse
|
131
|
+
c = col + width - @margin_right
|
132
|
+
$log.debug "XXX: ORIENT1f recalc #{@orientation} "
|
133
|
+
else
|
134
|
+
mult = 1
|
135
|
+
comps = @components
|
136
|
+
$log.debug "XXX: ORIENT2f recalc #{@orientation} "
|
137
|
+
end
|
138
|
+
comps.each { |e|
|
139
|
+
e.width = e.weight * wd * 0.01
|
140
|
+
wround = e.width.floor
|
141
|
+
rem += e.width - wround
|
142
|
+
e.width = wround
|
143
|
+
# see comment in prev block regarding remaininder
|
144
|
+
if rem >= 1
|
145
|
+
e.width += 1
|
146
|
+
rem = 0
|
147
|
+
end
|
148
|
+
e.height = height - (@margin_top + @margin_bottom) #* weight * 0.01
|
149
|
+
#e.height = e.height.round
|
150
|
+
if @orientation == :right
|
151
|
+
c += e.width * mult # mult 1 or -1
|
152
|
+
e.col = c
|
153
|
+
else
|
154
|
+
e.col = c
|
155
|
+
c += e.width * mult # mult 1 or -1
|
156
|
+
end
|
157
|
+
e.row = row + @margin_top
|
158
|
+
check_coords e
|
159
|
+
$log.debug "XXX: recalc flow #{e.widget.class} r:#{e.row} c:#{e.col} h:#{e.height} = we:#{e.weight} * w:#{width} "
|
160
|
+
e.repaint_all(true) # why not happening when we change row, hieght etc
|
161
|
+
e.recalc if e.is_a? BaseStack
|
162
|
+
}
|
163
|
+
end
|
164
|
+
else
|
165
|
+
alert "in else recalc DOES NOT COME HERE "
|
166
|
+
comp.col = comp.parent.col
|
167
|
+
comp.row = comp.parent.row
|
168
|
+
comp.height = comp.parent.height
|
169
|
+
comp.width = comp.parent.width
|
170
|
+
$log.debug "XXX: recalc else #{comp.class} r #{comp.row} c #{comp.col} . h #{comp} height w #{comp.width} "
|
171
|
+
end
|
172
|
+
end
|
173
|
+
# Traverses the comopnent tree and calculates weightages for all components
|
174
|
+
# based on what has been specified by user
|
175
|
+
def check_coords e # stack
|
176
|
+
r = e.row
|
177
|
+
c = e.col
|
178
|
+
if r >= row + height
|
179
|
+
$log.warn "XXX: WARN e.class is out of bounds row #{r} "
|
180
|
+
e.visible = false
|
181
|
+
end
|
182
|
+
if c >= col + width
|
183
|
+
$log.warn "XXX: WARN e.class is out of bounds col #{c} "
|
184
|
+
e.visible = false
|
185
|
+
end
|
186
|
+
end
|
187
|
+
def increase c=@current_component
|
188
|
+
p = self #c.parent_component
|
189
|
+
ci = p.components.index(c)
|
190
|
+
ni = ci + 1
|
191
|
+
if p.components[ni].nil?
|
192
|
+
ni = nil
|
193
|
+
end
|
194
|
+
case p
|
195
|
+
when Flow
|
196
|
+
# increase width of current and reduce from neighbor
|
197
|
+
if ni
|
198
|
+
n = p.components[ni]
|
199
|
+
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
200
|
+
|
201
|
+
c.width += 1
|
202
|
+
n.width -= 1
|
203
|
+
n.col += 1
|
204
|
+
end
|
205
|
+
|
206
|
+
when Stack
|
207
|
+
if ni
|
208
|
+
n = p.components[ni]
|
209
|
+
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
210
|
+
|
211
|
+
c.height += 1
|
212
|
+
n.height -= 1
|
213
|
+
n.row += 1
|
214
|
+
end
|
215
|
+
$log.debug "XXX: INC st current #{ci}, total#{p.components.count} "
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
219
|
+
def decrease c=@current_component
|
220
|
+
p = self #c.parent_component
|
221
|
+
ci = p.components.index(c)
|
222
|
+
ni = ci + 1
|
223
|
+
if p.components[ni].nil?
|
224
|
+
ni = nil
|
225
|
+
end
|
226
|
+
case p
|
227
|
+
when Flow
|
228
|
+
# increase width of current and reduce from neighbor
|
229
|
+
if ni
|
230
|
+
n = p.components[ni]
|
231
|
+
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
232
|
+
|
233
|
+
c.width -= 1
|
234
|
+
n.width += 1
|
235
|
+
n.col -= 1
|
236
|
+
end
|
237
|
+
|
238
|
+
when Stack
|
239
|
+
if ni
|
240
|
+
n = p.components[ni]
|
241
|
+
$log.debug "XXX: INC fl current #{ci}, total#{p.components.count}, next #{n} "
|
242
|
+
|
243
|
+
c.height -= 1
|
244
|
+
n.height += 1
|
245
|
+
n.row -= 1
|
246
|
+
end
|
247
|
+
$log.debug "XXX: INC st current #{ci}, total#{p.components.count} "
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
def to_s
|
252
|
+
@components
|
253
|
+
end
|
254
|
+
end # class Base
|
255
|
+
# A stack positions objects one below the other
|
256
|
+
class Stack < BaseStack; end
|
257
|
+
# A flow positions objects in a left to right
|
258
|
+
class Flow < BaseStack; end
|
259
|
+
#
|
260
|
+
# A wrapper over widget mostly because it adds weight and margins
|
261
|
+
#
|
262
|
+
class Item
|
263
|
+
attr_reader :config, :widget
|
264
|
+
attr_reader :margin_top, :margin_left, :margin_bottom, :margin_right
|
265
|
+
def initialize config={}, widget
|
266
|
+
@config = config
|
267
|
+
config.each do |k, v|
|
268
|
+
instance_variable_set "@#{k}", v
|
269
|
+
end
|
270
|
+
@margin_left ||= 0
|
271
|
+
@margin_right ||= 0
|
272
|
+
@margin_top ||= 0
|
273
|
+
@margin_bottom ||= 0
|
274
|
+
@widget = widget
|
275
|
+
end
|
276
|
+
def weight; @config[:weight]||100; end
|
277
|
+
def weight=(val); @config[:weight]=val; end
|
278
|
+
def repaint; @widget.repaint; end
|
279
|
+
%w[ form parent parent_component width height row col row_offset col_offset focusable].each { |e|
|
280
|
+
eval(
|
281
|
+
"def #{e}
|
282
|
+
@widget.#{e}
|
283
|
+
end
|
284
|
+
def #{e}=(val)
|
285
|
+
@widget.#{e}=val
|
286
|
+
end"
|
287
|
+
)
|
288
|
+
}
|
289
|
+
def method_missing(sym, *args, &block)
|
290
|
+
@widget.send sym, *args, &block
|
291
|
+
end
|
292
|
+
end # class Item
|
293
|
+
|
294
|
+
# --------------------- module level ------------------------------#
|
295
|
+
# General routin to traverse components and their components
|
296
|
+
def traverse c, &block
|
297
|
+
if c.is_a? BaseStack
|
298
|
+
yield c
|
299
|
+
c.components.each { |e|
|
300
|
+
yield e
|
301
|
+
}
|
302
|
+
c.components.each { |e| traverse(e, &block) }
|
303
|
+
@ctr -= 1
|
304
|
+
else
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
# traverse the components and their children
|
309
|
+
#
|
310
|
+
def each &block
|
311
|
+
@components.each { |e| traverse e, &block }
|
312
|
+
end
|
313
|
+
# module level
|
314
|
+
private
|
315
|
+
def _stack type, config={}, &block
|
316
|
+
case type
|
317
|
+
when :stack
|
318
|
+
s = Stack.new(config)
|
319
|
+
when :flow
|
320
|
+
s = Flow.new(config)
|
321
|
+
end
|
322
|
+
_add s
|
323
|
+
@active << s
|
324
|
+
yield_or_eval &block if block_given?
|
325
|
+
@active.pop
|
326
|
+
# if active is empty then this is where we could calculate
|
327
|
+
# percentatges and do recalc, thus making it independent
|
328
|
+
end
|
329
|
+
# module level
|
330
|
+
private
|
331
|
+
def _add s
|
332
|
+
if @active.empty?
|
333
|
+
$log.debug "XXX: ADDING TO components #{s} "
|
334
|
+
unless s.is_a? BaseStack
|
335
|
+
raise "No stack or flow to add to. Results may not be what you want"
|
336
|
+
end
|
337
|
+
@components << s
|
338
|
+
else
|
339
|
+
@active.last.components << s
|
340
|
+
end
|
341
|
+
__add s
|
342
|
+
end
|
343
|
+
|
344
|
+
# module level
|
345
|
+
public
|
346
|
+
def stack config={}, &block
|
347
|
+
_stack :stack, config, &block
|
348
|
+
end
|
349
|
+
def flow config={}, &block
|
350
|
+
_stack :flow, config, &block
|
351
|
+
end
|
352
|
+
# module level
|
353
|
+
private
|
354
|
+
def add w, config={}
|
355
|
+
i = Item.new config, w
|
356
|
+
_add i
|
357
|
+
end
|
358
|
+
alias :add_widget :add
|
359
|
+
# module level
|
360
|
+
private
|
361
|
+
def calc_weightages2 components, parent
|
362
|
+
#puts " #{@ctr} --> #{c.type}, wt: #{c.config[:weight]} "
|
363
|
+
@ctr += 1
|
364
|
+
wt = 0
|
365
|
+
cnt = 0
|
366
|
+
sz = components.count
|
367
|
+
$log.debug "XXX: calc COMP COUNT #{sz} "
|
368
|
+
# calculate how much weightage has been given by user
|
369
|
+
# so we can allocate average to other components
|
370
|
+
components.each { |e|
|
371
|
+
if e.config[:weight]
|
372
|
+
wt += e.config[:weight]
|
373
|
+
cnt += 1
|
374
|
+
end
|
375
|
+
$log.debug "XXX: INC setting parent #{parent} to #{e} "
|
376
|
+
e.config[:parent] = parent
|
377
|
+
e.config[:level] = @ctr
|
378
|
+
}
|
379
|
+
used = sz - cnt
|
380
|
+
$log.debug "XXX: ADDING calc COMP COUNT #{sz} - #{cnt} "
|
381
|
+
if used > 0
|
382
|
+
avg = (100-wt)/used
|
383
|
+
# Allocate average to other components
|
384
|
+
components.each { |e| e.config[:weight] = avg unless e.config[:weight] }
|
385
|
+
end
|
386
|
+
components.each { |e| calc_weightages2(e.components, e) if e.respond_to? :components }
|
387
|
+
@ctr -= 1
|
388
|
+
end
|
389
|
+
# module level
|
390
|
+
#private
|
391
|
+
public
|
392
|
+
# given an widget, return the item, so we can change weight or some other config
|
393
|
+
def item_for widget
|
394
|
+
each do |e|
|
395
|
+
if e.is_a? Item
|
396
|
+
if e.widget == widget
|
397
|
+
return e
|
398
|
+
end
|
399
|
+
end
|
400
|
+
end
|
401
|
+
return nil
|
402
|
+
end
|
403
|
+
# module level
|
404
|
+
# returns the parent (flow or stack) for a given widget
|
405
|
+
# allowing user to change configuration such as weight
|
406
|
+
def parent_of widget
|
407
|
+
f = item_for widget
|
408
|
+
return f.config[:parent] if f
|
409
|
+
return nil
|
410
|
+
end
|
411
|
+
end # mod modstack
|
412
|
+
end # mod
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# ----------------------------------------------------------------------------- #
|
2
|
+
# File: colorparser.rb
|
3
|
+
# Description: Default parse for our tmux format
|
4
|
+
# The aim is to be able to specify parsers so different kinds
|
5
|
+
# of formatting or documents can be used, such as ANSI formatted
|
6
|
+
# manpages.
|
7
|
+
# Author: jkepler http://github.com/mare-imbrium/canis/
|
8
|
+
# Date: 07.11.11 - 13:17
|
9
|
+
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
10
|
+
# Last update: 2014-05-19 12:56
|
11
|
+
# ----------------------------------------------------------------------------- #
|
12
|
+
# == TODO
|
13
|
+
# - perhaps we can compile the regexp once and reuse
|
14
|
+
# == CHANGES
|
15
|
+
# - adding style 2014-05-19 - 12:52
|
16
|
+
#
|
17
|
+
|
18
|
+
module Canis
|
19
|
+
class DefaultColorParser
|
20
|
+
|
21
|
+
# NOTE: Experimental and minimal
|
22
|
+
# parses the formatted string and yields either an array of color, bgcolor and attrib
|
23
|
+
# or the text. This will be called by convert_to_chunk.
|
24
|
+
#
|
25
|
+
# Currently, assumes colors and attributes are correct. No error checking or fancy stuff.
|
26
|
+
# s="#[fg=green]hello there#[fg=yellow, bg=black, dim]"
|
27
|
+
# @since 1.4.1 2011-11-3 experimental, can change
|
28
|
+
# @return [nil] knows nothign about output format.
|
29
|
+
|
30
|
+
# 187compat 2013-03-20 - 19:33 not working in 187 so added ,1 in some cases for string
|
31
|
+
def parse_format s # yields attribs or text
|
32
|
+
## set default colors
|
33
|
+
color = :white
|
34
|
+
bgcolor = :black
|
35
|
+
attrib = FFI::NCurses::A_NORMAL
|
36
|
+
text = ""
|
37
|
+
|
38
|
+
## split #[...]
|
39
|
+
a = s.split /(#\[[^\]]*\])/
|
40
|
+
a.each { |e|
|
41
|
+
## process color or attrib portion
|
42
|
+
if e[0,2] == "#[" && e[-1,1] == "]"
|
43
|
+
# now resetting 1:20 PM November 3, 2011 , earlier we were carrying over
|
44
|
+
color, bgcolor, attrib = nil, nil, nil
|
45
|
+
style = nil
|
46
|
+
catch(:done) do
|
47
|
+
e = e[2..-2]
|
48
|
+
# TODO we could atthis point check against a hash to see if this string exists, and take
|
49
|
+
# the array from there and pass back so we don't keep splitting and parsing.
|
50
|
+
## first split on commas to separate fg, bg and attr
|
51
|
+
atts = e.split /\s*,\s*/
|
52
|
+
atts.each { |att|
|
53
|
+
## next split on =
|
54
|
+
part = att.split /\s*=\s*/
|
55
|
+
case part[0]
|
56
|
+
when "fg"
|
57
|
+
color = part[1]
|
58
|
+
when "bg"
|
59
|
+
bgcolor = part[1]
|
60
|
+
when "style"
|
61
|
+
style = part[1]
|
62
|
+
when "/end", "end"
|
63
|
+
yield :endcolor if block_given?
|
64
|
+
#next
|
65
|
+
throw :done
|
66
|
+
else
|
67
|
+
# attrib
|
68
|
+
attrib = part[0]
|
69
|
+
end
|
70
|
+
}
|
71
|
+
# 2013-03-25 - 13:31 if numeric color specified
|
72
|
+
color = color.to_i if color =~ /^[0-9]+$/
|
73
|
+
bgcolor = bgcolor.to_i if bgcolor =~ /^[0-9]+$/
|
74
|
+
yield [color,bgcolor,attrib,style] if block_given?
|
75
|
+
end # catch
|
76
|
+
else
|
77
|
+
text = e
|
78
|
+
yield text if block_given?
|
79
|
+
end
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|