insilmaril@747: #include "branchitem.h" insilmaril@747: #include "branchobj.h" insilmaril@753: #include "vymmodel.h" insilmaril@747: insilmaril@747: #include insilmaril@753: #include insilmaril@753: insilmaril@747: using namespace std; insilmaril@747: insilmaril@747: BranchItem::BranchItem(const QList &data, TreeItem *parent):TreeItem (data,parent) insilmaril@747: { insilmaril@749: //cout << "Constr. BranchItem\n"; insilmaril@749: insilmaril@749: scrolled=false; insilmaril@749: tmpUnscrolled=false; insilmaril@760: type=Branch; insilmaril@747: } insilmaril@747: insilmaril@747: BranchItem::~BranchItem() insilmaril@747: { insilmaril@756: // cout << "Destr. BranchItem "<scrolled; insilmaril@749: tmpUnscrolled=other->tmpUnscrolled; insilmaril@749: } insilmaril@749: 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@756: branch->setModel (model); 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@768: /* insilmaril@768: // save area, if not scrolled // FIXME-3 not needed if HTML is rewritten... insilmaril@768: // also we should check if _any_ of parents is scrolled insilmaril@747: QString areaAttr; insilmaril@747: if (!((BranchObj*)(parObj))->isScrolled() ) insilmaril@747: { insilmaril@747: areaAttr= insilmaril@747: attribut("x1",QString().setNum(absPos.x()-offset.x())) + insilmaril@747: attribut("y1",QString().setNum(absPos.y()-offset.y())) + insilmaril@747: attribut("x2",QString().setNum(absPos.x()+width()-offset.x())) + insilmaril@747: attribut("y2",QString().setNum(absPos.y()+height()-offset.y())); insilmaril@747: insilmaril@747: } else insilmaril@747: areaAttr=""; insilmaril@747: insilmaril@747: // Providing an ID for a branch makes export to XHTML easier insilmaril@747: QString idAttr; insilmaril@747: if (countXLinks()>0) insilmaril@747: idAttr=attribut ("id",model->getSelectString(this)); //TODO directly access model insilmaril@747: else insilmaril@747: idAttr=""; insilmaril@747: insilmaril@747: */ insilmaril@747: s=beginElement ("branch" insilmaril@762: +getAttr() insilmaril@747: // +getOrnXMLAttr() insilmaril@768: +scrolledAttr insilmaril@747: // +areaAttr insilmaril@747: // +idAttr insilmaril@747: // +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@747: /* insilmaril@747: // Save frame insilmaril@747: if (frame->getFrameType()!=FrameObj::NoFrame) insilmaril@747: s+=frame->saveToDir (); insilmaril@768: */ insilmaril@747: insilmaril@747: // save names of flags set insilmaril@768: s+=standardFlags.saveToDir(tmpdir,prefix,0); insilmaril@747: insilmaril@768: /* insilmaril@747: // Save FloatImages insilmaril@747: for (int i=0; isaveToDir (tmpdir,prefix); insilmaril@747: */ 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@747: /* insilmaril@747: // Save XLinks insilmaril@747: QString ol; // old link insilmaril@747: QString cl; // current link insilmaril@747: 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: insilmaril@747: decIndent(); insilmaril@747: s+=endElement ("branch"); insilmaril@747: return s; insilmaril@747: } insilmaril@747: insilmaril@771: void BranchItem::updateVisibility() // FIXME-3 Check if this is needed after all... insilmaril@753: { insilmaril@753: } insilmaril@753: insilmaril@753: void BranchItem::setVymLink(QString s) insilmaril@753: { insilmaril@753: if (!s.isEmpty()) insilmaril@753: { insilmaril@753: // We need the relative (from loading) insilmaril@753: // or absolute path (from User event) insilmaril@753: // and build the absolute path. insilmaril@753: // Note: If we have relative, use path of insilmaril@753: // current map to build absolute path insilmaril@753: QDir d(s); insilmaril@753: if (!d.path().startsWith ("/")) insilmaril@753: { insilmaril@753: QString p=model->getDestPath(); insilmaril@753: int i=p.findRev("/",-1); insilmaril@753: d.setPath(p.left(i)+"/"+s); insilmaril@753: d.convertToAbs(); insilmaril@753: } insilmaril@753: vymLink=d.path(); insilmaril@753: //FIXME-2 systemFlags->activate("vymLink"); insilmaril@753: } insilmaril@753: else insilmaril@753: { insilmaril@753: //FIXME-2 systemFlags->deactivate("vymLink"); insilmaril@753: vymLink=""; insilmaril@753: } insilmaril@753: /* FIXME-2 insilmaril@753: calcBBoxSize(); // recalculate bbox insilmaril@753: positionBBox(); // rearrange contents insilmaril@753: forceReposition(); insilmaril@753: */ insilmaril@753: } insilmaril@753: insilmaril@753: QString BranchItem::getVymLink() insilmaril@753: { insilmaril@753: return vymLink; 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: insilmaril@767: if (!branchCount()>0) return false; 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@767: model->reposition(); 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@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@749: if (bi) insilmaril@749: return bi->hasScrolledParent(start); insilmaril@749: else insilmaril@749: return false; insilmaril@749: } insilmaril@749: insilmaril@749: void BranchItem::tmpUnscroll() insilmaril@749: { insilmaril@749: // Unscroll parent (recursivly) insilmaril@749: BranchItem * bi=(BranchItem*)parentItem; insilmaril@749: if (bi) bi->tmpUnscroll(); insilmaril@749: insilmaril@749: // Unscroll myself insilmaril@749: if (scrolled) insilmaril@749: { insilmaril@749: tmpUnscrolled=true; insilmaril@749: // FIXME-1 systemFlags->activate("tmpUnscrolledright"); insilmaril@749: toggleScroll(); insilmaril@749: } insilmaril@749: } insilmaril@749: insilmaril@749: void BranchItem::resetTmpUnscroll() insilmaril@749: { insilmaril@749: // Unscroll parent (recursivly) insilmaril@749: BranchItem * bi=(BranchItem*)parentItem; insilmaril@749: if (bi) bi->resetTmpUnscroll(); insilmaril@749: insilmaril@749: // Unscroll myself insilmaril@749: if (tmpUnscrolled) insilmaril@749: { insilmaril@749: tmpUnscrolled=false; insilmaril@749: // FIXME-1 systemFlags->deactivate("tmpUnscrolledright"); insilmaril@749: toggleScroll(); insilmaril@749: } insilmaril@749: } insilmaril@749: 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@754: /* FIXME-2 // Search float images insilmaril@754: for (int i=0; iisInClickBox(p) && insilmaril@758: (floatimage.at(i) != excludeTI) && insilmaril@758: floatimage.at(i)->getParObj()!= excludeTI && insilmaril@754: floatimage.at(i)->isVisibleObj() insilmaril@754: ) return floatimage.at(i)->getTreeItem(); insilmaril@754: */ insilmaril@754: return NULL; insilmaril@754: } insilmaril@754: insilmaril@754: TreeItem* BranchItem::findID (QString sid) 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@754: /* insilmaril@754: // 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: */ insilmaril@754: return NULL; insilmaril@754: } insilmaril@754: 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@755: BranchObj* BranchItem::createMapObj(QGraphicsScene *scene) insilmaril@755: { insilmaril@755: // Initialize BranchObj, order of things is important... insilmaril@755: BranchObj* newbo=new BranchObj(scene); insilmaril@760: lmo=newbo; insilmaril@755: newbo->setParObj(parent()->getLMO() ); insilmaril@755: newbo->setTreeItem (this); insilmaril@755: newbo->setDefAttr(BranchObj::NewBranch); insilmaril@758: insilmaril@760: initLMO(); insilmaril@758: insilmaril@758: if (!getHeading().isEmpty() ) insilmaril@758: { insilmaril@767: newbo->updateData(); //FIXME-3 maybe better model->emitDataHasChanged()? insilmaril@758: newbo->setColor (headingColor); insilmaril@758: } insilmaril@758: insilmaril@758: insilmaril@756: //newbo->updateLink(); //FIXME-3 insilmaril@755: insilmaril@755: return newbo; insilmaril@755: } insilmaril@755: