linkablemapobj.cpp
author insilmaril
Tue Mar 23 11:54:30 2010 +0000 (2010-03-23)
branchrelease-1-12-maintained
changeset 81 876eed30ba3b
parent 0 7a96bd401351
permissions -rw-r--r--
Patch from Xavier Oswald to compile with older compilers
insilmaril@81
     1
#include <math.h>
insilmaril@81
     2
#include <cstdlib>
insilmaril@0
     3
insilmaril@0
     4
#include "linkablemapobj.h"
insilmaril@0
     5
#include "branchobj.h"
insilmaril@0
     6
#include "mapeditor.h"
insilmaril@0
     7
insilmaril@0
     8
/////////////////////////////////////////////////////////////////
insilmaril@0
     9
// LinkableMapObj
insilmaril@0
    10
/////////////////////////////////////////////////////////////////
insilmaril@0
    11
insilmaril@0
    12
LinkableMapObj::LinkableMapObj():MapObj()
insilmaril@0
    13
{
insilmaril@0
    14
  //  cout << "Const LinkableMapObj ()\n";
insilmaril@0
    15
    init ();
insilmaril@0
    16
}
insilmaril@0
    17
insilmaril@81
    18
LinkableMapObj::LinkableMapObj(QGraphicsScene* s) :MapObj(s)
insilmaril@0
    19
{
insilmaril@81
    20
//    cout << "Const LinkableMapObj (s)\n";
insilmaril@0
    21
    init ();
insilmaril@0
    22
}
insilmaril@0
    23
insilmaril@81
    24
LinkableMapObj::LinkableMapObj (LinkableMapObj* lmo) : MapObj (lmo->scene)
insilmaril@0
    25
{
insilmaril@0
    26
    copy (lmo);
insilmaril@0
    27
}
insilmaril@0
    28
insilmaril@0
    29
LinkableMapObj::~LinkableMapObj()
insilmaril@0
    30
{
insilmaril@0
    31
    delete (bottomline);
insilmaril@0
    32
	delLink();
insilmaril@0
    33
}
insilmaril@0
    34
insilmaril@0
    35
void LinkableMapObj::delLink()
insilmaril@0
    36
{
insilmaril@0
    37
	switch (style)
insilmaril@0
    38
	{
insilmaril@81
    39
		case Line:
insilmaril@0
    40
			delete (l);
insilmaril@0
    41
			break;
insilmaril@81
    42
		case Parabel:
insilmaril@81
    43
			while (!segment.isEmpty()) delete segment.takeFirst();
insilmaril@0
    44
			break;
insilmaril@81
    45
		case PolyLine:
insilmaril@0
    46
			delete (p);
insilmaril@0
    47
			break;
insilmaril@81
    48
		case PolyParabel:
insilmaril@0
    49
			delete (p);
insilmaril@0
    50
			break;
insilmaril@0
    51
		default:
insilmaril@0
    52
			break;
insilmaril@0
    53
	}		
insilmaril@0
    54
}
insilmaril@0
    55
insilmaril@0
    56
void LinkableMapObj::init ()
insilmaril@0
    57
{
insilmaril@0
    58
    depth=-1;	
insilmaril@81
    59
	mapEditor=NULL;
insilmaril@0
    60
    childObj=NULL;
insilmaril@0
    61
    parObj=NULL;
insilmaril@0
    62
    parObjTmpBuf=NULL;
insilmaril@81
    63
    parPos=QPointF(0,0);
insilmaril@81
    64
    childPos=QPointF(0,0);
insilmaril@0
    65
	link2ParPos=false;
insilmaril@0
    66
    l=NULL;
insilmaril@81
    67
    orientation=UndefinedOrientation;
insilmaril@0
    68
    linkwidth=20;		
insilmaril@0
    69
	thickness_start=8;
insilmaril@81
    70
    style=UndefinedStyle;
insilmaril@81
    71
	linkpos=Bottom;
insilmaril@0
    72
    arcsegs=13;
insilmaril@0
    73
    
insilmaril@81
    74
// TODO instead of linkcolor pen.color() could be used	all around
insilmaril@81
    75
	pen.setWidth (1);
insilmaril@81
    76
	pen.setColor (linkcolor);
insilmaril@81
    77
	pen.setCapStyle ( Qt::RoundCap );
insilmaril@81
    78
	bottomline=scene->addLine(QLineF(1,1,1,1),pen);
insilmaril@81
    79
    bottomline->setZValue(Z_LINK);
insilmaril@0
    80
    bottomline->show();
insilmaril@0
    81
insilmaril@0
    82
    // Prepare showing the selection of a MapObj
insilmaril@0
    83
    selected=false;
insilmaril@0
    84
insilmaril@81
    85
	hideLinkUnselected=false;
insilmaril@81
    86
insilmaril@81
    87
	topPad=botPad=leftPad=rightPad=0;
insilmaril@81
    88
insilmaril@0
    89
	repositionRequest=false;
insilmaril@81
    90
insilmaril@81
    91
	// Rel Positions
insilmaril@81
    92
	relPos=QPointF(0,0);
insilmaril@81
    93
	useRelPos=false;
insilmaril@81
    94
	useOrientation=true;
insilmaril@81
    95
insilmaril@81
    96
	// Reset ID
insilmaril@81
    97
	objID="";
insilmaril@0
    98
}
insilmaril@0
    99
