xlinkobj.cpp
author insilmaril
Mon, 18 Apr 2005 06:17:00 +0000
changeset 95 f688a9913724
child 97 0b048b6bb6f4
permissions -rw-r--r--
added basic xLink functions
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