package PWidget; @ISA = qw(PBase); use strict; sub new { my $class = shift; my $self = $class->SUPER::new($class, @_); $self->{widgetType} = $::PWIDGET_WIDGET; # Default handlers $self->installHandler($::PUKE_WIDGET_EVENT_RESIZE, sub {$self->resizeEvent(@_)}); $self->installHandler($::PUKE_WIDGET_EVENT_PAINT, sub {$self->paintEvent(@_)}); $self->installHandler($::PUKE_WIDGET_EVENT_MOVE, sub {$self->moveEvent(@_)}); $self->installHandler($::PUKE_EVENT_UNKOWN, sub {$self->miscEvent(@_)}); # Examplesto listen for mouse events # $self->installHandler($::PUKE_WIDGET_EVENT_MOUSEBUTTONPRESS, # sub {$self->mousePressEvent(@_)}); #$self->installHandler($::PUKE_WIDGET_EVENT_MOUSEBUTTONRELEASE, # sub {$self->mouseReleaseEvent(@_)}); if($class eq 'PWidget'){ $self->create(); } return $self; } sub close { my $self = shift; $self->hide(); $self->sendMessage('iCommand' => $::PUKE_WIDGET_DELETE, 'CallBack' => sub {}); $self->{DESTROYED} = 1; } sub show { my $self = shift; # make sure we are runable then show continue. my @ARG = (); # $self->canRun($self, \&PWidget::show, \@ARG) || return; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SHOW); } sub hide { my $self = shift; $self->sendMessage('iCommand' => $::PUKE_WIDGET_HIDE); } sub repaint { my $self = shift; my $erase = shift; # 1 for erase and reapint $self->sendMessage('iCommand' => $::PUKE_WIDGET_REPAINT, 'iArg' => $erase); } sub resize { my $self = shift; my $width = shift; my $height = shift; my $carg = "$width\t$height"; $self->sendMessage('iCommand' => $::PUKE_WIDGET_RESIZE, 'cArg' => $carg); } sub move { my $self = shift; my $x = shift; my $y = shift; my $carg = "$x\t$y"; $self->sendMessage('iCommand' => $::PUKE_WIDGET_MOVE, 'cArg' => $carg); } sub setMinimumSize { my $self = shift; my $w = shift; my $h = shift; my $carg = "$w\t$h"; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SETMINSIZE, 'cArg' => $carg, 'CallBack' => sub {}); } sub setMaximumSize { my $self = shift; my $w = shift; my $h = shift; my $carg = "$w\t$h"; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SETMAXSIZE, 'cArg' => $carg, 'CallBack' => sub {}); } sub setCaption { my $self = shift; my $text = shift; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SETCAPTION, 'cArg' => $text, 'CallBack' => sub {}); } sub resizeEvent { my $self = shift; my %ARG = %{shift()}; my($h, $w, $oh, $ow) = unpack("iiii", $ARG{'cArg'}); $self->{'height'} = $h; $self->{'width'} = $w; } sub paintEvent { } sub moveEvent { my $self = shift; my %ARG = %{shift()}; my($x, $y, $ox, $oy) = unpack("iiii", $ARG{'cArg'}); $self->{'x'} = $x; $self->{'y'} = $y; } sub miscEvent { } sub backgroundColor { my $self = shift; my %arg = $self->sendMessage('iCommand' => $::PUKE_WIDGET_GET_BACKGROUND_COLOUR, 'WaitFor' => 1); # print "Got: " . $arg{'cArg'} . "\n"; $arg{'cArg'} =~ s/\000//g; my ($r, $g, $b) = split(/,/, $arg{'cArg'}); return ($r, $g, $b); } sub setBackgroundColor { my $self = shift; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SET_BACKGROUND_COLOUR, 'cArg' => pack("i3", shift(), shift(), shift()), 'CallBack' => sub {}); } sub setBackgroundPixmap { my $self = shift; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SET_BACKGROUND_PIXMAP, 'cArg' => shift(), 'CallBack' => sub {}); } sub setBackgroundMode { my $self = shift; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SET_BACKGROUND_MODE, 'iArg' => shift(), 'CallBack' => sub {}); } sub setEnabled { my $self = shift; $self->sendMessage('iCommand' => $::PUKE_WIDGET_SET_ENABLED, 'iArg' => shift(), 'CallBack' => sub {}); } sub recreate { my $self = shift; my $nparent = shift; my $wflags = shift; # Not used! $self->sendMessage('iCommand' => $::PUKE_WIDGET_RECREATE, 'iArg' => $nparent ? $nparent->{'iWinId'} : 0, 'cArg' => pack("iii", shift(), shift(), shift()), 'CallBack' => sub {}); } package main; 1;