insilmaril@0
   100
void LinkableMapObj::copy (LinkableMapObj* other)
insilmaril@0
   101
{
insilmaril@0
   102
    MapObj::copy(other);
insilmaril@0
   103
	bboxTotal=other->bboxTotal;
insilmaril@0
   104
    setLinkStyle(other->style);
insilmaril@0
   105
    setLinkColor (other->linkcolor);
insilmaril@81
   106
	relPos=other->relPos;
insilmaril@81
   107
	useOrientation=other->useOrientation;
insilmaril@81
   108
	objID=other->objID;
insilmaril@0
   109
}
insilmaril@0
   110
insilmaril@0
   111
void LinkableMapObj::setChildObj(LinkableMapObj* o)
insilmaril@0
   112
{
insilmaril@0
   113
    childObj=o;
insilmaril@0
   114
}
insilmaril@0
   115
insilmaril@0
   116
void LinkableMapObj::setParObj(LinkableMapObj* o)
insilmaril@0
   117
{
insilmaril@0
   118
    parObj=o;
insilmaril@0
   119
	mapEditor=parObj->getMapEditor();
insilmaril@0
   120
}
insilmaril@0
   121
insilmaril@81
   122
void LinkableMapObj::setParObjTmp(LinkableMapObj*,QPointF,int)
insilmaril@0
   123
{
insilmaril@0
   124
}
insilmaril@0
   125
insilmaril@0
   126
void LinkableMapObj::unsetParObjTmp()
insilmaril@0
   127
{
insilmaril@0
   128
}
insilmaril@0
   129
insilmaril@81
   130
bool LinkableMapObj::hasParObjTmp()
insilmaril@0
   131
{
insilmaril@81
   132
	if (parObjTmpBuf) return true;
insilmaril@81
   133
	return false;
insilmaril@81
   134
}
insilmaril@81
   135
insilmaril@81
   136
void LinkableMapObj::setUseRelPos (const bool &b)
insilmaril@81
   137
{
insilmaril@81
   138
	useRelPos=b;
insilmaril@81
   139
}
insilmaril@81
   140
insilmaril@81
   141
void LinkableMapObj::setRelPos()
insilmaril@81
   142
{
insilmaril@81
   143
	if (parObj)
insilmaril@81
   144
	{	
insilmaril@81
   145
		relPos.setX (absPos.x() - parObj->getChildPos().x() );
insilmaril@81
   146
		relPos.setY (absPos.y() - parObj->getChildPos().y() );
insilmaril@81
   147
		parObj->calcBBoxSize();
insilmaril@81
   148
	}	
insilmaril@81
   149
}
insilmaril@81
   150
insilmaril@81
   151
void LinkableMapObj::setRelPos(const QPointF &p)
insilmaril@81
   152
{
insilmaril@81
   153
	relPos=p;
insilmaril@81
   154
	if (parObj)
insilmaril@81
   155
	{		
insilmaril@81
   156
		parObj->calcBBoxSize();
insilmaril@81
   157
		requestReposition();
insilmaril@81
   158
	}
insilmaril@81
   159
}
insilmaril@81
   160
insilmaril@81
   161
QPointF LinkableMapObj::getRelPos()
insilmaril@81
   162
{
insilmaril@81
   163
	if (!parObj) return QPointF();
insilmaril@81
   164
	return relPos;
insilmaril@81
   165
}
insilmaril@81
   166
insilmaril@81
   167
qreal LinkableMapObj::getTopPad()
insilmaril@81
   168
{
insilmaril@81
   169
	return topPad;
insilmaril@81
   170
}
insilmaril@81
   171
insilmaril@81
   172
qreal LinkableMapObj::getLeftPad()
insilmaril@81
   173
{
insilmaril@81
   174
	return leftPad;
insilmaril@81
   175
}
insilmaril@81
   176
insilmaril@81
   177
qreal LinkableMapObj::getRightPad()
insilmaril@81
   178
{
insilmaril@81
   179
	return rightPad;
insilmaril@81
   180
}
insilmaril@81
   181
insilmaril@81
   182
LinkableMapObj::Style LinkableMapObj::getDefLinkStyle ()
insilmaril@81
   183
{
insilmaril@81
   184
	if (!mapEditor) return UndefinedStyle;
insilmaril@81
   185
	Style ls=mapEditor->getMapLinkStyle();
insilmaril@0
   186
	switch (ls)
insilmaril@0
   187
	{
insilmaril@81
   188
		case Line: 
insilmaril@0
   189
			return ls;
insilmaril@0
   190
			break;
insilmaril@81
   191
		case Parabel:
insilmaril@0
   192
			return ls;
insilmaril@0
   193
			break;
insilmaril@81
   194
		case PolyLine:	
insilmaril@0
   195
			if (depth>1)
insilmaril@81
   196
				return Line;
insilmaril@0
   197
			else	
insilmaril@0
   198
				return ls;
insilmaril@0
   199
			break;
insilmaril@81
   200
		case PolyParabel:	
insilmaril@0
   201
			if (depth>1)
insilmaril@81
   202
				return Parabel;
insilmaril@0
   203
			else	
insilmaril@0
   204
				return ls;
insilmaril@0
   205
			break;
insilmaril@0
   206
		default: 
insilmaril@0
   207
			break;	
insilmaril@0
   208
	}	
insilmaril@81
   209
	return UndefinedStyle;
insilmaril@0
   210
}
insilmaril@0
   211
insilmaril@81
   212
void LinkableMapObj::setLinkStyle(Style newstyle)
insilmaril@0
   213
{
insilmaril@81
   214
	//if (newstyle=style) return;
insilmaril@0
   215
	delLink();
insilmaril@0
   216
		
insilmaril@0
   217
	style=newstyle;
insilmaril@0
   218
insilmaril@0
   219
    if (childObj!=NULL && parObj != NULL)
insilmaril@0
   220
    {
insilmaril@81
   221
		QGraphicsLineItem *cl;
insilmaril@0
   222
		switch (style)
insilmaril@0
   223
		{
insilmaril@81
   224
			case UndefinedStyle:
insilmaril@0
   225
				bottomline->hide();
insilmaril@0
   226
				break;
insilmaril@81
   227
			case Line: 
insilmaril@81
   228
				l = scene->addLine(QLineF(1,1,1,1),pen);
insilmaril@81
   229
				l->setZValue(Z_LINK);
insilmaril@0
   230
				if (visible)
insilmaril@0
   231
					l->show();
insilmaril@0
   232
				else
insilmaril@0
   233
					l->hide();
insilmaril@0
   234
				break;
insilmaril@81
   235
			case Parabel:
insilmaril@81
   236
				for (int i=0;i<arcsegs;i++)
insilmaril@0
   237
				{
insilmaril@81
   238
					cl = scene->addLine(QLineF(i*5,0,i*10,100),pen);
insilmaril@81
   239
					cl->setZValue(Z_LINK);
insilmaril@0
   240
					if (visible)
insilmaril@0
   241
						cl->show();
insilmaril@0
   242
					else
insilmaril@0
   243
						cl->hide();
insilmaril@0
   244
					segment.append(cl);
insilmaril@0
   245
				}
insilmaril@0
   246
				pa0.resize (arcsegs+1);
insilmaril@0
   247
				break;
insilmaril@81
   248
			case PolyLine:	
insilmaril@81
   249
				p =scene->addPolygon(QPolygonF(),pen,linkcolor);
insilmaril@81
   250
				p->setZValue(Z_LINK);
insilmaril@0
   251
				if (visible)
insilmaril@0
   252
					p->show();
insilmaril@0
   253
				else
insilmaril@0
   254
					p->hide();
insilmaril@0
   255
				pa0.resize (3);
insilmaril@0
   256
				break;
insilmaril@81
   257
			case PolyParabel:	
insilmaril@81
   258
				p = scene->addPolygon(QPolygonF(),pen,linkcolor);
insilmaril@81
   259
				p->setZValue(Z_LINK);
insilmaril@0
   260
				if (visible)
insilmaril@0
   261
					p->show();
insilmaril@0
   262
				else
insilmaril@0
   263
					p->hide();
insilmaril@0
   264
				pa0.resize (arcsegs*2+2);
insilmaril@0
   265
				pa1.resize (arcsegs+1);
insilmaril@0
   266
				pa2.resize (arcsegs+1);
insilmaril@0
   267
				break;
insilmaril@0
   268
			default: 
insilmaril@0
   269
				break;	
insilmaril@0
   270
		}	
insilmaril@81
   271
	} 
insilmaril@0
   272
}
insilmaril@0
   273
insilmaril@81
   274
LinkableMapObj::Style LinkableMapObj::getLinkStyle()
insilmaril@0
   275
{
insilmaril@0
   276
	return style;
insilmaril@0
   277
}
insilmaril@0
   278
insilmaril@81
   279
void LinkableMapObj::setHideLinkUnselected(bool b)
insilmaril@81
   280
{
insilmaril@81
   281
	hideLinkUnselected=b;
insilmaril@81
   282
	setVisibility (visible);
insilmaril@81
   283
	updateLink();
insilmaril@81
   284
}
insilmaril@81
   285
insilmaril@81
   286
bool LinkableMapObj::getHideLinkUnselected()
insilmaril@81
   287
{
insilmaril@81
   288
	return hideLinkUnselected;
insilmaril@81
   289
}
insilmaril@81
   290
insilmaril@81
   291
void LinkableMapObj::setLinkPos(Position lp)
insilmaril@0
   292
{
insilmaril@0
   293
	linkpos=lp;
insilmaril@0
   294
}
insilmaril@0
   295
insilmaril@81
   296
LinkableMapObj::Position LinkableMapObj::getLinkPos()
insilmaril@0
   297
{
insilmaril@0
   298
	return linkpos;
insilmaril@0
   299
}
insilmaril@0
   300
insilmaril@81
   301
void LinkableMapObj::setID (const QString &s)
insilmaril@81
   302
{
insilmaril@81
   303
	objID=s;
insilmaril@81
   304
}
insilmaril@81
   305
insilmaril@81
   306
QString LinkableMapObj::getID()
insilmaril@81
   307
{
insilmaril@81
   308
	return objID;
insilmaril@81
   309
}
insilmaril@0
   310
insilmaril@0
   311
void LinkableMapObj::setLinkColor()
insilmaril@0
   312
{
insilmaril@0
   313
	// Overloaded in BranchObj and childs
insilmaril@0
   314
	// here only set default color
insilmaril@81
   315
	if (mapEditor)
insilmaril@81
   316
		setLinkColor (mapEditor->getMapDefLinkColor());
insilmaril@0
   317
}
insilmaril@0
   318
insilmaril@0
   319
void LinkableMapObj::setLinkColor(QColor col)
insilmaril@0
   320
{
insilmaril@0
   321
	linkcolor=col;
insilmaril@81
   322
	pen.setColor(col);
insilmaril@81
   323
    bottomline->setPen( pen );
insilmaril@0
   324
	switch (style)
insilmaril@0
   325
	{
insilmaril@81
   326
		case Line:
insilmaril@81
   327
			l->setPen( pen);
insilmaril@0
   328
			break;	
insilmaril@81
   329
		case Parabel:	
insilmaril@81
   330
			for (int i=0; i<segment.size(); ++i)
insilmaril@81
   331
				segment.at(i)->setPen( pen);
insilmaril@0
   332
			break;
insilmaril@81
   333
		case PolyLine:
insilmaril@0
   334
			p->setBrush( QBrush(col));
insilmaril@81
   335
			p->setPen( pen);
insilmaril@0
   336
			break;
insilmaril@81
   337
		case PolyParabel:	
insilmaril@0
   338
			p->setBrush( QBrush(col));
insilmaril@81
   339
			p->setPen( pen);
insilmaril@0
   340
			break;
insilmaril@0
   341
		default:
insilmaril@0
   342
			break;
insilmaril@0
   343
	} // switch (style)	
insilmaril@0
   344
}
insilmaril@0
   345
insilmaril@0
   346
QColor LinkableMapObj::getLinkColor()
insilmaril@0
   347
{
insilmaril@0
   348
	return linkcolor;
insilmaril@0
   349
}
insilmaril@0
   350
insilmaril@0
   351
