4 #include "attributeitem.h"
6 #include "branchitem.h"
14 extern FlagRow* standardFlagsMaster;
16 uint TreeItem::idLast=0; // Create instance
20 cout << "Constr. TI this="<<this<<endl;
27 TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
29 //cout << "Constructor TreeItem this="<<this<<" parent="<<parent<<endl;
36 rootItem=parentItem->rootItem;
41 //cout << "Destructor TreeItem "<<getHeadingStd()<<endl;
43 while (!childItems.isEmpty())
45 ti=childItems.takeFirst();
55 // Reset ID //FIXME-2 compare objID (string), so far only used for xLinks during load/save (Id=selString)
72 // note.setFontHint (textEditor->getFontHintDefault() ); //FIXME-3
73 // isNoteInEditor=false;
78 standardFlags.setMasterRow (standardFlagsMaster);
82 void TreeItem::setModel (VymModel *m)
87 VymModel* TreeItem::getModel ()
92 int TreeItem::getRowNumAppend (TreeItem *item)
96 case Attribute: return attributeOffset + attributeCounter;
97 case XLink: return xlinkOffset + xlinkCounter;
98 case Image: return imageOffset + imageCounter;
99 case MapCenter: return branchOffset + branchCounter;
100 case Branch: return branchOffset + branchCounter;
105 void TreeItem::appendChild(TreeItem *item)
107 item->parentItem=this;
108 item->rootItem=rootItem;
109 item->setModel (model);
111 if (item->type == Attribute)
113 // attribute are on top of list
114 childItems.insert (attributeCounter,item);
121 if (item->type == XLink)
123 childItems.insert (xlinkCounter+xlinkOffset,item);
129 if (item->type == Image)
131 childItems.insert (imageCounter+imageOffset,item);
136 if (item->isBranchLikeType())
138 // branches are on bottom of list
139 childItems.append(item);
142 // Set correct type //FIXME-3 DUP in constr branchitem
144 item->setType(MapCenter);
146 item->setType (Branch);
150 void TreeItem::removeChild(int row)
152 if (row<0 || row > childItems.size()-1)
153 qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
156 if (childItems.at(row)->type==Attribute)
163 if (childItems.at(row)->type==XLink)
169 if (childItems.at(row)->type==Image)
174 if (childItems.at(row)->isBranchLikeType())
177 childItems.removeAt (row);
181 TreeItem *TreeItem::child(int row)
183 return childItems.value(row);
186 int TreeItem::childCount() const
188 return childItems.count();
191 int TreeItem::childNumber() const
194 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
199 int TreeItem::columnCount() const
204 int TreeItem::branchCount() const
206 return branchCounter;
209 int TreeItem::imageCount() const
214 int TreeItem::xlinkCount() const
219 int TreeItem::attributeCount() const
221 return attributeCounter;
224 int TreeItem::row() const
227 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
229 cout << "TI::row() pI=NULL this="<<this<<" ***************\n";
233 int TreeItem::depth()
247 TreeItem *TreeItem::parent()
249 //cout << "TI::parent of "<<getHeadingStd()<<" is "<<parentItem<<endl;
253 int TreeItem::childNum()
255 return parentItem->childItems.indexOf (this);
260 if (!parentItem) return -1;
261 return parentItem->num (this);
264 int TreeItem::num (TreeItem *item)
266 if (!item) return -1;
267 if (!childItems.contains(item)) return -1;
268 switch (item->getType())
270 case MapCenter: return childItems.indexOf (item) - branchOffset;
271 case Branch: return childItems.indexOf (item) - branchOffset;
272 case Image: return childItems.indexOf (item) - imageOffset;
273 case Attribute: return childItems.indexOf (item) - attributeOffset;
274 case XLink: return childItems.indexOf (item) - xlinkOffset;
278 void TreeItem::setType(const Type t)
281 itemData[1]=getTypeName();
284 TreeItem::Type TreeItem::getType()
286 if (type==Branch && depth()==0) return MapCenter; //FIXME-3 should not be necesssary
290 bool TreeItem::isBranchLikeType() const
292 if (type==Branch ||type==MapCenter) return true;
296 QString TreeItem::getTypeName()
300 case Undefined: return QString ("Undefined");
301 case MapCenter: return QString ("MapCenter");
302 case Branch: return QString ("Branch");
303 case Image: return QString ("Image");
304 case Attribute: return QString ("Attribute");
305 case XLink: return QString ("XLink");
306 default: return QString ("TreeItem::getTypeName no typename defined?!");
311 QVariant TreeItem::data(int column) const
313 return itemData.value(column);
316 void TreeItem::setHeading (const QString s)
321 QString TreeItem::getHeading () const
323 return itemData[0].toString();
326 std::string TreeItem::getHeadingStd () const
328 return itemData[0].toString().toStdString();
331 void TreeItem::setHeadingColor (QColor color)
336 QColor TreeItem::getHeadingColor ()
341 void TreeItem::setURL (const QString &u)
345 systemFlags.activate ("system-url");
347 systemFlags.deactivate ("system-url");
350 QString TreeItem::getURL ()
355 void TreeItem::setVymLink (const QString &vl)
359 // We need the relative (from loading)
360 // or absolute path (from User event)
361 // and build the absolute path.
362 // Note: If we have relative, use path of
363 // current map to build absolute path
365 if (!d.path().startsWith ("/"))
367 QString p=model->getDestPath();
368 int i=p.findRev("/",-1);
369 d.setPath(p.left(i)+"/"+vl);
373 systemFlags.activate("system-vymLink");
377 systemFlags.deactivate("system-vymLink");
382 QString TreeItem::getVymLink ()
387 void TreeItem::setNote(const QString &s)
394 void TreeItem::clearNote()
397 systemFlags.deactivate ("system-note");
400 void TreeItem::setNoteObj(const NoteObj &n){
402 if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
403 systemFlags.activate ("system-note");
404 if (note.isEmpty() && systemFlags.isActive ("system-note"))
405 systemFlags.deactivate ("system-note");
408 QString TreeItem::getNote()
410 return note.getNote();
413 bool TreeItem::hasEmptyNote()
415 return note.isEmpty();
418 NoteObj TreeItem::getNoteObj()
423 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
425 return note.getNoteASCII(indent,width);
428 QString TreeItem::getNoteASCII()
430 return note.getNoteASCII();
433 QString TreeItem::getNoteOpenDoc()
435 return note.getNoteOpenDoc();
438 void TreeItem::activateStandardFlag (const QString &name)
440 standardFlags.activate (name);
441 model->emitDataHasChanged(this);
444 void TreeItem::deactivateStandardFlag (const QString &name)
446 standardFlags.deactivate (name);
447 model->emitDataHasChanged(this);
450 void TreeItem::deactivateAllStandardFlags ()
452 standardFlags.deactivateAll ();
453 model->emitDataHasChanged(this);
456 void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
458 standardFlags.toggle (name,master);
459 model->emitDataHasChanged(this);
462 bool TreeItem::isActiveStandardFlag (const QString &name)
464 return standardFlags.isActive (name);
467 QStringList TreeItem::activeStandardFlagNames ()
469 return standardFlags.activeFlagNames();
472 FlagRow* TreeItem::getStandardFlagRow()
474 return &standardFlags;
477 QStringList TreeItem::activeSystemFlagNames ()
479 return systemFlags.activeFlagNames();
482 bool TreeItem::canMoveDown()
486 case Undefined: return false;
489 if (!parentItem) return false;
490 if (parentItem->num (this) < parentItem->branchCount()-1)
495 case Image: return false;
496 default: return false;
500 bool TreeItem::canMoveUp()
506 if (!parentItem) return false;
507 if (parentItem->num (this) > 0)
512 default: return false;
516 uint TreeItem::getID()
521 TreeItem* TreeItem::findID (const uint &n)
523 if (n>=0 && n<childItems.count() )
525 for (int i=0;i<childItems.count(); i++)
526 if (n==childItems.at(i)->id)
527 return childItems.at(n);
534 TreeItem* TreeItem::getChildNum(const int &n)
536 if (n>=0 && n<childItems.count() )
537 return childItems.at(n);
542 BranchItem* TreeItem::getFirstBranch()
545 return getBranchNum (0);
550 BranchItem* TreeItem::getLastBranch()
553 return getBranchNum (branchCounter-1);
558 BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
560 if (!currentBranch) return NULL;
561 int n=num (currentBranch)+1;
563 return getBranchNum (branchOffset + n);
569 BranchItem* TreeItem::getBranchNum(const int &n)
571 if (n>=0 && n<branchCounter)
572 return (BranchItem*)getChildNum (branchOffset + n);
577 BranchObj* TreeItem::getBranchObjNum(const int &n)
579 if (n>=0 && n<branchCounter)
581 return (BranchObj*)(getBranchNum(n)->getLMO());
586 ImageItem* TreeItem::getImageNum (const int &n)
588 if (n>=0 && n<imageCounter)
589 return (ImageItem*)getChildNum (imageOffset + n);
594 FloatImageObj* TreeItem::getImageObjNum (const int &n) // FIXME-5 what about SVGs later?
597 return (FloatImageObj*)(getImageNum(n)->getLMO());
602 AttributeItem* TreeItem::getAttributeNum (const int &n)
604 if (n>=0 && n<attributeCounter)
605 return (AttributeItem*)getChildNum (attributeOffset + n);
610 XLinkItem* TreeItem::getXLinkNum (const int &n)
612 if (n>=0 && n<xlinkCounter )
613 return (XLinkItem*)getChildNum (xlinkOffset +n);
619 XLinkObj* TreeItem::getXLinkObjNum (const int &n)
623 XLinkItem *xli=getXLinkNum (n);
624 if (!xli) return NULL;
626 return (XLinkObj*)(xli->getLMO());
629 xli=xli->getPartnerXLink();
630 if (!xli) return NULL;
631 return (XLinkObj*)(xli->getLMO());
638 void TreeItem::setHideTmp (HideTmpMode mode) //FIXME-2 update visibility in derived objects
640 if (type==Image || type==Branch || type==MapCenter)
641 // ((ImageItem*)this)->updateVisibility();
643 LinkableMapObj* lmo=((MapItem*)this)->getLMO();
645 if (mode==HideExport && (hideExport || hasHiddenExportParent() ) ) // FIXME-2 try to avoid calling hasScrolledParent repeatedly
648 // Hide stuff according to hideExport flag and parents
650 //if (lmo) lmo->setVisibility (false);
651 updateVisibility(); // FIXME-3 missing for images
654 // Do not hide, but still take care of scrolled status
658 // And take care of my children
659 for (int i=0; i<branchCount(); ++i)
660 getBranchNum(i)->setHideTmp (mode);
664 bool TreeItem::hasHiddenExportParent()
666 // Calls parents recursivly to
667 // find out, if we or parents are temp. hidden
669 if (hidden || hideExport) return true;
672 return parentItem->hasHiddenExportParent();
678 void TreeItem::setHideInExport(bool b)
680 if (type==MapCenter ||type==Branch || type==Image)
684 systemFlags.activate("system-hideInExport");
686 systemFlags.deactivate("system-hideInExport");
690 bool TreeItem::hideInExport()
695 void TreeItem::updateVisibility()
697 // overloaded in derived objects
700 bool TreeItem::isHidden()
705 QString TreeItem::getGeneralAttr()
709 s+=attribut("hideInExport","true");
711 s+=attribut ("url",url);
712 if (!vymLink.isEmpty())
713 s+=attribut ("vymLink",convertToRel (model->getDestPath(),vymLink));