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