void LinkableMapObj::setVisibility (bool v)
insilmaril@0
   352
{
insilmaril@0
   353
	MapObj::setVisibility (v);
insilmaril@81
   354
	bool visnow=visible;
insilmaril@81
   355
insilmaril@81
   356
	// We can hide the link, while object is not selected
insilmaril@81
   357
	if (hideLinkUnselected && !selected)
insilmaril@81
   358
		visnow=false;
insilmaril@81
   359
insilmaril@81
   360
	if (visnow) 
insilmaril@0
   361
	{
insilmaril@0
   362
		bottomline->show();
insilmaril@81
   363
		switch (style)
insilmaril@0
   364
		{
insilmaril@81
   365
			case Line:
insilmaril@81
   366
				if (l) l->show();
insilmaril@81
   367
				break;
insilmaril@81
   368
			case Parabel:	
insilmaril@81
   369
				for (int i=0; i<segment.size(); ++i)
insilmaril@81
   370
					segment.at(i)->show();
insilmaril@81
   371
				break;	
insilmaril@81
   372
			case PolyLine:
insilmaril@81
   373
				if (p) p->show();
insilmaril@81
   374
				break;
insilmaril@81
   375
			case PolyParabel:	
insilmaril@81
   376
				if (p) p->show();
insilmaril@81
   377
				break;
insilmaril@81
   378
			default:
insilmaril@81
   379
				break;
insilmaril@81
   380
		}
insilmaril@0
   381
	} else 
insilmaril@0
   382
	{
insilmaril@0
   383
		bottomline->hide();
insilmaril@81
   384
		switch (style)
insilmaril@0
   385
		{
insilmaril@81
   386
			case Line:
insilmaril@81
   387
				if (l) l->hide();
insilmaril@81
   388
				break;
insilmaril@81
   389
			case Parabel:	
insilmaril@81
   390
				for (int i=0; i<segment.size(); ++i)
insilmaril@81
   391
					segment.at(i)->hide();
insilmaril@81
   392
				break;	
insilmaril@81
   393
			case PolyLine:
insilmaril@81
   394
				if (p) p->hide();
insilmaril@81
   395
				break;
insilmaril@81
   396
			case PolyParabel:	
insilmaril@81
   397
				if (p) p->hide();
insilmaril@81
   398
				break;
insilmaril@81
   399
			default:
insilmaril@81
   400
				break;
insilmaril@81
   401
		}
insilmaril@0
   402
	}	
insilmaril@0
   403
}
insilmaril@0
   404
insilmaril@81
   405
void LinkableMapObj::setOrientation()
insilmaril@81
   406
{
insilmaril@81
   407
	Orientation orientOld=orientation;
insilmaril@81
   408
insilmaril@81
   409
	if (!parObj) 
insilmaril@81
   410
	{
insilmaril@81
   411
		orientation=UndefinedOrientation;
insilmaril@81
   412
		return;
insilmaril@81
   413
	}
insilmaril@81
   414
		
insilmaril@81
   415
    // Set orientation, first look for orientation of parent
insilmaril@81
   416
    if (parObj->getOrientation() != UndefinedOrientation ) 
insilmaril@81
   417
		// use the orientation of the parent:
insilmaril@81
   418
		orientation=parObj->getOrientation();
insilmaril@81
   419
    else
insilmaril@81
   420
    {
insilmaril@81
   421
		// calc orientation depending on position rel to parent
insilmaril@81
   422
		if (absPos.x() < QPointF(parObj->getChildPos() ).x() )
insilmaril@81
   423
			orientation=LeftOfCenter; 
insilmaril@81
   424
		else
insilmaril@81
   425
			orientation=RightOfCenter;
insilmaril@81
   426
    }
insilmaril@81
   427
	if (orientOld!=orientation) requestReposition();
insilmaril@81
   428
}
insilmaril@81
   429
insilmaril@0
   430
