insilmaril@95: #include "xlinkobj.h" insilmaril@790: insilmaril@95: #include "branchobj.h" insilmaril@790: #include "branchitem.h" insilmaril@790: #include "xlinkitem.h" insilmaril@95: insilmaril@790: #include insilmaril@790: using namespace std; insilmaril@95: insilmaril@95: ///////////////////////////////////////////////////////////////// insilmaril@95: // XLinkObj insilmaril@95: ///////////////////////////////////////////////////////////////// insilmaril@95: insilmaril@790: int XLinkObj::arrowSize=10; // make instances insilmaril@95: insilmaril@790: XLinkObj::XLinkObj (QGraphicsScene* scene, TreeItem* ti):MapObj(scene,ti) insilmaril@95: { insilmaril@790: //cout << "Const XLinkObj (s)\n"; insilmaril@95: init(); insilmaril@95: } insilmaril@95: insilmaril@95: insilmaril@95: XLinkObj::~XLinkObj () insilmaril@95: { insilmaril@790: //cout << "Destr XLinkObj\n"; insilmaril@95: delete (line); insilmaril@95: delete (poly); insilmaril@95: } insilmaril@95: insilmaril@347: insilmaril@95: void XLinkObj::init () insilmaril@95: { insilmaril@790: XLinkItem *xli=(XLinkItem*)treeItem; insilmaril@95: visBranch=NULL; insilmaril@95: insilmaril@790: pen.setColor ( xli->getColor() ); insilmaril@790: pen.setWidth ( xli->getWidth() ); insilmaril@408: pen.setCapStyle ( Qt::RoundCap ); insilmaril@408: line=scene->addLine(QLineF(1,1,1,1),pen); insilmaril@408: line->setZValue (Z_XLINK); insilmaril@790: poly=scene->addPolygon(QPolygonF(),pen, xli->getColor()); insilmaril@408: poly->setZValue (Z_XLINK); insilmaril@790: setVisibility (true); insilmaril@95: } insilmaril@95: insilmaril@408: void XLinkObj::setEnd (QPointF p) insilmaril@95: { insilmaril@95: endPos=p; insilmaril@95: } insilmaril@95: insilmaril@95: insilmaril@95: void XLinkObj::updateXLink() insilmaril@95: { insilmaril@408: QPointF a,b; insilmaril@408: QPolygonF pa; insilmaril@95: if (visBranch) insilmaril@95: { insilmaril@95: // Only one of the linked branches is visible insilmaril@790: BranchObj *bo=(BranchObj*)(visBranch->getLMO()); insilmaril@790: if (!bo) return; insilmaril@790: insilmaril@790: a=b=bo->getChildPos(); insilmaril@790: if (bo->getOrientation()==LinkableMapObj::RightOfCenter) insilmaril@95: { insilmaril@95: b.setX (b.x()+25); insilmaril@408: insilmaril@408: pa.clear(); insilmaril@408: pa<< QPointF(b.x(),b.y())<< insilmaril@408: QPointF(b.x()-arrowSize,b.y()-arrowSize)<< insilmaril@408: QPointF(b.x()-arrowSize,b.y()+arrowSize); insilmaril@408: poly->setPolygon(pa); insilmaril@95: } else insilmaril@95: { insilmaril@95: b.setX (b.x()-25); insilmaril@408: pa.clear(); insilmaril@408: pa<< QPointF(b.x(),b.y())<< insilmaril@408: QPointF(b.x()+arrowSize,b.y()-arrowSize)<< insilmaril@408: QPointF(b.x()+arrowSize,b.y()+arrowSize); insilmaril@408: poly->setPolygon (pa); insilmaril@95: } insilmaril@95: } else insilmaril@95: { insilmaril@95: // Both linked branches are visible insilmaril@790: BranchItem *bi=((XLinkItem*)treeItem)->getBegin(); insilmaril@790: if ( bi) insilmaril@790: { insilmaril@95: // If a link is just drawn in the editor, insilmaril@95: // we have already a beginBranch insilmaril@790: BranchObj *bo=(BranchObj*)(bi->getLMO()); insilmaril@790: if (bo) insilmaril@790: a=bo->getChildPos(); insilmaril@790: else insilmaril@790: return; insilmaril@790: } insilmaril@95: else insilmaril@95: // This shouldn't be reached normally... insilmaril@95: a=beginPos; insilmaril@790: insilmaril@790: // FIXME-3 try to get rid of xLinkstate if (xLinkState==activeXLink && endBranch) insilmaril@790: bi=((XLinkItem*)treeItem)->getEnd(); insilmaril@790: if (bi) insilmaril@790: { insilmaril@790: BranchObj *bo=(BranchObj*)(bi->getLMO()); insilmaril@790: if (bo) insilmaril@790: b=bo->getChildPos(); insilmaril@790: else insilmaril@790: return; insilmaril@790: } insilmaril@95: else insilmaril@95: b=endPos; insilmaril@95: } insilmaril@95: insilmaril@790: beginPos=a; insilmaril@790: endPos=b; insilmaril@790: XLinkItem *xli=(XLinkItem*)treeItem; insilmaril@790: pen.setColor ( xli->getColor() ); insilmaril@790: pen.setWidth ( xli->getWidth() ); insilmaril@790: poly->setBrush (xli->getColor() ); insilmaril@790: line->setPen (pen); insilmaril@790: line->setLine(a.x(), a.y(), b.x(), b.y()); insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::positionBBox() insilmaril@95: { insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::calcBBoxSize() insilmaril@95: { insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::setVisibility (bool b) insilmaril@95: { insilmaril@95: MapObj::setVisibility (b); insilmaril@95: if (b) insilmaril@95: { insilmaril@95: line->show(); insilmaril@95: if (visBranch) insilmaril@95: poly->show(); insilmaril@95: else insilmaril@95: poly->hide(); insilmaril@95: } insilmaril@95: else insilmaril@95: { insilmaril@95: line->hide(); insilmaril@95: poly->hide(); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::setVisibility () insilmaril@95: { insilmaril@790: BranchItem* beginBI=((XLinkItem*)treeItem)->getBegin(); insilmaril@790: BranchObj* beginBO=NULL; insilmaril@790: if (beginBI) beginBO=(BranchObj*)(beginBI->getLMO()); insilmaril@790: insilmaril@790: BranchObj* endBO=NULL; insilmaril@790: BranchItem* endBI=((XLinkItem*)treeItem)->getEnd(); insilmaril@790: if (endBI) endBO=(BranchObj*)(endBI->getLMO()); insilmaril@790: if (beginBO && endBO) insilmaril@95: { insilmaril@790: if(beginBO->isVisibleObj() && endBO->isVisibleObj()) insilmaril@95: { // Both ends are visible insilmaril@95: visBranch=NULL; insilmaril@95: setVisibility (true); insilmaril@95: } else insilmaril@95: { insilmaril@790: if(!beginBO->isVisibleObj() && !endBO->isVisibleObj()) insilmaril@95: { //None of the ends is visible insilmaril@95: visBranch=NULL; insilmaril@95: setVisibility (false); insilmaril@95: } else insilmaril@95: { // Just one end is visible, draw a symbol that shows insilmaril@95: // that there is a link to a scrolled branch insilmaril@790: if (beginBO->isVisibleObj()) insilmaril@790: visBranch=beginBI; insilmaril@95: else insilmaril@790: visBranch=endBI; insilmaril@95: setVisibility (true); insilmaril@95: } insilmaril@95: } insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@95: