Class: StackLayout

Inherits:
AbstractLayout show all
Defined in:
lib/canis/core/include/layouts/stacklayout.rb

Overview

it, others that are complex may require the same.

Instance Attribute Summary

Attributes inherited from AbstractLayout

#bottom_margin, #components, #form, #gap, #height, #height_pc, #ignore_list, #left_margin, #right_margin, #top_margin, #width, #width_pc

Instance Method Summary collapse

Methods inherited from AbstractLayout

#_init_layout, #add, #add_with_weight, #cget, #clear, #configure_item, #cset, #push, #remove

Constructor Details

#initialize(arg, config = {}, &block) ⇒ StackLayout

Returns a new instance of StackLayout.

Parameters:

  • optional (Form)

    give a form

  • optional (Hash)

    give settings/attributes which will be set into variables



19
20
21
22
# File 'lib/canis/core/include/layouts/stacklayout.rb', line 19

def initialize arg, config={}, &block
  @wts = {}
  super
end

Instance Method Details

#do_layoutObject

This program lays out the widgets deciding their row and columm and height and weight. This program is called once at start of application, and again whenever a RESIZE event happens.



37
38
39
40
41
42
43
44
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/canis/core/include/layouts/stacklayout.rb', line 37

def do_layout
  _init_layout
  r = @top_margin
  c = @left_margin
  #
  # determine fixed widths and how much is left to share with others,
  # and how many variable width components there are.
  ht = 0   # accumulate fixed height
  fixed_ctr = 0 # how many items have a fixed wt
  var_ctr = 0
  var_wt = 0.0
  @components.each do |e|
    $log.debug "  looping 1 #{e.name} "
    _tmpwt = @wts[e] || 0
    # what of field and button placed side by side
    if e.is_a? Field or e.is_a? Button or e.is_a? Label
      @wts[e] ||= 1
      ht += @wts[e] || 1
      fixed_ctr += 1
    elsif _tmpwt >= 1
        ht += @wts[e] || 0
        fixed_ctr += 1
    elsif _tmpwt > 0 and _tmpwt <= 1
      # FIXME how to specify 100 % ???
      var_ctr += 1
      var_wt += @wts[e]
    end
  end
  unaccounted = @components.count - (fixed_ctr + var_ctr)
  $log.debug "  unacc #{unaccounted} , fixed #{fixed_ctr} , var : #{var_ctr} , ht #{ht} height #{@height}  "
  balance_ht = @height - ht # use this for those who have specified a %
  balance_ht1 = balance_ht * (1 - var_wt )
  average_ht = (balance_ht1 / unaccounted).floor # give this to those who have not specified ht
  average_ht = (balance_ht1 / unaccounted) # give this to those who have not specified ht
  $log.debug "  #{balance_ht} , #{balance_ht1} , #{average_ht} "
  # not accounted for gap in heights
  rem = 0 # remainder to be carried over
  @components.each do |e|
    $log.debug "  looping 2 #{e.name} #{e.class.to_s.downcase} "
    next if @ignore_list.include? e.class.to_s.downcase
    $log.debug "  looping 3 #{e.name} "
    e.row = r
    e.col = c
    wt = @wts[e]
    if wt
      if wt.is_a? Integer
        e.height = wt
      elsif wt.is_a? Float
        e.height = (wt * balance_ht).floor
      end
    else
      # no wt specified, give average of balance wt
      e.height = average_ht
      hround = e.height.floor

      rem += e.height - hround
      e.height = hround
      # see comment in prev block regarding remaininder
      if rem >= 1
        e.height += 1
        rem = 0
      end
    end
    $log.debug "  layout #{e.name} , h: #{e.height} r: #{e.row} , c = #{e.col} "

    e.width = @width
    r += e.height.floor
    r += @gap
  end
  $log.debug "  layout finished "
end

#weightage(item, wt) ⇒ Object

in case user does not wish to add objects, but wishes to specify the weightage on one, send in the widget and its weightage.

Parameters:

  • widget (Widget)

    whose weightage is to be specified

  • weightage (Float, Integer)

    for the given widget (@see add_with_weight)



30
31
32
# File 'lib/canis/core/include/layouts/stacklayout.rb', line 30

def weightage item, wt
  @wts[item] = wt
end