diff --git a/src/qcanvasarrow.h b/src/qcanvasarrow.h new file mode 100644 --- /dev/null +++ b/src/qcanvasarrow.h @@ -0,0 +1,73 @@ +/* + * + * $Id$ + * + * This file is part of the Virtual Leaf. + * + * The Virtual Leaf is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Virtual Leaf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Virtual Leaf. If not, see . + * + * Copyright 2010 Roeland Merks. + * + */ + + +#ifndef _QCANVASARROW_H_ +#define _QCANVASARROW_H_ + +#include + +class QGraphicsArrowItem : public QGraphicsLineItem { + + public: + QGraphicsArrowItem(QGraphicsItem *parent, QGraphicsScene *c) : QGraphicsLineItem(parent, c) { + }; + + void paint ( QPainter *p, const QStyleOptionGraphicsItem *option, + QWidget *widget ) { + + // construct arrow head + QPointF start=line().p1(); + QPointF end=line().p2(); + QPointF mid=start + (3./4.)*(end-start); + + double vx=end.x()-start.x(); + double vy=end.y()-start.y(); + + double length = sqrt(vx*vx+vy*vy); + if (length==0) return; + + // perpendicular vector + double px=-vy/length; + double py=vx/length; + + // Arrow head lines go from end point + // to points about 3/4 of the total arrow, extending sideways about 1/4 + // of the arrow length. + + + QPointF arwp1 = mid + QPointF( (int)( (length/4.)*px ), + (int)( (length/4.)*py ) ); + QPointF arwp2 = mid - QPointF( (int)( (length/4.)*px ), + (int)( (length/4.)*py ) ); + + p->setPen(pen()); + // Draw arrow head + p->drawLine( end, arwp1 ); + p->drawLine( end, arwp2 ); + // Draw arrow line + p->drawLine( start, end); + } +}; + +#endif