#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";
}