#!/usr/bin/perl -w
BEGIN { unshift(@INC, '.') }
use Qt;

package THAT;

@ISA = qw(QWidget);

sub new {
    shift->QWidget::new;
}

sub mousePressEvent {
    my $self = shift;
    my $e = shift;
    my $p = $self->mapToGlobal($e->pos);
    my($x, $y) = ($e->x, $e->y);
    my($gx, $gy) = ($p->x, $p->y);

    warn "Mouse pressed at ${gx}x$gy (${x}x$y)\n";
}

sub mouseReleaseEvent {
    my $self = shift;
    my $e = shift;
    my $p = $self->mapToGlobal($e->pos);
    my($x, $y) = ($e->x, $e->y);
    my($gx, $gy) = ($p->x, $p->y);

    warn "Mouse released at ${gx}x$gy (${x}x$y)\n";
}

sub mouseDoubleClickEvent {
    my $self = shift;
    my $e = shift;
    my $p = $self->mapToGlobal($e->pos);
    my($x, $y) = ($e->x, $e->y);
    my($gx, $gy) = ($p->x, $p->y);

    warn "Mouse double-clicked at ${gx}x$gy (${x}x$y)\n";
}

sub mouseMoveEvent {
    my $self = shift;
    my $e = shift;
    my $p = $self->mapToGlobal($e->pos);
    my($x, $y) = ($e->x, $e->y);
    my($gx, $gy) = ($p->x, $p->y);

    warn "Mouse moved to ${gx}x$gy (${x}x$y)\n";
} 

sub enterEvent {
    my $self = shift;
    my $p = &QCursor::pos;
    my $p2 = $self->mapFromGlobal($p);
    my($x, $y) = ($p2->x, $p2->y);
    my($gx, $gy) = ($p->x, $p->y);
    warn "Entered at ${gx}x$gy (${x}x$y)\n";
}

sub leaveEvent {
    my $self = shift;
    my $p = &QCursor::pos;
    my $p2 = $self->mapFromGlobal($p);
    my($x, $y) = ($p2->x, $p2->y);
    my($gx, $gy) = ($p->x, $p->y);
    warn "Exited at ${gx}x$gy (${x}x$y)\n";
}

sub moveEvent {
    my $self = shift;
    my $e = shift;
    my $from = $e->oldPos;

    my($x1, $y1) = ($from->x, $from->y);
    my($x2, $y2) = ($self->x, $self->y);

    warn "Moved from ${x1}x$y1 to ${x2}x$y2\n";
}

sub resizeEvent {
    my $self = shift;
    my $e = shift;
    my $from = $e->oldSize;

    my($w1, $h1) = ($from->width, $from->height);
    my($w2, $h2) = ($self->width, $self->height);

    warn "Resized from ${w1}x$h1 to ${w2}x$h2\n";
}

sub focusInEvent {
    my $self = shift;
    my $p = &QCursor::pos;
    my $p2 = $self->mapFromGlobal($p);
    my($x, $y) = ($p2->x, $p2->y);
    my($gx, $gy) = ($p->x, $p->y);
    warn "Got focus at ${gx}x$gy (${x}x$y)\n";
}

sub focusOutEvent {
    my $self = shift;
    my $p = &QCursor::pos;
    my $p2 = $self->mapFromGlobal($p);
    my($x, $y) = ($p2->x, $p2->y);
    my($gx, $gy) = ($p->x, $p->y);
    warn "Lost focus at ${gx}x$gy (${x}x$y)\n";
}

sub closeEvent {
    my $self = shift;
    my $e = shift;
    my $p = &QCursor::pos;
    my $p2 = $self->mapFromGlobal($p);
    my($x, $y) = ($p2->x, $p2->y);
    my($gx, $gy) = ($p->x, $p->y);

    $e->accept;

    warn "About to shut myself down. Incidentally, the mouse is at ${gx}x$gy (${x}x$y)\n";
}

package main;

$x = THAT->new;
print "$x $app\n";
$app->setMainWidget($x);
$x->show;
$app->exec;

exit;
