]> git.sven.stormbind.net Git - sven/vym.git/blob - src/arrowobj.cpp
New upstream version 2.9.22
[sven/vym.git] / src / arrowobj.cpp
1 #include "arrowobj.h"
2 #include "misc.h"
3
4 #include <QDebug>
5 #include <QGraphicsScene>
6
7 /////////////////////////////////////////////////////////////////
8 // ArrowObj
9 /////////////////////////////////////////////////////////////////
10
11 ArrowObj::ArrowObj(MapObj *parent) : MapObj(parent) { init(); }
12
13 ArrowObj::~ArrowObj()
14 {
15     delete arrowBegin;
16     delete arrowEnd;
17     delete line;
18 }
19
20 void ArrowObj::init()
21 {
22     QPen pen;
23
24     pen.setStyle(Qt::SolidLine);
25     arrowBegin = scene()->addPolygon(QPolygonF(), pen);
26     arrowBegin->setZValue(dZ_XLINK);
27     arrowEnd = scene()->addPolygon(QPolygonF(), pen);
28     arrowEnd->setZValue(dZ_XLINK);
29
30     line = scene()->addLine(QLineF(), pen);
31     line->setZValue(dZ_XLINK);
32
33     arrowSize = 4;
34     useFixedLength = false;
35     setStyleBegin(None);
36     setStyleEnd(HeadFull);
37 }
38
39 void ArrowObj::setPen(QPen p)
40 {
41     pen = p;
42     line->setPen(pen);
43
44     // end shall have same style as xlink
45     QPen pen_solid = pen;
46     pen_solid.setStyle(Qt::SolidLine);
47     arrowBegin->setPen(pen_solid);
48     arrowEnd->setPen(pen_solid);
49
50     setStyleBegin(styleBegin);
51     setStyleEnd(styleEnd);
52 }
53
54 QPen ArrowObj::getPen() { return pen; }
55
56 void ArrowObj::setArrowSize(qreal r) { arrowSize = r; }
57
58 qreal ArrowObj::getArrowSize() { return arrowSize; }
59
60 void ArrowObj::setUseFixedLength(bool b) { useFixedLength = b; }
61
62 bool ArrowObj::getUseFixedLength() { return useFixedLength; }
63
64 void ArrowObj::setFixedLength(int i) { fixedLength = i; }
65
66 int ArrowObj::getFixedLength() { return fixedLength; }
67
68 void ArrowObj::show() { setVisibility(true); }
69
70 void ArrowObj::hide() { setVisibility(false); }
71
72 void ArrowObj::setVisibility(bool b)
73 {
74     MapObj::setVisibility(b);
75     if (b) {
76         if (styleEnd != None)
77             arrowEnd->show();
78         else
79             arrowEnd->hide();
80         if (useFixedLength && fixedLength == 0)
81             line->hide();
82         else
83             line->show();
84     }
85     else {
86         arrowEnd->hide();
87         line->hide();
88     }
89 }
90
91 void ArrowObj::setEndPoint(QPointF p)
92 {
93     endPoint = p;
94
95     line->setLine(absPos.x(), absPos.y(), p.x(), p.y());
96     arrowEnd->setPos(absPos);
97
98     qreal a = getAngle(endPoint - absPos);
99     arrowEnd->setRotation(-a / 6.28 * 360);
100     arrowEnd->setPos(endPoint);
101 }
102
103 QPointF ArrowObj::getEndPoint() { return endPoint; }
104
105 void ArrowObj::setStyleBegin(const QString &s)
106 {
107     if (s == "HeadFull")
108         setStyleBegin(ArrowObj::HeadFull);
109     else
110         setStyleBegin(ArrowObj::None);
111 }
112
113 void ArrowObj::setStyleBegin(OrnamentStyle os)
114 {
115     styleBegin = os;
116     switch (styleBegin) {
117     case HeadFull:
118         arrowEnd->setPolygon(getArrowHead());
119         arrowBegin->setBrush(pen.color());
120         break;
121     case Foot:
122         break;
123     case None:
124         arrowBegin->setPolygon(QPolygonF());
125         break;
126     }
127 }
128
129 ArrowObj::OrnamentStyle ArrowObj::getStyleBegin() { return styleBegin; }
130
131 void ArrowObj::setStyleEnd(const QString &s)
132 {
133     if (s == "HeadFull")
134         setStyleEnd(ArrowObj::HeadFull);
135     else
136         setStyleEnd(ArrowObj::None);
137 }
138
139 void ArrowObj::setStyleEnd(OrnamentStyle os)
140 {
141     styleEnd = os;
142     switch (styleEnd) {
143     case HeadFull:
144         arrowEnd->setPolygon(getArrowHead());
145         arrowEnd->setBrush(pen.color());
146         break;
147     case Foot:
148         break;
149     case None:
150         arrowEnd->setPolygon(QPolygonF());
151         break;
152     }
153 }
154
155 QPolygonF ArrowObj::getArrowHead()
156 {
157     QPointF a, b, c;
158     QPolygonF pa;
159     b = a + QPointF(-arrowSize * 2, -arrowSize);
160     c = a + QPointF(-arrowSize * 2, +arrowSize);
161     pa << a << b << c;
162     return pa;
163 }
164
165 ArrowObj::OrnamentStyle ArrowObj::getStyleEnd() { return styleEnd; }
166
167 QString ArrowObj::styleToString(const OrnamentStyle &os)
168 {
169     switch (os) {
170     case HeadFull:
171         return "HeadFull";
172         break;
173     case None:
174         return "None";
175         break;
176     default:
177         qWarning() << "ArrowObj::styleToString unknown style " << os;
178     }
179     return "Unknown";
180 }