Class: EideticRML::LayoutManagers::FlowLayout

Inherits:
LayoutManager show all
Defined in:
lib/erml_layout_managers.rb

Instance Method Summary collapse

Methods inherited from LayoutManager

#after_layout, #col_grid, for_name, #initialize, #layout_absolute, #layout_relative, register, #row_grid

Constructor Details

This class inherits a constructor from EideticRML::LayoutManagers::LayoutManager

Instance Method Details

#layout(container, writer) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/erml_layout_managers.rb', line 107

def layout(container, writer)
  cx = cy = max_y = 0
  container_full = false
  bottom = container.content_top + container.max_content_height
  widgets, remaining = printable_widgets(container, :static)
  remaining.each { |widget| widget.visible = false if widget.printed }
  widgets.each do |widget|
    widget.visible = !container_full
    next if container_full
    widget.before_layout
    widget.width([widget.preferred_width(writer) || container.content_width, container.content_width].min, :pt) if widget.width.nil?
    # puts "flow widget width: #{widget.width} #{widget.path}"
    if cx != 0 and cx + widget.width > container.content_width
      cy += max_y + @style.vpadding
      cx = max_y = 0
    end
    widget.left(container.content_left + cx, :pt)
    widget.top(container.content_top + cy, :pt)
    widget.height(widget.preferred_height(writer) || 0, :pt) if widget.height.nil? # swapped
    widget.layout_widget(writer)                                                   # swapped
    # if container.bottom and widget.bottom > container.bottom
    if widget.bottom > bottom
      container_full = true
      # widget.visible = (cy == 0)
      widget.visible = container.root_page.positioned_widgets[:static] == 0
      # $stderr.puts "+++flow+++ #{container.root_page.positioned_widgets[:static]}, visible: #{widget.visible}"
      next
    end
    container.root_page.positioned_widgets[widget.position] += 1
    cx += widget.width + @style.hpadding
    max_y = [max_y, widget.height].max
  end
  container.more(true) if container_full and container.overflow
  container.height(cy + max_y + container.non_content_height, :pt) if container.height.nil? and max_y > 0
  super(container, writer)
end

#preferred_height(grid, writer) ⇒ Object



144
145
146
147
148
149
150
# File 'lib/erml_layout_managers.rb', line 144

def preferred_height(grid, writer)
  cells = grid.row(0)
  return 0 if cells.empty?
  cell_heights = cells.map { |w| w.preferred_height(writer) }
  return nil unless cell_heights.all?
  cell_heights.max
end

#preferred_width(grid, writer) ⇒ Object



152
153
154
155
156
157
158
# File 'lib/erml_layout_managers.rb', line 152

def preferred_width(grid, writer)
  cells = grid.row(0)
  return 0 if cells.empty?
  cell_widths = cells.map { |w| w.preferred_width(writer) }
  return nil unless cell_widths.all?
  cell_widths.inject((cells.size - 1) * @style.hpadding) { |sum, width| sum + width }
end