xlinkobj.cpp
author insilmaril
Mon, 14 Jun 2010 13:59:17 +0000
changeset 848 e265f07f2173
parent 847 43268373032d
permissions -rw-r--r--
Fixed tmp relink, colored headings in TreeView
insilmaril@847
     1
#include <QDebug>
insilmaril@847
     2
insilmaril@95
     3
#include "xlinkobj.h"
insilmaril@790
     4
insilmaril@95
     5
#include "branchobj.h"
insilmaril@790
     6
#include "branchitem.h"
insilmaril@95
     7
insilmaril@95
     8
/////////////////////////////////////////////////////////////////
insilmaril@95
     9
// XLinkObj
insilmaril@95
    10
/////////////////////////////////////////////////////////////////
insilmaril@95
    11
insilmaril@790
    12
int XLinkObj::arrowSize=10;					// make instances
insilmaril@95
    13
insilmaril@847
    14
XLinkObj::XLinkObj (QGraphicsScene* scene,Link *l):MapObj(scene)
insilmaril@95
    15
{
insilmaril@847
    16
	//qDebug()<< "Const XLinkObj (s,Link)";
insilmaril@847
    17
	link=l;
insilmaril@95
    18
	init();
insilmaril@95
    19
}
insilmaril@95
    20
insilmaril@95
    21
insilmaril@847
    22
insilmaril@95
    23
XLinkObj::~XLinkObj ()
insilmaril@95
    24
{
insilmaril@847
    25
	//qDebug() << "Destr XLinkObj";
insilmaril@95
    26
	delete (line);
insilmaril@95
    27
	delete (poly);
insilmaril@95
    28
}
insilmaril@95
    29
insilmaril@347
    30
insilmaril@95
    31
void XLinkObj::init () 
insilmaril@95
    32
{
insilmaril@95
    33
	visBranch=NULL;
insilmaril@95
    34
insilmaril@847
    35
	pen.setColor ( link->getColor() );
insilmaril@847
    36
	pen.setWidth ( link->getWidth() );
insilmaril@408
    37
	pen.setCapStyle (  Qt::RoundCap );
insilmaril@408
    38
	line=scene->addLine(QLineF(1,1,1,1),pen);
insilmaril@847
    39
	line->setZValue (Z_LINK);
insilmaril@847
    40
	poly=scene->addPolygon(QPolygonF(),pen, link->getColor());
insilmaril@847
    41
	poly->setZValue (Z_LINK);
insilmaril@790
    42
	setVisibility (true);
insilmaril@95
    43
}
insilmaril@95
    44
insilmaril@408
    45
void XLinkObj::setEnd (QPointF p)
insilmaril@95
    46
{
insilmaril@95
    47
	endPos=p;
insilmaril@95
    48
}
insilmaril@95
    49
insilmaril@95
    50
insilmaril@95
    51
void XLinkObj::updateXLink()
insilmaril@95
    52
{
insilmaril@408
    53
	QPointF a,b;
insilmaril@408
    54
	QPolygonF pa;
insilmaril@847
    55
	if (visBranch)   
insilmaril@95
    56
	{
insilmaril@95
    57
		// Only one of the linked branches is visible
insilmaril@790
    58
		BranchObj *bo=(BranchObj*)(visBranch->getLMO());
insilmaril@790
    59
		if (!bo) return;
insilmaril@790
    60
insilmaril@790
    61
		a=b=bo->getChildPos();
insilmaril@790
    62
		if (bo->getOrientation()==LinkableMapObj::RightOfCenter)
insilmaril@95
    63
		{
insilmaril@95
    64
			b.setX (b.x()+25);
insilmaril@408
    65
			
insilmaril@408
    66
			pa.clear();
insilmaril@408
    67
			pa<< QPointF(b.x(),b.y())<<
insilmaril@408
    68
				QPointF(b.x()-arrowSize,b.y()-arrowSize)<<
insilmaril@408
    69
				QPointF(b.x()-arrowSize,b.y()+arrowSize);
insilmaril@408
    70
			poly->setPolygon(pa);
insilmaril@95
    71
		} else
insilmaril@95
    72
		{
insilmaril@95
    73
			b.setX (b.x()-25);
insilmaril@408
    74
			pa.clear();
insilmaril@408
    75
			pa<< QPointF(b.x(),b.y())<<
insilmaril@408
    76
				QPointF(b.x()+arrowSize,b.y()-arrowSize)<<
insilmaril@408
    77
				QPointF(b.x()+arrowSize,b.y()+arrowSize);
insilmaril@408
    78
			poly->setPolygon (pa);
insilmaril@95
    79
		}	
insilmaril@95
    80
	} else
insilmaril@95
    81
	{
insilmaril@95
    82
		// Both linked branches are visible
insilmaril@847
    83
		BranchItem *bi=link->getBeginBranch();
insilmaril@790
    84
		if ( bi)
insilmaril@790
    85
		{
insilmaril@95
    86
			// If a link is just drawn in the editor,
insilmaril@95
    87
			// we have already a beginBranch
insilmaril@790
    88
			BranchObj *bo=(BranchObj*)(bi->getLMO());
insilmaril@790
    89
			if (bo)	
insilmaril@790
    90
				a=bo->getChildPos();
insilmaril@790
    91
			else 
insilmaril@790
    92
				return;	
insilmaril@790
    93
		}	
insilmaril@95
    94
		else
insilmaril@95
    95
			// This shouldn't be reached normally...
insilmaril@95
    96
			a=beginPos;
insilmaril@790
    97
insilmaril@847
    98
		bi=link->getEndBranch();
insilmaril@790
    99
		if (bi)
insilmaril@790
   100
		{
insilmaril@790
   101
			BranchObj *bo=(BranchObj*)(bi->getLMO());
insilmaril@790
   102
			if (bo)	
insilmaril@790
   103
				b=bo->getChildPos();
insilmaril@790
   104
			else 
insilmaril@790
   105
				return;	
insilmaril@790
   106
		}
insilmaril@95
   107
		else
insilmaril@95
   108
			b=endPos;
insilmaril@95
   109
	}
insilmaril@95
   110
insilmaril@790
   111
	beginPos=a;
insilmaril@790
   112
	endPos=b;
insilmaril@847
   113
	pen.setColor ( link->getColor() );
insilmaril@847
   114
	pen.setWidth ( link->getWidth() );
insilmaril@847
   115
	poly->setBrush (link->getColor() );
insilmaril@790
   116
	line->setPen (pen);
insilmaril@790
   117
	line->setLine(a.x(), a.y(), b.x(), b.y());
insilmaril@95
   118
}
insilmaril@95
   119
