7 #include "branchitem.h"
12 extern FlagRow* standardFlagsMaster;
16 //cout << "Constr. TI\n";
23 TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
25 //cout << "Constructor TreeItem this="<<this<<" parent="<<parent<<endl;
32 rootItem=parentItem->rootItem;
37 //cout << "Destructor TreeItem "<<getHeadingStd()<<endl;
39 while (!childItems.isEmpty())
41 ti=childItems.takeFirst();
42 switch (ti->getType() )
44 case TreeItem::MapCenter:
45 delete (BranchItem*)ti;
47 case TreeItem::Branch:
48 delete (BranchItem*)ti;
64 QList<QVariant> cData;
65 itemData<< "VM:addMapCenter" << "undef"<<"undef";
78 // note.setFontHint (textEditor->getFontHintDefault() ); //FIXME-3
79 // isNoteInEditor=false;
87 standardFlags.setMasterRow (standardFlagsMaster);
92 void TreeItem::copy (OrnamentedObj* other) //FIXME-3 probably need deep copy of branches and data!
95 note.copy (other->note);
102 void TreeItem::setModel (VymModel *m)
107 VymModel* TreeItem::getModel ()
112 int TreeItem::getRowNumAppend (TreeItem *item)
116 case Attribute: return attributeOffset + attributeCounter;
117 case Image: return imageOffset + imageCounter;
118 case MapCenter: return branchOffset + branchCounter;
119 case Branch: return branchOffset + branchCounter;
124 void TreeItem::appendChild(TreeItem *item)
126 item->parentItem=this;
127 item->rootItem=rootItem;
128 item->setModel (model);
130 if (item->type == Attribute)
132 // attribute are on top of list
133 childItems.insert (attributeCounter,item);
139 if (item->type == Image)
141 childItems.insert (imageCounter+imageOffset,item);
146 if (item->isBranchLikeType())
148 // branches are on bottom of list
149 childItems.append(item);
154 void TreeItem::removeChild(int row)
156 if (row<0 || row > childItems.size()-1)
157 qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
160 if (childItems.at(row)->type==Attribute)
166 if (childItems.at(row)->type==Image)
171 if (childItems.at(row)->isBranchLikeType())
174 childItems.removeAt (row);
178 void TreeItem::removeChildBranches()
180 while ( childItems.size()>0)
183 childItems.removeAt (0);
187 TreeItem *TreeItem::child(int row)
189 return childItems.value(row);
192 int TreeItem::childCount() const
194 return childItems.count();
197 int TreeItem::childNumber() const
200 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
205 int TreeItem::columnCount() const
207 return itemData.count();
210 int TreeItem::branchCount() const
212 return branchCounter;
215 int TreeItem::imageCount() const
220 int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?)
223 return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated...
226 int TreeItem::attributeCount() const
228 return attributeCounter;
231 int TreeItem::row() const
234 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
239 int TreeItem::column() const
244 int TreeItem::depth()
258 TreeItem *TreeItem::parent()
263 int TreeItem::childNum()
265 return parentItem->childItems.indexOf (this);
272 case MapCenter: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
273 case Branch: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
274 case Image: return parentItem->childItems.indexOf (this) - parentItem->imageOffset;
275 case Attribute: return parentItem->childItems.indexOf (this) - parentItem->attributeOffset;
280 int TreeItem::num (TreeItem *item)
282 if (!item) return -1;
283 if (!childItems.contains(item)) return -1;
284 switch (item->getType())
286 case MapCenter: return childItems.indexOf (item) - branchOffset;
287 case Branch: return childItems.indexOf (item) - branchOffset;
288 case Image: return parentItem->childItems.indexOf (item) - imageOffset;
289 case Attribute: return parentItem->childItems.indexOf (item) - attributeOffset;
293 void TreeItem::setType(const Type t)
296 itemData[1]=getTypeName();
299 TreeItem::Type TreeItem::getType()
301 if (type==Branch && depth()==0) return MapCenter;
305 bool TreeItem::isBranchLikeType() const
307 if (type==Branch ||type==MapCenter) return true;
311 QString TreeItem::getTypeName()
315 case Undefined: return QString ("Undefined");
316 case MapCenter: return QString ("MapCenter");
317 case Branch: return QString ("Branch");
318 case Image: return QString ("Image");
319 default: return QString ("TreeItem::getTypeName no typename defined?!");
324 QVariant TreeItem::data(int column) const
326 return itemData.value(column);
329 void TreeItem::setHeading (const QString s)
334 QString TreeItem::getHeading () const
336 return itemData[0].toString();
339 std::string TreeItem::getHeadingStd () const
341 return itemData[0].toString().toStdString();
344 void TreeItem::setHeadingColor (QColor color)
349 QColor TreeItem::getHeadingColor ()
354 void TreeItem::setURL (const QString &u)
358 systemFlags.activate ("system-url");
360 systemFlags.deactivate ("system-url");
363 QString TreeItem::getURL ()
368 void TreeItem::setVymLink (const QString &vl)
372 // We need the relative (from loading)
373 // or absolute path (from User event)
374 // and build the absolute path.
375 // Note: If we have relative, use path of
376 // current map to build absolute path
378 if (!d.path().startsWith ("/"))
380 QString p=model->getDestPath();
381 int i=p.findRev("/",-1);
382 d.setPath(p.left(i)+"/"+vl);
386 systemFlags.activate("system-vymLink");
390 systemFlags.deactivate("system-vymLink");
395 QString TreeItem::getVymLink ()
400 void TreeItem::setNote(const QString &s)
404 setNoteObj (n,false);
407 void TreeItem::clearNote()
410 systemFlags.deactivate ("system-note");
413 void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor){
415 if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
416 systemFlags.activate ("system-note");
417 if (note.isEmpty() && systemFlags.isActive ("system-note"))
418 systemFlags.deactivate ("system-note");
421 QString TreeItem::getNote()
423 return note.getNote();
426 bool TreeItem::hasEmptyNote()
428 return note.isEmpty();
431 NoteObj TreeItem::getNoteObj()
436 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
438 return note.getNoteASCII(indent,width);
441 QString TreeItem::getNoteASCII()
443 return note.getNoteASCII();
446 QString TreeItem::getNoteOpenDoc()
448 return note.getNoteOpenDoc();
451 void TreeItem::activateStandardFlag (const QString &name)
453 standardFlags.activate (name);
454 model->emitDataHasChanged(this);
457 void TreeItem::deactivateStandardFlag (const QString &name)
459 standardFlags.deactivate (name);
460 model->emitDataHasChanged(this);
463 void TreeItem::deactivateAllStandardFlags ()
465 standardFlags.deactivateAll ();
466 model->emitDataHasChanged(this);
469 void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
471 standardFlags.toggle (name,master);
472 model->emitDataHasChanged(this);
475 bool TreeItem::isActiveStandardFlag (const QString &name)
477 return standardFlags.isActive (name);
480 QStringList TreeItem::activeStandardFlagNames ()
482 return standardFlags.activeFlagNames();
485 FlagRow* TreeItem::getStandardFlagRow()
487 return &standardFlags;
490 /* FIXME-3 void TreeItem::updateToolBar()
492 standardFlags.updateToolBar();
495 QStringList TreeItem::activeSystemFlagNames ()
497 return systemFlags.activeFlagNames();
500 bool TreeItem::canMoveDown()
504 case Undefined: return false;
507 if (!parentItem) return false;
508 if (parentItem->num (this) < parentItem->branchCount()-1)
513 case Image: return false;
514 default: return false;
518 bool TreeItem::canMoveUp()
522 case Undefined: return false;
525 if (!parentItem) return false;
526 if (parentItem->num (this) > 0)
531 case Image: return false;
532 default: return false;
536 void TreeItem::setID (const QString &s)
541 QString TreeItem::getID()
547 TreeItem* TreeItem::getChildNum(const int &n)
549 if (n>=0 && n<childItems.count() )
550 return childItems.at(n);
555 BranchItem* TreeItem::getFirstBranch()
558 return getBranchNum (branchOffset);
563 BranchItem* TreeItem::getLastBranch()
566 return getBranchNum (branchOffset + branchCounter-1);
571 BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
573 if (!currentBranch) return NULL;
574 int n=num (currentBranch)+1;
576 return getBranchNum (branchOffset + n);
582 BranchItem* TreeItem::getBranchNum(const int &n)
584 if (n>=0 && n<branchCounter)
585 return (BranchItem*)getChildNum (branchOffset + n);
590 BranchObj* TreeItem::getBranchObjNum(const int &n)
592 if (n>=0 && n<branchCounter)
594 return (BranchObj*)(getBranchNum(n)->getLMO());
599 ImageItem* TreeItem::getImageNum (const int &n)
601 if (n>=0 && n<imageCounter)
602 return (ImageItem*)getChildNum (imageOffset + n);
607 FloatImageObj* TreeItem::getImageObjNum (const int &n) // FIXME-5 what about SVGs later?
610 return (FloatImageObj*)(getImageNum(n)->getLMO());
616 void TreeItem::setHideTmp (HideTmpMode mode) //FIXME-2
618 if (isBranchLikeType() )
619 ((BranchItem*)this)->updateVisibility();
622 //updateVisibility();
627 if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
629 // Hide stuff according to hideExport flag and parents
630 //setVisibility (false);
632 //FIXME-2 hidden=true;
635 // Do not hide, but still take care of scrolled status
638 XXXXXXXX treeItem should be THIS
640 move visible to TreeItem???
642 BranchObj now has updateContents
644 maybe also start "bool TreeItem::branchlikeType"
648 if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
649 setVisibility (false);
651 setVisibility (true);
652 //FIXME-2 hidden=false;
656 // And take care of my children
657 for (int i=0; i<branchCount(); ++i)
658 getBranchNum(i)->setHideTmp (mode);
661 bool TreeItem::hasHiddenExportParent()
663 // Calls parents recursivly to
664 // find out, if we or parents are temp. hidden
666 if (hidden || hideExport) return true;
669 return parentItem->hasHiddenExportParent();
675 void TreeItem::setHideInExport(bool b)
677 if (type==Branch || type==Image)
681 systemFlags.activate("system-hideInExport");
683 systemFlags.deactivate("system-hideInExport");
687 bool TreeItem::hideInExport()
692 bool TreeItem::isHidden()
697 QString TreeItem::getGeneralAttr()
701 s+=attribut("hideInExport","true");
703 s+=attribut ("url",url);
704 if (!vymLink.isEmpty())
705 s+=attribut ("vymLink",vymLink);