insilmaril@139: #include insilmaril@139: insilmaril@0: #include "linkablemapobj.h" insilmaril@0: #include "branchobj.h" insilmaril@0: #include "mapeditor.h" insilmaril@0: insilmaril@0: #include "version.h" insilmaril@0: insilmaril@0: insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: // LinkableMapObj insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: insilmaril@0: LinkableMapObj::LinkableMapObj():MapObj() insilmaril@0: { insilmaril@0: // cout << "Const LinkableMapObj ()\n"; insilmaril@0: init (); insilmaril@0: } insilmaril@0: insilmaril@0: LinkableMapObj::LinkableMapObj(QCanvas* c) :MapObj(c) insilmaril@0: { insilmaril@0: // cout << "Const LinkableMapObj\n"; insilmaril@0: init (); insilmaril@0: } insilmaril@0: insilmaril@0: LinkableMapObj::LinkableMapObj (LinkableMapObj* lmo) : MapObj (lmo->canvas) insilmaril@0: { insilmaril@0: copy (lmo); insilmaril@0: } insilmaril@0: insilmaril@0: LinkableMapObj::~LinkableMapObj() insilmaril@0: { insilmaril@0: delete (bottomline); insilmaril@0: delete (selbox); insilmaril@0: delete (frame); insilmaril@0: delLink(); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::delLink() insilmaril@0: { insilmaril@0: switch (style) insilmaril@0: { insilmaril@0: case StyleLine: insilmaril@0: delete (l); insilmaril@0: break; insilmaril@0: case StyleParabel: insilmaril@0: segment.clear(); insilmaril@0: break; insilmaril@0: case StylePolyLine: insilmaril@0: delete (p); insilmaril@0: delete (l); insilmaril@0: break; insilmaril@0: case StylePolyParabel: insilmaril@0: delete (p); insilmaril@0: segment.clear(); insilmaril@0: break; insilmaril@0: default: insilmaril@0: break; insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::init () insilmaril@0: { insilmaril@0: depth=-1; insilmaril@0: childObj=NULL; insilmaril@0: parObj=NULL; insilmaril@0: parObjTmpBuf=NULL; insilmaril@0: parPos=QPoint(0,0); insilmaril@0: childPos=QPoint(0,0); insilmaril@0: link2ParPos=false; insilmaril@0: l=NULL; insilmaril@0: orientation=OrientUndef; insilmaril@0: linkwidth=20; insilmaril@0: thickness_start=8; insilmaril@0: style=StyleUndef; insilmaril@0: linkpos=LinkBottom; insilmaril@0: segment.setAutoDelete (TRUE); insilmaril@0: arcsegs=13; insilmaril@0: QPointArray pa(arcsegs*2+2); insilmaril@0: insilmaril@0: bottomline=new QCanvasLine(canvas); insilmaril@0: bottomline->setPen( QPen(linkcolor, 1) ); insilmaril@0: bottomline->setZ(Z_LINK); insilmaril@0: bottomline->show(); insilmaril@0: insilmaril@0: // Prepare showing the selection of a MapObj insilmaril@0: selbox = new QCanvasRectangle (canvas); insilmaril@0: selbox->setZ(Z_SELBOX); insilmaril@0: selbox->setBrush( QColor(255,255,0) ); insilmaril@0: selbox->setPen( QPen(QColor(255,255,0) )); insilmaril@0: selbox->hide(); insilmaril@0: selected=false; insilmaril@0: insilmaril@160: hideLinkUnselected=false; insilmaril@160: insilmaril@0: // initialize frame insilmaril@0: frame = new FrameObj (canvas); insilmaril@0: insilmaril@0: repositionRequest=false; insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::copy (LinkableMapObj* other) insilmaril@0: { insilmaril@0: MapObj::copy(other); insilmaril@0: bboxTotal=other->bboxTotal; insilmaril@0: setLinkStyle(other->style); insilmaril@0: setLinkColor (other->linkcolor); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setChildObj(LinkableMapObj* o) insilmaril@0: { insilmaril@0: childObj=o; insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setParObj(LinkableMapObj* o) insilmaril@0: { insilmaril@0: parObj=o; insilmaril@0: mapEditor=parObj->getMapEditor(); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setParObjTmp(LinkableMapObj*,QPoint,int) insilmaril@0: { insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::unsetParObjTmp() insilmaril@0: { insilmaril@0: } insilmaril@0: insilmaril@0: LinkStyle LinkableMapObj::getDefLinkStyle () insilmaril@0: { insilmaril@0: LinkStyle ls=mapEditor->getLinkStyle(); insilmaril@0: switch (ls) insilmaril@0: { insilmaril@0: case StyleLine: insilmaril@0: return ls; insilmaril@0: break; insilmaril@0: case StyleParabel: insilmaril@0: return ls; insilmaril@0: break; insilmaril@0: case StylePolyLine: insilmaril@0: if (depth>1) insilmaril@0: return StyleLine; insilmaril@0: else insilmaril@0: return ls; insilmaril@0: break; insilmaril@0: case StylePolyParabel: insilmaril@0: if (depth>1) insilmaril@0: return StyleParabel; insilmaril@0: else insilmaril@0: return ls; insilmaril@0: break; insilmaril@0: default: insilmaril@0: break; insilmaril@0: } insilmaril@0: return StyleUndef; insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setLinkStyle(LinkStyle newstyle) insilmaril@0: { insilmaril@83: //if (newstyle=style) return; insilmaril@0: delLink(); insilmaril@0: insilmaril@0: style=newstyle; insilmaril@0: insilmaril@0: if (childObj!=NULL && parObj != NULL) insilmaril@0: { insilmaril@0: int i; insilmaril@0: QCanvasLine* cl; insilmaril@0: switch (style) insilmaril@0: { insilmaril@0: case StyleUndef: insilmaril@0: bottomline->hide(); insilmaril@0: break; insilmaril@0: case StyleLine: insilmaril@0: l = new QCanvasLine(canvas); insilmaril@0: l->setPen( QPen(linkcolor, 1) ); insilmaril@0: l->setZ(Z_LINK); insilmaril@0: if (visible) insilmaril@0: l->show(); insilmaril@0: else insilmaril@0: l->hide(); insilmaril@0: break; insilmaril@0: case StyleParabel: insilmaril@0: for (i=0;isetPen( QPen(linkcolor, 1) ); insilmaril@0: cl->setPoints( 0,0,i*10,100); insilmaril@0: cl->setZ(Z_LINK); insilmaril@0: if (visible) insilmaril@0: cl->show(); insilmaril@0: else insilmaril@0: cl->hide(); insilmaril@0: segment.append(cl); insilmaril@0: } insilmaril@0: pa0.resize (arcsegs+1); insilmaril@0: break; insilmaril@0: case StylePolyLine: insilmaril@0: p = new QCanvasPolygon(canvas); insilmaril@0: p->setBrush( linkcolor ); insilmaril@0: p->setZ(Z_LINK); insilmaril@0: if (visible) insilmaril@0: p->show(); insilmaril@0: else insilmaril@0: p->hide(); insilmaril@0: pa0.resize (3); insilmaril@0: // TODO insilmaril@0: // a bit awkward: draw the lines additionally to polygon, to avoid insilmaril@0: // missing pixels, when polygon is extremly flat insilmaril@0: l = new QCanvasLine(canvas); insilmaril@0: l->setPen( QPen(linkcolor, 1) ); insilmaril@0: l->setZ(Z_LINK); insilmaril@0: if (visible) insilmaril@0: l->show(); insilmaril@0: else insilmaril@0: l->hide(); insilmaril@0: break; insilmaril@0: case StylePolyParabel: insilmaril@0: p = new QCanvasPolygon(canvas); insilmaril@0: p->setBrush( linkcolor ); insilmaril@0: p->setZ(Z_LINK); insilmaril@0: if (visible) insilmaril@0: p->show(); insilmaril@0: else insilmaril@0: p->hide(); insilmaril@0: pa0.resize (arcsegs*2+2); insilmaril@0: pa1.resize (arcsegs+1); insilmaril@0: pa2.resize (arcsegs+1); insilmaril@0: insilmaril@0: // TODO insilmaril@0: // a bit awkward: draw the lines additionally insilmaril@0: // to polygon, to avoid missing pixels, insilmaril@0: // if polygon is extremly flat insilmaril@0: for (i=0;isetPen( QPen(linkcolor, 1) ); insilmaril@0: cl->setPoints( 0,0,i*10,100); insilmaril@0: cl->setZ(Z_LINK); insilmaril@0: if (visible) insilmaril@0: cl->show(); insilmaril@0: else insilmaril@0: cl->hide(); insilmaril@0: segment.append(cl); insilmaril@0: } insilmaril@0: break; insilmaril@0: default: insilmaril@0: break; insilmaril@0: } insilmaril@93: // FIXME updateLink is usually called (multiple times) later: insilmaril@93: //updateLink(); insilmaril@0: } else insilmaril@0: { insilmaril@83: qWarning ("Error: ChildObj or parObj == NULL in LinkableMapObj::setLinkStyle\n"); insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: LinkStyle LinkableMapObj::getLinkStyle() insilmaril@0: { insilmaril@0: return style; insilmaril@0: } insilmaril@0: insilmaril@160: void LinkableMapObj::setHideLinkUnselected(bool b) insilmaril@160: { insilmaril@160: hideLinkUnselected=b; insilmaril@160: setVisibility (visible); insilmaril@160: updateLink(); insilmaril@160: } insilmaril@160: insilmaril@160: bool LinkableMapObj::getHideLinkUnselected() insilmaril@160: { insilmaril@160: return hideLinkUnselected; insilmaril@160: } insilmaril@160: insilmaril@0: void LinkableMapObj::setLinkPos(LinkPos lp) insilmaril@0: { insilmaril@0: linkpos=lp; insilmaril@0: } insilmaril@0: insilmaril@0: LinkPos LinkableMapObj::getLinkPos() insilmaril@0: { insilmaril@0: return linkpos; insilmaril@0: } insilmaril@0: insilmaril@0: insilmaril@0: void LinkableMapObj::setLinkColor() insilmaril@0: { insilmaril@0: // Overloaded in BranchObj and childs insilmaril@0: // here only set default color insilmaril@0: setLinkColor (mapEditor->getDefLinkColor()); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setLinkColor(QColor col) insilmaril@0: { insilmaril@0: linkcolor=col; insilmaril@0: bottomline->setPen( QPen(linkcolor, 1) ); insilmaril@0: QCanvasLine *cl; insilmaril@0: switch (style) insilmaril@0: { insilmaril@0: case StyleLine: insilmaril@0: l->setPen( QPen(col,1)); insilmaril@0: break; insilmaril@0: case StyleParabel: insilmaril@0: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@0: cl->setPen( QPen(col,1)); insilmaril@0: break; insilmaril@0: case StylePolyLine: insilmaril@0: p->setBrush( QBrush(col)); insilmaril@0: l->setPen( QPen(col,1)); insilmaril@0: break; insilmaril@0: case StylePolyParabel: insilmaril@0: p->setBrush( QBrush(col)); insilmaril@0: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@0: cl->setPen( QPen(col,1)); insilmaril@0: break; insilmaril@0: default: insilmaril@0: break; insilmaril@0: } // switch (style) insilmaril@0: } insilmaril@0: insilmaril@0: QColor LinkableMapObj::getLinkColor() insilmaril@0: { insilmaril@0: return linkcolor; insilmaril@0: } insilmaril@0: insilmaril@0: FrameType LinkableMapObj::getFrameType() insilmaril@0: { insilmaril@0: return frame->getFrameType(); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setFrameType(const FrameType &t) insilmaril@0: { insilmaril@0: frame->setFrameType(t); insilmaril@0: calcBBoxSize(); insilmaril@0: positionBBox(); insilmaril@0: requestReposition(); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setFrameType(const QString &t) insilmaril@0: { insilmaril@0: frame->setFrameType(t); insilmaril@0: calcBBoxSize(); insilmaril@0: positionBBox(); insilmaril@0: requestReposition(); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setVisibility (bool v) insilmaril@0: { insilmaril@160: QCanvasLine* cl; insilmaril@0: MapObj::setVisibility (v); insilmaril@160: bool visnow=visible; insilmaril@160: if (hideLinkUnselected && !selected) insilmaril@160: visnow=false; insilmaril@160: insilmaril@160: if (visnow) insilmaril@0: { insilmaril@0: bottomline->show(); insilmaril@160: switch (style) insilmaril@0: { insilmaril@160: case StyleLine: insilmaril@160: if (l) l->show(); insilmaril@160: break; insilmaril@160: case StyleParabel: insilmaril@160: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@160: cl->show(); insilmaril@160: break; insilmaril@160: case StylePolyLine: insilmaril@160: if (p) p->show(); insilmaril@160: if (l) l->show(); insilmaril@160: break; insilmaril@160: case StylePolyParabel: insilmaril@160: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@160: cl->show(); insilmaril@160: if (p) p->show(); insilmaril@160: break; insilmaril@160: default: insilmaril@160: break; insilmaril@160: } insilmaril@0: } else insilmaril@0: { insilmaril@0: bottomline->hide(); insilmaril@160: switch (style) insilmaril@0: { insilmaril@160: case StyleLine: insilmaril@160: if (l) l->hide(); insilmaril@160: break; insilmaril@160: case StyleParabel: insilmaril@160: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@160: cl->hide(); insilmaril@160: break; insilmaril@160: case StylePolyLine: insilmaril@160: if (p) p->hide(); insilmaril@160: if (l) l->hide(); insilmaril@160: break; insilmaril@160: case StylePolyParabel: insilmaril@160: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@160: cl->hide(); insilmaril@160: if (p) p->hide(); insilmaril@160: break; insilmaril@160: default: insilmaril@160: break; insilmaril@160: } insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::updateLink() insilmaril@0: { insilmaril@0: // needs: insilmaril@0: // childPos of parent insilmaril@0: // orient of parent insilmaril@0: // style insilmaril@0: // insilmaril@0: // sets: insilmaril@0: // orientation insilmaril@0: // childPos insilmaril@0: // parPos insilmaril@0: // offset insilmaril@0: // drawing of the link itself insilmaril@0: insilmaril@0: insilmaril@0: // updateLink is called from move, but called from constructor we don't insilmaril@0: // have parents yet... insilmaril@0: if (style==StyleUndef) return; insilmaril@0: insilmaril@0: if (frame->getFrameType() == NoFrame) insilmaril@0: linkpos=LinkBottom; insilmaril@0: else insilmaril@0: linkpos=LinkMiddle; insilmaril@0: switch (linkpos) insilmaril@0: { insilmaril@0: case LinkMiddle: insilmaril@0: offset=bbox.height() /2; insilmaril@0: break; insilmaril@0: default : insilmaril@0: offset=bbox.height()-1; // draw link to bottom of bbox insilmaril@0: break; insilmaril@0: } insilmaril@0: insilmaril@0: double p2x,p2y; // Set P2 Before setting insilmaril@0: if (!link2ParPos) insilmaril@0: { insilmaril@0: p2x=QPoint( parObj->getChildPos() ).x(); // P1, we have to look at insilmaril@0: p2y=QPoint( parObj->getChildPos() ).y(); // orientation insilmaril@0: } else insilmaril@0: { insilmaril@0: p2x=QPoint( parObj->getParPos() ).x(); insilmaril@0: p2y=QPoint( parObj->getParPos() ).y(); insilmaril@0: } insilmaril@0: insilmaril@0: LinkOrient orientOld=orientation; insilmaril@0: insilmaril@0: // Set orientation, first look for orientation of parent insilmaril@0: if (parObj->getOrientation() != OrientUndef ) insilmaril@0: // use the orientation of the parent: insilmaril@0: orientation=parObj->getOrientation(); insilmaril@0: else insilmaril@0: { insilmaril@0: // calc orientation depending on position rel to mapCenter insilmaril@0: if (absPos.x() < QPoint(parObj->getChildPos() ).x() ) insilmaril@0: orientation=OrientLeftOfCenter; insilmaril@0: else insilmaril@0: orientation=OrientRightOfCenter; insilmaril@0: } insilmaril@0: insilmaril@0: if ((orientation!=orientOld) && (orientOld!= OrientUndef)) insilmaril@0: { insilmaril@0: // Orientation just changed. Reorient this subbranch, because move is called insilmaril@0: // before updateLink => Position is still the old one, which could lead to insilmaril@0: // linking of subranch to itself => segfault insilmaril@0: // insilmaril@0: // Also possible: called in BranchObj::init(), then orientOld==OrientUndef, insilmaril@0: // no need to reposition now insilmaril@0: reposition(); insilmaril@0: } insilmaril@0: insilmaril@0: if (orientation==OrientLeftOfCenter ) insilmaril@0: { insilmaril@0: childPos=QPoint (absPos.x(),absPos.y()+offset); insilmaril@0: parPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset ); insilmaril@0: } else insilmaril@0: { insilmaril@0: childPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset ); insilmaril@0: parPos=QPoint (absPos.x(),absPos.y()+offset); insilmaril@0: } insilmaril@0: insilmaril@0: double p1x=parPos.x(); // Link is drawn from P1 to P2 insilmaril@0: double p1y=parPos.y(); insilmaril@0: insilmaril@0: double vx=p2x - p1x; // V=P2-P1 insilmaril@0: double vy=p2y - p1y; insilmaril@0: insilmaril@0: // Draw the horizontal line below heading (from ChildPos to ParPos) insilmaril@104: bottomline->setPoints (qRound(childPos.x()), insilmaril@104: qRound(childPos.y()), insilmaril@104: qRound(p1x), insilmaril@104: qRound(p1y) ); insilmaril@0: insilmaril@0: double a; // angle insilmaril@0: if (vx > -0.000001 && vx < 0.000001) insilmaril@0: a=M_PI_2; insilmaril@0: else insilmaril@0: a=atan( vy / vx ); insilmaril@0: // "turning point" for drawing polygonal links insilmaril@104: QPoint tp (-qRound(sin (a)*thickness_start), qRound(cos (a)*thickness_start)); insilmaril@0: insilmaril@0: QCanvasLine *cl; insilmaril@0: insilmaril@0: int i; insilmaril@0: insilmaril@0: // Draw the link insilmaril@0: switch (style) insilmaril@0: { insilmaril@0: case StyleLine: insilmaril@104: l->setPoints( qRound (parPos.x()), insilmaril@104: qRound(parPos.y()), insilmaril@104: qRound(p2x), insilmaril@104: qRound(p2y) ); insilmaril@0: break; insilmaril@0: case StyleParabel: insilmaril@0: parabel (pa0, p1x,p1y,p2x,p2y); insilmaril@0: i=0; insilmaril@0: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@0: { insilmaril@0: cl->setPoints( pa0.point(i).x(), pa0.point(i).y(),pa0.point(i+1).x(),pa0.point(i+1).y()); insilmaril@0: i++; insilmaril@0: } insilmaril@0: break; insilmaril@0: case StylePolyLine: insilmaril@104: pa0[0]=QPoint (qRound(p2x+tp.x()), qRound(p2y+tp.y())); insilmaril@104: pa0[1]=QPoint (qRound(p2x-tp.x()), qRound(p2y-tp.y())); insilmaril@104: pa0[2]=QPoint (qRound (parPos.x()), qRound(parPos.y()) ); insilmaril@0: p->setPoints (pa0); insilmaril@0: // here too, draw line to avoid missing pixels insilmaril@104: l->setPoints( qRound (parPos.x()), insilmaril@104: qRound(parPos.y()), insilmaril@104: qRound(p2x), insilmaril@104: qRound(p2y) ); insilmaril@0: break; insilmaril@0: case StylePolyParabel: insilmaril@0: parabel (pa1, p1x,p1y,p2x+tp.x(),p2y+tp.y()); insilmaril@0: parabel (pa2, p1x,p1y,p2x-tp.x(),p2y-tp.y()); insilmaril@0: for (i=0;i<=arcsegs;i++) insilmaril@0: { insilmaril@0: // Combine the arrays to a single one insilmaril@0: pa0[i]=pa1[i]; insilmaril@0: pa0[i+arcsegs+1]=pa2[arcsegs-i]; insilmaril@0: } insilmaril@0: p->setPoints (pa0); insilmaril@0: i=0; insilmaril@0: for (cl=segment.first(); cl; cl=segment.next() ) insilmaril@0: { insilmaril@0: cl->setPoints( pa1.point(i).x(), pa1.point(i).y(),pa1.point(i+1).x(),pa1.point(i+1).y()); insilmaril@0: i++; insilmaril@0: } insilmaril@0: break; insilmaril@0: default: insilmaril@0: break; insilmaril@0: } // switch (style) insilmaril@0: } insilmaril@0: insilmaril@0: LinkableMapObj* LinkableMapObj::getChildObj() insilmaril@0: { insilmaril@0: return childObj; insilmaril@0: } insilmaril@0: insilmaril@0: LinkableMapObj* LinkableMapObj::getParObj() insilmaril@0: { insilmaril@0: return parObj; insilmaril@0: } insilmaril@0: insilmaril@106: LinkableMapObj* LinkableMapObj::findObjBySelect (QString s) insilmaril@95: { insilmaril@95: LinkableMapObj *lmo=this; insilmaril@95: QString part; insilmaril@95: QString typ; insilmaril@95: QString num; insilmaril@95: while (!s.isEmpty() ) insilmaril@95: { insilmaril@95: part=s.section(",",0,0); insilmaril@95: typ=part.left (3); insilmaril@95: num=part.right(part.length() - 3); insilmaril@95: if (typ=="mc:") insilmaril@95: { insilmaril@95: if (depth>0) insilmaril@95: return false; // in a subtree there is no center insilmaril@95: else insilmaril@95: break; insilmaril@95: } else insilmaril@95: if (typ=="bo:") insilmaril@95: lmo=((BranchObj*)(lmo))->getBranchNum (num.toUInt()); insilmaril@95: else insilmaril@95: if (typ=="fi:") insilmaril@95: lmo=((BranchObj*)(lmo))->getFloatImageNum (num.toUInt()); insilmaril@95: if (!lmo) break; insilmaril@95: insilmaril@95: if (s.contains(",")) insilmaril@95: s=s.right(s.length() - part.length() -1 ); insilmaril@95: else insilmaril@95: break; insilmaril@95: } insilmaril@95: return lmo; insilmaril@95: } insilmaril@95: insilmaril@0: QPoint LinkableMapObj::getChildPos() insilmaril@0: { insilmaril@0: return childPos; insilmaril@0: } insilmaril@0: insilmaril@0: QPoint LinkableMapObj::getParPos() insilmaril@0: { insilmaril@0: return parPos; insilmaril@0: } insilmaril@0: insilmaril@0: QPoint LinkableMapObj::getRelPos() insilmaril@0: { insilmaril@0: if (!parObj) return QPoint (0,0); insilmaril@0: return QPoint( insilmaril@0: absPos.x() - parObj->x(), insilmaril@0: absPos.y() - parObj->y() insilmaril@0: ); insilmaril@0: } insilmaril@0: insilmaril@0: LinkOrient LinkableMapObj::getOrientation() insilmaril@0: { insilmaril@0: return orientation; insilmaril@0: } insilmaril@0: insilmaril@0: int LinkableMapObj::getDepth() insilmaril@0: { insilmaril@0: return depth; insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::setMapEditor (MapEditor *me) insilmaril@0: { insilmaril@0: mapEditor=me; insilmaril@0: } insilmaril@0: insilmaril@0: MapEditor* LinkableMapObj::getMapEditor () insilmaril@0: { insilmaril@0: return mapEditor; insilmaril@0: } insilmaril@0: insilmaril@0: QPoint LinkableMapObj::getRandPos() insilmaril@0: { insilmaril@0: // Choose a random position with given distance to parent: insilmaril@0: double a=rand()%360 * 2 * M_PI / 360; insilmaril@0: return QPoint ( (int)( + 150*cos (a)), insilmaril@0: (int)( + 150*sin (a))); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::alignRelativeTo (QPoint ref) insilmaril@0: { insilmaril@95: cout << "LMO::alignRelTo ref="<requestReposition(); insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::forceReposition() insilmaril@0: { insilmaril@0: // Sometimes a reposition has to be done immediatly: For example insilmaril@0: // if the note editor flag changes, there is no user event in mapeditor insilmaril@0: // which could collect requests for a reposition. insilmaril@0: // Then we have to call forceReposition() insilmaril@0: // But no rule without exception: While loading a map or undoing it, insilmaril@0: // we want to block expensive repositioning, but just do it once at insilmaril@0: // the end, thus check first: insilmaril@0: insilmaril@139: if (mapEditor->isRepositionBlocked()) return; insilmaril@0: insilmaril@0: // Pass on the request to parental objects, if this hasn't been done yet insilmaril@0: insilmaril@0: if (parObj) insilmaril@0: parObj->forceReposition(); insilmaril@0: else insilmaril@83: reposition(); insilmaril@83: } insilmaril@0: insilmaril@0: bool LinkableMapObj::repositionRequested() insilmaril@0: { insilmaril@0: return repositionRequest; insilmaril@0: } insilmaril@0: insilmaril@0: insilmaril@0: void LinkableMapObj::setSelBox() insilmaril@0: { insilmaril@0: selbox->setX (bbox.x() ); insilmaril@0: selbox->setY (bbox.y() ); insilmaril@0: selbox->setSize (bbox.width(), bbox.height() ); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::select() insilmaril@0: { insilmaril@0: setSelBox(); insilmaril@0: selected=true; insilmaril@0: selbox->show(); insilmaril@160: setVisibility (visible); insilmaril@0: } insilmaril@0: insilmaril@0: insilmaril@0: void LinkableMapObj::unselect() insilmaril@0: { insilmaril@0: selected=false; insilmaril@0: selbox->hide(); insilmaril@160: setVisibility (visible); insilmaril@0: } insilmaril@0: insilmaril@0: void LinkableMapObj::parabel (QPointArray &ya, double p1x, double p1y, double p2x, double p2y) insilmaril@0: insilmaril@0: { insilmaril@0: double vx=p2x - p1x; // V=P2-P1 insilmaril@0: double vy=p2y - p1y; insilmaril@0: insilmaril@0: double dx; // delta x during calculation of parabel insilmaril@0: insilmaril@0: double pnx; // next point insilmaril@0: double pny; insilmaril@0: double m; insilmaril@0: insilmaril@0: if (vx > -0.0001 && vx < 0.0001) insilmaril@0: m=0; insilmaril@0: else insilmaril@0: m=(vy / (vx*vx)); insilmaril@0: dx=vx/(arcsegs); insilmaril@0: int i; insilmaril@104: ya.setPoint (0,QPoint (qRound(p1x),qRound(p1y))); insilmaril@0: for (i=1;i<=arcsegs;i++) insilmaril@0: { insilmaril@0: pnx=p1x+dx; insilmaril@0: pny=m*(pnx-parPos.x())*(pnx-parPos.x())+parPos.y(); insilmaril@104: ya.setPoint (i,QPoint (qRound(pnx),qRound(pny))); insilmaril@0: p1x=pnx; insilmaril@0: p1y=pny; insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@160: QString LinkableMapObj::getLinkAttr () insilmaril@160: { insilmaril@160: QString hideAttr; insilmaril@160: if (hideLinkUnselected) insilmaril@160: // Since this is currently the insilmaril@160: // only attribut and it is switched off by default insilmaril@160: // don't write at all if it is missing insilmaril@160: return attribut ("hideLinkUnselected","true"); insilmaril@160: else insilmaril@160: return ""; insilmaril@160: insilmaril@160: }