insilmaril@86: #include "linkobj.h" insilmaril@86: #include "branchobj.h" insilmaril@86: insilmaril@86: insilmaril@86: ///////////////////////////////////////////////////////////////// insilmaril@86: // LinkObj insilmaril@86: ///////////////////////////////////////////////////////////////// insilmaril@86: insilmaril@86: LinkObj::LinkObj ():MapObj() insilmaril@86: { insilmaril@94: // cout << "Const LinkObj ()\n"; insilmaril@94: init(); insilmaril@86: } insilmaril@86: insilmaril@86: LinkObj::LinkObj (QCanvas* c):MapObj(c) insilmaril@86: { insilmaril@94: // cout << "Const LinkObj (c) called from MapCenterObj (c)\n"; insilmaril@94: init(); insilmaril@86: } insilmaril@86: insilmaril@86: insilmaril@86: LinkObj::~LinkObj () insilmaril@86: { insilmaril@94: // cout << "Destr LinkObj\n"; insilmaril@86: if (linkState!=undefinedLink) insilmaril@86: deactivate(); insilmaril@86: delete (line); insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::init () insilmaril@86: { insilmaril@86: beginBranch=NULL; insilmaril@86: endBranch=NULL; insilmaril@94: visBranch=NULL; insilmaril@86: linkState=undefinedLink; insilmaril@86: insilmaril@86: line=new QCanvasLine (canvas); insilmaril@86: line->setPoints (0,0,200,200); insilmaril@86: line->setPen (QPen(QColor(200,200,200), 1)); insilmaril@86: insilmaril@86: setVisibility (false); insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::copy (LinkObj* other) insilmaril@86: { insilmaril@86: // FIXME copy not used yet insilmaril@86: cout << "LO::copy called\n"; insilmaril@86: MapObj::copy (other); insilmaril@86: setVisibility (other->visible); insilmaril@86: beginBranch=other->beginBranch; insilmaril@86: endBranch=other->endBranch; insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::setBegin (BranchObj *bo) insilmaril@86: { insilmaril@86: if (bo) insilmaril@86: { insilmaril@86: linkState=initLink; insilmaril@86: beginBranch=bo; insilmaril@86: beginPos=beginBranch->getChildPos(); insilmaril@86: } insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::setEnd (BranchObj *bo) insilmaril@86: { insilmaril@86: if (bo) insilmaril@86: { insilmaril@86: linkState=initLink; insilmaril@86: endBranch=bo; insilmaril@86: endPos=endBranch->getChildPos(); insilmaril@86: } insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::setEnd (QPoint p) insilmaril@86: { insilmaril@86: endPos=p; insilmaril@86: } insilmaril@86: insilmaril@86: bool LinkObj::activate () insilmaril@86: { insilmaril@86: if (beginBranch && endBranch) insilmaril@86: { insilmaril@86: linkState=activeLink; insilmaril@86: beginBranch->addLink (this); insilmaril@86: endBranch->addLink (this); insilmaril@86: setVisibility (true); insilmaril@86: return true; insilmaril@86: } else insilmaril@86: return false; insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::deactivate () insilmaril@86: { insilmaril@86: if (beginBranch) insilmaril@94: beginBranch->removeLinkRef (this); insilmaril@86: beginBranch=NULL; insilmaril@86: if (endBranch) insilmaril@94: endBranch->removeLinkRef (this); insilmaril@86: endBranch=NULL; insilmaril@94: visBranch=NULL; insilmaril@86: linkState=undefinedLink; insilmaril@86: insilmaril@86: line->hide(); insilmaril@86: } insilmaril@86: insilmaril@86: bool LinkObj::isUsed() insilmaril@86: { insilmaril@86: if (beginBranch || endBranch || linkState!=undefinedLink) insilmaril@86: return true; insilmaril@86: else insilmaril@86: return false; insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::updateLink() insilmaril@86: { insilmaril@86: QPoint a,b; insilmaril@94: if (visBranch) insilmaril@94: { insilmaril@94: // Only one of the linked branches is visible insilmaril@94: a=b=visBranch->getChildPos(); insilmaril@94: if (visBranch->getOrientation()==OrientRightOfCenter) insilmaril@94: b.setX (b.x()+25); insilmaril@94: else insilmaril@94: b.setX (b.x()-25); insilmaril@94: } else insilmaril@94: { insilmaril@94: // Both linked branches are visible insilmaril@94: if (beginBranch) insilmaril@94: // If a link is just drawn in the editor, insilmaril@94: // we have already a beginBranch insilmaril@94: a=beginBranch->getChildPos(); insilmaril@94: else insilmaril@94: // This shouldn't be reached normally... insilmaril@94: a=beginPos; insilmaril@94: if (linkState==activeLink && endBranch) insilmaril@94: b=endBranch->getChildPos(); insilmaril@94: else insilmaril@94: b=endPos; insilmaril@94: } insilmaril@94: insilmaril@94: insilmaril@94: if (line->startPoint()==a && line->endPoint()==b && !visBranch) insilmaril@94: { insilmaril@86: // update is called from both branches, so only insilmaril@86: // update if needed insilmaril@94: cout <<"LO__updateL returnung...\n"; insilmaril@86: return; insilmaril@94: } insilmaril@86: else insilmaril@86: { insilmaril@86: beginPos=a; insilmaril@86: endPos=b; insilmaril@86: line->setPoints (a.x(), a.y(), b.x(), b.y()); insilmaril@86: } insilmaril@86: } insilmaril@86: insilmaril@89: BranchObj* LinkObj::otherBranch(BranchObj* thisBranch) insilmaril@89: { insilmaril@89: if (!beginBranch && !endBranch) insilmaril@89: return NULL; insilmaril@89: if (thisBranch==beginBranch) insilmaril@89: return endBranch; insilmaril@89: else insilmaril@89: return beginBranch; insilmaril@89: } insilmaril@89: insilmaril@86: void LinkObj::positionBBox() insilmaril@86: { insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::calcBBoxSize() insilmaril@86: { insilmaril@86: } insilmaril@86: insilmaril@86: void LinkObj::setVisibility (bool b) insilmaril@86: { insilmaril@86: MapObj::setVisibility (b); insilmaril@86: if (b) insilmaril@86: { insilmaril@86: line->show(); insilmaril@86: } insilmaril@86: else insilmaril@86: { insilmaril@86: line->hide(); insilmaril@86: } insilmaril@86: } insilmaril@86: insilmaril@94: void LinkObj::setVisibility () insilmaril@94: { insilmaril@94: if (beginBranch && endBranch) insilmaril@94: { insilmaril@94: if(beginBranch->isVisibleObj() && endBranch->isVisibleObj()) insilmaril@94: { // Both ends are visible insilmaril@94: setVisibility (true); insilmaril@94: visBranch=NULL; insilmaril@94: } else insilmaril@94: { insilmaril@94: if(!beginBranch->isVisibleObj() && !endBranch->isVisibleObj()) insilmaril@94: { //None of the ends is visible insilmaril@94: setVisibility (false); insilmaril@94: visBranch=NULL; insilmaril@94: } else insilmaril@94: { // Just one end is visible, draw a symbol that shows insilmaril@94: // that there is a link to a scrolled branch insilmaril@94: setVisibility (true); insilmaril@94: if (beginBranch->isVisibleObj()) insilmaril@94: visBranch=beginBranch; insilmaril@94: else insilmaril@94: visBranch=endBranch; insilmaril@94: insilmaril@94: } insilmaril@94: } insilmaril@94: } insilmaril@94: } insilmaril@94: