insilmaril@746: #include insilmaril@725: #include insilmaril@725: insilmaril@750: #include "treeitem.h" insilmaril@750: insilmaril@741: #include "branchobj.h" insilmaril@750: #include "branchitem.h" insilmaril@746: #include "vymmodel.h" insilmaril@725: insilmaril@758: using namespace std; insilmaril@758: insilmaril@758: insilmaril@725: TreeItem::TreeItem(const QList &data, TreeItem *parent) insilmaril@725: { insilmaril@756: init(); insilmaril@756: parentItem = parent; insilmaril@756: itemData = data; insilmaril@756: } insilmaril@756: insilmaril@756: TreeItem::~TreeItem() insilmaril@756: { insilmaril@756: //cout << "Destructor TreeItem "<getType() ) insilmaril@756: { insilmaril@756: case TreeItem::MapCenter: insilmaril@756: delete (MapCenterItem*)ti; insilmaril@756: break; insilmaril@756: case TreeItem::Branch: insilmaril@756: delete (BranchItem*)ti; insilmaril@756: break; insilmaril@756: default: insilmaril@756: delete ti; insilmaril@756: break; insilmaril@756: } insilmaril@756: } insilmaril@756: } insilmaril@756: insilmaril@756: insilmaril@756: void TreeItem::init() insilmaril@756: { insilmaril@746: model=NULL; insilmaril@746: insilmaril@756: parentItem = NULL; insilmaril@756: itemData.clear(); insilmaril@756: lmo=NULL; insilmaril@738: insilmaril@738: branchOffset=0; insilmaril@741: branchCounter=0; insilmaril@738: lastSelectedBranchNum=-1; insilmaril@746: insilmaril@746: note.setNote(""); insilmaril@746: // note.setFontHint (textEditor->getFontHintDefault() ); //FIXME-2 insilmaril@746: // isNoteInEditor=false; insilmaril@753: insilmaril@753: hidden=false; insilmaril@754: insilmaril@754: // Reset ID insilmaril@754: objID=""; insilmaril@754: insilmaril@754: insilmaril@725: } insilmaril@725: insilmaril@746: QString TreeItem::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset) insilmaril@746: { insilmaril@755: cout << "TreeItem::saveToDir called directly for ("<note); insilmaril@746: model=other->model; insilmaril@754: hideExport=officially insilmaril@754: other->hideExport; insilmaril@746: } insilmaril@746: */ insilmaril@746: insilmaril@746: void TreeItem::setModel (VymModel *m) insilmaril@746: { insilmaril@746: model=m; insilmaril@746: } insilmaril@746: insilmaril@746: VymModel* TreeItem::getModel () insilmaril@746: { insilmaril@746: return model; insilmaril@746: } insilmaril@741: insilmaril@725: void TreeItem::appendChild(TreeItem *item) insilmaril@725: { insilmaril@725: childItems.append(item); insilmaril@756: item->parentItem=this; insilmaril@746: item->setModel (model); insilmaril@741: insilmaril@741: if (item->type == Branch || item->type ==MapCenter) insilmaril@738: { insilmaril@741: if (branchCounter==0) insilmaril@738: branchOffset=childItems.count()-1; insilmaril@741: branchCounter++; insilmaril@738: } insilmaril@725: } insilmaril@725: insilmaril@727: void TreeItem::removeChild(int row) insilmaril@727: { insilmaril@745: if (row<0 || row > childItems.size()-1) insilmaril@745: qWarning ("TreeItem::removeChild tried to remove non existing item?!\n"); insilmaril@745: else insilmaril@727: { insilmaril@755: if (childItems.at(row)->isBranchLikeType()) insilmaril@755: branchCounter--; insilmaril@755: childItems.removeAt (row); insilmaril@745: } insilmaril@727: } insilmaril@727: insilmaril@725: TreeItem *TreeItem::child(int row) insilmaril@725: { insilmaril@725: return childItems.value(row); insilmaril@725: } insilmaril@725: insilmaril@725: int TreeItem::childCount() const insilmaril@725: { insilmaril@725: return childItems.count(); insilmaril@725: } insilmaril@725: insilmaril@745: int TreeItem::childNumber() const insilmaril@745: { insilmaril@745: if (parentItem) insilmaril@745: return parentItem->childItems.indexOf(const_cast(this)); insilmaril@745: insilmaril@745: return 0; insilmaril@745: } insilmaril@745: insilmaril@725: int TreeItem::columnCount() const insilmaril@725: { insilmaril@725: return itemData.count(); insilmaril@725: } insilmaril@741: insilmaril@741: int TreeItem::branchCount() const insilmaril@741: { insilmaril@741: return branchCounter; insilmaril@741: } insilmaril@749: insilmaril@749: int TreeItem::imageCount() const insilmaril@749: { insilmaril@749: int imageCounter=0; insilmaril@749: return imageCounter; // FIXME-1 imageCounter needs to be calculated... insilmaril@749: } insilmaril@749: insilmaril@749: int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?) insilmaril@749: { insilmaril@749: int xlinkCounter=0; insilmaril@749: return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated... insilmaril@749: } insilmaril@749: insilmaril@727: int TreeItem::row() const insilmaril@727: { insilmaril@727: if (parentItem) insilmaril@727: return parentItem->childItems.indexOf(const_cast(this)); insilmaril@727: insilmaril@727: return 0; insilmaril@727: } insilmaril@727: insilmaril@727: int TreeItem::column() const insilmaril@727: { insilmaril@727: return 0; insilmaril@727: } insilmaril@727: insilmaril@740: int TreeItem::depth() insilmaril@740: { insilmaril@755: int d=-2; insilmaril@740: TreeItem *ti=this; insilmaril@740: while (ti!=NULL) insilmaril@740: { insilmaril@740: ti=ti->parent(); insilmaril@740: d++; insilmaril@740: } insilmaril@740: return d; insilmaril@740: } insilmaril@740: insilmaril@727: TreeItem *TreeItem::parent() insilmaril@727: { insilmaril@727: return parentItem; insilmaril@727: } insilmaril@727: insilmaril@755: int TreeItem::childNum() insilmaril@755: { insilmaril@755: return parentItem->childItems.indexOf (this); insilmaril@755: } insilmaril@755: insilmaril@741: int TreeItem::num() insilmaril@741: { insilmaril@741: switch (type) insilmaril@741: { insilmaril@741: case Undefined: return -1; insilmaril@741: case MapCenter: return parentItem->childItems.indexOf (this) - branchOffset; insilmaril@741: case Branch: return parentItem->childItems.indexOf (this) - branchOffset; insilmaril@746: case Image: return -1; // FIXME-2 insilmaril@741: default: return -1; insilmaril@741: } insilmaril@749: } insilmaril@749: insilmaril@749: int TreeItem::num (TreeItem *item) insilmaril@749: { insilmaril@749: if (!item) return -1; insilmaril@749: switch (item->getType()) insilmaril@749: { insilmaril@749: case Undefined: return -1; insilmaril@749: case MapCenter: return childItems.indexOf (this) - branchOffset; insilmaril@749: case Branch: return childItems.indexOf (this) - branchOffset; insilmaril@749: case Image: return -1; // FIXME-2 insilmaril@749: default: return -1; insilmaril@749: } insilmaril@741: } insilmaril@725: insilmaril@725: QVariant TreeItem::data(int column) const insilmaril@725: { insilmaril@725: return itemData.value(column); insilmaril@725: } insilmaril@725: insilmaril@726: void TreeItem::setHeading (const QString s) insilmaril@725: { insilmaril@726: itemData[0]=s; insilmaril@726: } insilmaril@726: insilmaril@753: QString TreeItem::getHeading () const insilmaril@726: { insilmaril@726: return itemData[0].toString(); insilmaril@726: } insilmaril@726: insilmaril@755: std::string TreeItem::getHeadingStd () const insilmaril@753: { insilmaril@753: return itemData[0].toString().toStdString(); insilmaril@753: } insilmaril@753: insilmaril@758: void TreeItem::setHeadingColor (QColor color) insilmaril@758: { insilmaril@758: headingColor=color; insilmaril@758: } insilmaril@758: insilmaril@758: QColor TreeItem::getHeadingColor () insilmaril@758: { insilmaril@758: return headingColor; insilmaril@758: } insilmaril@758: insilmaril@741: void TreeItem::setNote(const QString s) insilmaril@741: { insilmaril@746: note.setNote(s); insilmaril@746: // updateNoteFlag(); FIXME-2 needed? insilmaril@746: if (model) insilmaril@753: model->emitNoteHasChanged (this); insilmaril@746: } insilmaril@746: insilmaril@746: void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor) insilmaril@746: { insilmaril@746: note=n; insilmaril@746: // updateNoteFlag(); FIXME-2 needed? insilmaril@746: if (model && updateNoteEditor) insilmaril@753: model->emitNoteHasChanged (this); insilmaril@741: } insilmaril@741: insilmaril@741: QString TreeItem::getNote() insilmaril@741: { insilmaril@746: return note.getNote(); insilmaril@746: } insilmaril@746: insilmaril@746: NoteObj TreeItem::getNoteObj() insilmaril@746: { insilmaril@746: return note; insilmaril@746: } insilmaril@746: insilmaril@746: QString TreeItem::getNoteASCII(const QString &indent, const int &width) insilmaril@746: { insilmaril@746: return note.getNoteASCII(indent,width); insilmaril@746: } insilmaril@746: insilmaril@746: QString TreeItem::getNoteASCII() insilmaril@746: { insilmaril@746: return note.getNoteASCII(); insilmaril@746: } insilmaril@746: insilmaril@746: QString TreeItem::getNoteOpenDoc() insilmaril@746: { insilmaril@746: return note.getNoteOpenDoc(); insilmaril@741: } insilmaril@741: insilmaril@726: void TreeItem::setType(const Type t) insilmaril@726: { insilmaril@726: type=t; insilmaril@726: itemData[1]=getTypeName(); insilmaril@726: } insilmaril@726: insilmaril@726: TreeItem::Type TreeItem::getType() insilmaril@726: { insilmaril@726: return type; insilmaril@726: } insilmaril@726: insilmaril@753: bool TreeItem::isBranchLikeType() const insilmaril@753: { insilmaril@753: if (type==Branch ||type==MapCenter) return true; insilmaril@753: return false; insilmaril@753: } insilmaril@753: insilmaril@726: QString TreeItem::getTypeName() insilmaril@726: { insilmaril@726: switch (type) insilmaril@726: { insilmaril@726: case Undefined: return QString ("Undefined"); insilmaril@726: case MapCenter: return QString ("MapCenter"); insilmaril@726: case Branch: return QString ("Branch"); insilmaril@739: case Image: return QString ("Image"); insilmaril@726: default: return QString ("TreeItem::getTypeName no typename defined?!"); insilmaril@726: } insilmaril@725: } insilmaril@725: insilmaril@754: void TreeItem::setID (const QString &s) insilmaril@754: { insilmaril@754: objID=s; insilmaril@754: } insilmaril@754: insilmaril@754: QString TreeItem::getID() insilmaril@754: { insilmaril@754: return objID; insilmaril@754: } insilmaril@754: insilmaril@754: insilmaril@738: TreeItem* TreeItem::getChildNum(const int &n) insilmaril@738: { insilmaril@738: if (n>=0 && n0) insilmaril@738: return getBranchNum (branchOffset); insilmaril@738: else insilmaril@738: return NULL; insilmaril@738: } insilmaril@738: insilmaril@750: BranchItem* TreeItem::getLastBranch() insilmaril@738: { insilmaril@741: if (branchCounter>0) insilmaril@741: return getBranchNum (branchOffset + branchCounter-1); insilmaril@738: else insilmaril@738: return NULL; insilmaril@738: } insilmaril@738: insilmaril@738: insilmaril@750: BranchItem* TreeItem::getBranchNum(const int &n) insilmaril@738: { insilmaril@741: if (branchCounter>0) insilmaril@750: return (BranchItem*)getChildNum (branchOffset + n); insilmaril@738: else insilmaril@738: return NULL; insilmaril@738: } insilmaril@738: insilmaril@750: BranchObj* TreeItem::getBranchObjNum(const int &n) insilmaril@750: { insilmaril@750: if (branchCounter>0) insilmaril@750: { insilmaril@750: return (BranchObj*)(getChildNum (branchOffset+n)->lmo); insilmaril@750: } else insilmaril@750: return NULL; insilmaril@750: } insilmaril@750: insilmaril@738: void TreeItem::setLastSelectedBranch() insilmaril@738: { insilmaril@738: if (parentItem) insilmaril@738: parentItem->lastSelectedBranchNum=parentItem->childItems.indexOf(this); insilmaril@738: } insilmaril@738: insilmaril@754: TreeItem* TreeItem::findBySelectString (const QString &s) //FIXME-1 insilmaril@754: { insilmaril@754: /* insilmaril@754: LinkableMapObj *lmo=this; insilmaril@754: QString part; insilmaril@754: QString typ; insilmaril@754: QString num; insilmaril@754: while (!s.isEmpty() ) insilmaril@754: { insilmaril@754: part=s.section(",",0,0); insilmaril@754: typ=part.left (3); insilmaril@754: num=part.right(part.length() - 3); insilmaril@754: if (typ=="mc:") insilmaril@754: { insilmaril@754: if (depth>0) insilmaril@754: return false; // in a subtree there is no center insilmaril@754: else insilmaril@754: break; insilmaril@754: } else insilmaril@754: if (typ=="bo:") insilmaril@754: lmo=lmo->getTreeItem()->getBranchObjNum (num.toInt()); insilmaril@754: else insilmaril@754: if (typ=="fi:") insilmaril@754: lmo=((BranchObj*)lmo)->getFloatImageNum (num.toUInt()); insilmaril@754: if (!lmo) break; insilmaril@754: insilmaril@754: if (s.contains(",")) insilmaril@754: s=s.right(s.length() - part.length() -1 ); insilmaril@754: else insilmaril@754: break; insilmaril@754: } insilmaril@754: */ insilmaril@754: return NULL; insilmaril@754: } insilmaril@754: insilmaril@754: void TreeItem::setLastSelectedBranch(int i) insilmaril@754: { insilmaril@754: lastSelectedBranchNum=i; insilmaril@754: } insilmaril@754: insilmaril@738: TreeItem* TreeItem::getLastSelectedBranch() insilmaril@738: { insilmaril@738: return getBranchNum (lastSelectedBranchNum); insilmaril@738: } insilmaril@738: insilmaril@753: insilmaril@753: void TreeItem::setHideTmp (HideTmpMode mode) insilmaril@753: { insilmaril@753: if (isBranchLikeType() ) insilmaril@753: ((BranchItem*)this)->updateVisibility(); insilmaril@753: /* insilmaril@753: if (type==Image) insilmaril@753: //updateVisibility(); insilmaril@753: */ insilmaril@753: insilmaril@753: /* insilmaril@753: insilmaril@753: if (mode==HideExport && (hideExport || hasHiddenExportParent() ) ) insilmaril@753: { insilmaril@753: // Hide stuff according to hideExport flag and parents insilmaril@753: //setVisibility (false); insilmaril@753: updateVisibility(); insilmaril@753: //FIXME-2 hidden=true; insilmaril@753: }else insilmaril@753: { insilmaril@753: // Do not hide, but still take care of scrolled status insilmaril@753: insilmaril@753: insilmaril@753: XXXXXXXX treeItem should be THIS insilmaril@753: insilmaril@753: move visible to TreeItem??? insilmaril@753: insilmaril@753: BranchObj now has updateContents insilmaril@753: insilmaril@753: maybe also start "bool TreeItem::branchlikeType" insilmaril@753: insilmaril@753: insilmaril@753: insilmaril@753: if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem)) insilmaril@753: setVisibility (false); insilmaril@753: else insilmaril@753: setVisibility (true); insilmaril@753: //FIXME-2 hidden=false; insilmaril@753: } insilmaril@753: insilmaril@753: */ insilmaril@753: // And take care of my children insilmaril@753: for (int i=0; isetHideTmp (mode); insilmaril@753: } insilmaril@753: insilmaril@753: bool TreeItem::hasHiddenExportParent() insilmaril@753: { insilmaril@753: // Calls parents recursivly to insilmaril@753: // find out, if we or parents are temp. hidden insilmaril@753: insilmaril@753: if (hidden || hideExport) return true; insilmaril@753: insilmaril@753: if (parentItem) insilmaril@753: return parentItem->hasHiddenExportParent(); insilmaril@753: else insilmaril@753: return false; insilmaril@753: } insilmaril@753: insilmaril@753: insilmaril@753: void TreeItem::setHideInExport(bool b) insilmaril@753: { insilmaril@753: if (isBranchLikeType() ) insilmaril@753: { insilmaril@753: hideExport=b; insilmaril@753: /* FIXME-1 call setVis and updateContentsSize... insilmaril@753: if (b) insilmaril@753: systemFlags->activate("hideInExport"); insilmaril@753: else insilmaril@753: systemFlags->deactivate("hideInExport"); insilmaril@753: calcBBoxSize(); insilmaril@753: positionBBox(); insilmaril@753: requestReposition(); insilmaril@753: */ insilmaril@753: } insilmaril@753: } insilmaril@753: insilmaril@753: bool TreeItem::hideInExport() insilmaril@753: { insilmaril@753: return hideExport; insilmaril@753: } insilmaril@753: insilmaril@753: bool TreeItem::isHidden() insilmaril@753: { insilmaril@753: return hidden; insilmaril@753: } insilmaril@753: insilmaril@753: insilmaril@746: LinkableMapObj* TreeItem::getLMO() // FIXME-3 VM should be unnecessary in the end insilmaril@726: { insilmaril@726: return lmo; insilmaril@726: } insilmaril@726: insilmaril@726: void TreeItem::setLMO(LinkableMapObj *l) insilmaril@726: { insilmaril@726: lmo=l; insilmaril@726: } insilmaril@726: