X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Farrowobj.cpp;fp=src%2Farrowobj.cpp;h=b4e36c731b28cf742577c430eff9582503fac647;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/arrowobj.cpp b/src/arrowobj.cpp new file mode 100644 index 0000000..b4e36c7 --- /dev/null +++ b/src/arrowobj.cpp @@ -0,0 +1,180 @@ +#include "arrowobj.h" +#include "misc.h" + +#include +#include + +///////////////////////////////////////////////////////////////// +// 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"; +}