Graphics::Primitive::Container - Component that holds other Components


Graphics-Primitive documentation Contained in the Graphics-Primitive distribution.

Index


Code Index:

NAME

Top

Graphics::Primitive::Container - Component that holds other Components

DESCRIPTION

Top

Containers are components that contain other components. They can also hold an instance of a Layout::Manager for automatic layout of their internal components. See the Component's Lifecycle Section|Graphics::Primitive::Component#LIFECYCLE for more information.

SYNOPSIS

Top

  my $c = Graphics::Primitive::Container->new(
    width => 500, height => 350,
    layout_manager => Layout::Manager::Compass->new
  );
  $c->add_component($comp, { meta => 'data' });

METHODS

Top

Constructor

new

Creates a new Container.

Instance Methods

add_component ($component, [ $constraint ])

Add a component to the container. Returns a true value if the component was added successfully. A second argument may be required, please consult the POD for your specific layout manager implementation.

Before the component is added, it is passed to the validate_component method. If validate_component does not return a true value, then the component is not added.

clear_components

Remove all components from the layout manager.

component_count

Returns the number of components in this container.

component_list

Returns this Container's ComponentList.

find_component

Returns the index of the first component with the supplied name. Returns undef if no component with that name is found.

get_component

Get the component at the specified index.

get_constraint

Get the constraint at the specified index.

get_tree

Returns a Forest::Tree object with this component at the root and all child components as children. Calling this from your root container will result in a tree representation of the entire scene.

prepare

Prepares this container. Does not mark as prepared, as that's done by the layout manager.

remove_component

Removes a component. Components must have names to be removed. Returns an arrayref of removed components.

validate_component

Optionally overriden by an implementation, allows it to deem a component as invalid. If this sub returns false, the component won't be added.

AUTHOR

Top

Cory Watson, <gphat@cpan.org>

BUGS

Top

Please report any bugs or feature requests to bug-geometry-primitive at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Geometry-Primitive. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

COPYRIGHT & LICENSE

Top


Graphics-Primitive documentation Contained in the Graphics-Primitive distribution.

package Graphics::Primitive::Container;
use Moose;
use MooseX::Storage;

with Storage (format => 'JSON', io => 'File');

use Graphics::Primitive::ComponentList;

use Forest::Tree;

extends 'Graphics::Primitive::Component';

with 'MooseX::Clone';

has 'component_list' => (
    is => 'rw',
    isa => 'Graphics::Primitive::ComponentList',
    default => sub { Graphics::Primitive::ComponentList->new },
    handles => [qw(component_count components constraints each find find_component get_component get_constraint)],
    trigger => sub { my ($self) = @_; $self->prepared(0); }
);
has 'layout_manager' => (
    is => 'rw',
    isa => 'Layout::Manager',
    handles => [ 'do_layout' ],
    trigger => sub { my ($self) = @_; $self->prepared(0); },
);

sub add_component {
    my ($self, $component, $args) = @_;

    return 0 unless $self->validate_component($component, $args);

    $component->parent($self);
    $self->component_list->add_component($component, $args);

    $self->prepared(0);

    return 1;
}

sub clear_components {
    my ($self) = @_;

    # Clear all the component's parent attributes just in case some
    # outside thingie is holding a reference to it
    foreach my $c (@{ $self->components }) {
        next unless(defined($c));
        $c->parent(undef);
    }
    $self->component_list->clear;
    $self->prepared(0);
}

sub get_tree {
    my ($self) = @_;

    my $tree = Forest::Tree->new(node => $self);

    foreach my $c (@{ $self->components }) {
        $tree->add_child($c->get_tree);
    }

    return $tree;
}

sub prepare {
    my ($self, $driver) = @_;

    return if $self->prepared;

    unless($self->minimum_width) {
        $self->minimum_width($self->outside_width);
    }
    unless($self->minimum_height) {
        $self->minimum_height($self->outside_height);
    }
}

sub remove_component {
    my ($self, $component) = @_;

    my $removed = $self->component_list->remove_component($component);
    if(scalar(@{ $removed })) {
        foreach my $r (@{ $removed }) {
            $r->parent(undef);
        }
    }

    return $removed;
}

sub validate_component {
    my ($self, $c, $a) = @_;

    return 1;
}

__PACKAGE__->meta->make_immutable;

no Moose;
1;
__END__