package DiagramItem; use strict; use warnings; use QtCore4; use QtGui4; use Arrow; use List::MoreUtils qw( firstidx ); # [0] use QtCore4::isa qw( Qt::GraphicsPolygonItem ); use constant { Type => Qt::GraphicsPolygonItem::UserType() + 15, Step => 0, Conditional => 1, StartEnd => 2, Io => 3 }; sub diagramType() { return this->{myDiagramType}; } sub polygon() { return this->{myPolygon}; } sub type() { return Type;} sub myContextMenu() { return this->{myContextMenu}; } sub arrows() { return this->{arrows}; } # [0] sub NEW { my ($class, $diagramType, $contextMenu, $parent, $scene) = @_; $class->SUPER::NEW($parent, $scene); this->{myDiagramType} = $diagramType; this->{myContextMenu} = $contextMenu; this->{myPolygon} = Qt::PolygonF(); my $path = Qt::PainterPath(); if ( $diagramType == StartEnd ) { $path->moveTo(200, 50); $path->arcTo(150, 0, 50, 50, 0, 90); $path->arcTo(50, 0, 50, 50, 90, 90); $path->arcTo(50, 50, 50, 50, 180, 90); $path->arcTo(150, 50, 50, 50, 270, 90); $path->lineTo(200, 25); this->{myPolygon} = $path->toFillPolygon(); } elsif ( $diagramType == Conditional ) { #this->{myPolygon} << Qt::PointF(-100, 0) << Qt::PointF(0, 100) #<< Qt::PointF(100, 0) << Qt::PointF(0, -100) #<< Qt::PointF(-100, 0); this->{myPolygon} = Qt::PolygonF( [ Qt::PointF(-100, 0), Qt::PointF(0, 100), Qt::PointF(100, 0), Qt::PointF(0, -100), Qt::PointF(-100, 0), ] ); } elsif ( $diagramType == Step ) { #this->{myPolygon} << Qt::PointF(-100, -100) << Qt::PointF(100, -100) #<< Qt::PointF(100, 100) << Qt::PointF(-100, 100) #<< Qt::PointF(-100, -100); this->{myPolygon} = Qt::PolygonF( [ Qt::PointF(-100, -100), Qt::PointF(100, -100), Qt::PointF(100, 100), Qt::PointF(-100, 100), Qt::PointF(-100, -100), ] ); } else { #this->{myPolygon} << Qt::PointF(-120, -80) << Qt::PointF(-70, 80) #<< Qt::PointF(120, 80) << Qt::PointF(70, -80) #<< Qt::PointF(-120, -80); this->{myPolygon} = Qt::PolygonF( [ Qt::PointF(-120, -80), Qt::PointF(-70, 80), Qt::PointF(120, 80), Qt::PointF(70, -80), Qt::PointF(-120, -80), ] ); } this->setPolygon(this->{myPolygon}); this->setFlag(Qt::GraphicsItem::ItemIsMovable(), 1); this->setFlag(Qt::GraphicsItem::ItemIsSelectable(), 1); this->{arrows} = []; } # [0] # [1] sub removeArrow { my ($arrow) = @_; my $index = firstidx { $_ == $arrow } @{this->arrows}; if ($index != -1) { splice @{this->arrows}, $index, 1; } } # [1] # [2] sub removeArrows { foreach my $arrow ( @{this->arrows} ) { $arrow->startItem()->removeArrow($arrow); $arrow->endItem()->removeArrow($arrow); this->scene()->removeItem($arrow); } } # [2] # [3] sub addArrow { my ($arrow) = @_; push @{this->{arrows}}, $arrow; } # [3] # [4] sub image { my $pixmap = Qt::Pixmap(250, 250); $pixmap->fill(Qt::Color(Qt::transparent())); my $painter = Qt::Painter($pixmap); $painter->setPen(Qt::Pen(Qt::Brush(Qt::black()), 8)); $painter->translate(125, 125); $painter->drawPolyline(this->{myPolygon}); return $pixmap; } # [4] # [5] sub contextMenuEvent { my ($event) = @_; this->scene()->clearSelection(); this->setSelected(1); this->myContextMenu->exec($event->screenPos()); } # [5] # [6] sub itemChange { my ($change, $value) = @_; if ($change == Qt::GraphicsItem::ItemPositionChange()) { foreach my $arrow ( @{this->arrows} ) { $arrow->updatePosition(); } } return $value; } # [6] 1;