void LinkableMapObj::updateLink()
insilmaril@0
   431
{
insilmaril@0
   432
    // needs:
insilmaril@0
   433
    //	childPos of parent
insilmaril@0
   434
    //	orient   of parent
insilmaril@0
   435
    //	style
insilmaril@0
   436
    // 
insilmaril@0
   437
    // sets:
insilmaril@0
   438
    //	orientation
insilmaril@81
   439
    //	childPos	(by calling setDockPos())
insilmaril@81
   440
    //	parPos		(by calling setDockPos())
insilmaril@81
   441
	//  bottomlineY
insilmaril@0
   442
    //	drawing of the link itself
insilmaril@0
   443
insilmaril@0
   444
	// updateLink is called from move, but called from constructor we don't
insilmaril@0
   445
	// have parents yet...
insilmaril@81
   446
	if (style==UndefinedStyle) return;	
insilmaril@0
   447
insilmaril@0
   448
	switch (linkpos)
insilmaril@0
   449
	{
insilmaril@81
   450
		case Middle:
insilmaril@81
   451
			bottomlineY=bbox.top() + bbox.height()/2;	// draw link to middle (of frame)
insilmaril@0
   452
			break;
insilmaril@81
   453
		case Bottom:
insilmaril@81
   454
			bottomlineY=bbox.bottom()-1;	// draw link to bottom of box
insilmaril@0
   455
			break;
insilmaril@0
   456
	}
insilmaril@0
   457
	
insilmaril@0
   458
    double p2x,p2y;								// Set P2 Before setting
insilmaril@0
   459
	if (!link2ParPos)
insilmaril@0
   460
	{
insilmaril@81
   461
		p2x=QPointF( parObj->getChildPos() ).x();	// P1, we have to look at
insilmaril@81
   462
		p2y=QPointF( parObj->getChildPos() ).y();	// orientation
insilmaril@0
   463
	} else	
insilmaril@0
   464
	{
insilmaril@81
   465
		p2x=QPointF( parObj->getParPos() ).x();	
insilmaril@81
   466
		p2y=QPointF( parObj->getParPos() ).y();
insilmaril@0
   467
	} 
insilmaril@0
   468
insilmaril@81
   469
	setDockPos(); // Call overloaded method
insilmaril@81
   470
	setOrientation();
insilmaril@0
   471
insilmaril@0
   472
	double p1x=parPos.x();	// Link is drawn from P1 to P2
insilmaril@0
   473
	double p1y=parPos.y();
insilmaril@0
   474
insilmaril@0
   475
	double vx=p2x - p1x;	// V=P2-P1
insilmaril@0
   476
	double vy=p2y - p1y;
insilmaril@0
   477
insilmaril@0
   478
	// Draw the horizontal line below heading (from ChildPos to ParPos)
insilmaril@81
   479
	//bottomline->prepareGeometryChange();
insilmaril@81
   480
	bottomline->setLine (QLine (qRound(childPos.x()),
insilmaril@81
   481
		qRound(childPos.y()),
insilmaril@81
   482
		qRound(p1x),
insilmaril@81
   483
		qRound(p1y) ));
insilmaril@0
   484
insilmaril@0
   485
	double a;	// angle
insilmaril@0
   486
	if (vx > -0.000001 && vx < 0.000001)
insilmaril@0
   487
		a=M_PI_2;
insilmaril@0
   488
	else
insilmaril@0
   489
		a=atan( vy / vx );
insilmaril@0
   490
	// "turning point" for drawing polygonal links
insilmaril@81
   491
	QPointF tp (-qRound(sin (a)*thickness_start), qRound(cos (a)*thickness_start));	
insilmaril@0
   492
	
insilmaril@0
   493
    // Draw the link
insilmaril@0
   494
	switch (style)
insilmaril@0
   495
	{
insilmaril@81
   496
		case Line:
insilmaril@81
   497
			//l->prepareGeometryChange();
insilmaril@81
   498
			l->setLine( QLine(qRound (parPos.x()),
insilmaril@81
   499
				qRound(parPos.y()),
insilmaril@81
   500
				qRound(p2x),
insilmaril@81
   501
				qRound(p2y) ));
insilmaril@0
   502
			break;	
insilmaril@81
   503
		case Parabel:	
insilmaril@0
   504
			parabel (pa0, p1x,p1y,p2x,p2y);
insilmaril@81
   505
			for (int i=0; i<segment.size(); ++i)
insilmaril@81
   506
			{
insilmaril@81
   507
				//segment.at(i)->prepareGeometryChange();
insilmaril@81
   508
				segment.at(i)->setLine(QLineF( pa0.at(i).x(), pa0.at(i).y(),pa0.at(i+1).x(),pa0.at(i+1).y()));
insilmaril@81
   509
			}	
insilmaril@0
   510
			break;
insilmaril@81
   511
		case PolyLine:
insilmaril@81
   512
			pa0.clear();
insilmaril@81
   513
			pa0<<QPointF (qRound(p2x+tp.x()), qRound(p2y+tp.y()));
insilmaril@81
   514
			pa0<<QPointF (qRound(p2x-tp.x()), qRound(p2y-tp.y()));
insilmaril@81
   515
			pa0<<QPointF (qRound (parPos.x()), qRound(parPos.y()) );
insilmaril@81
   516
			//p->prepareGeometryChange();
insilmaril@81
   517
			p->setPolygon(QPolygonF (pa0));
insilmaril@0
   518
			break;
insilmaril@81
   519
		case PolyParabel:	
insilmaril@0
   520
			parabel (pa1, p1x,p1y,p2x+tp.x(),p2y+tp.y());
insilmaril@0
   521
			parabel (pa2, p1x,p1y,p2x-tp.x(),p2y-tp.y());
insilmaril@81
   522
			pa0.clear();
insilmaril@81
   523
			for (int i=0;i<=arcsegs;i++)
insilmaril@81
   524
				pa0 << QPointF (pa1.at(i));
insilmaril@81
   525
			for (int i=0;i<=arcsegs;i++)
insilmaril@81
   526
				pa0 << QPointF (pa2.at(arcsegs-i));
insilmaril@81
   527
			//p->prepareGeometryChange();
insilmaril@81
   528
			p->setPolygon(QPolygonF (pa0));
insilmaril@0
   529
			break;
insilmaril@0
   530
		default:
insilmaril@0
   531
			break;
insilmaril@0
   532
	} // switch (style)	
insilmaril@0
   533
}
insilmaril@0
   534
	
insilmaril@0
   535
LinkableMapObj* LinkableMapObj::getChildObj()
insilmaril@0
   536
{
insilmaril@0
   537
    return childObj;
insilmaril@0
   538
}
insilmaril@0
   539
insilmaril@0
   540
LinkableMapObj* LinkableMapObj::getParObj()
insilmaril@0
   541
{
insilmaril@0
   542
    return parObj;
insilmaril@0
   543
}
insilmaril@0
   544
insilmaril@81
   545
LinkableMapObj* LinkableMapObj::findObjBySelect (QString s)
insilmaril@81
   546
{
insilmaril@81
   547
	LinkableMapObj *lmo=this;
insilmaril@81
   548
	QString part;
insilmaril@81
   549
	QString typ;
insilmaril@81
   550
	QString num;
insilmaril@81
   551
	while (!s.isEmpty() )
insilmaril@81
   552
	{
insilmaril@81
   553
		part=s.section(",",0,0);
insilmaril@81
   554
		typ=part.left (3);
insilmaril@81
   555
		num=part.right(part.length() - 3);
insilmaril@81
   556
		if (typ=="mc:")
insilmaril@81
   557
		{
insilmaril@81
   558
			if (depth>0)
insilmaril@81
   559
				return false;	// in a subtree there is no center
insilmaril@81
   560
			else
insilmaril@81
   561
				break;
insilmaril@81
   562
		} else
insilmaril@81
   563
			if (typ=="bo:")
insilmaril@81
   564
				lmo=((BranchObj*)lmo)->getBranchNum (num.toInt());
insilmaril@81
   565
			else
insilmaril@81
   566
				if (typ=="fi:")
insilmaril@81
   567
					lmo=((BranchObj*)lmo)->getFloatImageNum (num.toUInt());
insilmaril@81
   568
		if (!lmo) break;
insilmaril@81
   569
		
insilmaril@81
   570
		if (s.contains(","))
insilmaril@81
   571
			s=s.right(s.length() - part.length() -1 );
insilmaril@81
   572
		else	
insilmaril@81
   573
			break;
insilmaril@81
   574
	}
insilmaril@81
   575
	return lmo;
insilmaril@81
   576
}
insilmaril@81
   577
insilmaril@81
   578
QPointF LinkableMapObj::getChildPos()
insilmaril@0
   579
{
insilmaril@0
   580
    return childPos;
insilmaril@0
   581
}
insilmaril@0
   582
insilmaril@81
   583
QPointF LinkableMapObj::getParPos()
insilmaril@0
   584
{
insilmaril@0
   585
    return parPos;
insilmaril@0
   586
}
insilmaril@0
   587
insilmaril@81
   588
void LinkableMapObj::setUseOrientation (const bool &b)
insilmaril@81
   589
{	
insilmaril@81
   590
	if (useOrientation!=b)
insilmaril@81
   591
	{
insilmaril@81
   592
		useOrientation=b;
insilmaril@81
   593
		requestReposition();
insilmaril@81
   594
	}	
insilmaril@0
   595
}
insilmaril@0
   596
insilmaril@81
   597
LinkableMapObj::Orientation LinkableMapObj::getOrientation()
insilmaril@0
   598
{
insilmaril@0
   599
    return orientation;
insilmaril@0
   600
}
insilmaril@0
   601
insilmaril@0
   602
int LinkableMapObj::getDepth()
insilmaril@0
   603
{
insilmaril@0
   604
    return depth;
insilmaril@0
   605
}
insilmaril@0
   606
insilmaril@0
   607
void LinkableMapObj::setMapEditor (MapEditor *me)
insilmaril@0
   608
{
insilmaril@0
   609
	mapEditor=me;
insilmaril@0
   610
}
insilmaril@0
   611
insilmaril@0
   612
MapEditor* LinkableMapObj::getMapEditor ()
insilmaril@0
   613
{
insilmaril@0
   614
	return mapEditor;
insilmaril@0
   615
}
insilmaril@0
   616
insilmaril@81
   617
QPointF LinkableMapObj::getRandPos()
insilmaril@0
   618
{
insilmaril@0
   619
	// Choose a random position with given distance to parent:
insilmaril@0
   620
	double a=rand()%360 * 2 * M_PI / 360;
insilmaril@81
   621
    return QPointF ( (int)( + 150*cos (a)),
insilmaril@0
   622
                    (int)( + 150*sin (a)));
insilmaril@0
   623
}
insilmaril@0
   624
insilmaril@0
   625
void LinkableMapObj::reposition()
insilmaril@0
   626
{
insilmaril@0
   627
}
insilmaril@0
   628
insilmaril@0
   629
