Class: HexaPDF::Layout::Style::Layers
- Inherits:
-
Object
- Object
- HexaPDF::Layout::Style::Layers
- Defined in:
- lib/hexapdf/layout/style.rb
Overview
Represents layers that can be drawn under or over a box.
There are two ways to specify layers via #add:
-
Directly by providing a callable object.
-
By reference to a callable object or class in the ‘style.layers_map’ configuration option. The reference name is looked up in the configuration option using HexaPDF::Configuration#constantize. If the resulting object is a callable object, it is used; otherwise it is assumed that it is a class and an object is instantiated, passing in any options given on #add.
The object resolved in this way needs to respond to #call(canvas, box) where canvas
is the HexaPDF::Content::Canvas object on which it should be drawn and box
is a box-like object (e.g. Box or TextFragment). The coordinate system is translated so that the origin is at the bottom left corner of the box during the drawing operations.
Instance Method Summary collapse
-
#add(name = nil, **options, &block) ⇒ Object
:call-seq: layers.add {|canvas, box| block} layers.add(name, **options).
-
#draw(canvas, x, y, box) ⇒ Object
Draws all layer objects onto the canvas at the position [x, y] for the given box.
-
#each(config) ⇒ Object
Yields all layer objects.
-
#initialize(layers = nil) ⇒ Layers
constructor
Creates a new Layers object popuplated with the given
layers
. -
#initialize_copy(other) ⇒ Object
Duplicates the array holding the layers.
-
#none? ⇒ Boolean
Returns
true
if there are no layers defined.
Constructor Details
#initialize(layers = nil) ⇒ Layers
Creates a new Layers object popuplated with the given layers
.
400 401 402 403 |
# File 'lib/hexapdf/layout/style.rb', line 400 def initialize(layers = nil) @layers = [] layers&.each {|name, | add(name, **( || {})) } end |
Instance Method Details
#add(name = nil, **options, &block) ⇒ Object
:call-seq:
layers.add {|canvas, box| block}
layers.add(name, **)
Adds a new layer object.
The layer object can either be specified as a block or by reference to a configured layer object in ‘style.layers_map’. In this case name
is used as the reference and the options are passed to layer object if it needs initialization.
420 421 422 423 424 425 426 427 428 |
# File 'lib/hexapdf/layout/style.rb', line 420 def add(name = nil, **, &block) if block_given? || name.kind_of?(Proc) @layers << (block || name) elsif name @layers << [name, ] else raise ArgumentError, "Layer object name or block missing" end end |
#draw(canvas, x, y, box) ⇒ Object
Draws all layer objects onto the canvas at the position [x, y] for the given box.
431 432 433 434 435 436 437 438 439 |
# File 'lib/hexapdf/layout/style.rb', line 431 def draw(canvas, x, y, box) return if none? canvas.translate(x, y) do each(canvas.context.document.config) do |layer| canvas.save_graphics_state { layer.call(canvas, box) } end end end |
#each(config) ⇒ Object
Yields all layer objects. Objects that have been specified via a reference are first resolved using the provided configuration object.
443 444 445 446 447 448 449 |
# File 'lib/hexapdf/layout/style.rb', line 443 def each(config) #:yield: layer @layers.each do |obj, | obj = config.constantize('style.layers_map', obj) unless obj.respond_to?(:call) obj = obj.new(**) unless obj.respond_to?(:call) yield(obj) end end |
#initialize_copy(other) ⇒ Object
Duplicates the array holding the layers.
406 407 408 409 |
# File 'lib/hexapdf/layout/style.rb', line 406 def initialize_copy(other) super @layers = @layers.dup end |
#none? ⇒ Boolean
Returns true
if there are no layers defined.
452 453 454 |
# File 'lib/hexapdf/layout/style.rb', line 452 def none? @layers.empty? end |