insilmaril@95
|
1 |
#include "xlinkobj.h"
|
insilmaril@95
|
2 |
#include "branchobj.h"
|
insilmaril@95
|
3 |
|
insilmaril@95
|
4 |
|
insilmaril@95
|
5 |
/////////////////////////////////////////////////////////////////
|
insilmaril@95
|
6 |
// XLinkObj
|
insilmaril@95
|
7 |
/////////////////////////////////////////////////////////////////
|
insilmaril@95
|
8 |
|
insilmaril@95
|
9 |
int XLinkObj::arrowSize=10; // make instances
|
insilmaril@95
|
10 |
QColor XLinkObj::defXLinkColor=QColor(180,180,180);
|
insilmaril@95
|
11 |
|
insilmaril@95
|
12 |
XLinkObj::XLinkObj ():MapObj()
|
insilmaril@95
|
13 |
{
|
insilmaril@95
|
14 |
// cout << "Const XLinkObj ()\n";
|
insilmaril@95
|
15 |
init();
|
insilmaril@95
|
16 |
}
|
insilmaril@95
|
17 |
|
insilmaril@95
|
18 |
XLinkObj::XLinkObj (QCanvas* c):MapObj(c)
|
insilmaril@95
|
19 |
{
|
insilmaril@95
|
20 |
// cout << "Const XLinkObj (c) called from MapCenterObj (c)\n";
|
insilmaril@95
|
21 |
init();
|
insilmaril@95
|
22 |
}
|
insilmaril@95
|
23 |
|
insilmaril@95
|
24 |
|
insilmaril@95
|
25 |
XLinkObj::~XLinkObj ()
|
insilmaril@95
|
26 |
{
|
insilmaril@95
|
27 |
// cout << "Destr XLinkObj\n";
|
insilmaril@95
|
28 |
if (xLinkState!=undefinedXLink)
|
insilmaril@95
|
29 |
deactivate();
|
insilmaril@95
|
30 |
delete (line);
|
insilmaril@95
|
31 |
delete (poly);
|
insilmaril@95
|
32 |
}
|
insilmaril@95
|
33 |
|
insilmaril@95
|
34 |
void XLinkObj::init ()
|
insilmaril@95
|
35 |
{
|
insilmaril@95
|
36 |
beginBranch=NULL;
|
insilmaril@95
|
37 |
endBranch=NULL;
|
insilmaril@95
|
38 |
visBranch=NULL;
|
insilmaril@95
|
39 |
xLinkState=undefinedXLink;
|
insilmaril@95
|
40 |
|
insilmaril@95
|
41 |
xLinkColor=defXLinkColor;
|
insilmaril@95
|
42 |
line=new QCanvasLine (canvas);
|
insilmaril@95
|
43 |
line->setPoints (0,0,200,200);
|
insilmaril@95
|
44 |
line->setPen (QPen(xLinkColor, 1));
|
insilmaril@95
|
45 |
|
insilmaril@95
|
46 |
poly=new QCanvasPolygon (canvas);
|
insilmaril@95
|
47 |
poly->setBrush( xLinkColor );
|
insilmaril@95
|
48 |
|
insilmaril@95
|
49 |
setVisibility (false);
|
insilmaril@95
|
50 |
}
|
insilmaril@95
|
51 |
|
insilmaril@95
|
52 |
void XLinkObj::copy (XLinkObj* other)
|
insilmaril@95
|
53 |
{
|
insilmaril@95
|
54 |
// FIXME copy not used yet
|
insilmaril@95
|
55 |
cout << "LO::copy called\n";
|
insilmaril@95
|
56 |
MapObj::copy (other);
|
insilmaril@95
|
57 |
setVisibility (other->visible);
|
insilmaril@95
|
58 |
beginBranch=other->beginBranch;
|
insilmaril@95
|
59 |
endBranch=other->endBranch;
|
insilmaril@95
|
60 |
}
|
insilmaril@95
|
61 |
|
insilmaril@95
|
62 |
void XLinkObj::setBegin (BranchObj *bo)
|
insilmaril@95
|
63 |
{
|
insilmaril@95
|
64 |
if (bo)
|
insilmaril@95
|
65 |
{
|
insilmaril@95
|
66 |
xLinkState=initXLink;
|
insilmaril@95
|
67 |
beginBranch=bo;
|
insilmaril@95
|
68 |
beginPos=beginBranch->getChildPos();
|
insilmaril@95
|
69 |
}
|
insilmaril@95
|
70 |
}
|
insilmaril@95
|
71 |
|
insilmaril@95
|
72 |
void XLinkObj::setEnd (BranchObj *bo)
|
insilmaril@95
|
73 |
{
|
insilmaril@95
|
74 |
if (bo)
|
insilmaril@95
|
75 |
{
|
insilmaril@95
|
76 |
xLinkState=initXLink;
|
insilmaril@95
|
77 |
endBranch=bo;
|
insilmaril@95
|
78 |
endPos=endBranch->getChildPos();
|
insilmaril@95
|
79 |
}
|
insilmaril@95
|
80 |
}
|
insilmaril@95
|
81 |
|
insilmaril@95
|
82 |
void XLinkObj::setColor(QColor c)
|
insilmaril@95
|
83 |
{
|
insilmaril@95
|
84 |
xLinkColor=c;
|
insilmaril@95
|
85 |
}
|
insilmaril@95
|
86 |
|
insilmaril@95
|
87 |
void XLinkObj::setEnd (QPoint p)
|
insilmaril@95
|
88 |
{
|
insilmaril@95
|
89 |
endPos=p;
|
insilmaril@95
|
90 |
}
|
insilmaril@95
|
91 |
|
insilmaril@95
|
92 |
bool XLinkObj::activate ()
|
insilmaril@95
|
93 |
{
|
insilmaril@95
|
94 |
if (beginBranch && endBranch)
|
insilmaril@95
|
95 |
{
|
insilmaril@95
|
96 |
xLinkState=activeXLink;
|
insilmaril@95
|
97 |
beginBranch->addXLink (this);
|
insilmaril@95
|
98 |
endBranch->addXLink (this);
|
insilmaril@95
|
99 |
setVisibility (true);
|
insilmaril@95
|
100 |
return true;
|
insilmaril@95
|
101 |
} else
|
insilmaril@95
|
102 |
return false;
|
insilmaril@95
|
103 |
}
|
insilmaril@95
|
104 |
|
insilmaril@95
|
105 |
void XLinkObj::deactivate ()
|
insilmaril@95
|
106 |
{
|
insilmaril@95
|
107 |
if (beginBranch)
|
insilmaril@95
|
108 |
beginBranch->removeXLinkRef (this);
|
insilmaril@95
|
109 |
beginBranch=NULL;
|
insilmaril@95
|
110 |
if (endBranch)
|
insilmaril@95
|
111 |
endBranch->removeXLinkRef (this);
|
insilmaril@95
|
112 |
endBranch=NULL;
|
insilmaril@95
|
113 |
visBranch=NULL;
|
insilmaril@95
|
114 |
xLinkState=undefinedXLink;
|
insilmaril@95
|
115 |
|
insilmaril@95
|
116 |
line->hide();
|
insilmaril@95
|
117 |
}
|
insilmaril@95
|
118 |
|
insilmaril@95
|
119 |
bool XLinkObj::isUsed()
|
insilmaril@95
|
120 |
{
|
insilmaril@95
|
121 |
if (beginBranch || endBranch || xLinkState!=undefinedXLink)
|
insilmaril@95
|
122 |
return true;
|
insilmaril@95
|
123 |
else
|
insilmaril@95
|
124 |
return false;
|
insilmaril@95
|
125 |
}
|
insilmaril@95
|
126 |
|
insilmaril@95
|
127 |
void XLinkObj::updateXLink()
|
insilmaril@95
|
128 |
{
|
insilmaril@95
|
129 |
QPoint a,b;
|
insilmaril@95
|
130 |
QPointArray pa (3);
|
insilmaril@95
|
131 |
if (visBranch)
|
insilmaril@95
|
132 |
{
|
insilmaril@95
|
133 |
// Only one of the linked branches is visible
|
insilmaril@95
|
134 |
a=b=visBranch->getChildPos();
|
insilmaril@95
|
135 |
if (visBranch->getOrientation()==OrientRightOfCenter)
|
insilmaril@95
|
136 |
{
|
insilmaril@95
|
137 |
b.setX (b.x()+25);
|
insilmaril@95
|
138 |
pa.putPoints (0,3,
|
insilmaril@95
|
139 |
b.x(),b.y(),
|
insilmaril@95
|
140 |
b.x()-arrowSize,b.y()-arrowSize,
|
insilmaril@95
|
141 |
b.x()-arrowSize,b.y()+arrowSize
|
insilmaril@95
|
142 |
);
|
insilmaril@95
|
143 |
poly->setPoints (pa);
|
insilmaril@95
|
144 |
} else
|
insilmaril@95
|
145 |
{
|
insilmaril@95
|
146 |
b.setX (b.x()-25);
|
insilmaril@95
|
147 |
pa.putPoints (0,3,
|
insilmaril@95
|
148 |
b.x(),b.y(),
|
insilmaril@95
|
149 |
b.x()+arrowSize,b.y()-arrowSize,
|
insilmaril@95
|
150 |
b.x()+arrowSize,b.y()+arrowSize);
|
insilmaril@95
|
151 |
poly->setPoints (pa);
|
insilmaril@95
|
152 |
}
|
insilmaril@95
|
153 |
} else
|
insilmaril@95
|
154 |
{
|
insilmaril@95
|
155 |
// Both linked branches are visible
|
insilmaril@95
|
156 |
if (beginBranch)
|
insilmaril@95
|
157 |
// If a link is just drawn in the editor,
|
insilmaril@95
|
158 |
// we have already a beginBranch
|
insilmaril@95
|
159 |
a=beginBranch->getChildPos();
|
insilmaril@95
|
160 |
else
|
insilmaril@95
|
161 |
// This shouldn't be reached normally...
|
insilmaril@95
|
162 |
a=beginPos;
|
insilmaril@95
|
163 |
if (xLinkState==activeXLink && endBranch)
|
insilmaril@95
|
164 |
b=endBranch->getChildPos();
|
insilmaril@95
|
165 |
else
|
insilmaril@95
|
166 |
b=endPos;
|
insilmaril@95
|
167 |
}
|
insilmaril@95
|
168 |
|
insilmaril@95
|
169 |
|
insilmaril@95
|
170 |
if (line->startPoint()==a && line->endPoint()==b && !visBranch)
|
insilmaril@95
|
171 |
{
|
insilmaril@95
|
172 |
// update is called from both branches, so only
|
insilmaril@95
|
173 |
// update if something has changed
|
insilmaril@95
|
174 |
return;
|
insilmaril@95
|
175 |
}
|
insilmaril@95
|
176 |
else
|
insilmaril@95
|
177 |
{
|
insilmaril@95
|
178 |
beginPos=a;
|
insilmaril@95
|
179 |
endPos=b;
|
insilmaril@95
|
180 |
line->setPoints (a.x(), a.y(), b.x(), b.y());
|
insilmaril@95
|
181 |
}
|
insilmaril@95
|
182 |
}
|
insilmaril@95
|
183 |
|
insilmaril@95
|
184 |
BranchObj* XLinkObj::otherBranch(BranchObj* thisBranch)
|
insilmaril@95
|
185 |
{
|
insilmaril@95
|
186 |
if (!beginBranch && !endBranch)
|
insilmaril@95
|
187 |
return NULL;
|
insilmaril@95
|
188 |
if (thisBranch==beginBranch)
|
insilmaril@95
|
189 |
return endBranch;
|
insilmaril@95
|
190 |
else
|
insilmaril@95
|
191 |
return beginBranch;
|
insilmaril@95
|
192 |
}
|
insilmaril@95
|
193 |
|
insilmaril@95
|
194 |
void XLinkObj::positionBBox()
|
insilmaril@95
|
195 |
{
|
insilmaril@95
|
196 |
}
|
insilmaril@95
|
197 |
|
insilmaril@95
|
198 |
void XLinkObj::calcBBoxSize()
|
insilmaril@95
|
199 |
{
|
insilmaril@95
|
200 |
}
|
insilmaril@95
|
201 |
|
insilmaril@95
|
202 |
void XLinkObj::setVisibility (bool b)
|
insilmaril@95
|
203 |
{
|
insilmaril@95
|
204 |
MapObj::setVisibility (b);
|
insilmaril@95
|
205 |
if (b)
|
insilmaril@95
|
206 |
{
|
insilmaril@95
|
207 |
line->show();
|
insilmaril@95
|
208 |
if (visBranch)
|
insilmaril@95
|
209 |
poly->show();
|
insilmaril@95
|
210 |
else
|
insilmaril@95
|
211 |
poly->hide();
|
insilmaril@95
|
212 |
}
|
insilmaril@95
|
213 |
else
|
insilmaril@95
|
214 |
{
|
insilmaril@95
|
215 |
line->hide();
|
insilmaril@95
|
216 |
poly->hide();
|
insilmaril@95
|
217 |
}
|
insilmaril@95
|
218 |
}
|
insilmaril@95
|
219 |
|
insilmaril@95
|
220 |
void XLinkObj::setVisibility ()
|
insilmaril@95
|
221 |
{
|
insilmaril@95
|
222 |
if (beginBranch && endBranch)
|
insilmaril@95
|
223 |
{
|
insilmaril@95
|
224 |
if(beginBranch->isVisibleObj() && endBranch->isVisibleObj())
|
insilmaril@95
|
225 |
{ // Both ends are visible
|
insilmaril@95
|
226 |
visBranch=NULL;
|
insilmaril@95
|
227 |
setVisibility (true);
|
insilmaril@95
|
228 |
} else
|
insilmaril@95
|
229 |
{
|
insilmaril@95
|
230 |
if(!beginBranch->isVisibleObj() && !endBranch->isVisibleObj())
|
insilmaril@95
|
231 |
{ //None of the ends is visible
|
insilmaril@95
|
232 |
visBranch=NULL;
|
insilmaril@95
|
233 |
setVisibility (false);
|
insilmaril@95
|
234 |
} else
|
insilmaril@95
|
235 |
{ // Just one end is visible, draw a symbol that shows
|
insilmaril@95
|
236 |
// that there is a link to a scrolled branch
|
insilmaril@95
|
237 |
if (beginBranch->isVisibleObj())
|
insilmaril@95
|
238 |
visBranch=beginBranch;
|
insilmaril@95
|
239 |
else
|
insilmaril@95
|
240 |
visBranch=endBranch;
|
insilmaril@95
|
241 |
setVisibility (true);
|
insilmaril@95
|
242 |
}
|
insilmaril@95
|
243 |
}
|
insilmaril@95
|
244 |
}
|
insilmaril@95
|
245 |
}
|
insilmaril@95
|
246 |
|
insilmaril@95
|
247 |
QString XLinkObj::saveToDir ()
|
insilmaril@95
|
248 |
{
|
insilmaril@95
|
249 |
QString s;
|
insilmaril@95
|
250 |
if (beginBranch && endBranch)
|
insilmaril@95
|
251 |
{
|
insilmaril@95
|
252 |
QString colAttr=attribut ("color",xLinkColor.name());
|
insilmaril@95
|
253 |
QString begSelAttr=attribut ("beginBranch",beginBranch->getSelectString());
|
insilmaril@95
|
254 |
QString endSelAttr=attribut ("endBranch", endBranch->getSelectString());
|
insilmaril@95
|
255 |
s=beginElement ("xlink", colAttr +begSelAttr +endSelAttr);
|
insilmaril@95
|
256 |
|
insilmaril@95
|
257 |
s+=endElement ("xlink");
|
insilmaril@95
|
258 |
}
|
insilmaril@95
|
259 |
return s;
|
insilmaril@95
|
260 |
}
|
insilmaril@95
|
261 |
|