package ImageItemObject;

use strict;
use warnings;
use Qt4;
use Scalar::Util qw(weaken);

use Qt4::isa qw( Qt4::Object );
use Qt4::slots
    setFrame => ['int'],
    updateItemPosition => [];

sub NEW {
    shift->SUPER::NEW(@_);
}

sub setImageItem {
    this->{imageItem} = shift;
    weaken(this->{imageItem});
    return;
}

# [3]
sub setFrame
{
    my ($frame) = @_;
    this->{imageItem}->adjust();
    my $center = this->{imageItem}->boundingRect()->center();

    this->{imageItem}->translate($center->x(), $center->y());
    this->{imageItem}->scale(1 + $frame / 330.0, 1 + $frame / 330.0);
    this->{imageItem}->translate(-($center->x()), -($center->y()));
}
# [3]

# [6]
sub updateItemPosition
{
    this->{imageItem}->setZValue(this->{z});
}
# [6]

package ImageItem;

use strict;
use warnings;
use Qt4;
use Qt4::isa qw( Qt4::GraphicsPixmapItem );
use ImageItemObject;

# [0]
sub NEW {
    my ($class, $id, $pixmap, $parent, $scene) = @_;
    $class->SUPER::NEW($pixmap, $parent, $scene);

    my $object = ImageItemObject($parent);
    $object->setImageItem( this );
    this->{object} = $object;

    this->{z} = 0.0;

    this->{recordId} = $id;
    this->setAcceptsHoverEvents(1);

    this->{timeLine} = Qt4::TimeLine();
    this->{timeLine}->setDuration(150);
    this->{timeLine}->setFrameRange(0, 150);

    $object->connect(this->{timeLine}, SIGNAL 'frameChanged(int)', $object, SLOT 'setFrame(int)');
    $object->connect(this->{timeLine}, SIGNAL 'finished()', $object, SLOT 'updateItemPosition()');

    this->adjust();
}
# [0]

# [1]
sub hoverEnterEvent
{
    this->{timeLine}->setDirection(Qt4::TimeLine::Forward());

    if (this->{z} != 1.0) {
        this->{z} = 1.0;
        this->{object}->updateItemPosition();
    }

    if (this->{timeLine}->state() == Qt4::TimeLine::NotRunning()) {
        this->{timeLine}->start();
    }
}
# [1]

# [2]
sub hoverLeaveEvent
{
    this->{timeLine}->setDirection(Qt4::TimeLine::Backward());
    if (this->{z} != 0.0) {
        this->{z} = 0.0;
    }

    if (this->{timeLine}->state() == Qt4::TimeLine::NotRunning()) {
        this->{timeLine}->start();
    }
}
# [2]

# [4]
sub adjust
{
    my $matrix = Qt4::Matrix();
    $matrix->scale(150/ this->boundingRect()->width(), 120/ this->boundingRect()->height());
    this->setMatrix($matrix);
}
# [4]

# [5]
sub id
{
    return this->{recordId};
}
# [5]

1;