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@760: #include "mapcenteritem.h" insilmaril@746: #include "vymmodel.h" insilmaril@725: insilmaril@758: using namespace std; insilmaril@758: insilmaril@758: insilmaril@760: TreeItem::TreeItem(const QList &data, TreeItem *parent):MapItem() 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@738: insilmaril@738: branchOffset=0; insilmaril@741: branchCounter=0; insilmaril@738: lastSelectedBranchNum=-1; insilmaril@746: insilmaril@763: imageOffset=0; insilmaril@763: imageCounter=0; insilmaril@763: 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@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@763: case Image: return parentItem->childItems.indexOf (this) - imageOffset; 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@763: case MapCenter: return childItems.indexOf (item) - branchOffset; insilmaril@763: case Branch: return childItems.indexOf (item) - branchOffset; insilmaril@763: case Image: return parentItem->childItems.indexOf (item) - imageOffset; insilmaril@749: default: return -1; insilmaril@749: } insilmaril@741: } insilmaril@766: void TreeItem::setType(const Type t) insilmaril@766: { insilmaril@766: type=t; insilmaril@766: itemData[1]=getTypeName(); insilmaril@766: } insilmaril@766: insilmaril@766: TreeItem::Type TreeItem::getType() insilmaril@766: { insilmaril@766: return type; insilmaril@766: } insilmaril@766: insilmaril@766: bool TreeItem::isBranchLikeType() const insilmaril@766: { insilmaril@766: if (type==Branch ||type==MapCenter) return true; insilmaril@766: return false; insilmaril@766: } insilmaril@766: insilmaril@766: QString TreeItem::getTypeName() insilmaril@766: { insilmaril@766: switch (type) insilmaril@766: { insilmaril@766: case Undefined: return QString ("Undefined"); insilmaril@766: case MapCenter: return QString ("MapCenter"); insilmaril@766: case Branch: return QString ("Branch"); insilmaril@766: case Image: return QString ("Image"); insilmaril@766: default: return QString ("TreeItem::getTypeName no typename defined?!"); insilmaril@766: } insilmaril@766: } insilmaril@766: 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@767: void TreeItem::setURL (const QString &u) insilmaril@741: { insilmaril@767: url=u; insilmaril@767: if (!url.isEmpty()) insilmaril@767: systemFlags.activate ("system-url"); insilmaril@767: else insilmaril@767: systemFlags.deactivate ("system-url"); insilmaril@767: } insilmaril@767: insilmaril@767: QString TreeItem::getURL () insilmaril@767: { insilmaril@767: return url; insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::setVymLink (const QString &vl) insilmaril@767: { insilmaril@767: if (!vl.isEmpty()) insilmaril@767: { insilmaril@767: // We need the relative (from loading) insilmaril@767: // or absolute path (from User event) insilmaril@767: // and build the absolute path. insilmaril@767: // Note: If we have relative, use path of insilmaril@767: // current map to build absolute path insilmaril@767: QDir d(vl); insilmaril@767: if (!d.path().startsWith ("/")) insilmaril@767: { insilmaril@767: QString p=model->getDestPath(); insilmaril@767: int i=p.findRev("/",-1); insilmaril@767: d.setPath(p.left(i)+"/"+vl); insilmaril@767: d.convertToAbs(); insilmaril@767: } insilmaril@767: vymLink=d.path(); insilmaril@767: systemFlags.activate("system-vymLink"); insilmaril@767: } insilmaril@767: else insilmaril@767: { insilmaril@767: systemFlags.deactivate("system-vymLink"); insilmaril@767: vymLink.clear(); insilmaril@767: } insilmaril@767: } insilmaril@767: insilmaril@767: QString TreeItem::getVymLink () insilmaril@767: { insilmaril@767: return vymLink; insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::setNote(const QString &s) insilmaril@767: { insilmaril@767: NoteObj n; insilmaril@767: n.setNote(s); insilmaril@767: setNoteObj (n,false); insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::clearNote() insilmaril@767: { insilmaril@767: note.clear(); insilmaril@767: systemFlags.deactivate ("system-note"); insilmaril@746: } insilmaril@746: insilmaril@746: void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor) insilmaril@746: { insilmaril@746: note=n; insilmaril@767: if (!note.isEmpty() && !systemFlags.isActive ("system-note")) insilmaril@767: systemFlags.activate ("system-note"); insilmaril@767: if (note.isEmpty() && systemFlags.isActive ("system-note")) insilmaril@767: systemFlags.deactivate ("system-note"); 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@766: void TreeItem::activateStandardFlag (const QString &name) insilmaril@726: { insilmaril@766: standardFlags.activate (name); insilmaril@767: model->emitDataHasChanged(this); insilmaril@726: } insilmaril@726: insilmaril@766: void TreeItem::deactivateStandardFlag (const QString &name) insilmaril@726: { insilmaril@766: standardFlags.deactivate (name); insilmaril@767: model->emitDataHasChanged(this); insilmaril@726: } insilmaril@726: insilmaril@767: void TreeItem::deactivateAllStandardFlags () insilmaril@753: { insilmaril@767: standardFlags.deactivateAll (); insilmaril@767: model->emitDataHasChanged(this); insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master) insilmaril@767: { insilmaril@767: standardFlags.toggle (name,master); insilmaril@767: model->emitDataHasChanged(this); insilmaril@753: } insilmaril@753: insilmaril@766: bool TreeItem::isActiveStandardFlag (const QString &name) insilmaril@726: { insilmaril@766: return standardFlags.isActive (name); insilmaril@725: } insilmaril@725: insilmaril@767: QStringList TreeItem::activeStandardFlagNames () insilmaril@767: { insilmaril@767: return standardFlags.activeFlagNames(); insilmaril@767: } insilmaril@767: insilmaril@767: QStringList TreeItem::activeSystemFlagNames () //FIXME-1 missing: scrolled-tmp,hideInExport insilmaril@767: { insilmaril@767: return systemFlags.activeFlagNames(); insilmaril@767: } insilmaril@767: insilmaril@767: bool TreeItem::canMoveDown() insilmaril@767: { insilmaril@767: switch (type) insilmaril@767: { insilmaril@767: case Undefined: return false; insilmaril@767: case MapCenter: insilmaril@767: case Branch: insilmaril@767: if (!parentItem) return false; insilmaril@767: if (parentItem->num (this) < parentItem->branchCount()-1) insilmaril@767: return true; insilmaril@767: else insilmaril@767: return false; insilmaril@767: break; insilmaril@767: case Image: return false; insilmaril@767: default: return false; insilmaril@767: } insilmaril@767: } insilmaril@767: insilmaril@767: bool TreeItem::canMoveUp() insilmaril@767: { insilmaril@767: switch (type) insilmaril@767: { insilmaril@767: case Undefined: return false; insilmaril@767: case MapCenter: insilmaril@767: case Branch: insilmaril@767: if (!parentItem) return false; insilmaril@767: if (parentItem->num (this) > 0) insilmaril@767: return true; insilmaril@767: else insilmaril@767: return false; insilmaril@767: break; insilmaril@767: case Image: return false; insilmaril@767: default: return false; insilmaril@767: } insilmaril@767: } insilmaril@767: 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@763: BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch) insilmaril@763: { insilmaril@763: if (!currentBranch) return NULL; insilmaril@763: int n=num (currentBranch)+1; insilmaril@763: if (n0) 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: 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@726: