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 lmo exists, also set parObj there
128 if (lmo && item->lmo)
129 item->lmo->setParObj (lmo);
131 if (item->type == Image)
133 childItems.insert (imageCounter,item);
134 // images are on top of list
141 if (item->isBranchLikeType())
143 // branches are on bottom of list
144 childItems.append(item);
145 if (branchCounter==0)
146 branchOffset=childItems.count()-1;
151 void TreeItem::removeChild(int row)
153 if (row<0 || row > childItems.size()-1)
154 qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
157 if (childItems.at(row)->isBranchLikeType())
159 if (childItems.at(row)->type==Image)
165 childItems.removeAt (row);
169 void TreeItem::removeChildBranches()
171 while ( childItems.size()>0)
174 childItems.removeAt (0);
178 TreeItem *TreeItem::child(int row)
180 return childItems.value(row);
183 int TreeItem::childCount() const
185 return childItems.count();
188 int TreeItem::childNumber() const
191 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
196 int TreeItem::columnCount() const
198 return itemData.count();
201 int TreeItem::branchCount() const
203 return branchCounter;
206 int TreeItem::imageCount() const
211 int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?)
214 return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated...
217 int TreeItem::row() const
220 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
225 int TreeItem::column() const
230 int TreeItem::depth()
242 TreeItem *TreeItem::parent()
247 int TreeItem::childNum()
249 return parentItem->childItems.indexOf (this);
256 case MapCenter: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
257 case Branch: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
258 case Image: return parentItem->childItems.indexOf (this) - parentItem->imageOffset;
263 int TreeItem::num (TreeItem *item)
265 if (!item) return -1;
266 if (!childItems.contains(item)) return -1;
267 switch (item->getType())
269 case MapCenter: return childItems.indexOf (item) - branchOffset;
270 case Branch: return childItems.indexOf (item) - branchOffset;
271 case Image: return parentItem->childItems.indexOf (item) - imageOffset;
275 void TreeItem::setType(const Type t)
278 itemData[1]=getTypeName();
281 TreeItem::Type TreeItem::getType()
286 bool TreeItem::isBranchLikeType() const
288 if (type==Branch ||type==MapCenter) return true;
292 QString TreeItem::getTypeName()
296 case Undefined: return QString ("Undefined");
297 case MapCenter: return QString ("MapCenter");
298 case Branch: return QString ("Branch");
299 case Image: return QString ("Image");
300 default: return QString ("TreeItem::getTypeName no typename defined?!");
305 QVariant TreeItem::data(int column) const
307 return itemData.value(column);
310 void TreeItem::setHeading (const QString s)
315 QString TreeItem::getHeading () const
317 return itemData[0].toString();
320 std::string TreeItem::getHeadingStd () const
322 return itemData[0].toString().toStdString();
325 void TreeItem::setHeadingColor (QColor color)
330 QColor TreeItem::getHeadingColor ()
335 void TreeItem::setURL (const QString &u)
339 systemFlags.activate ("system-url");
341 systemFlags.deactivate ("system-url");
344 QString TreeItem::getURL ()
349 void TreeItem::setVymLink (const QString &vl)
353 // We need the relative (from loading)
354 // or absolute path (from User event)
355 // and build the absolute path.
356 // Note: If we have relative, use path of
357 // current map to build absolute path
359 if (!d.path().startsWith ("/"))
361 QString p=model->getDestPath();
362 int i=p.findRev("/",-1);
363 d.setPath(p.left(i)+"/"+vl);
367 systemFlags.activate("system-vymLink");
371 systemFlags.deactivate("system-vymLink");
376 QString TreeItem::getVymLink ()
381 void TreeItem::setNote(const QString &s)
385 setNoteObj (n,false);
388 void TreeItem::clearNote()
391 systemFlags.deactivate ("system-note");
394 void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor){
396 if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
397 systemFlags.activate ("system-note");
398 if (note.isEmpty() && systemFlags.isActive ("system-note"))
399 systemFlags.deactivate ("system-note");
402 QString TreeItem::getNote()
404 return note.getNote();
407 bool TreeItem::hasEmptyNote()
409 return note.isEmpty();
412 NoteObj TreeItem::getNoteObj()
417 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
419 return note.getNoteASCII(indent,width);
422 QString TreeItem::getNoteASCII()
424 return note.getNoteASCII();
427 QString TreeItem::getNoteOpenDoc()
429 return note.getNoteOpenDoc();
432 void TreeItem::activateStandardFlag (const QString &name)
434 standardFlags.activate (name);
435 model->emitDataHasChanged(this);
438 void TreeItem::deactivateStandardFlag (const QString &name)
440 standardFlags.deactivate (name);
441 model->emitDataHasChanged(this);
444 void TreeItem::deactivateAllStandardFlags ()
446 standardFlags.deactivateAll ();
447 model->emitDataHasChanged(this);
450 void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
452 standardFlags.toggle (name,master);
453 model->emitDataHasChanged(this);
456 bool TreeItem::isActiveStandardFlag (const QString &name)
458 return standardFlags.isActive (name);
461 QStringList TreeItem::activeStandardFlagNames ()
463 return standardFlags.activeFlagNames();
466 FlagRow* TreeItem::getStandardFlagRow()
468 return &standardFlags;
471 /* FIXME-3 void TreeItem::updateToolBar()
473 standardFlags.updateToolBar();
476 QStringList TreeItem::activeSystemFlagNames ()
478 return systemFlags.activeFlagNames();
481 bool TreeItem::canMoveDown()
485 case Undefined: return false;
488 if (!parentItem) return false;
489 if (parentItem->num (this) < parentItem->branchCount()-1)
494 case Image: return false;
495 default: return false;
499 bool TreeItem::canMoveUp()
503 case Undefined: return false;
506 if (!parentItem) return false;
507 if (parentItem->num (this) > 0)
512 case Image: return false;
513 default: return false;
517 void TreeItem::setID (const QString &s)
522 QString TreeItem::getID()
528 TreeItem* TreeItem::getChildNum(const int &n)
530 if (n>=0 && n<childItems.count() )
531 return childItems.at(n);
536 BranchItem* TreeItem::getFirstBranch()
539 return getBranchNum (branchOffset);
544 BranchItem* TreeItem::getLastBranch()
547 return getBranchNum (branchOffset + branchCounter-1);
552 BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
554 if (!currentBranch) return NULL;
555 int n=num (currentBranch)+1;
557 return getBranchNum (branchOffset + n);
563 BranchItem* TreeItem::getBranchNum(const int &n)
565 if (n>=0 && n<branchCounter)
566 return (BranchItem*)getChildNum (branchOffset + n);
571 BranchObj* TreeItem::getBranchObjNum(const int &n)
573 if (n>=0 && n<branchCounter)
575 return (BranchObj*)(getBranchNum(n)->getLMO());
580 void TreeItem::setLastSelectedBranch()
583 parentItem->lastSelectedBranchNum=parentItem->childItems.indexOf(this);
586 void TreeItem::setLastSelectedBranch(int i)
588 lastSelectedBranchNum=i;
591 TreeItem* TreeItem::getLastSelectedBranch()
593 return getBranchNum (lastSelectedBranchNum);
596 ImageItem* TreeItem::getImageNum (const int &n)
598 if (n>=0 && n<imageCounter)
599 return (ImageItem*)getChildNum (imageOffset + n);
604 FloatImageObj* TreeItem::getImageObjNum (const int &n) // FIXME-5 what about SVGs later?
607 return (FloatImageObj*)(getImageNum(n)->getLMO());
612 void TreeItem::setHideTmp (HideTmpMode mode)
614 if (isBranchLikeType() )
615 ((BranchItem*)this)->updateVisibility();
618 //updateVisibility();
623 if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
625 // Hide stuff according to hideExport flag and parents
626 //setVisibility (false);
628 //FIXME-2 hidden=true;
631 // Do not hide, but still take care of scrolled status
634 XXXXXXXX treeItem should be THIS
636 move visible to TreeItem???
638 BranchObj now has updateContents
640 maybe also start "bool TreeItem::branchlikeType"
644 if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
645 setVisibility (false);
647 setVisibility (true);
648 //FIXME-2 hidden=false;
652 // And take care of my children
653 for (int i=0; i<branchCount(); ++i)
654 getBranchNum(i)->setHideTmp (mode);
657 bool TreeItem::hasHiddenExportParent()
659 // Calls parents recursivly to
660 // find out, if we or parents are temp. hidden
662 if (hidden || hideExport) return true;
665 return parentItem->hasHiddenExportParent();
671 void TreeItem::setHideInExport(bool b)
673 if (type==Branch || type==Image)
677 systemFlags.activate("system-hideInExport");
679 systemFlags.deactivate("system-hideInExport");
683 bool TreeItem::hideInExport()
688 bool TreeItem::isHidden()
693 QString TreeItem::getAttr()
696 if (parentItem==rootItem)
700 if (type==TreeItem::Image ||depth()==1)
708 if (lmo) pos=lmo->getRelPos();
709 s= attribut("relPosX",QString().setNum(pos.x())) +
710 attribut("relPosY",QString().setNum(pos.y()));
713 if (lmo) pos=lmo->getAbsPos();
714 s=attribut("absPosX",QString().setNum(pos.x())) +
715 attribut("absPosY",QString().setNum(pos.y()));
720 return s+attribut("hideInExport","true");