insilmaril@95
   120
void XLinkObj::positionBBox()
insilmaril@95
   121
{
insilmaril@95
   122
}
insilmaril@95
   123
insilmaril@95
   124
void XLinkObj::calcBBoxSize()
insilmaril@95
   125
{
insilmaril@95
   126
}
insilmaril@95
   127
insilmaril@95
   128
void XLinkObj::setVisibility (bool b)
insilmaril@95
   129
{
insilmaril@95
   130
	MapObj::setVisibility (b);
insilmaril@95
   131
	if (b)
insilmaril@95
   132
	{
insilmaril@95
   133
		line->show();
insilmaril@95
   134
		if (visBranch) 
insilmaril@95
   135
			poly->show();
insilmaril@95
   136
		else	
insilmaril@95
   137
			poly->hide();
insilmaril@95
   138
	}	
insilmaril@95
   139
	else
insilmaril@95
   140
	{
insilmaril@95
   141
		line->hide();
insilmaril@95
   142
		poly->hide();
insilmaril@95
   143
	}	
insilmaril@95
   144
}
insilmaril@95
   145
insilmaril@95
   146
void XLinkObj::setVisibility ()
insilmaril@95
   147
{
insilmaril@847
   148
	BranchItem* beginBI=link->getBeginBranch();
insilmaril@790
   149
	BranchObj* beginBO=NULL;
insilmaril@790
   150
	if (beginBI) beginBO=(BranchObj*)(beginBI->getLMO());
insilmaril@790
   151
insilmaril@790
   152
	BranchObj* endBO=NULL;
insilmaril@847
   153
	BranchItem* endBI=link->getEndBranch();
insilmaril@790
   154
	if (endBI) endBO=(BranchObj*)(endBI->getLMO());
insilmaril@790
   155
	if (beginBO && endBO)
insilmaril@95
   156
	{
insilmaril@790
   157
		if(beginBO->isVisibleObj() && endBO->isVisibleObj())
insilmaril@95
   158
		{	// Both ends are visible
insilmaril@95
   159
			visBranch=NULL;
insilmaril@95
   160
			setVisibility (true);
insilmaril@95
   161
		} else
insilmaril@95
   162
		{
insilmaril@790
   163
			if(!beginBO->isVisibleObj() && !endBO->isVisibleObj())
insilmaril@95
   164
			{	//None of the ends is visible
insilmaril@95
   165
				visBranch=NULL;
insilmaril@95
   166
				setVisibility (false);
insilmaril@95
   167
			} else
insilmaril@95
   168
			{	// Just one end is visible, draw a symbol that shows
insilmaril@95
   169
				// that there is a link to a scrolled branch
insilmaril@790
   170
				if (beginBO->isVisibleObj())
insilmaril@790
   171
					visBranch=beginBI;
insilmaril@95
   172
				else
insilmaril@790
   173
					visBranch=endBI;
insilmaril@95
   174
				setVisibility (true);
insilmaril@95
   175
			}
insilmaril@95
   176
		}
insilmaril@95
   177
	}
insilmaril@95
   178
}
insilmaril@95
   179
insilmaril@95
   180