Sha256: f92b25d7d0164bc059dbfb5b1f54643382547ab76c87f7a42cafd228abd8c92e

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

require_relative 'node'

class PSD::Node
  # Represents a group, or folder, in the PSD document. It can have
  # zero or more children nodes.
  class Group < PSD::Node
    include PSD::HasChildren
    include PSD::Node::ParseLayers
    include PSD::Node::LockToOrigin

    attr_reader :name, :top, :left, :bottom, :right

    # Parses the descendant tree structure and figures out the bounds
    # of the layers within this folder.
    def initialize(folder)
      @name = folder[:name]
      @layer = folder[:layer]
      parse_layers(folder[:layers])
      get_dimensions
    end

    # Calculated height of this folder.
    def rows
      @bottom - @top
    end
    alias :height :rows

    # Calculated width of this folder.
    def cols
      @right - @left
    end
    alias :width :cols

    # Attempt to translate this folder and all of the descendants.
    def translate(x=0, y=0)
      @children.each{ |c| c.translate(x,y) }
    end

    # Attempt to hide all children of this layer.
    def hide!
      @children.each{ |c| c.hide! }
    end

    # Attempt to show all children of this layer.
    def show!
      @children.each{ |c| c.show! }
    end

    def empty?
      @children.empty?
    end

    # Export this layer and it's children to a hash recursively.
    def to_hash
      super.merge({
        type: :group,
        visible: visible?,
        children: children.map(&:to_hash)
      })
    end

    # If the method is missing, we blindly send it to the layer.
    # The layer handles the case in which the method doesn't exist.
    def method_missing(method, *args, &block)
      @layer.send(method, *args, &block)
    end

    private

    def get_dimensions
      children = @children.reject(&:empty?)
      @left = children.map(&:left).min || 0
      @top = children.map(&:top).min || 0
      @bottom = children.map(&:bottom).max || 0
      @right = children.map(&:right).max || 0
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
psd-1.5.0 lib/psd/node_group.rb