33 #ifndef PAINTERGRAPHICSITEMS_H
34 #define PAINTERGRAPHICSITEMS_H
38 #include <QtGui/QPainter>
39 #include <QtGui/QPainterPath>
40 #include <QtGui/QGraphicsItem>
41 #include <QtGui/QGraphicsRectItem>
42 #include <QtGui/QGraphicsPathItem>
43 #include <QtGui/QAbstractGraphicsShapeItem>
46 using namespace Frapper;
68 PointHandle( QPointF position,
BaseShapeItem* parent, QColor penColor = Qt::gray) : QGraphicsRectItem(-4, -4, 8, 8, parent), m_parent(parent)
70 setBrush( Qt::NoBrush );
71 setPen( QPen(penColor));
72 setFlags( ItemIsMovable | ItemSendsGeometryChanges );
75 setCursor(Qt::SizeAllCursor);
82 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
85 setPos( mapToParent(event->pos()) );
86 m_parent->updateShape();
106 setBrush( Qt::gray );
107 setFlags( ItemIsMovable | ItemSendsGeometryChanges );
109 setCursor(Qt::SizeAllCursor);
115 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
118 QPointF off =
event->scenePos() -
event->lastScenePos();
119 m_parent->setPos( m_parent->pos() + off);
140 setBrush(QBrush(Qt::green));
141 setFlags( ItemIsMovable | ItemSendsGeometryChanges);
143 setCursor(Qt::SizeHorCursor);
149 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
152 m_angle += (
event->scenePos() -
event->lastScenePos()).x();
156 m_parent->setTransform( QTransform().translate(p.x(), p.y()).rotate(m_angle).translate(-p.x(),-p.y()));
176 BaseShapeItem ( QPen pen = QPen(), QBrush brush = QBrush()) : QAbstractGraphicsShapeItem()
178 setFlags( ItemIsSelectable );
197 delete m_translateHandle;
198 delete m_rotateHandle;
204 PAINT, LINE,
RECT, CIRCLE, ELLIPSE, POLYGON, POLYLINE, CURVE, CLOSEDCURVE,
208 enum { Type = UserType + 1 };
213 virtual int type()
const
221 virtual void addPosition( QPointF pos ) = 0;
224 virtual void updatePosition( QPointF pos ) = 0;
228 virtual void skipLastPosition(
bool& emptyItem )
229 {emptyItem =
false;};
232 virtual QRectF boundingRect()
const
234 QRectF bb = m_shape.boundingRect();
235 int pw = pen().width();
236 return QRectF( bb.left() - pw/2, bb.top() - pw/2,
237 bb.width() + pw/2, bb.height() + pw/2);
243 virtual void paint (QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
245 QPen painterPen = pen();
247 painterPen.setColor(Qt::yellow);
249 painter->setPen(painterPen);
250 painter->setBrush( brush());
251 painter->drawPath( m_shape );
254 QString getDescriptionText()
259 case BASE:
return "Basic";
260 case PAINT:
return "Paint";
261 case LINE:
return "Line";
262 case RECT:
return "Rectangle";
263 case CIRCLE:
return "Circle";
264 case ELLIPSE:
return "Ellipse";
265 case POLYGON:
return "Polygon";
266 case POLYLINE:
return "Polyline";
267 case CURVE:
return "Curve";
268 case CLOSEDCURVE:
return "Closed Curve";
277 virtual void updateShape()
279 QPointF center = m_shape.boundingRect().center();
280 m_rotateHandle->setPos( center );
281 m_translateHandle->setPos(center.x(), center.y()-20);
285 virtual QVariant itemChange(GraphicsItemChange change,
const QVariant &value)
287 if( change == ItemSelectedHasChanged)
288 showHandles( isSelected());
289 return QGraphicsItem::itemChange( change, value);
295 void showHandles(
bool show =
true )
298 handle->setVisible(show);
299 m_rotateHandle->setVisible(show);
300 m_translateHandle->setVisible(show);
338 m_shape.moveTo( startPos );
343 void updatePosition( QPointF pos )
345 prepareGeometryChange();
346 m_shape.lineTo( pos );
351 void addPosition( QPointF pos )
353 prepareGeometryChange();
354 m_shape.lineTo( pos );
379 m_points.push_back(
new PointHandle( startPos,
this));
380 m_points.push_back(
new PointHandle( startPos,
this));
385 void updatePosition( QPointF pos )
387 m_points.at(1)->setPos(pos);
393 void addPosition( QPointF pos )
401 prepareGeometryChange();
402 m_shape = QPainterPath();
403 m_shape.moveTo( ( m_points.at(0)->pos()));
404 m_shape.lineTo( ( m_points.at(1)->pos()));
430 m_points.push_back(
new PointHandle( startPos,
this));
431 m_points.push_back(
new PointHandle( startPos,
this));
436 void updatePosition( QPointF pos )
438 m_points.at(1)->setPos(pos);
444 void addPosition( QPointF pos )
452 prepareGeometryChange();
453 m_shape = QPainterPath();
454 m_shape.addRect( QRectF(( m_points.at(0)->pos()), ( m_points.at(1)->pos())).normalized());
480 m_points.push_back(
new PointHandle( startPos,
this));
481 m_points.push_back(
new PointHandle( startPos,
this));
486 void updatePosition( QPointF pos )
488 m_points.at(1)->setPos(pos);
494 void addPosition( QPointF pos )
502 prepareGeometryChange();
503 QRectF rect = QRectF(( m_points.at(0)->pos()), ( m_points.at(1)->pos())).normalized();
505 float d = std::min( rect.width(), rect.height());
506 QRectF circleRect( rect.left(), rect.top(), d, d);
507 m_shape = QPainterPath();
508 m_shape.addEllipse( circleRect );
534 m_points.push_back(
new PointHandle( startPos,
this));
535 m_points.push_back(
new PointHandle( startPos,
this));
540 void updatePosition( QPointF pos )
542 m_points.at(1)->setPos(pos);
548 void addPosition( QPointF pos )
556 prepareGeometryChange();
557 QRectF rect = QRectF(( m_points.at(0)->pos()), ( m_points.at(1)->pos())).normalized();
558 m_shape = QPainterPath();
559 m_shape.addEllipse( rect );
584 m_points.push_back(
new PointHandle( startPos,
this));
589 void addPosition( QPointF pos )
597 void updatePosition( QPointF pos )
600 skipLastPosition( emptyItem);
606 void skipLastPosition(
bool& emptyItem )
608 emptyItem = m_points.size() < 2;
610 delete m_points.back();
617 virtual void updateShape()
620 prepareGeometryChange();
621 QPointF start = ( m_points.at(0)->pos());
622 m_shape = QPainterPath();
623 m_shape.moveTo( start);
624 for(
int i=1; i<m_points.size(); i++)
626 QPointF end = ( m_points.at(i)->pos());
657 m_shape.lineTo(m_points.front()->pos());
681 m_points.push_back(
new PointHandle(startPos,
this));
693 virtual void updatePosition( QPointF pos )
696 skipLastPosition( emptyItem);
702 virtual void skipLastPosition(
bool& emptyItem )
704 emptyItem = m_points.size() < 2;
705 if( m_cpoints.size() > 1)
707 delete m_cpoints.back();
708 m_cpoints.pop_back();
709 delete m_cpoints.back();
710 m_cpoints.pop_back();
714 delete m_points.back();
722 virtual void addPosition( QPointF pos )
724 QPointF start = ( m_points.back()->pos());
726 QPointF vec = end - start;
729 m_cpoints.push_back(
new PointHandle( start + 1.0f/3.0f * vec,
this, Qt::red));
730 m_cpoints.push_back(
new PointHandle( start + 2.0f/3.0f * vec,
this, Qt::red));
739 virtual void updateShape()
741 prepareGeometryChange();
743 QPointF startPos = m_points.at(0)->pos();
745 m_shape = QPainterPath();
746 m_shape.moveTo( startPos );
747 m_controlShape = QPainterPath();
748 m_controlShape.moveTo( startPos );
750 for(
int i=1; i<m_points.size(); i++)
752 QPointF end = ( m_points.at(i)->pos());
753 QPointF cp1 = ( m_cpoints.at( 2*( i-1) )->pos());
754 QPointF cp2 = ( m_cpoints.at( 2*( i-1) +1)->pos());
756 m_shape.cubicTo( cp1, cp2, end);
757 m_controlShape.lineTo(cp1);
758 m_controlShape.lineTo(cp2);
759 m_controlShape.lineTo(end);
769 virtual QVariant itemChange(GraphicsItemChange change,
const QVariant &value)
771 if( change == ItemSelectedHasChanged )
772 showControlHandles( isSelected() );
779 virtual void paint (QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
783 painter->setPen(QPen(Qt::lightGray, 1));
784 painter->drawPath( m_controlShape );
791 void showControlHandles(
bool show =
true )
794 handle->setVisible(show);
826 virtual void updatePosition( QPointF pos )
835 virtual void addPosition( QPointF pos )
837 if( m_cpoints.size() > 1)
839 delete m_cpoints.back();
840 m_cpoints.pop_back();
841 delete m_cpoints.back();
842 m_cpoints.pop_back();
847 QPointF start = m_points.back()->pos();
848 QPointF end = m_points.front()->pos();
849 QPointF vec = end - start;
852 m_cpoints.push_back(
new PointHandle( start + 1.0f/3.0f * vec,
this, Qt::red));
853 m_cpoints.push_back(
new PointHandle( start + 2.0f/3.0f * vec,
this, Qt::red));
860 virtual void skipLastPosition(
bool& emptyItem)
864 int numPoints = m_points.size();
865 if( m_cpoints.size() == 2*numPoints)
867 QPointF start = m_points.back()->pos();
868 QPointF end = m_points.front()->pos();
869 QPointF vec = end - start;
871 m_cpoints.at(2*numPoints-2)->setPos(start + 1.0f/3.0f * vec);
872 m_cpoints.at(2*numPoints-1)->setPos(start + 2.0f/3.0f * vec);
879 virtual void updateShape()
883 int numPoints = m_points.size();
884 if( numPoints > 1 && m_cpoints.size() == 2*numPoints)
886 QPointF cp1 = m_cpoints.at(2*numPoints-2)->pos();
887 QPointF cp2 = m_cpoints.at(2*numPoints-1)->pos();
888 QPointF end = m_points.front()->pos();
890 m_shape.cubicTo( cp1, cp2, end);
891 m_controlShape.lineTo(cp1);
892 m_controlShape.lineTo(cp2);
893 m_controlShape.lineTo(end);