treeitem.cpp
author insilmaril
Mon, 27 Apr 2009 12:42:06 +0000
changeset 757 c6908bc17d78
parent 756 a8a5c7288f57
child 758 04039e47ac74
permissions -rw-r--r--
minor fixes and cleanups
     1 #include <iostream>
     2 using namespace std;
     3 
     4 #include <QStringList>
     5 
     6 #include "treeitem.h"
     7 
     8 #include "branchobj.h"
     9 #include "branchitem.h"
    10 #include "vymmodel.h"
    11 
    12 TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
    13 {
    14 	init();
    15     parentItem = parent;
    16     itemData = data;
    17 }
    18 
    19 TreeItem::~TreeItem()
    20 {
    21 	//cout << "Destructor TreeItem "<<getHeadingStd()<<endl;
    22 	TreeItem *ti;
    23 	while (!childItems.isEmpty())
    24 	{
    25 		ti=childItems.takeFirst();
    26 		switch (ti->getType() )
    27 		{
    28 			case TreeItem::MapCenter:
    29 				delete (MapCenterItem*)ti;
    30 				break;
    31 			case TreeItem::Branch:
    32 				delete (BranchItem*)ti;
    33 				break;
    34 			default:
    35 				delete ti;
    36 				break;
    37 		}
    38 	}	
    39 }
    40 
    41 
    42 void TreeItem::init()
    43 {
    44 	model=NULL;
    45 
    46     parentItem = NULL;
    47     itemData.clear();
    48 	lmo=NULL;	
    49 
    50 	branchOffset=0;
    51 	branchCounter=0;
    52 	lastSelectedBranchNum=-1;
    53 
    54 	note.setNote(""); 
    55 	// note.setFontHint (textEditor->getFontHintDefault() );	//FIXME-2
    56 	// isNoteInEditor=false;
    57 
    58 	hidden=false;
    59 
    60 	// Reset ID
    61 	objID="";
    62 
    63 
    64 }
    65 
    66 QString TreeItem::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset)
    67 {
    68 	cout << "TreeItem::saveToDir called directly for ("<<getHeadingStd()<<"), instead of inherited type...\n";	//FIXME-1 triggered on save
    69 	return QString();
    70 }
    71 
    72 
    73 /*
    74 void TreeItem::copy (OrnamentedObj* other)	//FIXME-2	probably need deep copy of branches and data!
    75 
    76 {
    77 	note.copy (other->note);
    78 	model=other->model;
    79 	hideExport=officially 
    80 	other->hideExport;
    81 }
    82 */
    83 
    84 void TreeItem::setModel (VymModel *m)
    85 {
    86 	model=m;
    87 }
    88 
    89 VymModel* TreeItem::getModel ()
    90 {
    91 	return model;
    92 }
    93 
    94 void TreeItem::appendChild(TreeItem *item)
    95 {
    96     childItems.append(item);
    97 	item->parentItem=this;
    98 	item->setModel (model);
    99 
   100 	if (item->type == Branch || item->type ==MapCenter)
   101 	{
   102 		if (branchCounter==0)
   103 			branchOffset=childItems.count()-1;
   104 		branchCounter++;
   105 	}
   106 }
   107 
   108 void TreeItem::removeChild(int row)
   109 {
   110     if (row<0 || row > childItems.size()-1)
   111 		qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
   112 	else
   113 	{
   114 		if (childItems.at(row)->isBranchLikeType())
   115 			branchCounter--;
   116 		childItems.removeAt (row);
   117 	}
   118 }
   119 
   120 TreeItem *TreeItem::child(int row)
   121 {
   122     return childItems.value(row);
   123 }
   124 
   125 int TreeItem::childCount() const
   126 {
   127     return childItems.count();
   128 }
   129 
   130 int TreeItem::childNumber() const
   131 {
   132     if (parentItem)
   133         return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
   134 
   135     return 0;
   136 }
   137 
   138 int TreeItem::columnCount() const
   139 {
   140     return itemData.count();
   141 }
   142 
   143 int TreeItem::branchCount() const
   144 {
   145     return branchCounter;
   146 }
   147 
   148 int TreeItem::imageCount() const
   149 {
   150 	int imageCounter=0;
   151     return imageCounter; // FIXME-1 imageCounter needs to be calculated...
   152 }
   153 
   154 int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?)
   155 {
   156 	int xlinkCounter=0;
   157     return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated...
   158 }
   159 
   160 int TreeItem::row() const
   161 {
   162     if (parentItem)
   163         return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
   164 
   165     return 0;
   166 }
   167 
   168 int TreeItem::column() const
   169 {
   170     return 0;
   171 }
   172 
   173 int TreeItem::depth() 
   174 {
   175 	int d=-2;
   176 	TreeItem *ti=this;
   177 	while (ti!=NULL)
   178 	{
   179 		ti=ti->parent();
   180 		d++;
   181 	}
   182 	return d;
   183 }
   184 
   185 TreeItem *TreeItem::parent()
   186 {
   187     return parentItem;
   188 }
   189 
   190 int TreeItem::childNum()
   191 {
   192 	return parentItem->childItems.indexOf (this);
   193 }
   194 
   195 int TreeItem::num()
   196 {
   197 	switch (type)
   198 	{
   199 		case Undefined: return -1;
   200 		case MapCenter: return parentItem->childItems.indexOf (this) - branchOffset;
   201 		case Branch: return parentItem->childItems.indexOf (this) - branchOffset;
   202 		case Image: return -1; // FIXME-2
   203 		default: return -1;
   204 	}
   205 }
   206 
   207 int TreeItem::num (TreeItem *item)
   208 {
   209 	if (!item) return -1;
   210 	switch (item->getType())
   211 	{
   212 		case Undefined: return -1;
   213 		case MapCenter: return childItems.indexOf (this) - branchOffset;
   214 		case Branch: return childItems.indexOf (this) - branchOffset;
   215 		case Image: return -1; // FIXME-2
   216 		default: return -1;
   217 	}
   218 }
   219 
   220 QVariant TreeItem::data(int column) const
   221 {
   222     return itemData.value(column);
   223 }
   224 
   225 void TreeItem::setHeading (const QString s)
   226 {
   227 	itemData[0]=s;
   228 }
   229 
   230 QString TreeItem::getHeading () const
   231 {
   232 	return itemData[0].toString();
   233 }
   234 
   235 std::string TreeItem::getHeadingStd () const
   236 {
   237 	return itemData[0].toString().toStdString();
   238 }
   239 
   240 void TreeItem::setNote(const QString s)
   241 {
   242 	note.setNote(s);
   243 	// updateNoteFlag();  FIXME-2 needed?
   244 	if (model) 
   245 		model->emitNoteHasChanged (this);
   246 }
   247 
   248 void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor)
   249 {
   250 	note=n;
   251 	// updateNoteFlag();  FIXME-2 needed?
   252 	if (model && updateNoteEditor)	
   253 		model->emitNoteHasChanged (this);
   254 }
   255 
   256 QString TreeItem::getNote()
   257 {
   258 	return note.getNote();
   259 }
   260 
   261 NoteObj TreeItem::getNoteObj()
   262 {
   263 	return note;
   264 }
   265 
   266 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
   267 {
   268     return note.getNoteASCII(indent,width);
   269 }
   270 
   271 QString TreeItem::getNoteASCII()
   272 {
   273     return note.getNoteASCII();
   274 }
   275 
   276 QString TreeItem::getNoteOpenDoc()
   277 {
   278     return note.getNoteOpenDoc();
   279 }
   280 
   281 void TreeItem::setType(const Type t)
   282 {
   283 	type=t;
   284 	itemData[1]=getTypeName();
   285 }
   286 
   287 TreeItem::Type TreeItem::getType()
   288 {
   289 	return type;
   290 }
   291 
   292 bool TreeItem::isBranchLikeType() const
   293 {
   294 	if (type==Branch ||type==MapCenter) return true;
   295 	return false;
   296 }
   297 
   298 QString TreeItem::getTypeName()
   299 {
   300 	switch (type)
   301 	{
   302 		case Undefined: return QString ("Undefined");
   303 		case MapCenter: return QString ("MapCenter");
   304 		case Branch: return QString ("Branch");
   305 		case Image: return QString ("Image");
   306 		default: return QString ("TreeItem::getTypeName no typename defined?!");
   307 	}
   308 }
   309 
   310 void TreeItem::setID (const QString &s)
   311 {
   312 	objID=s;
   313 }
   314 
   315 QString TreeItem::getID()
   316 {
   317 	return objID;
   318 }
   319 
   320 
   321 TreeItem* TreeItem::getChildNum(const int &n)
   322 {
   323 	if (n>=0 && n<childItems.count() )
   324 		return childItems.at(n);
   325 	else
   326 		return NULL;
   327 }
   328 
   329 BranchItem* TreeItem::getFirstBranch()
   330 {
   331 	if (branchCounter>0)
   332 		return getBranchNum (branchOffset);
   333 	else
   334 		return NULL;
   335 }
   336 
   337 BranchItem* TreeItem::getLastBranch()
   338 {
   339 	if (branchCounter>0)
   340 		return getBranchNum (branchOffset + branchCounter-1);
   341 	else
   342 		return NULL;
   343 }
   344 
   345 
   346 BranchItem* TreeItem::getBranchNum(const int &n)
   347 {
   348 	if (branchCounter>0)
   349 		return (BranchItem*)getChildNum (branchOffset + n);
   350 	else
   351 		return NULL;
   352 }
   353 
   354 BranchObj* TreeItem::getBranchObjNum(const int &n)
   355 {
   356 	if (branchCounter>0)
   357 	{
   358 		return (BranchObj*)(getChildNum (branchOffset+n)->lmo);
   359 	} else
   360 		return NULL;
   361 }
   362 
   363 void TreeItem::setLastSelectedBranch()
   364 {
   365 	if (parentItem)
   366 		parentItem->lastSelectedBranchNum=parentItem->childItems.indexOf(this);
   367 }
   368 
   369 TreeItem* TreeItem::findBySelectString (const QString &s)  //FIXME-1
   370 {
   371 /*
   372 	LinkableMapObj *lmo=this;
   373 	QString part;
   374 	QString typ;
   375 	QString num;
   376 	while (!s.isEmpty() )
   377 	{
   378 		part=s.section(",",0,0);
   379 		typ=part.left (3);
   380 		num=part.right(part.length() - 3);
   381 		if (typ=="mc:")
   382 		{
   383 			if (depth>0)
   384 				return false;	// in a subtree there is no center
   385 			else
   386 				break;
   387 		} else
   388 			if (typ=="bo:")
   389 				lmo=lmo->getTreeItem()->getBranchObjNum (num.toInt());
   390 			else
   391 				if (typ=="fi:")
   392 					lmo=((BranchObj*)lmo)->getFloatImageNum (num.toUInt());
   393 		if (!lmo) break;
   394 		
   395 		if (s.contains(","))
   396 			s=s.right(s.length() - part.length() -1 );
   397 		else	
   398 			break;
   399 	}
   400 	*/
   401 	return NULL;
   402 }
   403 
   404 void TreeItem::setLastSelectedBranch(int i)
   405 {
   406 		lastSelectedBranchNum=i;
   407 }
   408 
   409 TreeItem* TreeItem::getLastSelectedBranch()
   410 {
   411 	return getBranchNum (lastSelectedBranchNum);
   412 }
   413 
   414 
   415 void TreeItem::setHideTmp (HideTmpMode mode)
   416 {
   417 	if (isBranchLikeType() )
   418 		((BranchItem*)this)->updateVisibility();
   419 		/*
   420 	if (type==Image)
   421 		//updateVisibility();
   422 	*/
   423 
   424 /*
   425 
   426 		if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
   427 		{
   428 			// Hide stuff according to hideExport flag and parents
   429 			//setVisibility (false);
   430 			updateVisibility();
   431 			//FIXME-2 hidden=true;
   432 		}else
   433 		{
   434 			// Do not hide, but still take care of scrolled status
   435 			
   436 
   437 			XXXXXXXX treeItem should be THIS
   438 
   439 			move visible to TreeItem???
   440 
   441 			BranchObj now has updateContents
   442 
   443 			maybe also start "bool TreeItem::branchlikeType"
   444 
   445 
   446 
   447 			if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
   448 				setVisibility (false);
   449 			else
   450 				setVisibility (true);
   451 			//FIXME-2 hidden=false;
   452 		}	
   453 
   454 */
   455 		// And take care of my children
   456 		for (int i=0; i<branchCount(); ++i)
   457 			getBranchNum(i)->setHideTmp (mode);
   458 }
   459 
   460 bool TreeItem::hasHiddenExportParent()
   461 {
   462 	// Calls parents recursivly to
   463 	// find out, if we or parents are temp. hidden
   464 
   465 	if (hidden || hideExport) return true;
   466 
   467 	if (parentItem) 
   468 		return parentItem->hasHiddenExportParent();
   469 	else
   470 		return false;
   471 }
   472 
   473 
   474 void TreeItem::setHideInExport(bool b) 
   475 {
   476 	if (isBranchLikeType() )
   477 	{
   478 		hideExport=b;
   479 		/* FIXME-1 call setVis and updateContentsSize...
   480 		if (b)
   481 			systemFlags->activate("hideInExport");
   482 		else	
   483 			systemFlags->deactivate("hideInExport");
   484 		calcBBoxSize();
   485 		positionBBox();
   486 		requestReposition();	
   487 		*/
   488 	}
   489 }	
   490 
   491 bool TreeItem::hideInExport()
   492 {
   493 	return hideExport;
   494 }	
   495 
   496 bool TreeItem::isHidden()
   497 {
   498 	return hidden;
   499 }	
   500 
   501 
   502 LinkableMapObj* TreeItem::getLMO()	// FIXME-3  VM should be unnecessary in the end
   503 {
   504 	return lmo;
   505 }
   506 
   507 void TreeItem::setLMO(LinkableMapObj *l)
   508 {
   509 	lmo=l;
   510 }
   511