Class: Prawn::Document::BoundingBox
- Inherits:
-
Object
- Object
- Prawn::Document::BoundingBox
- Defined in:
- lib/prawn/document/bounding_box.rb
Overview
Low level layout helper that simplifies coordinate math.
See Prawn::Document#bounding_box for a description of what this class is used for.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#document ⇒ Object
readonly
Returns the value of attribute document.
-
#parent ⇒ Object
readonly
Returns the value of attribute parent.
-
#total_left_padding ⇒ Object
readonly
The current indentation of the left side of the bounding box.
-
#total_right_padding ⇒ Object
readonly
The current indentation of the right side of the bounding box.
Class Method Summary collapse
-
.restore_deep_copy(bounds, document) ⇒ Object
Restores a copy of the bounds taken by BoundingBox.deep_copy in the context of the given
document
.
Instance Method Summary collapse
-
#absolute_bottom ⇒ Object
Absolute bottom y-coordinate of the bottom box.
-
#absolute_bottom_left ⇒ Object
Absolute bottom-left point of the bounding box.
-
#absolute_bottom_right ⇒ Object
Absolute bottom-left point of the bounding box.
-
#absolute_left ⇒ Object
Absolute left x-coordinate of the bounding box.
-
#absolute_right ⇒ Object
Absolute right x-coordinate of the bounding box.
-
#absolute_top ⇒ Object
Absolute top y-coordinate of the bounding box.
-
#absolute_top_left ⇒ Object
Absolute top-left point of the bounding box.
-
#absolute_top_right ⇒ Object
Absolute top-right point of the bounding box.
-
#add_left_padding(left_padding) ⇒ Object
Increase the left padding of the bounding box.
-
#add_right_padding(right_padding) ⇒ Object
Increase the right padding of the bounding box.
-
#anchor ⇒ Object
The translated origin (x,y-height) which describes the location of the bottom left corner of the bounding box.
-
#bottom ⇒ Object
Relative bottom y-coordinate of the bounding box (Always 0).
-
#bottom_left ⇒ Object
Relative bottom-left point of the bounding box.
-
#bottom_right ⇒ Object
Relative bottom-right point of the bounding box.
-
#deep_copy ⇒ Object
Returns a deep copy of these bounds (including all parent bounds but not copying the reference to the Document).
-
#height ⇒ Object
(also: #update_height)
Height of the bounding box.
-
#indent(left_padding, right_padding = 0, &block) ⇒ Object
Temporarily adjust the @x coordinate to allow for left_padding.
-
#initialize(document, parent, point, options = {}) ⇒ BoundingBox
constructor
:nodoc:.
-
#left ⇒ Object
Relative left x-coordinate of the bounding box.
-
#left_side ⇒ Object
an alias for absolute_left.
-
#move_past_bottom ⇒ Object
Moves to the top of the next page of the document, starting a new page if necessary.
-
#reference_bounds ⇒ Object
Returns the innermost non-stretchy bounding box.
-
#right ⇒ Object
Relative right x-coordinate of the bounding box.
-
#right_side ⇒ Object
an alias for absolute_right.
-
#stretchy? ⇒ Boolean
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. -
#subtract_left_padding(left_padding) ⇒ Object
Decrease the left padding of the bounding box.
-
#subtract_right_padding(right_padding) ⇒ Object
Decrease the right padding of the bounding box.
-
#top ⇒ Object
Relative top y-coordinate of the bounding box.
-
#top_left ⇒ Object
Relative top-left point of the bounding_box.
-
#top_right ⇒ Object
Relative top-right point of the bounding box.
-
#width ⇒ Object
Width of the bounding box.
Constructor Details
#initialize(document, parent, point, options = {}) ⇒ BoundingBox
:nodoc:
211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/prawn/document/bounding_box.rb', line 211 def initialize(document, parent, point, ={}) #:nodoc: unless [:width] raise ArgumentError, "BoundingBox needs the :width option to be set" end @document = document @parent = parent @x, @y = point @width, @height = [:width], [:height] @total_left_padding = 0 @total_right_padding = 0 @stretched_height = nil end |
Instance Attribute Details
#document ⇒ Object (readonly)
Returns the value of attribute document.
225 226 227 |
# File 'lib/prawn/document/bounding_box.rb', line 225 def document @document end |
#parent ⇒ Object (readonly)
Returns the value of attribute parent.
225 226 227 |
# File 'lib/prawn/document/bounding_box.rb', line 225 def parent @parent end |
#total_left_padding ⇒ Object (readonly)
The current indentation of the left side of the bounding box.
227 228 229 |
# File 'lib/prawn/document/bounding_box.rb', line 227 def total_left_padding @total_left_padding end |
#total_right_padding ⇒ Object (readonly)
The current indentation of the right side of the bounding box.
229 230 231 |
# File 'lib/prawn/document/bounding_box.rb', line 229 def total_right_padding @total_right_padding end |
Class Method Details
.restore_deep_copy(bounds, document) ⇒ Object
Restores a copy of the bounds taken by BoundingBox.deep_copy in the context of the given document
. Does not set the bounds of the document to the resulting BoundingBox, only returns it.
502 503 504 505 |
# File 'lib/prawn/document/bounding_box.rb', line 502 def self.restore_deep_copy(bounds, document) bounds.instance_variable_set("@document", document) bounds end |
Instance Method Details
#absolute_bottom ⇒ Object
Absolute bottom y-coordinate of the bottom box
399 400 401 |
# File 'lib/prawn/document/bounding_box.rb', line 399 def absolute_bottom @y - height end |
#absolute_bottom_left ⇒ Object
Absolute bottom-left point of the bounding box
417 418 419 |
# File 'lib/prawn/document/bounding_box.rb', line 417 def absolute_bottom_left [absolute_left, absolute_bottom] end |
#absolute_bottom_right ⇒ Object
Absolute bottom-left point of the bounding box
423 424 425 |
# File 'lib/prawn/document/bounding_box.rb', line 423 def absolute_bottom_right [absolute_right, absolute_bottom] end |
#absolute_left ⇒ Object
Absolute left x-coordinate of the bounding box
381 382 383 |
# File 'lib/prawn/document/bounding_box.rb', line 381 def absolute_left @x end |
#absolute_right ⇒ Object
Absolute right x-coordinate of the bounding box
387 388 389 |
# File 'lib/prawn/document/bounding_box.rb', line 387 def absolute_right @x + width end |
#absolute_top ⇒ Object
Absolute top y-coordinate of the bounding box
393 394 395 |
# File 'lib/prawn/document/bounding_box.rb', line 393 def absolute_top @y end |
#absolute_top_left ⇒ Object
Absolute top-left point of the bounding box
405 406 407 |
# File 'lib/prawn/document/bounding_box.rb', line 405 def absolute_top_left [absolute_left, absolute_top] end |
#absolute_top_right ⇒ Object
Absolute top-right point of the bounding box
411 412 413 |
# File 'lib/prawn/document/bounding_box.rb', line 411 def absolute_top_right [absolute_right, absolute_top] end |
#add_left_padding(left_padding) ⇒ Object
Increase the left padding of the bounding box.
274 275 276 277 278 |
# File 'lib/prawn/document/bounding_box.rb', line 274 def add_left_padding(left_padding) @total_left_padding += left_padding @x += left_padding @width -= left_padding end |
#add_right_padding(right_padding) ⇒ Object
Increase the right padding of the bounding box.
288 289 290 291 |
# File 'lib/prawn/document/bounding_box.rb', line 288 def add_right_padding(right_padding) @total_right_padding += right_padding @width -= right_padding end |
#anchor ⇒ Object
The translated origin (x,y-height) which describes the location of the bottom left corner of the bounding box
234 235 236 |
# File 'lib/prawn/document/bounding_box.rb', line 234 def anchor [@x, @y - height] end |
#bottom ⇒ Object
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)])
325 326 327 |
# File 'lib/prawn/document/bounding_box.rb', line 325 def bottom 0 end |
#bottom_left ⇒ Object
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
375 376 377 |
# File 'lib/prawn/document/bounding_box.rb', line 375 def bottom_left [left,bottom] end |
#bottom_right ⇒ Object
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
363 364 365 |
# File 'lib/prawn/document/bounding_box.rb', line 363 def bottom_right [right,bottom] end |
#deep_copy ⇒ Object
Returns a deep copy of these bounds (including all parent bounds but not copying the reference to the Document).
488 489 490 491 492 493 494 495 496 |
# File 'lib/prawn/document/bounding_box.rb', line 488 def deep_copy copy = dup # Deep-copy the parent bounds copy.instance_variable_set("@parent", if BoundingBox === @parent @parent.deep_copy end) copy.instance_variable_set("@document", nil) copy end |
#height ⇒ Object Also known as: update_height
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.
437 438 439 440 441 |
# File 'lib/prawn/document/bounding_box.rb', line 437 def height return @height if @height @stretched_height = [(absolute_top - @document.y), @stretched_height.to_f].max end |
#indent(left_padding, right_padding = 0, &block) ⇒ Object
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
264 265 266 267 268 269 270 271 |
# File 'lib/prawn/document/bounding_box.rb', line 264 def indent(left_padding, right_padding = 0, &block) 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 |
#left ⇒ Object
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])
244 245 246 |
# File 'lib/prawn/document/bounding_box.rb', line 244 def left 0 end |
#left_side ⇒ Object
an alias for absolute_left
444 445 446 |
# File 'lib/prawn/document/bounding_box.rb', line 444 def left_side absolute_left end |
#move_past_bottom ⇒ Object
Moves to the top of the next page of the document, starting a new page if necessary.
456 457 458 459 460 461 462 |
# File 'lib/prawn/document/bounding_box.rb', line 456 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 |
#reference_bounds ⇒ Object
Returns the innermost non-stretchy bounding box.
476 477 478 479 480 481 482 483 |
# File 'lib/prawn/document/bounding_box.rb', line 476 def reference_bounds if stretchy? raise "Can't find reference bounds: my parent is unset" unless @parent @parent.reference_bounds else self end end |
#right ⇒ Object
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])
305 306 307 |
# File 'lib/prawn/document/bounding_box.rb', line 305 def right @width end |
#right_side ⇒ Object
an alias for absolute_right
449 450 451 |
# File 'lib/prawn/document/bounding_box.rb', line 449 def right_side absolute_right end |
#stretchy? ⇒ Boolean
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.
470 471 472 |
# File 'lib/prawn/document/bounding_box.rb', line 470 def stretchy? !@height end |
#subtract_left_padding(left_padding) ⇒ Object
Decrease the left padding of the bounding box.
281 282 283 284 285 |
# File 'lib/prawn/document/bounding_box.rb', line 281 def subtract_left_padding(left_padding) @total_left_padding -= left_padding @x -= left_padding @width += left_padding end |
#subtract_right_padding(right_padding) ⇒ Object
Decrease the right padding of the bounding box.
294 295 296 297 |
# File 'lib/prawn/document/bounding_box.rb', line 294 def subtract_right_padding(right_padding) @total_right_padding -= right_padding @width += right_padding end |
#top ⇒ Object
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)])
315 316 317 |
# File 'lib/prawn/document/bounding_box.rb', line 315 def top height end |
#top_left ⇒ Object
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
338 339 340 |
# File 'lib/prawn/document/bounding_box.rb', line 338 def top_left [left,top] end |
#top_right ⇒ Object
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
351 352 353 |
# File 'lib/prawn/document/bounding_box.rb', line 351 def top_right [right,top] end |
#width ⇒ Object
Width of the bounding box
429 430 431 |
# File 'lib/prawn/document/bounding_box.rb', line 429 def width @width end |