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";
70 lastSelectedBranchNum=-1;
76 // note.setFontHint (textEditor->getFontHintDefault() ); //FIXME-2
77 // isNoteInEditor=false;
85 standardFlags.setMasterRow (standardFlagsMaster);
90 void TreeItem::copy (OrnamentedObj* other) //FIXME-2 probably need deep copy of branches and data!
93 note.copy (other->note);
100 void TreeItem::setModel (VymModel *m)
105 VymModel* TreeItem::getModel ()
110 int TreeItem::getRowNumAppend (TreeItem *item)
114 case MapCenter: return branchOffset + branchCounter;
115 case Branch: return branchOffset + branchCounter;
116 case Image: return imageOffset + imageCounter;
121 void TreeItem::appendChild(TreeItem *item)
123 item->parentItem=this;
124 item->rootItem=rootItem;
125 item->setModel (model);
127 if (item->type == Image)
129 childItems.insert (imageCounter,item);
130 // images are on top of list
137 if (item->isBranchLikeType())
139 // branches are on bottom of list
140 childItems.append(item);
141 if (branchCounter==0)
142 branchOffset=childItems.count()-1;
147 void TreeItem::removeChild(int row)
149 if (row<0 || row > childItems.size()-1)
150 qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
153 if (childItems.at(row)->isBranchLikeType())
155 if (childItems.at(row)->type==Image)
161 childItems.removeAt (row);
165 void TreeItem::removeChildBranches()
167 while ( childItems.size()>0)
170 childItems.removeAt (0);
174 TreeItem *TreeItem::child(int row)
176 return childItems.value(row);
179 int TreeItem::childCount() const
181 return childItems.count();
184 int TreeItem::childNumber() const
187 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
192 int TreeItem::columnCount() const
194 return itemData.count();
197 int TreeItem::branchCount() const
199 return branchCounter;
202 int TreeItem::imageCount() const
207 int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?)
210 return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated...
213 int TreeItem::row() const
216 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
221 int TreeItem::column() const
226 int TreeItem::depth()
238 TreeItem *TreeItem::parent()
243 int TreeItem::childNum()
245 return parentItem->childItems.indexOf (this);
252 case MapCenter: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
253 case Branch: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
254 case Image: return parentItem->childItems.indexOf (this) - parentItem->imageOffset;
259 int TreeItem::num (TreeItem *item)
261 if (!item) return -1;
262 if (!childItems.contains(item)) return -1;
263 switch (item->getType())
265 case MapCenter: return childItems.indexOf (item) - branchOffset;
266 case Branch: return childItems.indexOf (item) - branchOffset;
267 case Image: return parentItem->childItems.indexOf (item) - imageOffset;
271 void TreeItem::setType(const Type t)
274 itemData[1]=getTypeName();
277 TreeItem::Type TreeItem::getType()
282 bool TreeItem::isBranchLikeType() const
284 if (type==Branch ||type==MapCenter) return true;
288 QString TreeItem::getTypeName()
292 case Undefined: return QString ("Undefined");
293 case MapCenter: return QString ("MapCenter");
294 case Branch: return QString ("Branch");
295 case Image: return QString ("Image");
296 default: return QString ("TreeItem::getTypeName no typename defined?!");
301 QVariant TreeItem::data(int column) const
303 return itemData.value(column);
306 void TreeItem::setHeading (const QString s)
311 QString TreeItem::getHeading () const
313 return itemData[0].toString();
316 std::string TreeItem::getHeadingStd () const
318 return itemData[0].toString().toStdString();
321 void TreeItem::setHeadingColor (QColor color)
326 QColor TreeItem::getHeadingColor ()
331 void TreeItem::setURL (const QString &u)
335 systemFlags.activate ("system-url");
337 systemFlags.deactivate ("system-url");
340 QString TreeItem::getURL ()
345 void TreeItem::setVymLink (const QString &vl)
349 // We need the relative (from loading)
350 // or absolute path (from User event)
351 // and build the absolute path.
352 // Note: If we have relative, use path of
353 // current map to build absolute path
355 if (!d.path().startsWith ("/"))
357 QString p=model->getDestPath();
358 int i=p.findRev("/",-1);
359 d.setPath(p.left(i)+"/"+vl);
363 systemFlags.activate("system-vymLink");
367 systemFlags.deactivate("system-vymLink");
372 QString TreeItem::getVymLink ()
377 void TreeItem::setNote(const QString &s)
381 setNoteObj (n,false);
384 void TreeItem::clearNote()
387 systemFlags.deactivate ("system-note");
390 void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor){
392 if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
393 systemFlags.activate ("system-note");
394 if (note.isEmpty() && systemFlags.isActive ("system-note"))
395 systemFlags.deactivate ("system-note");
398 QString TreeItem::getNote()
400 return note.getNote();
403 bool TreeItem::hasEmptyNote()
405 return note.isEmpty();
408 NoteObj TreeItem::getNoteObj()
413 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
415 return note.getNoteASCII(indent,width);
418 QString TreeItem::getNoteASCII()
420 return note.getNoteASCII();
423 QString TreeItem::getNoteOpenDoc()
425 return note.getNoteOpenDoc();
428 void TreeItem::activateStandardFlag (const QString &name)
430 standardFlags.activate (name);
431 model->emitDataHasChanged(this);
434 void TreeItem::deactivateStandardFlag (const QString &name)
436 standardFlags.deactivate (name);
437 model->emitDataHasChanged(this);
440 void TreeItem::deactivateAllStandardFlags ()
442 standardFlags.deactivateAll ();
443 model->emitDataHasChanged(this);
446 void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
448 standardFlags.toggle (name,master);
449 model->emitDataHasChanged(this);
452 bool TreeItem::isActiveStandardFlag (const QString &name)
454 return standardFlags.isActive (name);
457 QStringList TreeItem::activeStandardFlagNames ()
459 return standardFlags.activeFlagNames();
462 FlagRow* TreeItem::getStandardFlagRow()
464 return &standardFlags;
467 /* FIXME-3 void TreeItem::updateToolBar()
469 standardFlags.updateToolBar();
472 QStringList TreeItem::activeSystemFlagNames ()
474 return systemFlags.activeFlagNames();
477 bool TreeItem::canMoveDown()
481 case Undefined: return false;
484 if (!parentItem) return false;
485 if (parentItem->num (this) < parentItem->branchCount()-1)
490 case Image: return false;
491 default: return false;
495 bool TreeItem::canMoveUp()
499 case Undefined: return false;
502 if (!parentItem) return false;
503 if (parentItem->num (this) > 0)
508 case Image: return false;
509 default: return false;
513 void TreeItem::setID (const QString &s)
518 QString TreeItem::getID()
524 TreeItem* TreeItem::getChildNum(const int &n)
526 if (n>=0 && n<childItems.count() )
527 return childItems.at(n);
532 BranchItem* TreeItem::getFirstBranch()
535 return getBranchNum (branchOffset);
540 BranchItem* TreeItem::getLastBranch()
543 return getBranchNum (branchOffset + branchCounter-1);
548 BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
550 if (!currentBranch) return NULL;
551 int n=num (currentBranch)+1;
553 return getBranchNum (branchOffset + n);
559 BranchItem* TreeItem::getBranchNum(const int &n)
561 if (n>=0 && n<branchCounter)
562 return (BranchItem*)getChildNum (branchOffset + n);
567 BranchObj* TreeItem::getBranchObjNum(const int &n)
569 if (n>=0 && n<branchCounter)
571 return (BranchObj*)(getBranchNum(n)->getLMO());
576 void TreeItem::setLastSelectedBranch()
579 parentItem->lastSelectedBranchNum=parentItem->childItems.indexOf(this);
582 void TreeItem::setLastSelectedBranch(int i)
584 lastSelectedBranchNum=i;
587 TreeItem* TreeItem::getLastSelectedBranch()
589 return getBranchNum (lastSelectedBranchNum);
592 ImageItem* TreeItem::getImageNum (const int &n)
594 if (n>=0 && n<imageCounter)
595 return (ImageItem*)getChildNum (imageOffset + n);
600 FloatImageObj* TreeItem::getImageObjNum (const int &n) // FIXME-5 what about SVGs later?
603 return (FloatImageObj*)(getImageNum(n)->getLMO());
609 void TreeItem::setHideTmp (HideTmpMode mode)
611 if (isBranchLikeType() )
612 ((BranchItem*)this)->updateVisibility();
615 //updateVisibility();
620 if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
622 // Hide stuff according to hideExport flag and parents
623 //setVisibility (false);
625 //FIXME-2 hidden=true;
628 // Do not hide, but still take care of scrolled status
631 XXXXXXXX treeItem should be THIS
633 move visible to TreeItem???
635 BranchObj now has updateContents
637 maybe also start "bool TreeItem::branchlikeType"
641 if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
642 setVisibility (false);
644 setVisibility (true);
645 //FIXME-2 hidden=false;
649 // And take care of my children
650 for (int i=0; i<branchCount(); ++i)
651 getBranchNum(i)->setHideTmp (mode);
654 bool TreeItem::hasHiddenExportParent()
656 // Calls parents recursivly to
657 // find out, if we or parents are temp. hidden
659 if (hidden || hideExport) return true;
662 return parentItem->hasHiddenExportParent();
668 void TreeItem::setHideInExport(bool b)
670 if (type==Branch || type==Image)
674 systemFlags.activate("system-hideInExport");
676 systemFlags.deactivate("system-hideInExport");
680 bool TreeItem::hideInExport()
685 bool TreeItem::isHidden()
690 QString TreeItem::getGeneralAttr()
694 s+=attribut("hideInExport","true");
696 s+=attribut ("url",url);
697 if (!vymLink.isEmpty())
698 s+=attribut ("vymLink",vymLink);