insilmaril@747: #include "branchitem.h" insilmaril@747: #include "branchobj.h" insilmaril@753: #include "vymmodel.h" insilmaril@790: #include "xlinkitem.h" insilmaril@747: insilmaril@747: #include insilmaril@753: #include insilmaril@753: insilmaril@747: using namespace std; insilmaril@747: insilmaril@779: BranchItem::BranchItem(const QList &data, TreeItem *parent):MapItem (data,parent) insilmaril@747: { insilmaril@749: //cout << "Constr. BranchItem\n"; insilmaril@749: insilmaril@791: // Set type if parent is known yet insilmaril@791: // if not, type is set in insertBranch or TreeItem::appendChild insilmaril@788: if (parent==rootItem) insilmaril@788: setType (MapCenter); insilmaril@788: else insilmaril@788: setType (Branch); insilmaril@788: insilmaril@749: scrolled=false; insilmaril@749: tmpUnscrolled=false; insilmaril@785: insilmaril@785: includeImagesVer=false; insilmaril@785: includeImagesHor=false; insilmaril@787: insilmaril@787: lastSelectedBranchNum=-1; insilmaril@787: lastSelectedBranchNumAlt=-1; insilmaril@747: } insilmaril@747: insilmaril@747: BranchItem::~BranchItem() insilmaril@747: { insilmaril@788: //cout << "Destr. BranchItem "<scrolled; insilmaril@749: tmpUnscrolled=other->tmpUnscrolled; insilmaril@749: } insilmaril@749: insilmaril@795: BranchItem* BranchItem::parentBranch () insilmaril@795: { insilmaril@795: return (BranchItem*) parentItem; insilmaril@795: } insilmaril@795: insilmaril@756: void BranchItem::insertBranch (int pos, BranchItem *branch) insilmaril@756: { insilmaril@756: if (pos<0) pos=0; insilmaril@756: if (pos>branchCounter) pos=branchCounter; insilmaril@756: childItems.insert(pos+branchOffset,branch); insilmaril@756: branch->parentItem=this; insilmaril@791: branch->rootItem=rootItem; insilmaril@756: branch->setModel (model); insilmaril@791: if (parentItem==rootItem) insilmaril@791: setType (MapCenter); insilmaril@791: else insilmaril@791: setType (Branch); insilmaril@791: insilmaril@756: insilmaril@756: if (branchCounter==0) insilmaril@756: branchOffset=childItems.count()-1; insilmaril@756: branchCounter++; insilmaril@756: } insilmaril@756: insilmaril@771: QString BranchItem::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset) //FIXME-3 Check if everything is saved... insilmaril@747: { insilmaril@747: // Cloudy stuff can be hidden during exports insilmaril@748: if (hidden) return QString(); insilmaril@747: insilmaril@747: QString s,a; insilmaril@747: BranchObj *bo=(BranchObj*)lmo; insilmaril@747: insilmaril@747: // Update of note is usually done while unselecting a branch insilmaril@747: insilmaril@747: QString scrolledAttr; insilmaril@747: if (scrolled) insilmaril@747: scrolledAttr=attribut ("scrolled","yes"); insilmaril@747: else insilmaril@747: scrolledAttr=""; insilmaril@747: insilmaril@775: // save area, if not scrolled // FIXME-5 not needed if HTML is rewritten... insilmaril@768: // also we should check if _any_ of parents is scrolled insilmaril@747: QString areaAttr; insilmaril@775: if (lmo && parentItem->isBranchLikeType() && !((BranchItem*)parentItem)->isScrolled() ) insilmaril@747: { insilmaril@775: qreal x=lmo->getAbsPos().x(); insilmaril@775: qreal y=lmo->getAbsPos().y(); insilmaril@747: areaAttr= insilmaril@775: attribut("x1",QString().setNum(x-offset.x())) + insilmaril@775: attribut("y1",QString().setNum(y-offset.y())) + insilmaril@775: attribut("x2",QString().setNum(x+lmo->width()-offset.x())) + insilmaril@775: attribut("y2",QString().setNum(y+lmo->height()-offset.y())); insilmaril@747: insilmaril@747: } else insilmaril@747: areaAttr=""; insilmaril@747: insilmaril@790: // Provide an ID for a branch makes export to XHTML easier insilmaril@747: QString idAttr; insilmaril@790: if (xlinkCount()>0) insilmaril@790: idAttr=attribut ("id",model->getSelectString(this)); insilmaril@747: else insilmaril@747: idAttr=""; insilmaril@747: insilmaril@773: QString elementName; insilmaril@773: if (parentItem==rootItem) insilmaril@773: elementName="mapcenter"; insilmaril@773: else insilmaril@773: elementName="branch"; insilmaril@773: insilmaril@773: s=beginElement (elementName insilmaril@779: +getMapAttr() insilmaril@779: +getGeneralAttr() insilmaril@768: +scrolledAttr insilmaril@790: // +areaAttr // FIXME-2 insilmaril@790: +idAttr insilmaril@785: +getIncludeImageAttr() insilmaril@747: ); insilmaril@747: incIndent(); insilmaril@747: insilmaril@747: // save heading insilmaril@747: s+=valueElement("heading", getHeading(), insilmaril@747: attribut ("textColor",QColor( bo->getColor()).name())); insilmaril@747: insilmaril@777: // Save frame //FIXME-4 not saved if there is no LMO insilmaril@777: if (lmo && ((OrnamentedObj*)lmo)->getFrame()->getFrameType()!=FrameObj::NoFrame) insilmaril@777: s+=((OrnamentedObj*)lmo)->getFrame()->saveToDir (); insilmaril@747: insilmaril@747: // save names of flags set insilmaril@768: s+=standardFlags.saveToDir(tmpdir,prefix,0); insilmaril@747: insilmaril@776: // Save Images insilmaril@776: for (int i=0; isaveToDir (tmpdir,prefix); insilmaril@747: insilmaril@747: // save note insilmaril@747: if (!note.isEmpty() ) insilmaril@747: s+=note.saveToDir(); insilmaril@747: insilmaril@747: // Save branches insilmaril@760: int i=0; insilmaril@760: TreeItem *ti=getBranchNum(i); insilmaril@760: while (ti) insilmaril@760: { insilmaril@760: s+=getBranchNum(i)->saveToDir(tmpdir,prefix,offset); insilmaril@760: i++; insilmaril@760: ti=getBranchNum(i); insilmaril@760: } insilmaril@747: insilmaril@790: // Save XLinks insilmaril@747: QString ol; // old link insilmaril@747: QString cl; // current link insilmaril@790: for (int i=0; isaveToDir(); insilmaril@747: if (cl!=ol) insilmaril@747: { insilmaril@747: s+=cl; insilmaril@747: ol=cl; insilmaril@747: } else insilmaril@747: { insilmaril@747: qWarning (QString("Ignoring of duplicate xLink in %1").arg(getHeading())); insilmaril@747: } insilmaril@747: } insilmaril@747: insilmaril@747: decIndent(); insilmaril@773: s+=endElement (elementName); insilmaril@747: return s; insilmaril@747: } insilmaril@747: insilmaril@781: void BranchItem::updateVisibility() insilmaril@753: { insilmaril@781: // Needed to hide relinked branch, if parent is scrolled insilmaril@781: if (lmo) insilmaril@819: { insilmaril@819: if (hasScrolledParent(this) || hidden) insilmaril@819: lmo->setVisibility (false); insilmaril@819: else insilmaril@819: lmo->setVisibility (true); insilmaril@819: } insilmaril@753: } insilmaril@753: insilmaril@758: void BranchItem::setHeadingColor (QColor color) insilmaril@758: { insilmaril@758: TreeItem::setHeadingColor (color); insilmaril@758: if (lmo) ((BranchObj*)lmo)->setColor (color); insilmaril@758: } insilmaril@758: insilmaril@749: void BranchItem::unScroll() insilmaril@749: { insilmaril@749: if (tmpUnscrolled) resetTmpUnscroll(); insilmaril@749: if (scrolled) toggleScroll(); insilmaril@749: } insilmaril@747: insilmaril@767: bool BranchItem::toggleScroll() insilmaril@749: { insilmaril@763: BranchObj *bo=NULL; insilmaril@749: if (scrolled) insilmaril@749: { insilmaril@749: scrolled=false; insilmaril@767: systemFlags.deactivate("system-scrolledright"); insilmaril@767: if (branchCounter>0) insilmaril@763: { insilmaril@767: for (int i=0;igetLMO()); insilmaril@767: if (bo) bo->setVisibility(true); insilmaril@767: } insilmaril@763: } insilmaril@749: } else insilmaril@749: { insilmaril@749: scrolled=true; insilmaril@767: systemFlags.activate("system-scrolledright"); insilmaril@767: if (branchCounter>0) insilmaril@763: { insilmaril@767: for (int i=0;igetLMO()); insilmaril@767: if (bo) bo->setVisibility(false); insilmaril@767: } insilmaril@763: } insilmaril@749: } insilmaril@795: //model->reposition(); // FIXME-3 we don't really want to update view from here... insilmaril@767: return true; insilmaril@749: } insilmaril@749: insilmaril@749: bool BranchItem::isScrolled() insilmaril@749: { insilmaril@749: return scrolled; insilmaril@749: } insilmaril@749: insilmaril@749: bool BranchItem::hasScrolledParent(BranchItem *start) insilmaril@749: { insilmaril@749: // Calls parents recursivly to insilmaril@749: // find out, if we are scrolled at all. insilmaril@749: // But ignore myself, just look at parents. insilmaril@749: insilmaril@749: if (this !=start && scrolled) return true; insilmaril@749: insilmaril@749: BranchItem* bi=(BranchItem*)parentItem; insilmaril@796: if (bi && bi!=rootItem ) insilmaril@749: return bi->hasScrolledParent(start); insilmaril@749: else insilmaril@749: return false; insilmaril@749: } insilmaril@749: insilmaril@796: bool BranchItem::tmpUnscroll() insilmaril@749: { insilmaril@796: bool result=false; insilmaril@796: insilmaril@749: // Unscroll parent (recursivly) insilmaril@775: BranchItem * pi=(BranchItem*)parentItem; insilmaril@796: if (pi && pi->isBranchLikeType() ) result=pi->tmpUnscroll(); insilmaril@749: insilmaril@749: // Unscroll myself insilmaril@749: if (scrolled) insilmaril@749: { insilmaril@749: tmpUnscrolled=true; insilmaril@775: systemFlags.activate("system-tmpUnscrolledRight"); insilmaril@749: toggleScroll(); insilmaril@775: model->emitDataHasChanged (this); insilmaril@796: result=true; insilmaril@749: } insilmaril@796: return result; insilmaril@749: } insilmaril@749: insilmaril@796: bool BranchItem::resetTmpUnscroll() insilmaril@749: { insilmaril@796: bool result=false; insilmaril@796: insilmaril@749: // Unscroll parent (recursivly) insilmaril@775: BranchItem * pi=(BranchItem*)parentItem; insilmaril@796: if (pi && pi->isBranchLikeType() ) result=pi->resetTmpUnscroll(); insilmaril@749: insilmaril@749: // Unscroll myself insilmaril@749: if (tmpUnscrolled) insilmaril@749: { insilmaril@749: tmpUnscrolled=false; insilmaril@775: systemFlags.deactivate("system-tmpUnscrolledRight"); insilmaril@749: toggleScroll(); insilmaril@775: model->emitDataHasChanged (this); insilmaril@796: result=true; insilmaril@749: } insilmaril@796: return result; insilmaril@749: } insilmaril@749: insilmaril@795: void BranchItem::sortChildren() insilmaril@795: { insilmaril@795: int childCount=branchCounter; insilmaril@795: int curChildIndex; insilmaril@795: bool madeChanges=false; insilmaril@795: do insilmaril@795: { insilmaril@795: madeChanges=false; insilmaril@795: for(curChildIndex=1;curChildIndexgetHeading().compare(curChild->getHeading())>0) insilmaril@795: { insilmaril@795: model->moveUp(curChild); insilmaril@795: madeChanges=true; insilmaril@795: } insilmaril@795: } insilmaril@795: }while(madeChanges); insilmaril@795: } insilmaril@795: insilmaril@785: void BranchItem::setIncludeImagesVer(bool b) insilmaril@785: { insilmaril@785: includeImagesVer=b; insilmaril@795: /* calcBBoxSize(); FIXME-3 insilmaril@785: positionBBox(); insilmaril@785: requestReposition(); insilmaril@785: */ insilmaril@785: } insilmaril@785: insilmaril@785: bool BranchItem::getIncludeImagesVer() insilmaril@785: { insilmaril@785: return includeImagesVer; insilmaril@785: } insilmaril@785: insilmaril@785: void BranchItem::setIncludeImagesHor(bool b) insilmaril@785: { insilmaril@785: includeImagesHor=b; insilmaril@795: /* calcBBoxSize(); FIXME-3 insilmaril@785: positionBBox(); insilmaril@785: requestReposition(); insilmaril@785: */ insilmaril@785: } insilmaril@785: insilmaril@785: bool BranchItem::getIncludeImagesHor() insilmaril@785: { insilmaril@785: return includeImagesHor; insilmaril@785: } insilmaril@785: insilmaril@785: QString BranchItem::getIncludeImageAttr() insilmaril@785: { insilmaril@785: QString a; insilmaril@785: if (includeImagesVer) insilmaril@785: a=attribut ("incImgV","true"); insilmaril@785: if (includeImagesHor) insilmaril@785: a+=attribut ("incImgH","true"); insilmaril@785: return a; insilmaril@785: } insilmaril@785: insilmaril@787: void BranchItem::setLastSelectedBranch() insilmaril@787: { insilmaril@787: int d=depth(); insilmaril@787: if (d>=0) insilmaril@787: { insilmaril@787: if (d==1) insilmaril@787: // Hack to save an additional lastSelected for mapcenters in MapEditor insilmaril@787: // depending on orientation insilmaril@787: // this allows to go both left and right from there insilmaril@787: if (lmo && lmo->getOrientation()==LinkableMapObj::LeftOfCenter) insilmaril@787: { insilmaril@787: ((BranchItem*)parentItem)->lastSelectedBranchNumAlt=parentItem->num(this); insilmaril@787: return; insilmaril@787: } insilmaril@787: ((BranchItem*)parentItem)->lastSelectedBranchNum=parentItem->num(this); insilmaril@787: } insilmaril@787: } insilmaril@787: insilmaril@787: void BranchItem::setLastSelectedBranch(int i) insilmaril@787: { insilmaril@787: lastSelectedBranchNum=i; insilmaril@787: } insilmaril@787: insilmaril@787: BranchItem* BranchItem::getLastSelectedBranch() insilmaril@787: { insilmaril@804: if (lastSelectedBranchNum>=branchCounter) insilmaril@804: return getBranchNum (branchCounter-1); insilmaril@804: else insilmaril@804: return getBranchNum (lastSelectedBranchNum); insilmaril@787: } insilmaril@787: insilmaril@787: BranchItem* BranchItem::getLastSelectedBranchAlt() insilmaril@787: { insilmaril@787: return getBranchNum (lastSelectedBranchNumAlt); insilmaril@787: } insilmaril@787: insilmaril@787: insilmaril@787: insilmaril@785: insilmaril@785: insilmaril@758: TreeItem* BranchItem::findMapItem (QPointF p, TreeItem* excludeTI) insilmaril@754: { insilmaril@754: // Search branches insilmaril@754: TreeItem *ti; insilmaril@754: for (int i=0; ifindMapItem(p, excludeTI); insilmaril@754: if (ti != NULL) return ti; insilmaril@754: } insilmaril@754: insilmaril@754: insilmaril@754: // Search myself insilmaril@758: if (getBranchObj()->isInClickBox (p) && (this != excludeTI) && getBranchObj()->isVisibleObj() ) insilmaril@754: return this; insilmaril@754: insilmaril@776: // Search images insilmaril@776: ImageItem *ii; insilmaril@776: for (int i=0; igetLMO(); insilmaril@776: if (mo && mo->isInClickBox(p) && insilmaril@776: (ii != excludeTI) && insilmaril@776: this!= excludeTI && insilmaril@776: mo->isVisibleObj() insilmaril@776: ) return ii; insilmaril@776: } insilmaril@776: return NULL; insilmaril@754: } insilmaril@795: /* insilmaril@790: TreeItem* BranchItem::findID (QString sid) //FIXME-3 move to TreeItem //FIXME-4 search images insilmaril@754: { insilmaril@754: // Search branches insilmaril@754: TreeItem *ti; insilmaril@754: for (int i=0; ifindID (sid); insilmaril@754: if (ti != NULL) return ti; insilmaril@754: } insilmaril@754: insilmaril@754: // Search myself insilmaril@754: if (sid==objID) return this; insilmaril@754: insilmaril@754: insilmaril@790: // Search float images insilmaril@754: for (int i=0; iinBox(p) && insilmaril@754: (floatimage.at(i) != excludeLMO) && insilmaril@754: floatimage.at(i)->getParObj()!= excludeLMO && insilmaril@754: floatimage.at(i)->isVisibleObj() insilmaril@754: ) return floatimage.at(i); insilmaril@754: return NULL; insilmaril@754: } insilmaril@795: */ insilmaril@773: void BranchItem::updateStyles() insilmaril@773: { insilmaril@773: // FIXME-5 compare also MapItem::initLMO... insilmaril@773: insilmaril@798: if (lmo) insilmaril@798: { insilmaril@798: if ( parentItem != rootItem) insilmaril@798: lmo->setParObj ( ((MapItem*)parentItem)->getLMO() ); insilmaril@798: else insilmaril@798: lmo->setParObj (NULL); insilmaril@798: ((BranchObj*)lmo)->setDefAttr(BranchObj::MovedBranch); insilmaril@773: } insilmaril@773: } insilmaril@754: insilmaril@750: BranchObj* BranchItem::getBranchObj() // FIXME-3 only for transition BO->BI insilmaril@750: { insilmaril@750: return (BranchObj*)lmo; insilmaril@750: } insilmaril@749: insilmaril@786: BranchObj* BranchItem::createMapObj(QGraphicsScene *scene) // FIXME-4 maybe move this into MapEditor to get rid of scene in VymModel? insilmaril@755: { insilmaril@773: BranchObj *newbo; insilmaril@790: newbo=new BranchObj(scene,this); insilmaril@775: lmo=newbo; insilmaril@775: insilmaril@773: if (parentItem==rootItem) insilmaril@773: { insilmaril@773: newbo->setParObj(NULL); insilmaril@798: //newbo->setFrameType (FrameObj::Rectangle); //FIXME-4 maybe call updateStyles? insilmaril@773: } else insilmaril@773: { insilmaril@779: newbo->setParObj( ((MapItem*)parentItem)->getLMO() ); insilmaril@775: // Set visibility depending on parents insilmaril@791: if (parentItem!=rootItem && insilmaril@791: ( ((BranchItem*)parentItem)->scrolled || !((MapItem*)parentItem)->getLMO()->isVisibleObj() ) ) insilmaril@775: newbo->setVisibility (false); insilmaril@773: } insilmaril@775: newbo->setDefAttr(BranchObj::NewBranch); insilmaril@760: initLMO(); insilmaril@758: insilmaril@758: if (!getHeading().isEmpty() ) insilmaril@758: { insilmaril@775: newbo->updateData(); //FIXME-3 maybe better model->emitDataHasChanged()? insilmaril@775: newbo->setColor (headingColor); insilmaril@758: } insilmaril@758: insilmaril@779: //newbo->updateLinkGeometry(); //FIXME-3 insilmaril@755: insilmaril@755: return newbo; insilmaril@755: } insilmaril@755: