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 |