insilmaril@0: #include "branchobj.h" insilmaril@40: insilmaril@40: // #include "texteditor.h" insilmaril@40: #include "geometry.h" insilmaril@0: #include "mapeditor.h" insilmaril@0: #include "mainwindow.h" insilmaril@40: #include "misc.h" insilmaril@40: insilmaril@40: class TextEditor; insilmaril@0: insilmaril@0: extern TextEditor *textEditor; insilmaril@0: extern Main *mainWindow; insilmaril@0: extern FlagRowObj *standardFlagsDefault; insilmaril@0: insilmaril@0: insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: // BranchObj insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: insilmaril@0: BranchObj* BranchObj::itLast=NULL; insilmaril@40: BranchObj* BranchObj::itFirst=NULL; insilmaril@0: insilmaril@0: insilmaril@0: BranchObj::BranchObj () :OrnamentedObj() insilmaril@0: { insilmaril@0: // cout << "Const BranchObj ()\n"; insilmaril@0: setParObj (this); insilmaril@0: init(); insilmaril@0: depth=-1; insilmaril@0: } insilmaril@0: insilmaril@40: BranchObj::BranchObj (QGraphicsScene* s):OrnamentedObj (s) insilmaril@0: { insilmaril@40: // cout << "Const BranchObj (s) called from MapCenterObj (s)\n"; insilmaril@40: parObj=NULL; insilmaril@40: scene=s; insilmaril@0: } insilmaril@0: insilmaril@40: BranchObj::BranchObj (QGraphicsScene* s, LinkableMapObj* p):OrnamentedObj (s) insilmaril@0: { insilmaril@40: // cout << "Const BranchObj (s,p)\n"; insilmaril@40: scene=s; insilmaril@0: setParObj (p); insilmaril@0: depth=p->getDepth()+1; insilmaril@0: if (depth==1) insilmaril@0: // Calc angle to mapCenter if I am a mainbranch insilmaril@0: // needed for reordering the mainbranches clockwise insilmaril@0: // around mapcenter insilmaril@40: angle=getAngle (QPointF (x() - parObj->getChildPos().x() , insilmaril@40: (y() - parObj->getChildPos().y() ) ) ); insilmaril@0: init(); insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj::~BranchObj () insilmaril@0: { insilmaril@40: // If I'm animated, I need to un-animate myself first insilmaril@40: if (anim.isAnimated() ) insilmaril@40: { insilmaril@40: anim.setAnimated (false); insilmaril@40: mapEditor->getModel()->stopAnimation (this); insilmaril@40: } insilmaril@40: insilmaril@40: insilmaril@40: //cout << "Destr BranchObj of "<getLastBranch(); insilmaril@40: if (bo) po->unScroll(); insilmaril@0: } insilmaril@40: 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@40: if (parObj) insilmaril@40: { insilmaril@40: absPos=getRandPos(); insilmaril@40: absPos+=parObj->getChildPos(); insilmaril@40: } insilmaril@0: insilmaril@40: lastSelectedBranch=0; insilmaril@0: insilmaril@0: setChildObj(this); insilmaril@0: insilmaril@0: scrolled=false; insilmaril@0: tmpUnscrolled=false; insilmaril@0: insilmaril@40: includeImagesVer=false; insilmaril@40: includeImagesHor=false; insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::copy (BranchObj* other) insilmaril@0: { insilmaril@0: OrnamentedObj::copy(other); insilmaril@0: insilmaril@0: branch.clear(); insilmaril@40: for (int i=0; ibranch.size(); ++i) insilmaril@0: // Make deep copy of b insilmaril@0: // Because addBranch again calls copy for the childs, insilmaril@0: // Those will get a deep copy, too insilmaril@40: addBranch(other->branch.at(i) ); insilmaril@0: insilmaril@40: for (int i=0; ifloatimage.size(); ++i) insilmaril@40: addFloatImage (other->floatimage.at(i)); insilmaril@0: scrolled=other->scrolled; insilmaril@0: tmpUnscrolled=other->tmpUnscrolled; 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@40: setVisibility (true); insilmaril@40: insilmaril@40: while (!floatimage.isEmpty()) insilmaril@40: delete floatimage.takeFirst(); insilmaril@40: insilmaril@40: while (!xlink.isEmpty()) insilmaril@40: delete xlink.takeFirst(); insilmaril@40: insilmaril@40: while (!branch.isEmpty()) insilmaril@40: delete branch.takeFirst(); insilmaril@70: insilmaril@70: if (scrolled) unScroll(); insilmaril@40: } insilmaril@40: insilmaril@40: bool isAbove (BranchObj* a, BranchObj *b) insilmaril@40: { insilmaril@40: if (a->angle < b->angle) insilmaril@40: return true; insilmaril@40: else insilmaril@40: return false; insilmaril@0: } insilmaril@0: insilmaril@0: int BranchObj::getNum() insilmaril@0: { insilmaril@0: if (parObj) insilmaril@40: return ((BranchObj*)parObj)->getNum (this); insilmaril@0: else insilmaril@0: return 0; insilmaril@0: } insilmaril@0: insilmaril@0: int BranchObj::getNum(BranchObj *bo) insilmaril@0: { insilmaril@40: return branch.indexOf (bo); insilmaril@0: } insilmaril@0: insilmaril@0: int BranchObj::getFloatImageNum(FloatImageObj *fio) insilmaril@0: { insilmaril@40: return floatimage.indexOf(fio); insilmaril@0: } insilmaril@0: insilmaril@0: int BranchObj::countBranches() insilmaril@0: { insilmaril@0: return branch.count(); insilmaril@0: } insilmaril@0: insilmaril@0: int BranchObj::countFloatImages() insilmaril@0: { insilmaril@0: return floatimage.count(); insilmaril@0: } insilmaril@0: insilmaril@40: int BranchObj::countXLinks() insilmaril@40: { insilmaril@40: return xlink.count(); insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::setParObjTmp(LinkableMapObj* lmo, QPointF m, int off) insilmaril@0: { insilmaril@0: // Temporary link to lmo insilmaril@0: // m is position of mouse pointer insilmaril@0: // offset 0: default 1: below lmo -1 above lmo (if possible) insilmaril@0: insilmaril@0: insilmaril@0: BranchObj* o=(BranchObj*)(lmo); insilmaril@0: if (!parObjTmpBuf) insilmaril@0: parObjTmpBuf=parObj; insilmaril@0: insilmaril@0: // ignore mapcenter and mainbranch insilmaril@0: if (lmo->getDepth()<2) off=0; insilmaril@0: if (off==0) insilmaril@0: link2ParPos=false; insilmaril@0: else insilmaril@0: link2ParPos=true; insilmaril@40: parObj=o; insilmaril@0: insilmaril@0: depth=parObj->getDepth()+1; insilmaril@0: insilmaril@0: // setLinkStyle calls updateLink, only set it once insilmaril@0: if (style!=getDefLinkStyle() ) setLinkStyle (getDefLinkStyle()); insilmaril@0: 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@0: if (depth==1) insilmaril@0: { // new parent is the mapcenter itself insilmaril@0: insilmaril@40: QPointF p= normalise ( QPointF (m.x() - o->getChildPos().x(), insilmaril@0: m.y() - o->getChildPos().y() )); insilmaril@0: if (p.x()<0) p.setX( p.x()-bbox.width() ); insilmaril@0: move2RelPos (p); insilmaril@0: } else insilmaril@0: { insilmaril@40: qreal y; insilmaril@0: if (off==0) insilmaril@0: { insilmaril@0: // new parent is just a branch, link to it insilmaril@40: QRectF t=o->getBBoxSizeWithChilds(); insilmaril@0: if (o->getLastBranch()) insilmaril@0: y=t.y() + t.height() ; insilmaril@0: else insilmaril@0: y=t.y(); insilmaril@0: insilmaril@0: } else insilmaril@0: { insilmaril@0: if (off<0) insilmaril@0: // we want to link above lmo insilmaril@0: y=o->y() - height() + 5; insilmaril@0: else insilmaril@0: // we want to link below lmo insilmaril@0: // Bottom of sel should be 5 pixels above insilmaril@0: // the bottom of the branch _below_ the target: insilmaril@0: // Don't try to find that branch, guess 12 pixels insilmaril@0: y=o->getChildPos().y() -height() + 12; insilmaril@0: } insilmaril@40: if (o->getOrientation()==LinkableMapObj::LeftOfCenter) insilmaril@0: move ( o->getChildPos().x() - linkwidth, y ); insilmaril@0: else insilmaril@0: move (o->getChildPos().x() + linkwidth, y ); insilmaril@0: } insilmaril@0: insilmaril@0: // updateLink is called implicitly in move insilmaril@40: requestReposition(); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::unsetParObjTmp() insilmaril@0: { insilmaril@0: if (parObjTmpBuf) insilmaril@0: { insilmaril@0: link2ParPos=false; insilmaril@0: parObj=parObjTmpBuf; insilmaril@0: parObjTmpBuf=NULL; insilmaril@0: depth=parObj->getDepth()+1; insilmaril@0: setLinkStyle (getDefLinkStyle() ); insilmaril@40: updateLink(); insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::unScroll() insilmaril@0: { insilmaril@0: if (tmpUnscrolled) resetTmpUnscroll(); insilmaril@0: if (scrolled) toggleScroll(); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::toggleScroll() insilmaril@0: { insilmaril@0: if (scrolled) insilmaril@0: { insilmaril@0: scrolled=false; insilmaril@0: systemFlags->deactivate("scrolledright"); insilmaril@40: for (int i=0; isetVisibility(true); insilmaril@0: } else insilmaril@0: { insilmaril@0: scrolled=true; insilmaril@0: systemFlags->activate("scrolledright"); insilmaril@40: for (int i=0; isetVisibility(false); insilmaril@0: } insilmaril@0: calcBBoxSize(); insilmaril@0: positionBBox(); insilmaril@0: move (absPos.x(), absPos.y() ); insilmaril@0: forceReposition(); insilmaril@0: } insilmaril@0: insilmaril@0: bool BranchObj::isScrolled() insilmaril@0: { insilmaril@0: return scrolled; insilmaril@0: } insilmaril@0: insilmaril@0: bool BranchObj::hasScrolledParent(BranchObj *start) insilmaril@0: { insilmaril@0: // Calls parents recursivly to insilmaril@0: // find out, if we are scrolled at all. insilmaril@0: // But ignore myself, just look at parents. insilmaril@0: insilmaril@0: if (this !=start && scrolled) return true; insilmaril@0: insilmaril@0: BranchObj* bo=(BranchObj*)(parObj); insilmaril@0: if (bo) insilmaril@0: return bo->hasScrolledParent(start); insilmaril@0: else insilmaril@0: return false; insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::tmpUnscroll() insilmaril@0: { insilmaril@0: // Unscroll parent (recursivly) insilmaril@0: BranchObj* bo=(BranchObj*)(parObj); insilmaril@0: if (bo) bo->tmpUnscroll(); insilmaril@0: insilmaril@0: // Unscroll myself insilmaril@0: if (scrolled) insilmaril@0: { insilmaril@0: tmpUnscrolled=true; insilmaril@0: systemFlags->activate("tmpUnscrolledright"); insilmaril@0: toggleScroll(); insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::resetTmpUnscroll() insilmaril@0: { insilmaril@0: // Unscroll parent (recursivly) insilmaril@0: BranchObj* bo=(BranchObj*)(parObj); insilmaril@0: if (bo) insilmaril@0: bo->resetTmpUnscroll(); insilmaril@0: insilmaril@0: // Unscroll myself insilmaril@0: if (tmpUnscrolled) insilmaril@0: { insilmaril@0: tmpUnscrolled=false; insilmaril@0: systemFlags->deactivate("tmpUnscrolledright"); insilmaril@0: toggleScroll(); insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::setVisibility(bool v, int toDepth) insilmaril@0: { insilmaril@0: if (depth <= toDepth) insilmaril@0: { insilmaril@0: frame->setVisibility(v); insilmaril@0: heading->setVisibility(v); insilmaril@0: systemFlags->setVisibility(v); insilmaril@0: standardFlags->setVisibility(v); insilmaril@0: LinkableMapObj::setVisibility (v); insilmaril@0: insilmaril@56: int i; insilmaril@56: for (i=0; isetVisibility (v); insilmaril@56: for (i=0; isetVisibility (); insilmaril@56: insilmaril@40: // Only change childs, if I am not scrolled insilmaril@0: if (!scrolled && (depth < toDepth)) insilmaril@0: { insilmaril@0: // Now go recursivly through all childs insilmaril@40: for (i=0; isetVisibility (v,toDepth); insilmaril@0: } insilmaril@0: } // depth <= toDepth insilmaril@0: requestReposition(); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::setVisibility(bool v) insilmaril@0: { insilmaril@0: setVisibility (v,MAX_DEPTH); insilmaril@0: } insilmaril@0: insilmaril@0: insilmaril@0: void BranchObj::setLinkColor () insilmaril@0: { insilmaril@0: // Overloaded from LinkableMapObj insilmaril@0: // BranchObj can use color of heading insilmaril@0: insilmaril@40: if (mapEditor) insilmaril@40: { insilmaril@40: if (mapEditor->getMapLinkColorHint()==HeadingColor) insilmaril@40: LinkableMapObj::setLinkColor (heading->getColor() ); insilmaril@40: else insilmaril@40: LinkableMapObj::setLinkColor (); insilmaril@40: } insilmaril@0: } insilmaril@0: insilmaril@40: void BranchObj::setColorSubtree(QColor col) insilmaril@0: { insilmaril@40: setColor (col); insilmaril@40: for (int i=0; isetColorSubtree(col); insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::first() insilmaril@0: { insilmaril@0: itLast=NULL; insilmaril@40: itFirst=this; insilmaril@0: return this; insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::next() insilmaril@0: { insilmaril@40: BranchObj *bo; insilmaril@0: BranchObj *lmo; insilmaril@40: BranchObj *po=(BranchObj*)parObj; insilmaril@40: insilmaril@40: if (branch.isEmpty()) insilmaril@40: bo=NULL; insilmaril@40: else insilmaril@40: bo=branch.first(); insilmaril@0: insilmaril@0: if (!itLast) insilmaril@40: { insilmaril@40: // no itLast, we are just beginning insilmaril@0: if (bo) insilmaril@0: { insilmaril@40: // we have childs, return first one insilmaril@0: itLast=this; insilmaril@0: return bo; insilmaril@0: } insilmaril@0: else insilmaril@0: { insilmaril@40: // No childs, so there is no next insilmaril@40: itLast=this; insilmaril@0: return NULL; insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@40: // We have an itLast insilmaril@40: if (itLast==po) insilmaril@40: { // We come from parent insilmaril@0: if (bo) insilmaril@0: { insilmaril@0: // there are childs, go there insilmaril@0: itLast=this; insilmaril@0: return bo; insilmaril@0: } insilmaril@0: else insilmaril@0: { // no childs, try to go up again insilmaril@0: if (po) insilmaril@0: { insilmaril@40: // go back to parent and try to find next there insilmaril@0: itLast=this; insilmaril@0: lmo=po->next(); insilmaril@0: itLast=this; insilmaril@0: return lmo; insilmaril@0: insilmaril@0: } insilmaril@0: else insilmaril@0: { insilmaril@40: // can't go up, I am mapCenter, no next insilmaril@0: itLast=NULL; insilmaril@0: return NULL; insilmaril@0: } insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@40: // We don't come from parent, but from brother or childs insilmaril@40: insilmaril@40: // Try to find last child, where we came from, in my own childs insilmaril@0: bool searching=true; insilmaril@40: int i=0; insilmaril@40: while (inext(); insilmaril@0: itLast=this; insilmaril@0: return lmo; insilmaril@0: } insilmaril@0: else insilmaril@0: { insilmaril@0: // can't go up, I am mapCenter insilmaril@0: itLast=NULL; insilmaril@0: return NULL; insilmaril@0: } insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: // couldn't find last child, it must be a nephew of mine insilmaril@40: if (branch.size()>0) insilmaril@0: { insilmaril@0: // proceed with my first child insilmaril@0: itLast=this; insilmaril@40: return branch.first(); insilmaril@0: } insilmaril@0: else insilmaril@0: { insilmaril@0: // or go back to my parents insilmaril@0: if (po) insilmaril@0: { insilmaril@0: // go up insilmaril@0: itLast=this; insilmaril@0: lmo=po->next(); insilmaril@0: itLast=this; insilmaril@0: return lmo; insilmaril@0: } insilmaril@0: else insilmaril@0: { insilmaril@0: // can't go up, I am mapCenter insilmaril@0: itLast=NULL; insilmaril@0: return NULL; insilmaril@0: } insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::getLastIterator() insilmaril@0: { insilmaril@0: return itLast; insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::setLastIterator(BranchObj* it) insilmaril@0: { insilmaril@0: itLast=it; insilmaril@0: } insilmaril@0: insilmaril@40: void BranchObj::positionContents() insilmaril@40: { insilmaril@40: for (int i=0; ireposition(); insilmaril@40: OrnamentedObj::positionContents(); insilmaril@40: } insilmaril@0: insilmaril@0: void BranchObj::move (double x, double y) insilmaril@0: { insilmaril@0: OrnamentedObj::move (x,y); insilmaril@40: for (int i=0; ireposition(); insilmaril@0: positionBBox(); insilmaril@0: } insilmaril@0: insilmaril@40: void BranchObj::move (QPointF p) insilmaril@0: { insilmaril@0: move (p.x(), p.y()); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::moveBy (double x, double y) insilmaril@0: { insilmaril@0: OrnamentedObj::moveBy (x,y); insilmaril@40: for (int i=0; imoveBy (x,y); insilmaril@0: positionBBox(); insilmaril@0: } insilmaril@40: insilmaril@40: void BranchObj::moveBy (QPointF p) insilmaril@0: { insilmaril@0: moveBy (p.x(), p.y()); insilmaril@0: } insilmaril@0: insilmaril@0: insilmaril@0: void BranchObj::positionBBox() insilmaril@0: { insilmaril@40: QPointF ap=getAbsPos(); insilmaril@40: bbox.moveTopLeft (ap); insilmaril@40: positionContents(); insilmaril@0: insilmaril@0: // set the frame insilmaril@40: frame->setRect(QRectF(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) ); insilmaril@40: insilmaril@40: // Update links to other branches insilmaril@40: for (int i=0; iupdateXLink(); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::calcBBoxSize() insilmaril@0: { insilmaril@40: QSizeF heading_r=heading->getSize(); insilmaril@40: qreal heading_w=(qreal) heading_r.width() ; insilmaril@40: qreal heading_h=(qreal) heading_r.height() ; insilmaril@40: QSizeF sysflags_r=systemFlags->getSize(); insilmaril@40: qreal sysflags_h=sysflags_r.height(); insilmaril@40: qreal sysflags_w=sysflags_r.width(); insilmaril@40: QSizeF stanflags_r=standardFlags->getSize(); insilmaril@40: qreal stanflags_h=stanflags_r.height(); insilmaril@40: qreal stanflags_w=stanflags_r.width(); insilmaril@40: qreal w; insilmaril@40: qreal h; insilmaril@0: insilmaril@0: // set width to sum of all widths insilmaril@0: w=heading_w + sysflags_w + stanflags_w; insilmaril@0: // set height to maximum needed height insilmaril@0: h=max (sysflags_h,stanflags_h); insilmaril@0: h=max (h,heading_h); insilmaril@0: insilmaril@40: // Save the dimension of flags and heading insilmaril@40: ornamentsBBox.setSize ( QSizeF(w,h)); insilmaril@40: insilmaril@40: // clickBox includes Flags and Heading insilmaril@40: clickBox.setSize (ornamentsBBox.size() ); insilmaril@40: insilmaril@40: // Floatimages insilmaril@40: QPointF rp; insilmaril@40: insilmaril@40: topPad=botPad=leftPad=rightPad=0; insilmaril@40: if (includeImagesVer || includeImagesHor) insilmaril@40: { insilmaril@40: if (countFloatImages()>0) insilmaril@40: { insilmaril@40: for (int i=0; igetRelPos(); insilmaril@40: if (includeImagesVer) insilmaril@40: { insilmaril@40: if (rp.y() < 0) insilmaril@40: topPad=max (topPad,-rp.y()-h); insilmaril@40: if (rp.y()+floatimage.at(i)->height() > 0) insilmaril@40: botPad=max (botPad,rp.y()+floatimage.at(i)->height()); insilmaril@40: } insilmaril@40: if (includeImagesHor) insilmaril@40: { insilmaril@40: if (orientation==LinkableMapObj::RightOfCenter) insilmaril@40: { insilmaril@40: if (-rp.x()-w > 0) insilmaril@40: leftPad=max (leftPad,-rp.x()-w); insilmaril@40: if (rp.x()+floatimage.at(i)->width() > 0) insilmaril@40: rightPad=max (rightPad,rp.x()+floatimage.at(i)->width()); insilmaril@40: } else insilmaril@40: { insilmaril@40: if (rp.x()< 0) insilmaril@40: leftPad=max (leftPad,-rp.x()); insilmaril@40: if (rp.x()+floatimage.at(i)->width() > w) insilmaril@40: rightPad=max (rightPad,rp.x()+floatimage.at(i)->width()-w); insilmaril@40: } insilmaril@40: } insilmaril@40: } insilmaril@40: } insilmaril@40: h+=topPad+botPad; insilmaril@40: w+=leftPad+rightPad; insilmaril@40: } insilmaril@40: insilmaril@40: // Frame thickness insilmaril@40: w+=frame->getPadding(); insilmaril@40: h+=frame->getPadding(); insilmaril@40: insilmaril@40: // Finally set size insilmaril@40: bbox.setSize (QSizeF (w,h)); insilmaril@0: } insilmaril@0: insilmaril@40: void BranchObj::setDockPos() insilmaril@40: { insilmaril@40: // Sets childpos and parpos depending on orientation insilmaril@40: if (getOrientation()==LinkableMapObj::LeftOfCenter ) insilmaril@40: { insilmaril@40: childPos=QPointF ( insilmaril@40: ornamentsBBox.bottomLeft().x(), insilmaril@40: bottomlineY); insilmaril@40: parPos=QPointF ( insilmaril@40: ornamentsBBox.bottomRight().x(), insilmaril@40: bottomlineY); insilmaril@40: } else insilmaril@40: { insilmaril@40: childPos=QPointF ( insilmaril@40: ornamentsBBox.bottomRight().x(), insilmaril@40: bottomlineY); insilmaril@40: parPos=QPointF ( insilmaril@40: ornamentsBBox.bottomLeft().x(), insilmaril@40: bottomlineY); insilmaril@40: } insilmaril@40: } insilmaril@40: insilmaril@40: LinkableMapObj* BranchObj::findMapObj(QPointF p, LinkableMapObj* excludeLMO) insilmaril@0: { insilmaril@0: // Search branches insilmaril@0: LinkableMapObj *lmo; insilmaril@40: for (int i=0; ifindMapObj(p, excludeLMO); insilmaril@40: if (lmo != NULL) return lmo; insilmaril@40: } insilmaril@40: insilmaril@40: insilmaril@40: // Search myself insilmaril@40: if (inBox (p,clickBox) && (this != excludeLMO) && isVisibleObj() ) insilmaril@40: return this; insilmaril@40: insilmaril@40: // Search float images insilmaril@40: for (int i=0; igetClickBox()) && insilmaril@40: (floatimage.at(i) != excludeLMO) && insilmaril@40: floatimage.at(i)->getParObj()!= excludeLMO && insilmaril@40: floatimage.at(i)->isVisibleObj() insilmaril@40: ) return floatimage.at(i); insilmaril@40: insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@40: LinkableMapObj* BranchObj::findID (QString sid) insilmaril@40: { insilmaril@40: // Search branches insilmaril@40: LinkableMapObj *lmo; insilmaril@40: for (int i=0; ifindID (sid); insilmaril@0: if (lmo != NULL) return lmo; insilmaril@0: } insilmaril@0: insilmaril@0: // Search myself insilmaril@40: if (sid==objID) return this; insilmaril@0: insilmaril@40: insilmaril@40: /* insilmaril@0: // Search float images insilmaril@40: for (int i=0; iinBox(p) && insilmaril@40: (floatimage.at(i) != excludeLMO) && insilmaril@40: floatimage.at(i)->getParObj()!= excludeLMO && insilmaril@40: floatimage.at(i)->isVisibleObj() insilmaril@40: ) return floatimage.at(i); insilmaril@40: */ insilmaril@0: return NULL; insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::setHeading(QString s) insilmaril@0: { insilmaril@0: heading->setText(s); // set new heading insilmaril@0: calcBBoxSize(); // recalculate bbox insilmaril@0: positionBBox(); // rearrange contents insilmaril@0: requestReposition(); insilmaril@0: } insilmaril@0: insilmaril@40: void BranchObj::setHideTmp (HideTmpMode mode) insilmaril@0: { insilmaril@40: if (mode==HideExport && (hideExport|| hasHiddenExportParent() ) ) insilmaril@40: { insilmaril@40: // Hide stuff according to hideExport flag and parents insilmaril@40: setVisibility (false); insilmaril@40: hidden=true; insilmaril@40: }else insilmaril@40: { insilmaril@40: // Do not hide, but still take care of scrolled status insilmaril@40: if (hasScrolledParent(this)) insilmaril@40: setVisibility (false); insilmaril@40: else insilmaril@40: setVisibility (true); insilmaril@40: hidden=false; insilmaril@40: } insilmaril@40: insilmaril@40: // And take care of my childs insilmaril@40: for (int i=0; isetHideTmp (mode); insilmaril@0: } insilmaril@0: insilmaril@40: bool BranchObj::hasHiddenExportParent() insilmaril@0: { insilmaril@40: // Calls parents recursivly to insilmaril@40: // find out, if we or parents are temp. hidden insilmaril@40: insilmaril@40: if (hidden || hideExport) return true; insilmaril@40: insilmaril@40: BranchObj* bo=(BranchObj*)parObj; insilmaril@40: if (bo) insilmaril@40: return bo->hasHiddenExportParent(); insilmaril@40: else insilmaril@40: return false; insilmaril@0: } insilmaril@0: insilmaril@40: QString BranchObj::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset) insilmaril@0: { insilmaril@40: // Cloudy stuff can be hidden during exports insilmaril@40: if (hidden) return ""; insilmaril@0: insilmaril@40: // Update of note is usually done while unselecting a branch insilmaril@40: if (isNoteInEditor) getNoteFromTextEditor(); insilmaril@40: insilmaril@0: QString s,a; insilmaril@0: QString scrolledAttr; insilmaril@0: if (scrolled) insilmaril@0: scrolledAttr=attribut ("scrolled","yes"); insilmaril@0: else insilmaril@0: scrolledAttr=""; insilmaril@0: insilmaril@0: // save area, if not scrolled insilmaril@0: QString areaAttr; insilmaril@0: if (!((BranchObj*)(parObj))->isScrolled() ) insilmaril@0: { insilmaril@0: areaAttr= insilmaril@40: attribut("x1",QString().setNum(absPos.x()-offset.x())) + insilmaril@40: attribut("y1",QString().setNum(absPos.y()-offset.y())) + insilmaril@40: attribut("x2",QString().setNum(absPos.x()+width()-offset.x())) + insilmaril@40: attribut("y2",QString().setNum(absPos.y()+height()-offset.y())); insilmaril@0: insilmaril@0: } else insilmaril@0: areaAttr=""; insilmaril@0: insilmaril@40: // Providing an ID for a branch makes export to XHTML easier insilmaril@40: QString idAttr; insilmaril@40: if (countXLinks()>0) insilmaril@40: idAttr=attribut ("id",mapEditor->getModel()->getSelectString(this)); //TODO directly access model insilmaril@40: else insilmaril@40: idAttr=""; insilmaril@40: insilmaril@40: s=beginElement ("branch" insilmaril@40: +getOrnXMLAttr() insilmaril@40: +scrolledAttr insilmaril@40: +areaAttr insilmaril@40: +idAttr insilmaril@40: +getIncludeImageAttr() ); insilmaril@0: incIndent(); insilmaril@0: insilmaril@0: // save heading insilmaril@40: s+=valueElement("heading", getHeading(), insilmaril@0: attribut ("textColor",QColor(heading->getColor()).name())); insilmaril@0: insilmaril@40: // Save frame insilmaril@40: if (frame->getFrameType()!=FrameObj::NoFrame) insilmaril@40: s+=frame->saveToDir (); insilmaril@40: insilmaril@0: // save names of flags set insilmaril@0: s+=standardFlags->saveToDir(tmpdir,prefix,0); insilmaril@0: insilmaril@40: // Save FloatImages insilmaril@40: for (int i=0; isaveToDir (tmpdir,prefix); insilmaril@40: insilmaril@0: // save note insilmaril@0: if (!note.isEmpty() ) insilmaril@0: s+=note.saveToDir(); insilmaril@0: insilmaril@0: // Save branches insilmaril@40: for (int i=0; isaveToDir(tmpdir,prefix,offset); insilmaril@40: insilmaril@40: // Save XLinks insilmaril@40: QString ol; // old link insilmaril@40: QString cl; // current link insilmaril@40: for (int i=0; isaveToDir(); insilmaril@40: if (cl!=ol) insilmaril@40: { insilmaril@40: s+=cl; insilmaril@40: ol=cl; insilmaril@40: } else insilmaril@40: { insilmaril@40: qWarning (QString("Ignoring of duplicate xLink in %1").arg(getHeading())); insilmaril@40: } insilmaril@40: } insilmaril@40: insilmaril@0: decIndent(); insilmaril@0: s+=endElement ("branch"); insilmaril@0: return s; insilmaril@0: } insilmaril@0: insilmaril@40: void BranchObj::addXLink (XLinkObj *xlo) insilmaril@0: { insilmaril@40: xlink.append (xlo); insilmaril@40: insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::removeXLinkRef (XLinkObj *xlo) insilmaril@40: { insilmaril@40: xlink.removeAt (xlink.indexOf(xlo)); insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::deleteXLink(XLinkObj *xlo) insilmaril@40: { insilmaril@40: xlo->deactivate(); insilmaril@40: if (!xlo->isUsed()) delete (xlo); insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::deleteXLinkAt (int i) insilmaril@40: { insilmaril@40: XLinkObj *xlo=xlink.at(i); insilmaril@40: xlo->deactivate(); insilmaril@40: if (!xlo->isUsed()) delete(xlo); insilmaril@40: } insilmaril@40: insilmaril@40: XLinkObj* BranchObj::XLinkAt (int i) insilmaril@40: { insilmaril@40: return xlink.at(i); insilmaril@40: } insilmaril@40: insilmaril@40: int BranchObj::countXLink() insilmaril@40: { insilmaril@40: return xlink.count(); insilmaril@40: } insilmaril@40: insilmaril@40: insilmaril@40: BranchObj* BranchObj::XLinkTargetAt (int i) insilmaril@40: { insilmaril@40: if (i>=0 && iotherBranch (this); insilmaril@40: } insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::setIncludeImagesVer(bool b) insilmaril@40: { insilmaril@40: includeImagesVer=b; insilmaril@40: calcBBoxSize(); insilmaril@40: positionBBox(); insilmaril@40: requestReposition(); insilmaril@40: } insilmaril@40: insilmaril@40: bool BranchObj::getIncludeImagesVer() insilmaril@40: { insilmaril@40: return includeImagesVer; insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::setIncludeImagesHor(bool b) insilmaril@40: { insilmaril@40: includeImagesHor=b; insilmaril@40: calcBBoxSize(); insilmaril@40: positionBBox(); insilmaril@40: requestReposition(); insilmaril@40: } insilmaril@40: insilmaril@40: bool BranchObj::getIncludeImagesHor() insilmaril@40: { insilmaril@40: return includeImagesHor; insilmaril@40: } insilmaril@40: insilmaril@40: QString BranchObj::getIncludeImageAttr() insilmaril@40: { insilmaril@40: QString a; insilmaril@40: if (includeImagesVer) insilmaril@40: a=attribut ("incImgV","true"); insilmaril@40: else insilmaril@40: a=attribut ("incImgV","false"); insilmaril@40: if (includeImagesHor) insilmaril@40: a+=attribut ("incImgH","true"); insilmaril@40: else insilmaril@40: a+=attribut ("incImgH","false"); insilmaril@40: return a; insilmaril@40: } insilmaril@40: insilmaril@40: FloatImageObj* BranchObj::addFloatImage () insilmaril@40: { insilmaril@40: FloatImageObj *newfi=new FloatImageObj (scene,this); insilmaril@0: floatimage.append (newfi); insilmaril@0: if (hasScrolledParent(this) ) insilmaril@0: newfi->setVisibility (false); insilmaril@0: else insilmaril@0: newfi->setVisibility(visible); insilmaril@40: /* insilmaril@40: calcBBoxSize(); insilmaril@40: positionBBox(); insilmaril@40: */ insilmaril@0: requestReposition(); insilmaril@0: return newfi; insilmaril@0: } insilmaril@0: insilmaril@40: FloatImageObj* BranchObj::addFloatImage (FloatImageObj *fio) insilmaril@0: { insilmaril@40: FloatImageObj *newfi=new FloatImageObj (scene,this); insilmaril@0: floatimage.append (newfi); insilmaril@0: newfi->copy (fio); insilmaril@0: if (hasScrolledParent(this) ) insilmaril@0: newfi->setVisibility (false); insilmaril@0: else insilmaril@0: newfi->setVisibility(visible); insilmaril@40: /* insilmaril@40: calcBBoxSize(); insilmaril@40: positionBBox(); insilmaril@40: */ insilmaril@0: requestReposition(); insilmaril@0: return newfi; insilmaril@0: } insilmaril@0: insilmaril@0: FloatImageObj* BranchObj::getFirstFloatImage () insilmaril@0: { insilmaril@0: return floatimage.first(); insilmaril@0: } insilmaril@0: insilmaril@0: FloatImageObj* BranchObj::getLastFloatImage () insilmaril@0: { insilmaril@0: return floatimage.last(); insilmaril@0: } insilmaril@0: insilmaril@0: FloatImageObj* BranchObj::getFloatImageNum (const uint &i) insilmaril@0: { insilmaril@0: return floatimage.at(i); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::removeFloatImage (FloatImageObj *fio) insilmaril@0: { insilmaril@40: int i=floatimage.indexOf (fio); insilmaril@40: if (i>-1) delete (floatimage.takeAt (i)); insilmaril@40: calcBBoxSize(); insilmaril@40: positionBBox(); insilmaril@0: requestReposition(); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::savePosInAngle () insilmaril@0: { insilmaril@0: // Save position in angle insilmaril@40: for (int i=0; iangle=i; insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::setDefAttr (BranchModification mod) insilmaril@40: { insilmaril@40: int fontsize; insilmaril@40: switch (depth) insilmaril@0: { insilmaril@40: case 0: fontsize=16; break; insilmaril@40: case 1: fontsize=12; break; insilmaril@40: default: fontsize=10; break; insilmaril@40: } insilmaril@40: insilmaril@40: setLinkColor (); insilmaril@40: setLinkStyle(getDefLinkStyle()); insilmaril@40: QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0"); insilmaril@40: font.setPointSize(fontsize); insilmaril@40: heading->setFont(font ); insilmaril@40: insilmaril@40: if (mod==NewBranch) insilmaril@40: setColor (((BranchObj*)(parObj))->getColor()); insilmaril@40: insilmaril@40: calcBBoxSize(); insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::addBranch() insilmaril@0: { insilmaril@40: BranchObj* newbo=new BranchObj(scene,this); insilmaril@0: branch.append (newbo); insilmaril@0: newbo->setParObj(this); insilmaril@40: newbo->setDefAttr(NewBranch); insilmaril@0: newbo->setHeading ("new"); insilmaril@0: if (scrolled) insilmaril@0: newbo->setVisibility (false); insilmaril@0: else insilmaril@0: newbo->setVisibility(visible); insilmaril@40: newbo->updateLink(); insilmaril@0: requestReposition(); insilmaril@0: return newbo; insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::addBranch(BranchObj* bo) insilmaril@0: { insilmaril@40: BranchObj* newbo=new BranchObj(scene,this); insilmaril@0: branch.append (newbo); insilmaril@0: newbo->copy(bo); insilmaril@0: newbo->setParObj(this); insilmaril@40: newbo->setDefAttr(MovedBranch); insilmaril@0: if (scrolled) insilmaril@0: newbo->setVisibility (false); insilmaril@0: else insilmaril@0: newbo->setVisibility(bo->visible); insilmaril@40: newbo->updateLink(); insilmaril@0: requestReposition(); insilmaril@0: return newbo; insilmaril@0: } insilmaril@0: insilmaril@40: BranchObj* BranchObj::addBranchPtr(BranchObj* bo) insilmaril@40: { insilmaril@40: branch.append (bo); insilmaril@40: bo->setParObj (this); insilmaril@40: bo->depth=depth+1; insilmaril@40: bo->setDefAttr(MovedBranch); insilmaril@40: if (scrolled) tmpUnscroll(); insilmaril@40: setLastSelectedBranch (bo); insilmaril@40: return bo; insilmaril@40: } insilmaril@40: insilmaril@0: BranchObj* BranchObj::insertBranch(int pos) insilmaril@0: { insilmaril@0: savePosInAngle(); insilmaril@0: // Add new bo and resort branches insilmaril@0: BranchObj *newbo=addBranch (); insilmaril@0: newbo->angle=pos-0.5; insilmaril@40: qSort (branch.begin(),branch.end(), isAbove); insilmaril@0: return newbo; insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::insertBranch(BranchObj* bo, int pos) insilmaril@0: { insilmaril@0: savePosInAngle(); insilmaril@0: // Add new bo and resort branches insilmaril@0: bo->angle=pos-0.5; insilmaril@0: BranchObj *newbo=addBranch (bo); insilmaril@40: qSort (branch.begin(),branch.end(), isAbove); insilmaril@0: return newbo; insilmaril@0: } insilmaril@0: insilmaril@40: BranchObj* BranchObj::insertBranchPtr (BranchObj* bo, int pos) insilmaril@40: { insilmaril@40: savePosInAngle(); insilmaril@40: // Add new bo and resort branches insilmaril@40: bo->angle=pos-0.5; insilmaril@40: branch.append (bo); insilmaril@40: bo->setParObj (this); insilmaril@40: bo->depth=depth+1; insilmaril@40: bo->setDefAttr (MovedBranch); insilmaril@40: if (scrolled) tmpUnscroll(); insilmaril@40: setLastSelectedBranch (bo); insilmaril@40: qSort (branch.begin(),branch.end(), isAbove); insilmaril@40: return bo; insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::removeBranchHere(BranchObj* borem) insilmaril@40: { insilmaril@40: // This removes the branch bo from list, but insilmaril@40: // inserts its childs at the place of bo insilmaril@40: BranchObj *bo; insilmaril@40: bo=borem->getLastBranch(); insilmaril@40: int pos=borem->getNum(); insilmaril@40: while (bo) insilmaril@40: { insilmaril@40: bo->linkTo (this,pos+1); insilmaril@40: bo=borem->getLastBranch(); insilmaril@40: } insilmaril@40: removeBranch (borem); insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::removeChilds() insilmaril@40: { insilmaril@40: clear(); insilmaril@40: } insilmaril@40: insilmaril@0: void BranchObj::removeBranch(BranchObj* bo) insilmaril@0: { insilmaril@0: // if bo is not in branch remove returns false, we insilmaril@0: // don't care... insilmaril@40: insilmaril@40: int i=branch.indexOf(bo); insilmaril@40: if (i>=0) insilmaril@40: { insilmaril@40: delete (bo); insilmaril@40: branch.removeAt (i); insilmaril@40: } else insilmaril@40: qWarning ("BranchObj::removeBranch tried to remove non existing branch?!\n"); insilmaril@40: requestReposition(); insilmaril@40: } insilmaril@40: insilmaril@40: void BranchObj::removeBranchPtr(BranchObj* bo) insilmaril@40: { insilmaril@40: int i=branch.indexOf(bo); insilmaril@40: insilmaril@40: if (i>=0) insilmaril@40: branch.removeAt (i); insilmaril@40: else insilmaril@40: qWarning ("BranchObj::removeBranchPtr tried to remove non existing branch?!\n"); insilmaril@0: requestReposition(); insilmaril@0: } insilmaril@0: insilmaril@0: void BranchObj::setLastSelectedBranch (BranchObj* bo) insilmaril@0: { insilmaril@40: lastSelectedBranch=branch.indexOf(bo); insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::getLastSelectedBranch () insilmaril@0: { insilmaril@40: if (lastSelectedBranch>=0) insilmaril@0: { insilmaril@40: if ( branch.size()>lastSelectedBranch) insilmaril@40: return branch.at(lastSelectedBranch); insilmaril@40: if (branch.size()>0) insilmaril@40: return branch.last(); insilmaril@40: } insilmaril@40: return NULL; insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::getFirstBranch () insilmaril@0: { insilmaril@40: if (branch.size()>0) insilmaril@40: return branch.first(); insilmaril@40: else insilmaril@40: return NULL; insilmaril@0: } insilmaril@0: insilmaril@0: BranchObj* BranchObj::getLastBranch () insilmaril@0: { insilmaril@40: if (branch.size()>0) insilmaril@40: return branch.last(); insilmaril@40: else insilmaril@40: return NULL; insilmaril@0: } insilmaril@0: insilmaril@40: BranchObj* BranchObj::getBranchNum (int i) insilmaril@0: { insilmaril@40: if (i>=0 && igetFirstBranch()) insilmaril@40: return false; insilmaril@40: else insilmaril@40: return true; insilmaril@40: } insilmaril@0: insilmaril@40: BranchObj* BranchObj::moveBranchUp(BranchObj* bo1) // modify my childlist insilmaril@0: { insilmaril@0: savePosInAngle(); insilmaril@40: int i=branch.indexOf(bo1); insilmaril@0: if (i>0) insilmaril@0: { // -1 if bo1 not found insilmaril@0: branch.at(i)->angle--; insilmaril@0: branch.at(i-1)->angle++; insilmaril@40: qSort (branch.begin(),branch.end(), isAbove); insilmaril@40: return branch.at(i); insilmaril@0: } else insilmaril@40: return NULL; insilmaril@0: } insilmaril@0: insilmaril@40: bool BranchObj::canMoveBranchDown() insilmaril@40: { insilmaril@40: if (!parObj|| depth==1) return false; insilmaril@40: BranchObj* par=(BranchObj*)parObj; insilmaril@40: if (this==par->getLastBranch()) insilmaril@40: return false; insilmaril@40: else insilmaril@40: return true; insilmaril@40: } insilmaril@40: insilmaril@40: BranchObj* BranchObj::moveBranchDown(BranchObj* bo1)// modify my childlist insilmaril@0: { insilmaril@0: savePosInAngle(); insilmaril@40: int i=branch.indexOf(bo1); insilmaril@0: int j; insilmaril@40: if (i angle++; insilmaril@0: branch.at(j)->angle--; insilmaril@40: qSort (branch.begin(),branch.end(), isAbove); insilmaril@40: return branch.at(i); insilmaril@0: } else insilmaril@40: return NULL; insilmaril@0: } insilmaril@0: insilmaril@40: void BranchObj::sortChildren() insilmaril@0: { insilmaril@40: int childCount=branch.count(); insilmaril@40: int curChildIndex; insilmaril@40: bool madeChanges=false; insilmaril@40: do insilmaril@40: { insilmaril@40: madeChanges=false; insilmaril@40: for(curChildIndex=1;curChildIndexheading->text().compare(curChild->heading->text())>0) insilmaril@40: { insilmaril@40: this->moveBranchUp(curChild); insilmaril@40: madeChanges=true; insilmaril@40: } insilmaril@40: } insilmaril@40: }while(madeChanges); insilmaril@40: } insilmaril@0: insilmaril@40: insilmaril@40: BranchObj* BranchObj::linkTo (BranchObj* dst, int pos) insilmaril@40: { insilmaril@40: // Find current parent and insilmaril@40: // remove pointer to myself there insilmaril@40: if (!dst) return NULL; insilmaril@40: BranchObj *par=(BranchObj*)parObj; insilmaril@40: if (par) insilmaril@40: par->removeBranchPtr (this); insilmaril@40: else insilmaril@40: return NULL; insilmaril@40: insilmaril@40: // Create new pointer to myself at dst insilmaril@40: if (pos<0||dst->getDepth()==0) insilmaril@40: { insilmaril@40: // links myself as last branch at dst insilmaril@40: dst->addBranchPtr (this); insilmaril@40: updateLink(); insilmaril@40: return this; insilmaril@40: } else insilmaril@40: { insilmaril@40: // inserts me at pos in parent of dst insilmaril@40: if (par) insilmaril@40: { insilmaril@40: BranchObj *bo=dst->insertBranchPtr (this,pos); insilmaril@40: bo->setDefAttr(MovedBranch); insilmaril@40: updateLink(); insilmaril@40: return bo; insilmaril@40: } else insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: } insilmaril@40: insilmaril@41: void BranchObj::alignRelativeTo (QPointF ref,bool alignSelf) insilmaril@40: { insilmaril@40: qreal th = bboxTotal.height(); insilmaril@40: // TODO testing insilmaril@40: /* insilmaril@40: QPointF pp; if (parObj) pp=parObj->getChildPos(); insilmaril@40: cout << "BO::alignRelTo "<