class Prawn::Document::BoundingBox
Low level layout helper that simplifies coordinate math.
See Prawn::Document#bounding_box for a description of what this class is used for.
Attributes
@private
@private
@private The current indentation of the left side of the bounding box.
@private The current indentation of the right side of the bounding box.
Width of the bounding box
Public Class Methods
# File lib/prawn/document/bounding_box.rb, line 222 def initialize(document, parent, point, options = {}) # @private unless options[:width] raise ArgumentError, 'BoundingBox needs the :width option to be set' end @document = document @parent = parent @x, @y = point @width = options[:width] @height = options[:height] @total_left_padding = 0 @total_right_padding = 0 @stretched_height = nil end
Restores a copy of the bounds taken by #deep_copy in the context of
the given document
. Does not set the bounds
of the document to the resulting BoundingBox, only returns it.
@private
# File lib/prawn/document/bounding_box.rb, line 534 def self.restore_deep_copy(bounds, document) bounds.instance_variable_set('@document', document) bounds end
Public Instance Methods
Absolute bottom y-coordinate of the bottom box
# File lib/prawn/document/bounding_box.rb, line 423 def absolute_bottom @y - height end
Absolute bottom-left point of the bounding box
# File lib/prawn/document/bounding_box.rb, line 441 def absolute_bottom_left [absolute_left, absolute_bottom] end
Absolute bottom-left point of the bounding box
# File lib/prawn/document/bounding_box.rb, line 447 def absolute_bottom_right [absolute_right, absolute_bottom] end
Absolute left x-coordinate of the bounding box
# File lib/prawn/document/bounding_box.rb, line 405 def absolute_left @x end
Absolute right x-coordinate of the bounding box
# File lib/prawn/document/bounding_box.rb, line 411 def absolute_right @x + width end
Absolute top y-coordinate of the bounding box
# File lib/prawn/document/bounding_box.rb, line 417 def absolute_top @y end
Absolute top-left point of the bounding box
# File lib/prawn/document/bounding_box.rb, line 429 def absolute_top_left [absolute_left, absolute_top] end
Absolute top-right point of the bounding box
# File lib/prawn/document/bounding_box.rb, line 435 def absolute_top_right [absolute_right, absolute_top] end
Increase the left padding of the bounding box. @private
# File lib/prawn/document/bounding_box.rb, line 294 def add_left_padding(left_padding) @total_left_padding += left_padding @x += left_padding @width -= left_padding end
Increase the right padding of the bounding box. @private
# File lib/prawn/document/bounding_box.rb, line 310 def add_right_padding(right_padding) @total_right_padding += right_padding @width -= right_padding end
The translated origin (x,y-height) which describes the location of the bottom left corner of the bounding box
@private
# File lib/prawn/document/bounding_box.rb, line 253 def anchor [@x, @y - height] end
Relative bottom y-coordinate of the bounding box (Always 0)
Example, position some text 3 pts from the bottom of the containing box:
draw_text('hello', :at => [0, (bounds.bottom + 3)])
# File lib/prawn/document/bounding_box.rb, line 349 def bottom 0 end
Relative bottom-left point of the bounding box
Example, draw a line along the left hand side of the page:
stroke do line(bounds.bottom_left, bounds.top_left) end
# File lib/prawn/document/bounding_box.rb, line 399 def bottom_left [left, bottom] end
Relative bottom-right point of the bounding box
Example, draw a line along the right hand side of the page:
stroke do line(bounds.bottom_right, bounds.top_right) end
# File lib/prawn/document/bounding_box.rb, line 387 def bottom_right [right, bottom] end
Returns a deep copy of these bounds (including all parent bounds but not copying the reference to the Document).
@private
# File lib/prawn/document/bounding_box.rb, line 516 def deep_copy copy = dup # Deep-copy the parent bounds copy.instance_variable_set( '@parent', if @parent.is_a?(BoundingBox) @parent.deep_copy end ) copy.instance_variable_set('@document', nil) copy end
Height of the bounding box. If the box is 'stretchy' (unspecified height attribute), height is calculated as the distance from the top of the box to the current drawing position.
# File lib/prawn/document/bounding_box.rb, line 458 def height return @height if @height @stretched_height = [ (absolute_top - @document.y), @stretched_height.to_f ].max end
Temporarily adjust the @x coordinate to allow for left_padding
Example:
indent 20 do text "20 points in" indent 30 do text "50 points in" end end indent 20, 20 do text "indented on both sides" end
@private
# File lib/prawn/document/bounding_box.rb, line 283 def indent(left_padding, right_padding = 0) add_left_padding(left_padding) add_right_padding(right_padding) yield ensure @document.bounds.subtract_left_padding(left_padding) @document.bounds.subtract_right_padding(right_padding) end
Relative left x-coordinate of the bounding box. (Always 0)
Example, position some text 3 pts from the left of the containing box:
draw_text('hello', :at => [(bounds.left + 3), 0])
# File lib/prawn/document/bounding_box.rb, line 263 def left 0 end
an alias for #absolute_left @private
# File lib/prawn/document/bounding_box.rb, line 468 def left_side absolute_left end
Moves to the top of the next page of the document, starting a new page if necessary.
# File lib/prawn/document/bounding_box.rb, line 483 def move_past_bottom if @document.page_number == @document.page_count @document.start_new_page else @document.go_to_page(@document.page_number + 1) end end
Returns the innermost non-stretchy bounding box.
# File lib/prawn/document/bounding_box.rb, line 501 def reference_bounds if stretchy? raise "Can't find reference bounds: my parent is unset" unless @parent @parent.reference_bounds else self end end
Relative right x-coordinate of the bounding box. (Equal to the box width)
Example, position some text 3 pts from the right of the containing box:
draw_text('hello', :at => [(bounds.right - 3), 0])
# File lib/prawn/document/bounding_box.rb, line 329 def right @width end
an alias for #absolute_right @private
# File lib/prawn/document/bounding_box.rb, line 474 def right_side absolute_right end
Returns false
when the box has a defined height,
true
when the height is being calculated on the fly based on
the current vertical position.
# File lib/prawn/document/bounding_box.rb, line 495 def stretchy? !@height end
Decrease the left padding of the bounding box. @private
# File lib/prawn/document/bounding_box.rb, line 302 def subtract_left_padding(left_padding) @total_left_padding -= left_padding @x -= left_padding @width += left_padding end
Decrease the right padding of the bounding box. @private
# File lib/prawn/document/bounding_box.rb, line 317 def subtract_right_padding(right_padding) @total_right_padding -= right_padding @width += right_padding end
Relative top y-coordinate of the bounding box. (Equal to the box height)
Example, position some text 3 pts from the top of the containing box:
draw_text('hello', :at => [0, (bounds.top - 3)])
# File lib/prawn/document/bounding_box.rb, line 339 def top height end
Relative top-left point of the bounding_box
Example, draw a line from the top left of the box diagonally to the bottom right:
stroke do line(bounds.top_left, bounds.bottom_right) end
# File lib/prawn/document/bounding_box.rb, line 362 def top_left [left, top] end
Relative top-right point of the bounding box
Example, draw a line from the #top_right of the box diagonally to the bottom left:
stroke do line(bounds.top_right, bounds.bottom_left) end
# File lib/prawn/document/bounding_box.rb, line 375 def top_right [right, top] end