insilmaril@95: #include "xlinkobj.h" insilmaril@95: #include "branchobj.h" insilmaril@97: #include "mapeditor.h" insilmaril@95: insilmaril@95: insilmaril@95: ///////////////////////////////////////////////////////////////// insilmaril@95: // XLinkObj insilmaril@95: ///////////////////////////////////////////////////////////////// insilmaril@95: insilmaril@95: int XLinkObj::arrowSize=10; // make instances insilmaril@95: insilmaril@95: XLinkObj::XLinkObj ():MapObj() insilmaril@95: { insilmaril@95: // cout << "Const XLinkObj ()\n"; insilmaril@95: init(); insilmaril@95: } insilmaril@95: insilmaril@408: XLinkObj::XLinkObj (QGraphicsScene* s):MapObj(s) insilmaril@95: { insilmaril@408: // cout << "Const XLinkObj (s) called from MapCenterObj (s)\n"; insilmaril@95: init(); insilmaril@95: } insilmaril@95: insilmaril@95: insilmaril@95: XLinkObj::~XLinkObj () insilmaril@95: { insilmaril@406: // cout << "Destr XLinkObj\n"; insilmaril@95: if (xLinkState!=undefinedXLink) insilmaril@95: deactivate(); insilmaril@95: delete (line); insilmaril@95: delete (poly); insilmaril@95: } insilmaril@95: insilmaril@347: insilmaril@95: void XLinkObj::init () insilmaril@95: { insilmaril@95: beginBranch=NULL; insilmaril@95: endBranch=NULL; insilmaril@95: visBranch=NULL; insilmaril@95: xLinkState=undefinedXLink; insilmaril@95: insilmaril@97: color=QColor (180,180,180); insilmaril@102: width=1; insilmaril@408: pen.setColor (color); insilmaril@408: pen.setWidth (width); insilmaril@408: pen.setCapStyle ( Qt::RoundCap ); insilmaril@408: line=scene->addLine(QLineF(1,1,1,1),pen); insilmaril@408: line->setZValue (Z_XLINK); insilmaril@408: poly=scene->addPolygon(QPolygonF(),pen,color); insilmaril@408: poly->setZValue (Z_XLINK); insilmaril@95: setVisibility (false); insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::copy (XLinkObj* other) insilmaril@95: { insilmaril@106: // TODO copy not used yet insilmaril@95: MapObj::copy (other); insilmaril@95: setVisibility (other->visible); insilmaril@95: beginBranch=other->beginBranch; insilmaril@95: endBranch=other->endBranch; insilmaril@347: width=other->width; insilmaril@408: insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::setBegin (BranchObj *bo) insilmaril@95: { insilmaril@95: if (bo) insilmaril@95: { insilmaril@95: xLinkState=initXLink; insilmaril@95: beginBranch=bo; insilmaril@95: beginPos=beginBranch->getChildPos(); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@298: BranchObj* XLinkObj::getBegin () insilmaril@298: { insilmaril@298: return beginBranch; insilmaril@298: } insilmaril@298: insilmaril@95: void XLinkObj::setEnd (BranchObj *bo) insilmaril@95: { insilmaril@95: if (bo) insilmaril@95: { insilmaril@95: xLinkState=initXLink; insilmaril@95: endBranch=bo; insilmaril@95: endPos=endBranch->getChildPos(); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@298: BranchObj* XLinkObj::getEnd() insilmaril@298: { insilmaril@298: return endBranch; insilmaril@298: } insilmaril@298: insilmaril@97: void XLinkObj::setWidth (int w) insilmaril@97: { insilmaril@97: width=w; insilmaril@408: pen.setWidth (w); insilmaril@97: setColor (color); insilmaril@97: } insilmaril@97: insilmaril@97: int XLinkObj::getWidth() insilmaril@97: { insilmaril@408: return pen.width(); insilmaril@97: } insilmaril@97: insilmaril@95: void XLinkObj::setColor(QColor c) insilmaril@95: { insilmaril@97: color=c; insilmaril@408: pen.setColor (c); insilmaril@408: line->setPen (pen); insilmaril@97: poly->setBrush( color ); insilmaril@97: } insilmaril@97: insilmaril@97: QColor XLinkObj::getColor() insilmaril@97: { insilmaril@408: return pen.color(); insilmaril@95: } insilmaril@95: insilmaril@408: void XLinkObj::setEnd (QPointF p) insilmaril@95: { insilmaril@95: endPos=p; insilmaril@95: } insilmaril@95: insilmaril@95: bool XLinkObj::activate () insilmaril@95: { insilmaril@95: if (beginBranch && endBranch) insilmaril@95: { insilmaril@104: if (beginBranch==endBranch) return false; insilmaril@95: xLinkState=activeXLink; insilmaril@95: beginBranch->addXLink (this); insilmaril@95: endBranch->addXLink (this); insilmaril@103: setVisibility (); insilmaril@95: return true; insilmaril@95: } else insilmaril@95: return false; insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::deactivate () insilmaril@95: { insilmaril@95: if (beginBranch) insilmaril@95: beginBranch->removeXLinkRef (this); insilmaril@95: beginBranch=NULL; insilmaril@95: if (endBranch) insilmaril@95: endBranch->removeXLinkRef (this); insilmaril@95: endBranch=NULL; insilmaril@95: visBranch=NULL; insilmaril@95: xLinkState=undefinedXLink; insilmaril@95: insilmaril@95: line->hide(); insilmaril@95: } insilmaril@95: insilmaril@95: bool XLinkObj::isUsed() insilmaril@95: { insilmaril@95: if (beginBranch || endBranch || xLinkState!=undefinedXLink) insilmaril@95: return true; insilmaril@95: else insilmaril@95: return false; 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@95: a=b=visBranch->getChildPos(); insilmaril@95: if (visBranch->getOrientation()==OrientRightOfCenter) 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@95: if (beginBranch) insilmaril@95: // If a link is just drawn in the editor, insilmaril@95: // we have already a beginBranch insilmaril@95: a=beginBranch->getChildPos(); insilmaril@95: else insilmaril@95: // This shouldn't be reached normally... insilmaril@95: a=beginPos; insilmaril@95: if (xLinkState==activeXLink && endBranch) insilmaril@95: b=endBranch->getChildPos(); insilmaril@95: else insilmaril@95: b=endPos; insilmaril@95: } insilmaril@95: insilmaril@95: insilmaril@408: if (line->line().p1()==a && line->line().p2()==b && !visBranch) insilmaril@95: { insilmaril@95: // update is called from both branches, so only insilmaril@95: // update if something has changed insilmaril@95: return; insilmaril@95: } insilmaril@95: else insilmaril@95: { insilmaril@95: beginPos=a; insilmaril@95: endPos=b; insilmaril@408: line->setPen (pen); insilmaril@408: line->setLine(a.x(), a.y(), b.x(), b.y()); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@95: BranchObj* XLinkObj::otherBranch(BranchObj* thisBranch) insilmaril@95: { insilmaril@95: if (!beginBranch && !endBranch) insilmaril@95: return NULL; insilmaril@95: if (thisBranch==beginBranch) insilmaril@95: return endBranch; insilmaril@95: else insilmaril@95: return beginBranch; 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@95: if (beginBranch && endBranch) insilmaril@95: { insilmaril@95: if(beginBranch->isVisibleObj() && endBranch->isVisibleObj()) insilmaril@95: { // Both ends are visible insilmaril@95: visBranch=NULL; insilmaril@95: setVisibility (true); insilmaril@95: } else insilmaril@95: { insilmaril@95: if(!beginBranch->isVisibleObj() && !endBranch->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@95: if (beginBranch->isVisibleObj()) insilmaril@95: visBranch=beginBranch; insilmaril@95: else insilmaril@95: visBranch=endBranch; insilmaril@95: setVisibility (true); insilmaril@95: } insilmaril@95: } insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@95: QString XLinkObj::saveToDir () insilmaril@95: { insilmaril@103: QString s=""; insilmaril@103: if (beginBranch && endBranch &&xLinkState==activeXLink) insilmaril@95: { insilmaril@103: if (beginBranch==endBranch && xLinkState) insilmaril@103: s=""; insilmaril@106: else insilmaril@103: { insilmaril@103: QString colAttr=attribut ("color",color.name()); insilmaril@103: QString widAttr=attribut ("width",QString().setNum(width,10)); insilmaril@103: QString begSelAttr=attribut ("beginBranch",beginBranch->getSelectString()); insilmaril@103: QString endSelAttr=attribut ("endBranch", endBranch->getSelectString()); insilmaril@103: s=beginElement ("xlink", colAttr +widAttr +begSelAttr +endSelAttr); insilmaril@95: insilmaril@103: s+=endElement ("xlink"); insilmaril@103: } insilmaril@95: } insilmaril@95: return s; insilmaril@95: } insilmaril@95: