--- /dev/null
+#include "arrowobj.h"
+#include "misc.h"
+
+#include <QDebug>
+#include <QGraphicsScene>
+
+/////////////////////////////////////////////////////////////////
+// ArrowObj
+/////////////////////////////////////////////////////////////////
+
+ArrowObj::ArrowObj(MapObj *parent) : MapObj(parent) { init(); }
+
+ArrowObj::~ArrowObj()
+{
+ delete arrowBegin;
+ delete arrowEnd;
+ delete line;
+}
+
+void ArrowObj::init()
+{
+ QPen pen;
+
+ pen.setStyle(Qt::SolidLine);
+ arrowBegin = scene()->addPolygon(QPolygonF(), pen);
+ arrowBegin->setZValue(dZ_XLINK);
+ arrowEnd = scene()->addPolygon(QPolygonF(), pen);
+ arrowEnd->setZValue(dZ_XLINK);
+
+ line = scene()->addLine(QLineF(), pen);
+ line->setZValue(dZ_XLINK);
+
+ arrowSize = 4;
+ useFixedLength = false;
+ setStyleBegin(None);
+ setStyleEnd(HeadFull);
+}
+
+void ArrowObj::setPen(QPen p)
+{
+ pen = p;
+ line->setPen(pen);
+
+ // end shall have same style as xlink
+ QPen pen_solid = pen;
+ pen_solid.setStyle(Qt::SolidLine);
+ arrowBegin->setPen(pen_solid);
+ arrowEnd->setPen(pen_solid);
+
+ setStyleBegin(styleBegin);
+ setStyleEnd(styleEnd);
+}
+
+QPen ArrowObj::getPen() { return pen; }
+
+void ArrowObj::setArrowSize(qreal r) { arrowSize = r; }
+
+qreal ArrowObj::getArrowSize() { return arrowSize; }
+
+void ArrowObj::setUseFixedLength(bool b) { useFixedLength = b; }
+
+bool ArrowObj::getUseFixedLength() { return useFixedLength; }
+
+void ArrowObj::setFixedLength(int i) { fixedLength = i; }
+
+int ArrowObj::getFixedLength() { return fixedLength; }
+
+void ArrowObj::show() { setVisibility(true); }
+
+void ArrowObj::hide() { setVisibility(false); }
+
+void ArrowObj::setVisibility(bool b)
+{
+ MapObj::setVisibility(b);
+ if (b) {
+ if (styleEnd != None)
+ arrowEnd->show();
+ else
+ arrowEnd->hide();
+ if (useFixedLength && fixedLength == 0)
+ line->hide();
+ else
+ line->show();
+ }
+ else {
+ arrowEnd->hide();
+ line->hide();
+ }
+}
+
+void ArrowObj::setEndPoint(QPointF p)
+{
+ endPoint = p;
+
+ line->setLine(absPos.x(), absPos.y(), p.x(), p.y());
+ arrowEnd->setPos(absPos);
+
+ qreal a = getAngle(endPoint - absPos);
+ arrowEnd->setRotation(-a / 6.28 * 360);
+ arrowEnd->setPos(endPoint);
+}
+
+QPointF ArrowObj::getEndPoint() { return endPoint; }
+
+void ArrowObj::setStyleBegin(const QString &s)
+{
+ if (s == "HeadFull")
+ setStyleBegin(ArrowObj::HeadFull);
+ else
+ setStyleBegin(ArrowObj::None);
+}
+
+void ArrowObj::setStyleBegin(OrnamentStyle os)
+{
+ styleBegin = os;
+ switch (styleBegin) {
+ case HeadFull:
+ arrowEnd->setPolygon(getArrowHead());
+ arrowBegin->setBrush(pen.color());
+ break;
+ case Foot:
+ break;
+ case None:
+ arrowBegin->setPolygon(QPolygonF());
+ break;
+ }
+}
+
+ArrowObj::OrnamentStyle ArrowObj::getStyleBegin() { return styleBegin; }
+
+void ArrowObj::setStyleEnd(const QString &s)
+{
+ if (s == "HeadFull")
+ setStyleEnd(ArrowObj::HeadFull);
+ else
+ setStyleEnd(ArrowObj::None);
+}
+
+void ArrowObj::setStyleEnd(OrnamentStyle os)
+{
+ styleEnd = os;
+ switch (styleEnd) {
+ case HeadFull:
+ arrowEnd->setPolygon(getArrowHead());
+ arrowEnd->setBrush(pen.color());
+ break;
+ case Foot:
+ break;
+ case None:
+ arrowEnd->setPolygon(QPolygonF());
+ break;
+ }
+}
+
+QPolygonF ArrowObj::getArrowHead()
+{
+ QPointF a, b, c;
+ QPolygonF pa;
+ b = a + QPointF(-arrowSize * 2, -arrowSize);
+ c = a + QPointF(-arrowSize * 2, +arrowSize);
+ pa << a << b << c;
+ return pa;
+}
+
+ArrowObj::OrnamentStyle ArrowObj::getStyleEnd() { return styleEnd; }
+
+QString ArrowObj::styleToString(const OrnamentStyle &os)
+{
+ switch (os) {
+ case HeadFull:
+ return "HeadFull";
+ break;
+ case None:
+ return "None";
+ break;
+ default:
+ qWarning() << "ArrowObj::styleToString unknown style " << os;
+ }
+ return "Unknown";
+}