insilmaril@0: #include "branchobj.h" insilmaril@616: insilmaril@749: #include "branchitem.h" insilmaril@643: #include "geometry.h" insilmaril@0: #include "mapeditor.h" insilmaril@794: #include "mainwindow.h" insilmaril@616: #include "misc.h" insilmaril@616: insilmaril@767: extern FlagRow *standardFlagsMaster; insilmaril@767: extern FlagRow *systemFlagsMaster; insilmaril@0: insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: // BranchObj insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: insilmaril@790: BranchObj::BranchObj (QGraphicsScene* s,TreeItem *ti):OrnamentedObj (s) insilmaril@0: { insilmaril@755: // cout << "Const BranchObj (s) \n"; insilmaril@408: scene=s; insilmaril@790: treeItem=ti; insilmaril@794: BranchItem *pi=(BranchItem*)(ti->parent()); insilmaril@794: if (pi && pi!=ti->getModel()->getRootItem() ) insilmaril@794: parObj=pi->getLMO(); insilmaril@794: else insilmaril@794: parObj=NULL; insilmaril@755: init(); insilmaril@0: } insilmaril@0: insilmaril@790: /* insilmaril@755: BranchObj::BranchObj (QGraphicsScene* s, LinkableMapObj* p):OrnamentedObj (s)// FIXME-3 needed at all? insilmaril@0: { insilmaril@408: // cout << "Const BranchObj (s,p)\n"; insilmaril@408: scene=s; insilmaril@0: setParObj (p); insilmaril@773: if (treeItem->depth()==1) // FIXME-3 needed to recursively calc depth? insilmaril@0: // Calc angle to mapCenter if I am a mainbranch insilmaril@0: // needed for reordering the mainbranches clockwise insilmaril@0: // around mapcenter insilmaril@408: angle=getAngle (QPointF (x() - parObj->getChildPos().x() , insilmaril@408: (y() - parObj->getChildPos().y() ) ) ); insilmaril@0: init(); insilmaril@0: } insilmaril@790: */ insilmaril@0: insilmaril@0: BranchObj::~BranchObj () insilmaril@0: { insilmaril@757: // cout << "Destr BranchObj of "<getHeading().toStdString()<<")"<getModel(); insilmaril@722: model->stopAnimation (this); insilmaril@722: } insilmaril@722: insilmaril@0: // Check, if this branch was the last child to be deleted insilmaril@749: // If so, unset the scrolled flags in parent // FIXME-2 better do this in model? insilmaril@0: insilmaril@749: /* insilmaril@425: BranchObj *po=(BranchObj*)parObj; insilmaril@83: BranchObj *bo; insilmaril@0: if (po) insilmaril@0: { insilmaril@425: bo=((BranchObj*)parObj)->getLastBranch(); insilmaril@425: if (bo) po->unScroll(); insilmaril@0: } insilmaril@749: */ insilmaril@83: clear(); insilmaril@0: } insilmaril@0: insilmaril@0: bool BranchObj::operator< ( const BranchObj & other ) insilmaril@0: { insilmaril@0: return angle < other.angle; insilmaril@0: } insilmaril@0: insilmaril@0: bool BranchObj::operator== ( const BranchObj & other ) insilmaril@0: { insilmaril@0: return angle == other.angle; insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::init () insilmaril@0: { insilmaril@83: if (parObj) insilmaril@83: { insilmaril@83: absPos=getRandPos(); insilmaril@83: absPos+=parObj->getChildPos(); insilmaril@83: } insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::copy (BranchObj* other) insilmaril@0: { insilmaril@0: OrnamentedObj::copy(other); insilmaril@0: insilmaril@0: setVisibility (other->visible); insilmaril@0: insilmaril@0: angle=other->angle; insilmaril@0: insilmaril@0: positionBBox(); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::clear() insilmaril@0: { insilmaril@755: //setVisibility (true); //FIXME-4 needed? insilmaril@425: insilmaril@95: while (!xlink.isEmpty()) insilmaril@406: delete xlink.takeFirst(); insilmaril@0: } insilmaril@0: insilmaril@411: bool isAbove (BranchObj* a, BranchObj *b) insilmaril@411: { insilmaril@411: if (a->angle < b->angle) insilmaril@411: return true; insilmaril@411: else insilmaril@411: return false; insilmaril@411: } insilmaril@411: insilmaril@804: void BranchObj::setParObjTmp(LinkableMapObj* dst, QPointF m, int off) //FIXME-1 when moving a mainbranch to a branch it still has relPos, not moved as child insilmaril@0: { insilmaril@796: // Temporary link to dst insilmaril@0: // m is position of mouse pointer insilmaril@796: // offset 0: default 1: below dst -1 above dst (if possible) insilmaril@0: insilmaril@796: BranchItem *dsti=(BranchItem*)(dst->getTreeItem()); insilmaril@796: insilmaril@796: BranchItem *pi=(BranchItem*)(dsti->parent()); insilmaril@775: int pi_depth=pi->depth(); insilmaril@815: BranchObj* bodst=(BranchObj*)dst; insilmaril@0: insilmaril@798: if (!tmpParent) insilmaril@798: { insilmaril@798: tmpParent=true; insilmaril@798: parObjTmpBuf=parObj; insilmaril@798: } insilmaril@796: insilmaril@775: if (pi_depth<2) off=0; insilmaril@0: if (off==0) insilmaril@0: link2ParPos=false; insilmaril@0: else insilmaril@0: link2ParPos=true; insilmaril@815: parObj=bodst; insilmaril@0: insilmaril@796: setLinkStyle (dst->getDefLinkStyle (dsti)); insilmaril@814: insilmaril@0: // Move temporary to new position at destination insilmaril@0: // Usually the positioning would be done by reposition(), insilmaril@0: // but then also the destination branch would "Jump" around... insilmaril@0: // Better just do it approximately insilmaril@815: cout << "BO::setTmp "; insilmaril@814: if (dsti->depth()==0) insilmaril@786: { // new parent is a mapcenter insilmaril@815: Vector v= ( m - bodst->getChildPos()); insilmaril@798: if (v.x()<0) v.setX( v.x()-bbox.width() ); insilmaril@798: v.normalize(); insilmaril@798: v.scale (100); insilmaril@798: move2RelPos (v.toQPointF()); insilmaril@814: cout << " v="<getBBoxSizeWithChildren(); insilmaril@796: if (dsti->getLastBranch()) insilmaril@0: y=t.y() + t.height() ; insilmaril@0: else insilmaril@0: y=t.y(); insilmaril@0: insilmaril@815: y=t.bottom(); insilmaril@815: cout << " y="<getHeading(); insilmaril@767: if (s!=heading->text()) insilmaril@767: { insilmaril@767: heading->setText (s); insilmaril@767: changed=true; insilmaril@767: } insilmaril@767: QStringList TIactiveFlags=treeItem->activeStandardFlagNames(); insilmaril@767: insilmaril@767: // Add missing standard flags active in TreeItem insilmaril@767: for (int i=0;i<=TIactiveFlags.size()-1;i++) insilmaril@767: { insilmaril@767: if (!standardFlags->isActive (TIactiveFlags.at(i) )) insilmaril@767: { insilmaril@767: Flag *f=standardFlagsMaster->getFlag(TIactiveFlags.at(i)); insilmaril@767: if (f) standardFlags->activate (f); insilmaril@767: changed=true; insilmaril@767: } insilmaril@767: } insilmaril@767: // Remove standard flags no longer active in TreeItem insilmaril@767: QStringList BOactiveFlags=standardFlags->activeFlagNames(); insilmaril@767: for (int i=0;ideactivate (BOactiveFlags.at(i)); insilmaril@767: changed=true; insilmaril@767: } insilmaril@767: insilmaril@767: // Add missing system flags active in TreeItem insilmaril@767: TIactiveFlags=treeItem->activeSystemFlagNames(); insilmaril@767: for (int i=0;iisActive (TIactiveFlags.at(i) )) insilmaril@767: { insilmaril@767: Flag *f=systemFlagsMaster->getFlag(TIactiveFlags.at(i)); insilmaril@767: if (f) systemFlags->activate (f); insilmaril@767: changed=true; insilmaril@767: } insilmaril@767: } insilmaril@767: // Remove system flags no longer active in TreeItem insilmaril@767: BOactiveFlags=systemFlags->activeFlagNames(); insilmaril@767: for (int i=0;ideactivate (BOactiveFlags.at(i)); insilmaril@767: changed=true; insilmaril@767: } insilmaril@767: } insilmaril@785: updateContentSize(); insilmaril@254: } insilmaril@254: insilmaril@0: void BranchObj::savePosInAngle () insilmaril@0: { insilmaril@0: // Save position in angle insilmaril@750: for (int i=0; ibranchCount(); ++i) insilmaril@753: treeItem->getBranchObjNum(i)->angle=i; insilmaril@0: } insilmaril@0: insilmaril@146: void BranchObj::setDefAttr (BranchModification mod) insilmaril@146: { insilmaril@146: int fontsize; insilmaril@755: switch (treeItem->depth()) insilmaril@146: { insilmaril@798: case 0: insilmaril@798: fontsize=16; insilmaril@798: setFrameType (FrameObj::Rectangle); insilmaril@798: break; insilmaril@798: case 1: insilmaril@804: fontsize=14; insilmaril@804: setFrameType (FrameObj::NoFrame); insilmaril@804: break; insilmaril@804: case 2: insilmaril@798: fontsize=12; insilmaril@798: setFrameType (FrameObj::NoFrame); insilmaril@798: break; insilmaril@798: default: insilmaril@798: fontsize=10; insilmaril@798: setFrameType (FrameObj::NoFrame); insilmaril@798: break; insilmaril@146: } insilmaril@786: setLinkStyle(getDefLinkStyle(treeItem->parent() )); insilmaril@146: setLinkColor (); insilmaril@146: QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0"); insilmaril@146: font.setPointSize(fontsize); insilmaril@146: heading->setFont(font ); insilmaril@146: insilmaril@146: if (mod==NewBranch) insilmaril@760: setColor (treeItem->getHeadingColor() ); insilmaril@798: else insilmaril@798: // Also set styles for children insilmaril@798: for (int i=0; ibranchCount(); ++i) insilmaril@798: treeItem->getBranchObjNum(i)->setDefAttr(MovedBranch); insilmaril@146: calcBBoxSize(); insilmaril@146: } insilmaril@146: insilmaril@721: void BranchObj::alignRelativeTo (QPointF ref,bool alignSelf) insilmaril@0: { insilmaril@408: qreal th = bboxTotal.height(); insilmaril@773: int depth=treeItem->depth(); // FIXME-3 needed to recursively calc depth? insilmaril@223: // TODO testing insilmaril@223: /* insilmaril@755: insilmaril@755: QString h=QString (depth,' '); insilmaril@753: h+=treeItem->getHeading(); insilmaril@753: h+=QString (15,' '); insilmaril@753: h.truncate (15); insilmaril@688: QPointF pp; if (parObj) pp=parObj->getChildPos(); insilmaril@753: cout << "BO::alignRelTo "; insilmaril@753: cout<