linkablemapobj.cpp
branchqt4-port
changeset 10 e2a80d9b5858
parent 0 7a96bd401351
child 20 9ad3d0391be1
     1.1 --- a/linkablemapobj.cpp	Sun Jan 30 12:58:47 2005 +0000
     1.2 +++ b/linkablemapobj.cpp	Thu Jul 06 15:39:54 2006 +0000
     1.3 @@ -1,10 +1,12 @@
     1.4 -//#include <math.h>
     1.5 +#include <math.h>
     1.6  
     1.7  #include "linkablemapobj.h"
     1.8  #include "branchobj.h"
     1.9  #include "mapeditor.h"
    1.10  
    1.11  #include "version.h"
    1.12 +//Added by qt3to4:
    1.13 +#include <Q3PointArray>
    1.14  
    1.15  
    1.16  /////////////////////////////////////////////////////////////////
    1.17 @@ -17,7 +19,7 @@
    1.18      init ();
    1.19  }
    1.20  
    1.21 -LinkableMapObj::LinkableMapObj(QCanvas* c) :MapObj(c)
    1.22 +LinkableMapObj::LinkableMapObj(Q3Canvas* c) :MapObj(c)
    1.23  {
    1.24  //    cout << "Const LinkableMapObj\n";
    1.25      init ();
    1.26 @@ -62,6 +64,7 @@
    1.27  void LinkableMapObj::init ()
    1.28  {
    1.29      depth=-1;	
    1.30 +	mapEditor=NULL;
    1.31      childObj=NULL;
    1.32      parObj=NULL;
    1.33      parObjTmpBuf=NULL;
    1.34 @@ -76,35 +79,45 @@
    1.35  	linkpos=LinkBottom;
    1.36      segment.setAutoDelete (TRUE);
    1.37      arcsegs=13;
    1.38 -	QPointArray pa(arcsegs*2+2);
    1.39 +	Q3PointArray pa(arcsegs*2+2);
    1.40      
    1.41 -    bottomline=new QCanvasLine(canvas);
    1.42 +    bottomline=new Q3CanvasLine(canvas);
    1.43      bottomline->setPen( QPen(linkcolor, 1) );
    1.44      bottomline->setZ(Z_LINK);
    1.45      bottomline->show();
    1.46  
    1.47      // Prepare showing the selection of a MapObj
    1.48 -    selbox = new QCanvasRectangle (canvas);
    1.49 +    selbox = new Q3CanvasRectangle (canvas);
    1.50      selbox->setZ(Z_SELBOX);
    1.51      selbox->setBrush( QColor(255,255,0) );
    1.52      selbox->setPen( QPen(QColor(255,255,0) ));
    1.53      selbox->hide();
    1.54      selected=false;
    1.55  
    1.56 +	hideLinkUnselected=false;
    1.57 +
    1.58 +	topPad=botPad=leftPad=rightPad=0;
    1.59 +
    1.60  	// initialize frame
    1.61  	frame = new FrameObj (canvas);
    1.62  	
    1.63  	repositionRequest=false;
    1.64 +
    1.65 +	// Rel Positions
    1.66 +	relPos=QPoint(0,0);
    1.67 +	useRelPos=false;
    1.68 +	useOrientation=true;
    1.69  }
    1.70  
    1.71  void LinkableMapObj::copy (LinkableMapObj* other)
    1.72  {
    1.73      MapObj::copy(other);
    1.74  	bboxTotal=other->bboxTotal;
    1.75 -//    linkwidth=other->linkwidth;		
    1.76 -
    1.77      setLinkStyle(other->style);
    1.78      setLinkColor (other->linkcolor);
    1.79 +	relPos=other->relPos;
    1.80 +	useOrientation=other->useOrientation;
    1.81 +
    1.82  }
    1.83  
    1.84  void LinkableMapObj::setChildObj(LinkableMapObj* o)
    1.85 @@ -126,8 +139,57 @@
    1.86  {
    1.87  }
    1.88  
    1.89 +bool LinkableMapObj::hasParObjTmp()
    1.90 +{
    1.91 +	if (parObjTmpBuf) return true;
    1.92 +	return false;
    1.93 +}
    1.94 +
    1.95 +void LinkableMapObj::setUseRelPos (const bool &b)
    1.96 +{
    1.97 +	useRelPos=b;
    1.98 +}
    1.99 +
   1.100 +void LinkableMapObj::setRelPos()
   1.101 +{
   1.102 +	if (parObj)
   1.103 +	{	
   1.104 +		relPos.setX (absPos.x() - parObj->getChildPos().x() );
   1.105 +		relPos.setY (absPos.y() - parObj->getChildPos().y() );
   1.106 +
   1.107 +		parObj->calcBBoxSize();
   1.108 +		parObj->requestReposition();
   1.109 +	}	
   1.110 +}
   1.111 +
   1.112 +void LinkableMapObj::setRelPos(const QPoint &p)
   1.113 +{
   1.114 +	relPos=p;
   1.115 +	if (parObj)
   1.116 +	{	parObj->calcBBoxSize();
   1.117 +		parObj->requestReposition();
   1.118 +	}	
   1.119 +}
   1.120 +
   1.121 +int LinkableMapObj::getTopPad()
   1.122 +{
   1.123 +	return topPad;
   1.124 +}
   1.125 +
   1.126 +int LinkableMapObj::getLeftPad()
   1.127 +{
   1.128 +	return leftPad;
   1.129 +}
   1.130 +
   1.131 +int LinkableMapObj::getRightPad()
   1.132 +{
   1.133 +	return rightPad;
   1.134 +}
   1.135 +
   1.136  LinkStyle LinkableMapObj::getDefLinkStyle ()
   1.137  {
   1.138 +	if (!mapEditor) return StyleUndef;
   1.139 +
   1.140  	LinkStyle ls=mapEditor->getLinkStyle();
   1.141  	switch (ls)
   1.142  	{
   1.143 @@ -157,6 +219,7 @@
   1.144  
   1.145  void LinkableMapObj::setLinkStyle(LinkStyle newstyle)
   1.146  {
   1.147 +	//if (newstyle=style) return;
   1.148  	delLink();
   1.149  		
   1.150  	style=newstyle;
   1.151 @@ -164,14 +227,14 @@
   1.152      if (childObj!=NULL && parObj != NULL)
   1.153      {
   1.154  		int i;
   1.155 -		QCanvasLine* cl;
   1.156 +		Q3CanvasLine* cl;
   1.157  		switch (style)
   1.158  		{
   1.159  			case StyleUndef:
   1.160  				bottomline->hide();
   1.161  				break;
   1.162  			case StyleLine: 
   1.163 -				l = new QCanvasLine(canvas);
   1.164 +				l = new Q3CanvasLine(canvas);
   1.165  				l->setPen( QPen(linkcolor, 1) );
   1.166  				l->setZ(Z_LINK);
   1.167  				if (visible)
   1.168 @@ -182,7 +245,7 @@
   1.169  			case StyleParabel:
   1.170  				for (i=0;i<arcsegs;i++)
   1.171  				{
   1.172 -					cl = new QCanvasLine(canvas);
   1.173 +					cl = new Q3CanvasLine(canvas);
   1.174  					cl->setPen( QPen(linkcolor, 1) );
   1.175  					cl->setPoints( 0,0,i*10,100);
   1.176  					cl->setZ(Z_LINK);
   1.177 @@ -195,7 +258,7 @@
   1.178  				pa0.resize (arcsegs+1);
   1.179  				break;
   1.180  			case StylePolyLine:	
   1.181 -				p = new QCanvasPolygon(canvas);
   1.182 +				p = new Q3CanvasPolygon(canvas);
   1.183  				p->setBrush( linkcolor );
   1.184  				p->setZ(Z_LINK);
   1.185  				if (visible)
   1.186 @@ -203,10 +266,9 @@
   1.187  				else
   1.188  					p->hide();
   1.189  				pa0.resize (3);
   1.190 -				// TODO
   1.191 -				// a bit awkward: draw the lines additionally to polygon, to avoid
   1.192 +				// TODO a bit awkward: draw the lines additionally to polygon, to avoid
   1.193  				// missing pixels, when polygon is extremly flat
   1.194 -				l = new QCanvasLine(canvas);
   1.195 +				l = new Q3CanvasLine(canvas);
   1.196  				l->setPen( QPen(linkcolor, 1) );
   1.197  				l->setZ(Z_LINK);
   1.198  				if (visible)
   1.199 @@ -215,7 +277,7 @@
   1.200  					l->hide();
   1.201  				break;
   1.202  			case StylePolyParabel:	
   1.203 -				p = new QCanvasPolygon(canvas);
   1.204 +				p = new Q3CanvasPolygon(canvas);
   1.205  				p->setBrush( linkcolor );
   1.206  				p->setZ(Z_LINK);
   1.207  				if (visible)
   1.208 @@ -226,13 +288,12 @@
   1.209  				pa1.resize (arcsegs+1);
   1.210  				pa2.resize (arcsegs+1);
   1.211  
   1.212 -				// TODO
   1.213 -				// a bit awkward: draw the lines additionally 
   1.214 +				// TODO a bit awkward: draw the lines additionally 
   1.215  				// to polygon, to avoid missing pixels, 
   1.216  				// if polygon is extremly flat
   1.217  				for (i=0;i<arcsegs;i++)
   1.218  				{
   1.219 -					cl = new QCanvasLine(canvas);
   1.220 +					cl = new Q3CanvasLine(canvas);
   1.221  					cl->setPen( QPen(linkcolor, 1) );
   1.222  					cl->setPoints( 0,0,i*10,100);
   1.223  					cl->setZ(Z_LINK);
   1.224 @@ -246,10 +307,7 @@
   1.225  			default: 
   1.226  				break;	
   1.227  		}	
   1.228 -	} else
   1.229 -	{
   1.230 -		cout << "Error: ChildObj or parObj == NULL in LinkableMapObj::setLinkStyle\n";
   1.231 -	}
   1.232 +	} 
   1.233  }
   1.234  
   1.235  LinkStyle LinkableMapObj::getLinkStyle()
   1.236 @@ -257,6 +315,18 @@
   1.237  	return style;
   1.238  }
   1.239  
   1.240 +void LinkableMapObj::setHideLinkUnselected(bool b)
   1.241 +{
   1.242 +	hideLinkUnselected=b;
   1.243 +	setVisibility (visible);
   1.244 +	updateLink();
   1.245 +}
   1.246 +
   1.247 +bool LinkableMapObj::getHideLinkUnselected()
   1.248 +{
   1.249 +	return hideLinkUnselected;
   1.250 +}
   1.251 +
   1.252  void LinkableMapObj::setLinkPos(LinkPos lp)
   1.253  {
   1.254  	linkpos=lp;
   1.255 @@ -272,14 +342,15 @@
   1.256  {
   1.257  	// Overloaded in BranchObj and childs
   1.258  	// here only set default color
   1.259 -	setLinkColor (mapEditor->getDefLinkColor());
   1.260 +	if (mapEditor)
   1.261 +		setLinkColor (mapEditor->getDefLinkColor());
   1.262  }
   1.263  
   1.264  void LinkableMapObj::setLinkColor(QColor col)
   1.265  {
   1.266  	linkcolor=col;
   1.267      bottomline->setPen( QPen(linkcolor, 1) );
   1.268 -	QCanvasLine *cl;
   1.269 +	Q3CanvasLine *cl;
   1.270  	switch (style)
   1.271  	{
   1.272  		case StyleLine:
   1.273 @@ -301,7 +372,6 @@
   1.274  		default:
   1.275  			break;
   1.276  	} // switch (style)	
   1.277 -	updateLink();
   1.278  }
   1.279  
   1.280  QColor LinkableMapObj::getLinkColor()
   1.281 @@ -332,32 +402,62 @@
   1.282  
   1.283  void LinkableMapObj::setVisibility (bool v)
   1.284  {
   1.285 +	Q3CanvasLine* cl;
   1.286  	MapObj::setVisibility (v);
   1.287 -	if (visible) 
   1.288 +	bool visnow=visible;
   1.289 +
   1.290 +	// We can hide the link, while object is not selected
   1.291 +	if (hideLinkUnselected && !selected)
   1.292 +		visnow=false;
   1.293 +
   1.294 +	if (visnow) 
   1.295  	{
   1.296  		bottomline->show();
   1.297 -		// FIXME lines and segments should be done in LMO?
   1.298 -		if (style==StyleLine && l) 
   1.299 +		switch (style)
   1.300  		{
   1.301 -			l->show();
   1.302 -		} else
   1.303 -		{
   1.304 -			QCanvasLine* cl;
   1.305 -			for (cl=segment.first(); cl; cl=segment.next() )
   1.306 -				cl->show();
   1.307 -		} 
   1.308 +			case StyleLine:
   1.309 +				if (l) l->show();
   1.310 +				break;
   1.311 +			case StyleParabel:	
   1.312 +				for (cl=segment.first(); cl; cl=segment.next() )
   1.313 +					cl->show();
   1.314 +				break;	
   1.315 +			case StylePolyLine:
   1.316 +				if (p) p->show();
   1.317 +				if (l) l->show();
   1.318 +				break;
   1.319 +			case StylePolyParabel:	
   1.320 +				for (cl=segment.first(); cl; cl=segment.next() )
   1.321 +					cl->show();
   1.322 +				if (p) p->show();
   1.323 +				break;
   1.324 +			default:
   1.325 +				break;
   1.326 +		}
   1.327  	} else 
   1.328  	{
   1.329  		bottomline->hide();
   1.330 -		if (style==StyleLine && l) 
   1.331 +		switch (style)
   1.332  		{
   1.333 -			l->hide();
   1.334 -		} else
   1.335 -		{
   1.336 -			QCanvasLine* cl;
   1.337 -			for (cl=segment.first(); cl; cl=segment.next() )
   1.338 -				cl->hide();
   1.339 -		} 
   1.340 +			case StyleLine:
   1.341 +				if (l) l->hide();
   1.342 +				break;
   1.343 +			case StyleParabel:	
   1.344 +				for (cl=segment.first(); cl; cl=segment.next() )
   1.345 +					cl->hide();
   1.346 +				break;	
   1.347 +			case StylePolyLine:
   1.348 +				if (p) p->hide();
   1.349 +				if (l) l->hide();
   1.350 +				break;
   1.351 +			case StylePolyParabel:	
   1.352 +				for (cl=segment.first(); cl; cl=segment.next() )
   1.353 +					cl->hide();
   1.354 +				if (p) p->hide();
   1.355 +				break;
   1.356 +			default:
   1.357 +				break;
   1.358 +		}
   1.359  	}	
   1.360  }
   1.361  
   1.362 @@ -370,12 +470,11 @@
   1.363      // 
   1.364      // sets:
   1.365      //	orientation
   1.366 -    //	childPos
   1.367 -    //	parPos
   1.368 -	//  offset
   1.369 +    //	childPos	(by calling setDockPos())
   1.370 +    //	parPos		(by calling setDockPos())
   1.371 +	//  bottomlineY
   1.372      //	drawing of the link itself
   1.373  
   1.374 -
   1.375  	// updateLink is called from move, but called from constructor we don't
   1.376  	// have parents yet...
   1.377  	if (style==StyleUndef) return;	
   1.378 @@ -387,10 +486,10 @@
   1.379  	switch (linkpos)
   1.380  	{
   1.381  		case LinkMiddle:
   1.382 -			offset=bbox.height() /2;
   1.383 +			bottomlineY=bbox.top()+bbox.height() /2;	// draw link to middle (of frame)
   1.384  			break;
   1.385  		default :
   1.386 -			offset=bbox.height()-1;			// draw link to bottom of bbox
   1.387 +			bottomlineY=bbox.bottom()-1;	// draw link to bottom of box
   1.388  			break;
   1.389  	}
   1.390  	
   1.391 @@ -431,23 +530,7 @@
   1.392  		reposition();
   1.393  	}
   1.394  	
   1.395 -    if (orientation==OrientLeftOfCenter )
   1.396 -    {
   1.397 -		childPos=QPoint (absPos.x(),absPos.y()+offset);
   1.398 -		parPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset );
   1.399 -    } else
   1.400 -    {
   1.401 -		childPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset ); 
   1.402 -		parPos=QPoint (absPos.x(),absPos.y()+offset);
   1.403 -    }
   1.404 -	/* FIXME
   1.405 -		cout << "      LMO::updateLink   absPos="<<absPos<<endl;
   1.406 -		cout << "      LMO::updateLink childPos="<<childPos<<endl;
   1.407 -		cout << "      LMO::updateLink   parPos="<<parPos<<endl;
   1.408 -		cout << "      LMO::updateLink   offset="<<offset<<endl;
   1.409 -		cout << "      LMO::updateLink   bbox.w="<<bbox.width()<<endl;
   1.410 -		cout << "      LMO::updateLink   bbox.h="<<bbox.height()<<endl;
   1.411 -	*/	
   1.412 +	setDockPos();
   1.413  
   1.414  	double p1x=parPos.x();	// Link is drawn from P1 to P2
   1.415  	double p1y=parPos.y();
   1.416 @@ -456,10 +539,10 @@
   1.417  	double vy=p2y - p1y;
   1.418  
   1.419  	// Draw the horizontal line below heading (from ChildPos to ParPos)
   1.420 -	bottomline->setPoints (lrint(childPos.x()),
   1.421 -		lrint(childPos.y()),
   1.422 -		lrint(p1x),
   1.423 -		lrint(p1y) );
   1.424 +	bottomline->setPoints (qRound(childPos.x()),
   1.425 +		qRound(childPos.y()),
   1.426 +		qRound(p1x),
   1.427 +		qRound(p1y) );
   1.428  
   1.429  	double a;	// angle
   1.430  	if (vx > -0.000001 && vx < 0.000001)
   1.431 @@ -467,9 +550,9 @@
   1.432  	else
   1.433  		a=atan( vy / vx );
   1.434  	// "turning point" for drawing polygonal links
   1.435 -	QPoint tp (-lrint(sin (a)*thickness_start), lrint(cos (a)*thickness_start));	
   1.436 +	QPoint tp (-qRound(sin (a)*thickness_start), qRound(cos (a)*thickness_start));	
   1.437  	
   1.438 -	QCanvasLine *cl;
   1.439 +	Q3CanvasLine *cl;
   1.440  
   1.441  	int i;
   1.442  
   1.443 @@ -477,10 +560,10 @@
   1.444  	switch (style)
   1.445  	{
   1.446  		case StyleLine:
   1.447 -			l->setPoints( lrint (parPos.x()),
   1.448 -				lrint(parPos.y()),
   1.449 -				lrint(p2x),
   1.450 -				lrint(p2y) );
   1.451 +			l->setPoints( qRound (parPos.x()),
   1.452 +				qRound(parPos.y()),
   1.453 +				qRound(p2x),
   1.454 +				qRound(p2y) );
   1.455  			break;	
   1.456  		case StyleParabel:	
   1.457  			parabel (pa0, p1x,p1y,p2x,p2y);
   1.458 @@ -492,15 +575,15 @@
   1.459  			}
   1.460  			break;
   1.461  		case StylePolyLine:
   1.462 -			pa0[0]=QPoint (lrint(p2x+tp.x()), lrint(p2y+tp.y()));
   1.463 -			pa0[1]=QPoint (lrint(p2x-tp.x()), lrint(p2y-tp.y()));
   1.464 -			pa0[2]=QPoint (lrint (parPos.x()), lrint(parPos.y()) );
   1.465 +			pa0[0]=QPoint (qRound(p2x+tp.x()), qRound(p2y+tp.y()));
   1.466 +			pa0[1]=QPoint (qRound(p2x-tp.x()), qRound(p2y-tp.y()));
   1.467 +			pa0[2]=QPoint (qRound (parPos.x()), qRound(parPos.y()) );
   1.468  			p->setPoints (pa0);
   1.469  			// here too, draw line to avoid missing pixels
   1.470 -			l->setPoints( lrint (parPos.x()),
   1.471 -				lrint(parPos.y()),
   1.472 -				lrint(p2x),
   1.473 -				lrint(p2y) );
   1.474 +			l->setPoints( qRound (parPos.x()),
   1.475 +				qRound(parPos.y()),
   1.476 +				qRound(p2x),
   1.477 +				qRound(p2y) );
   1.478  			break;
   1.479  		case StylePolyParabel:	
   1.480  			parabel (pa1, p1x,p1y,p2x+tp.x(),p2y+tp.y());
   1.481 @@ -534,6 +617,44 @@
   1.482      return parObj;
   1.483  }
   1.484  
   1.485 +LinkableMapObj* LinkableMapObj::findObjBySelect (QString s)
   1.486 +{
   1.487 +	LinkableMapObj *lmo=this;
   1.488 +	QString part;
   1.489 +	QString typ;
   1.490 +	QString num;
   1.491 +	while (!s.isEmpty() )
   1.492 +	{
   1.493 +		part=s.section(",",0,0);
   1.494 +		typ=part.left (3);
   1.495 +		num=part.right(part.length() - 3);
   1.496 +		if (typ=="mc:")
   1.497 +		{
   1.498 +			if (depth>0)
   1.499 +				return false;	// in a subtree there is no center
   1.500 +			else
   1.501 +				break;
   1.502 +		} else
   1.503 +			if (typ=="bo:")
   1.504 +				lmo=((BranchObj*)(lmo))->getBranchNum (num.toUInt());
   1.505 +			else
   1.506 +				if (typ=="fi:")
   1.507 +					lmo=((BranchObj*)(lmo))->getFloatImageNum (num.toUInt());
   1.508 +		if (!lmo) break;
   1.509 +		
   1.510 +		if (s.contains(","))
   1.511 +			s=s.right(s.length() - part.length() -1 );
   1.512 +		else	
   1.513 +			break;
   1.514 +	}
   1.515 +	return lmo;
   1.516 +}
   1.517 +
   1.518 +void LinkableMapObj::setDockPos()
   1.519 +{
   1.520 +	cout <<"LMO::setDockPos()\n";
   1.521 +}
   1.522 +
   1.523  QPoint LinkableMapObj::getChildPos()
   1.524  {
   1.525      return childPos;
   1.526 @@ -546,11 +667,26 @@
   1.527  
   1.528  QPoint LinkableMapObj::getRelPos()
   1.529  {
   1.530 +	return relPos;
   1.531 +/* FIXME not needed? relPos was moved in 1.7.10 from
   1.532 +   floatobj to linkablemapobj. Before we had:
   1.533 +	
   1.534  	if (!parObj) return QPoint (0,0);
   1.535      return QPoint(
   1.536  		absPos.x() - parObj->x(),
   1.537  		absPos.y() - parObj->y()
   1.538  	);
   1.539 +*/	
   1.540 +}
   1.541 +
   1.542 +
   1.543 +void LinkableMapObj::setUseOrientation (const bool &b)
   1.544 +{	
   1.545 +	if (useOrientation!=b)
   1.546 +	{
   1.547 +		useOrientation=b;
   1.548 +		requestReposition();
   1.549 +	}	
   1.550  }
   1.551  
   1.552  LinkOrient LinkableMapObj::getOrientation()
   1.553 @@ -583,11 +719,12 @@
   1.554  
   1.555  void LinkableMapObj::alignRelativeTo (QPoint ref)
   1.556  {
   1.557 +	// FIXME testing, seems not to be used right now...
   1.558 +	cout << "LMO::alignRelTo   ref="<<ref<<endl;
   1.559  }
   1.560  
   1.561  void LinkableMapObj::reposition()
   1.562  {
   1.563 -cout << "LMO::reposition  ???"<<endl;
   1.564  	if (depth==0)
   1.565  	{
   1.566  		// only calculate the sizes once. If the deepest LMO changes its height,
   1.567 @@ -626,14 +763,15 @@
   1.568  	// we want to block expensive repositioning, but just do it once at
   1.569  	// the end, thus check first:
   1.570  
   1.571 -	if (mapEditor->blockReposition()) return;
   1.572 +	if (mapEditor->isRepositionBlocked()) return;
   1.573  	
   1.574  	// Pass on the request to parental objects, if this hasn't been done yet
   1.575  	
   1.576  	if (parObj) 
   1.577  		parObj->forceReposition(); 
   1.578  	else 
   1.579 -		reposition(); }
   1.580 +		reposition(); 
   1.581 +}
   1.582  
   1.583  bool LinkableMapObj::repositionRequested()
   1.584  {
   1.585 @@ -643,9 +781,9 @@
   1.586  
   1.587  void LinkableMapObj::setSelBox()
   1.588  {
   1.589 -    selbox->setX (bbox.x() );
   1.590 -    selbox->setY (bbox.y() );
   1.591 -    selbox->setSize (bbox.width(), bbox.height() );
   1.592 +    selbox->setX (clickBox.x() );
   1.593 +    selbox->setY (clickBox.y() );
   1.594 +    selbox->setSize (clickBox.width(), clickBox.height() );
   1.595  }
   1.596  
   1.597  void LinkableMapObj::select()
   1.598 @@ -653,6 +791,8 @@
   1.599  	setSelBox();
   1.600      selected=true;
   1.601      selbox->show();
   1.602 +// FIXME not needed?	
   1.603 +	setVisibility (visible);
   1.604  }
   1.605  
   1.606  
   1.607 @@ -660,9 +800,11 @@
   1.608  {
   1.609      selected=false;
   1.610      selbox->hide();
   1.611 +	// Maybe we have to hide the link:
   1.612 +	setVisibility (visible);
   1.613  }
   1.614  
   1.615 -void LinkableMapObj::parabel (QPointArray &ya, double p1x, double p1y, double p2x, double p2y)
   1.616 +void LinkableMapObj::parabel (Q3PointArray &ya, double p1x, double p1y, double p2x, double p2y)
   1.617  
   1.618  {
   1.619  	double vx=p2x - p1x;	// V=P2-P1
   1.620 @@ -680,14 +822,22 @@
   1.621  		m=(vy / (vx*vx));
   1.622  	dx=vx/(arcsegs);
   1.623  	int i;
   1.624 -	ya.setPoint (0,QPoint (lrint(p1x),lrint(p1y)));
   1.625 +	ya.setPoint (0,QPoint (qRound(p1x),qRound(p1y)));
   1.626  	for (i=1;i<=arcsegs;i++)
   1.627  	{	
   1.628  		pnx=p1x+dx;
   1.629  		pny=m*(pnx-parPos.x())*(pnx-parPos.x())+parPos.y();
   1.630 -		ya.setPoint (i,QPoint (lrint(pnx),lrint(pny)));
   1.631 +		ya.setPoint (i,QPoint (qRound(pnx),qRound(pny)));
   1.632  		p1x=pnx;
   1.633  		p1y=pny;
   1.634  	}	
   1.635  }
   1.636  
   1.637 +QString LinkableMapObj::getLinkAttr ()
   1.638 +{
   1.639 +	if (hideLinkUnselected)
   1.640 +		return attribut ("hideLink","true");
   1.641 +	else
   1.642 +		return attribut ("hideLink","false");
   1.643 +	
   1.644 +}