package ColorItem; use strict; use warnings; use QtCore4; use QtGui4; use QtCore4::isa qw( Qt::GraphicsItem ); use constant RAND_MAX => 2147483647; sub NEW { my ($class) = @_; $class->SUPER::NEW(); this->{color} = Qt::Color( rand(RAND_MAX) % 256, rand(RAND_MAX) % 256, rand(RAND_MAX) % 256 ); this->setToolTip(sprintf "Qt::Color(%d, %d, %d)\n%s", this->{color}->red(), this->{color}->green(), this->{color}->blue(), 'Click and drag this color onto the robot!'); this->setCursor(Qt::Cursor(Qt::OpenHandCursor())); } sub boundingRect { return Qt::RectF(-15.5, -15.5, 34, 34); } sub paint { my ($painter) = @_; $painter->setPen(Qt::NoPen()); $painter->setBrush(Qt::Brush(Qt::darkGray())); $painter->drawEllipse(-12, -12, 30, 30); $painter->setPen(Qt::Pen(Qt::Brush(Qt::Color(Qt::black())), 1)); $painter->setBrush(Qt::Brush(this->{color})); $painter->drawEllipse(-15, -15, 30, 30); } sub mousePressEvent { my ($event) = @_; if ($event->button() != Qt::LeftButton()) { $event->ignore(); return; } this->setCursor(Qt::Cursor(Qt::ClosedHandCursor())); } sub mouseMoveEvent { my ($event) = @_; if (Qt::LineF(Qt::PointF($event->screenPos()), Qt::PointF($event->buttonDownScreenPos(Qt::LeftButton()))) ->length() < Qt::Application::startDragDistance()) { return; } my $drag = Qt::Drag($event->widget()); my $mime = Qt::MimeData(); $drag->setMimeData($mime); my $n = 0; if ($n++ > 2 && (rand(RAND_MAX) % 3) == 0) { my $image = Qt::Image('images/head.png'); $mime->setImageData($image); $drag->setPixmap(Qt::Pixmap::fromImage($image)->scaled(30, 40)); $drag->setHotSpot(Qt::Point(15, 30)); } else { $mime->setColorData(Qt::qVariantFromValue(this->{color})); $mime->setText(sprintf '#%02x%02x%02x', this->{color}->red(), this->{color}->green(), this->{color}->blue()); my $pixmap = Qt::Pixmap(34, 34); $pixmap->fill(Qt::Color(Qt::white())); my $painter = Qt::Painter($pixmap); $painter->translate(15, 15); $painter->setRenderHint(Qt::Painter::Antialiasing()); this->paint($painter, 0, 0); $painter->end(); $pixmap->setMask($pixmap->createHeuristicMask()); $drag->setPixmap($pixmap); $drag->setHotSpot(Qt::Point(15, 20)); } $drag->exec(); this->setCursor(Qt::Cursor(Qt::OpenHandCursor())); } sub mouseReleaseEvent { this->setCursor(Qt::Cursor(Qt::OpenHandCursor())); } 1;