#the basic window class, from which every window will be derived. package Window; use Moose; extends (qw(Object)); #position for x in pixel has 'x' => ( is => 'rw', required =>1, isa => 'Num', default => 0 ); #position for y in pixel has 'y' => ( is => 'rw', required =>1, isa => 'Num', default=> 0 ); #widgets list has 'content' => ( is =>'rw', required =>0, isa => 'ArrayRef' ); #return value for the window, once set it will close it. has 'answer' => ( is => 'rw', required => 0, isa => 'Any' ); #constructor. sub BUILD { my ( $self ) = @_ ; #every window get a close button. my $widget = new Widget name =>"close", type => "icon", x => 0, y => 0, img => 'close', xsize => 16, ysize => 16 ; #useless again. window => $self; my $wt; push @$wt,$widget; $self->content( $wt ); } #Mouse actions on that window. # if a widget is clicked, then its action will be called. # if the click is done outside the window code() function will be called with current cursor position. sub action { my ( $self,$x,$y ) = @_; #calculate action in the window. my $rx = $x - $self->x ; my $ry = $y - $self->y ; my $max_x = $self->x + $self->xsize; my $max_y = $self->y + $self->ysize; #click inside window if( $x > $self->x and $x < $max_x ) { if( $y > $self->y and $y < $max_y ) { my $objects = $self->content; print "click inside the window $rx $ry\n"; foreach my $object ( @$objects ) { if( $rx > $object->x and $ry > $object->y ) { if( $rx < ( $object->x + $object->xsize ) and $ry < ( $object->y + $object->ysize ) ) { #click on a widget print "match ! " . $object->name ."\n"; $object->click; } } } } } else { #click outside window if( defined( $self->answer ) ) { $self->code( $x,$y); } } } #show the full window sub show($) { my ( $self ) = @_; #show the cursor. SDL::ShowCursor (1); #first the background color. my $color = SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x00, ); #the background rect. my $window = SDL::Rect->new( -height => $self->xsize, -width => $self->ysize, -x => $self->x, -y => $self->y, ); #draw window's background $ProneClient::screen->fill( $window, $color ); #the borders $ProneClient::screen = ProneClient::prone_image_copy( $ProneClient::screen, $ProneClient::imgs->{"corner1"}, $self->x-5, $self->y-5 ); $ProneClient::screen = ProneClient::prone_image_copy( $ProneClient::screen, $ProneClient::imgs->{"corner2"}, $self->x+$self->xsize + 5 - 32, $self->y -5); $ProneClient::screen = ProneClient::prone_image_copy( $ProneClient::screen, $ProneClient::imgs->{"corner3"}, $self->x+ $self->xsize +5 -32 , $self->y + $self->ysize +5 -32 ); $ProneClient::screen = ProneClient::prone_image_copy( $ProneClient::screen, $ProneClient::imgs->{"corner4"}, $self->x-5, $self->y + $self->ysize +5 -32 ) ; #show the widget. my $wid = $self->content; foreach my $dget ( @$wid ) { $dget->show($ProneClient::screen,$self->x,$self->y); } return 0; } return 1;