void LinkableMapObj::requestReposition()
insilmaril@0
   630
{
insilmaril@0
   631
	if (!repositionRequest)
insilmaril@0
   632
	{
insilmaril@0
   633
		// Pass on the request to parental objects, if this hasn't
insilmaril@0
   634
		// been done yet
insilmaril@0
   635
		repositionRequest=true;
insilmaril@0
   636
		if (parObj) parObj->requestReposition();
insilmaril@0
   637
	}
insilmaril@0
   638
}
insilmaril@0
   639
insilmaril@0
   640
void LinkableMapObj::forceReposition()
insilmaril@0
   641
{
insilmaril@0
   642
	// Sometimes a reposition has to be done immediatly: For example
insilmaril@0
   643
	// if the note editor flag changes, there is no user event in mapeditor
insilmaril@0
   644
	// which could collect requests for a reposition.
insilmaril@0
   645
	// Then we have to call forceReposition()
insilmaril@0
   646
	// But no rule without exception: While loading a map or undoing it,
insilmaril@0
   647
	// we want to block expensive repositioning, but just do it once at
insilmaril@0
   648
	// the end, thus check first:
insilmaril@0
   649
insilmaril@81
   650
	if (mapEditor->isRepositionBlocked()) return;
insilmaril@0
   651
	
insilmaril@0
   652
	// Pass on the request to parental objects, if this hasn't been done yet
insilmaril@0
   653
	
insilmaril@0
   654
	if (parObj) 
insilmaril@0
   655
		parObj->forceReposition(); 
insilmaril@0
   656
	else 
insilmaril@81
   657
		reposition(); 
insilmaril@81
   658
}
insilmaril@0
   659
insilmaril@0
   660
bool LinkableMapObj::repositionRequested()
insilmaril@0
   661
{
insilmaril@0
   662
	return repositionRequest;
insilmaril@0
   663
}
insilmaril@0
   664
insilmaril@0
   665
insilmaril@0
   666
void LinkableMapObj::select()
insilmaril@0
   667
{
insilmaril@81
   668
	// select and unselect are still needed to
insilmaril@81
   669
	// handle hiding of links
insilmaril@0
   670
    selected=true;
insilmaril@81
   671
	setVisibility (visible);
insilmaril@0
   672
}
insilmaril@0
   673
insilmaril@0
   674
insilmaril@0
   675
void LinkableMapObj::unselect()
insilmaril@0
   676
{
insilmaril@0
   677
    selected=false;
insilmaril@81
   678
	// Maybe we have to hide the link:
insilmaril@81
   679
	setVisibility (visible);
insilmaril@0
   680
}
insilmaril@0
   681
insilmaril@81
   682
void LinkableMapObj::parabel (QPolygonF &ya, double p1x, double p1y, double p2x, double p2y)
insilmaril@0
   683
insilmaril@0
   684
{
insilmaril@0
   685
	double vx=p2x - p1x;	// V=P2-P1
insilmaril@0
   686
	double vy=p2y - p1y;
insilmaril@0
   687
insilmaril@0
   688
	double dx;				// delta x during calculation of parabel
insilmaril@0
   689
	
insilmaril@0
   690
	double pnx;				// next point
insilmaril@0
   691
	double pny;
insilmaril@0
   692
	double m;
insilmaril@0
   693
insilmaril@0
   694
	if (vx > -0.0001 && vx < 0.0001)
insilmaril@0
   695
		m=0;
insilmaril@0
   696
	else	
insilmaril@0
   697
		m=(vy / (vx*vx));
insilmaril@0
   698
	dx=vx/(arcsegs);
insilmaril@81
   699
	ya.clear();
insilmaril@81
   700
	ya<<QPointF (p1x,p1y);
insilmaril@81
   701
	for (int i=1;i<=arcsegs;i++)
insilmaril@0
   702
	{	
insilmaril@0
   703
		pnx=p1x+dx;
insilmaril@0
   704
		pny=m*(pnx-parPos.x())*(pnx-parPos.x())+parPos.y();
insilmaril@81
   705
		ya<<QPointF (pnx,pny);
insilmaril@0
   706
		p1x=pnx;
insilmaril@0
   707
		p1y=pny;
insilmaril@0
   708
	}	
insilmaril@0
   709
}
insilmaril@0
   710
insilmaril@81
   711
QString LinkableMapObj::getLinkAttr ()
insilmaril@81
   712
{
insilmaril@81
   713
	if (hideLinkUnselected)
insilmaril@81
   714
		return attribut ("hideLink","true");
insilmaril@81
   715
	else
insilmaril@81
   716
		return attribut ("hideLink","false");
insilmaril@81
   717
	
insilmaril@81
   718
}
insilmaril@81
   719