Class: Vizcore::DSL::SceneBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/vizcore/dsl/scene_builder.rb

Overview

Collects layer definitions inside a single scene block.

Instance Method Summary collapse

Constructor Details

#initialize(name:, styles: {}, themes: {}, layers: []) ⇒ SceneBuilder

Returns a new instance of SceneBuilder.

Parameters:

  • name (Symbol, String)

    scene identifier

  • styles (Hash) (defaults to: {})

    reusable layer parameter styles

  • themes (Hash) (defaults to: {})

    reusable scene-wide layer parameter themes

  • layers (Array<Hash>) (defaults to: [])

    initial layer definitions



14
15
16
17
18
19
20
21
# File 'lib/vizcore/dsl/scene_builder.rb', line 14

def initialize(name:, styles: {}, themes: {}, layers: [])
  @name = name.to_sym
  @styles = styles
  @themes = themes
  @theme_name = nil
  @theme_params = {}
  @layers = layers.map { |layer| deep_dup(layer) }
end

Instance Method Details

#evaluate { ... } ⇒ Vizcore::DSL::SceneBuilder

Evaluate a scene block.

Yields:

  • Layer definitions

Returns:



27
28
29
30
# File 'lib/vizcore/dsl/scene_builder.rb', line 27

def evaluate(&block)
  instance_eval(&block) if block
  self
end

#group(name) { ... } ⇒ void

This method returns an undefined value.

Define a related group of layers with shared params.

Parameters:

  • name (Symbol, String)

    group identifier

Yields:

  • Layer group definition block



48
49
50
51
52
# File 'lib/vizcore/dsl/scene_builder.rb', line 48

def group(name, &block)
  builder = LayerGroupBuilder.new(name: name, styles: @styles, defaults: @theme_params)
  builder.evaluate(&block)
  @layers.concat(builder.to_a)
end

#layer(name) { ... } ⇒ void

This method returns an undefined value.

Define one layer in this scene.

Parameters:

  • name (Symbol, String)

    layer identifier

Yields:

  • Layer definition block



37
38
39
40
41
# File 'lib/vizcore/dsl/scene_builder.rb', line 37

def layer(name, &block)
  builder = LayerBuilder.new(name: name, styles: @styles, defaults: @theme_params)
  builder.evaluate(&block)
  @layers << builder.to_h
end

#to_hHash

Returns serialized scene payload.

Returns:

  • (Hash)

    serialized scene payload



69
70
71
72
73
74
75
76
# File 'lib/vizcore/dsl/scene_builder.rb', line 69

def to_h
  scene = {
    name: @name,
    layers: @layers.map { |layer| deep_dup(layer) }
  }
  scene[:theme] = @theme_name if @theme_name
  scene
end

#use_theme(name) ⇒ Hash

Apply a named theme as default params for all layers in this scene.

Parameters:

  • name (Symbol, String)

    theme identifier

Returns:

  • (Hash)

    applied theme params

Raises:

  • (ArgumentError)

    when the theme is unknown



59
60
61
62
63
64
65
66
# File 'lib/vizcore/dsl/scene_builder.rb', line 59

def use_theme(name)
  theme_name = name.to_sym
  theme_params = @themes.fetch(theme_name) { raise ArgumentError, "unknown theme: #{theme_name}" }
  @theme_name = theme_name
  @theme_params = deep_dup(theme_params)
  @layers = @layers.map { |layer| apply_theme_defaults(layer, @theme_params) }
  deep_dup(@theme_params)
end