#
# This file is part of SDLx-GUI
#
# This software is copyright (c) 2013 by Jerome Quelin.
#
# This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#
use 5.016;
use warnings;

package SDLx::GUI::Widget;
{
  $SDLx::GUI::Widget::VERSION = '0.001';
}
# ABSTRACT: Base class for all GUI widgets

use Moose;
use MooseX::Has::Sugar;
use MooseX::SemiAffordanceAccessor;
use SDL::Color;
use SDLx::Sprite;

use SDLx::GUI::Debug qw{ debug };


# -- attributes

has bg_color => ( rw, lazy_build, isa=>"SDL::Color" );



has parent     => ( rw, weak_ref, isa=>"SDLx::GUI::Widget" );


# the pack information describing how the widget is being packed onto
# its parent. A SDLx::GUI::Pack object, refer to this module for more
# information.
has _pack_info => ( rw, isa=>"SDLx::GUI::Pack", predicate=>"is_packed" );


# -- initialization

sub BUILD    { debug( "widget created: $_[0]\n" ); }
sub DEMOLISH { debug( "widget destroyed: $_[0]\n" ); }
sub _build_bg_color { SDL::Color->new(192,192,192); }

# -- public methods


sub pack {
    my ($self, %opts) = @_;
    my $pack = SDLx::GUI::Pack->new(%opts);
    $self->_set_pack_info( $pack );
    $self->parent->_recompute;
}



sub is_visible {
    my $self = shift;
    return $self->_pack_info && $self->_pack_info->_slave_dims;
}

# -- private methods

#
#   $widget->_draw( $surface );
#
# Request C<$widget> to be drawn on C<$surface>.
# PLACEHOLDER: method needs to be implemented in subclasses.
#

#
#   my ($width, $height) = $widget->_wanted_size;
#

# Return the minimum C<$width> and C<$height> needed to draw C<$widget>.
# Those dimensions are guaranted to be respected by its parent container
# - even if that means that the result will be clipped! :-)
# PLACEHOLDER: method needs to be implemented in subclasses.


no Moose;
__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=head1 NAME

SDLx::GUI::Widget - Base class for all GUI widgets

=head1 VERSION

version 0.001

=head1 DESCRIPTION

L<SDLx::GUI> provides some widgets to build the interface. Those widgets
all inherit from this base class.

=head1 ATTRIBUTES

=head2 parent

The parent widget (a L<SDLx::GUI::Widget> object).

=head1 METHODS

=head2 pack

    $widget->pack( %opts );

Request C<$widget> to be packed on its parent. C<%opts> is used to
create a new L<SDLx::GUI::Pack> object - refer to this module for more
information on supported attributes.

=head2 is_visible

    my $bool = $widget->is_visible;

Return true if C<$widget> is currently visible, ie if it is packed and
there's enough place on the screen for it to be shown.

=for Pod::Coverage BUILD DEMOLISH

=head1 AUTHOR

Jerome Quelin <jquelin@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2013 by Jerome Quelin.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut