treeitem.cpp
author insilmaril
Mon, 27 Apr 2009 12:07:15 +0000
changeset 756 a8a5c7288f57
parent 755 ed5b407975b3
child 757 c6908bc17d78
permissions -rw-r--r--
relinking branches and removing branches works
     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 		cout << "TI::removeChild this="<<this<<"  row="<<row<<endl;
   115 		if (childItems.at(row)->isBranchLikeType())
   116 			branchCounter--;
   117 		childItems.removeAt (row);
   118 	}
   119 }
   120 
   121 TreeItem *TreeItem::child(int row)
   122 {
   123     return childItems.value(row);
   124 }
   125 
   126 int TreeItem::childCount() const
   127 {
   128     return childItems.count();
   129 }
   130 
   131 int TreeItem::childNumber() const
   132 {
   133     if (parentItem)
   134         return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
   135 
   136     return 0;
   137 }
   138 
   139 int TreeItem::columnCount() const
   140 {
   141     return itemData.count();
   142 }
   143 
   144 int TreeItem::branchCount() const
   145 {
   146     return branchCounter;
   147 }
   148 
   149 int TreeItem::imageCount() const
   150 {
   151 	int imageCounter=0;
   152     return imageCounter; // FIXME-1 imageCounter needs to be calculated...
   153 }
   154 
   155 int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?)
   156 {
   157 	int xlinkCounter=0;
   158     return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated...
   159 }
   160 
   161 int TreeItem::row() const
   162 {
   163     if (parentItem)
   164         return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
   165 
   166     return 0;
   167 }
   168 
   169 int TreeItem::column() const
   170 {
   171     return 0;
   172 }
   173 
   174 int TreeItem::depth() 
   175 {
   176 	int d=-2;
   177 	TreeItem *ti=this;
   178 	while (ti!=NULL)
   179 	{
   180 		ti=ti->parent();
   181 		d++;
   182 	}
   183 	return d;
   184 }
   185 
   186 TreeItem *TreeItem::parent()
   187 {
   188     return parentItem;
   189 }
   190 
   191 int TreeItem::childNum()
   192 {
   193 	return parentItem->childItems.indexOf (this);
   194 }
   195 
   196 int TreeItem::num()
   197 {
   198 	switch (type)
   199 	{
   200 		case Undefined: return -1;
   201 		case MapCenter: return parentItem->childItems.indexOf (this) - branchOffset;
   202 		case Branch: return parentItem->childItems.indexOf (this) - branchOffset;
   203 		case Image: return -1; // FIXME-2
   204 		default: return -1;
   205 	}
   206 }
   207 
   208 int TreeItem::num (TreeItem *item)
   209 {
   210 	if (!item) return -1;
   211 	switch (item->getType())
   212 	{
   213 		case Undefined: return -1;
   214 		case MapCenter: return childItems.indexOf (this) - branchOffset;
   215 		case Branch: return childItems.indexOf (this) - branchOffset;
   216 		case Image: return -1; // FIXME-2
   217 		default: return -1;
   218 	}
   219 }
   220 
   221 QVariant TreeItem::data(int column) const
   222 {
   223     return itemData.value(column);
   224 }
   225 
   226 void TreeItem::setHeading (const QString s)
   227 {
   228 	itemData[0]=s;
   229 }
   230 
   231 QString TreeItem::getHeading () const
   232 {
   233 	return itemData[0].toString();
   234 }
   235 
   236 std::string TreeItem::getHeadingStd () const
   237 {
   238 	return itemData[0].toString().toStdString();
   239 }
   240 
   241 void TreeItem::setNote(const QString s)
   242 {
   243 	note.setNote(s);
   244 	// updateNoteFlag();  FIXME-2 needed?
   245 	if (model) 
   246 		model->emitNoteHasChanged (this);
   247 }
   248 
   249 void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor)
   250 {
   251 	note=n;
   252 	// updateNoteFlag();  FIXME-2 needed?
   253 	if (model && updateNoteEditor)	
   254 		model->emitNoteHasChanged (this);
   255 }
   256 
   257 QString TreeItem::getNote()
   258 {
   259 	return note.getNote();
   260 }
   261 
   262 NoteObj TreeItem::getNoteObj()
   263 {
   264 	return note;
   265 }
   266 
   267 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
   268 {
   269     return note.getNoteASCII(indent,width);
   270 }
   271 
   272 QString TreeItem::getNoteASCII()
   273 {
   274     return note.getNoteASCII();
   275 }
   276 
   277 QString TreeItem::getNoteOpenDoc()
   278 {
   279     return note.getNoteOpenDoc();
   280 }
   281 
   282 void TreeItem::setType(const Type t)
   283 {
   284 	type=t;
   285 	itemData[1]=getTypeName();
   286 }
   287 
   288 TreeItem::Type TreeItem::getType()
   289 {
   290 	return type;
   291 }
   292 
   293 bool TreeItem::isBranchLikeType() const
   294 {
   295 	if (type==Branch ||type==MapCenter) return true;
   296 	return false;
   297 }
   298 
   299 QString TreeItem::getTypeName()
   300 {
   301 	switch (type)
   302 	{
   303 		case Undefined: return QString ("Undefined");
   304 		case MapCenter: return QString ("MapCenter");
   305 		case Branch: return QString ("Branch");
   306 		case Image: return QString ("Image");
   307 		default: return QString ("TreeItem::getTypeName no typename defined?!");
   308 	}
   309 }
   310 
   311 void TreeItem::setID (const QString &s)
   312 {
   313 	objID=s;
   314 }
   315 
   316 QString TreeItem::getID()
   317 {
   318 	return objID;
   319 }
   320 
   321 
   322 TreeItem* TreeItem::getChildNum(const int &n)
   323 {
   324 	if (n>=0 && n<childItems.count() )
   325 		return childItems.at(n);
   326 	else
   327 		return NULL;
   328 }
   329 
   330 BranchItem* TreeItem::getFirstBranch()
   331 {
   332 	if (branchCounter>0)
   333 		return getBranchNum (branchOffset);
   334 	else
   335 		return NULL;
   336 }
   337 
   338 BranchItem* TreeItem::getLastBranch()
   339 {
   340 	if (branchCounter>0)
   341 		return getBranchNum (branchOffset + branchCounter-1);
   342 	else
   343 		return NULL;
   344 }
   345 
   346 
   347 BranchItem* TreeItem::getBranchNum(const int &n)
   348 {
   349 	if (branchCounter>0)
   350 		return (BranchItem*)getChildNum (branchOffset + n);
   351 	else
   352 		return NULL;
   353 }
   354 
   355 BranchObj* TreeItem::getBranchObjNum(const int &n)
   356 {
   357 	if (branchCounter>0)
   358 	{
   359 		return (BranchObj*)(getChildNum (branchOffset+n)->lmo);
   360 	} else
   361 		return NULL;
   362 }
   363 
   364 void TreeItem::setLastSelectedBranch()
   365 {
   366 	if (parentItem)
   367 		parentItem->lastSelectedBranchNum=parentItem->childItems.indexOf(this);
   368 }
   369 
   370 TreeItem* TreeItem::findBySelectString (const QString &s)  //FIXME-1
   371 {
   372 /*
   373 	LinkableMapObj *lmo=this;
   374 	QString part;
   375 	QString typ;
   376 	QString num;
   377 	while (!s.isEmpty() )
   378 	{
   379 		part=s.section(",",0,0);
   380 		typ=part.left (3);
   381 		num=part.right(part.length() - 3);
   382 		if (typ=="mc:")
   383 		{
   384 			if (depth>0)
   385 				return false;	// in a subtree there is no center
   386 			else
   387 				break;
   388 		} else
   389 			if (typ=="bo:")
   390 				lmo=lmo->getTreeItem()->getBranchObjNum (num.toInt());
   391 			else
   392 				if (typ=="fi:")
   393 					lmo=((BranchObj*)lmo)->getFloatImageNum (num.toUInt());
   394 		if (!lmo) break;
   395 		
   396 		if (s.contains(","))
   397 			s=s.right(s.length() - part.length() -1 );
   398 		else	
   399 			break;
   400 	}
   401 	*/
   402 	return NULL;
   403 }
   404 
   405 void TreeItem::setLastSelectedBranch(int i)
   406 {
   407 		lastSelectedBranchNum=i;
   408 }
   409 
   410 TreeItem* TreeItem::getLastSelectedBranch()
   411 {
   412 	return getBranchNum (lastSelectedBranchNum);
   413 }
   414 
   415 
   416 void TreeItem::setHideTmp (HideTmpMode mode)
   417 {
   418 	if (isBranchLikeType() )
   419 		((BranchItem*)this)->updateVisibility();
   420 		/*
   421 	if (type==Image)
   422 		//updateVisibility();
   423 	*/
   424 
   425 /*
   426 
   427 		if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
   428 		{
   429 			// Hide stuff according to hideExport flag and parents
   430 			//setVisibility (false);
   431 			updateVisibility();
   432 			//FIXME-2 hidden=true;
   433 		}else
   434 		{
   435 			// Do not hide, but still take care of scrolled status
   436 			
   437 
   438 			XXXXXXXX treeItem should be THIS
   439 
   440 			move visible to TreeItem???
   441 
   442 			BranchObj now has updateContents
   443 
   444 			maybe also start "bool TreeItem::branchlikeType"
   445 
   446 
   447 
   448 			if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
   449 				setVisibility (false);
   450 			else
   451 				setVisibility (true);
   452 			//FIXME-2 hidden=false;
   453 		}	
   454 
   455 */
   456 		// And take care of my children
   457 		for (int i=0; i<branchCount(); ++i)
   458 			getBranchNum(i)->setHideTmp (mode);
   459 }
   460 
   461 bool TreeItem::hasHiddenExportParent()
   462 {
   463 	// Calls parents recursivly to
   464 	// find out, if we or parents are temp. hidden
   465 
   466 	if (hidden || hideExport) return true;
   467 
   468 	if (parentItem) 
   469 		return parentItem->hasHiddenExportParent();
   470 	else
   471 		return false;
   472 }
   473 
   474 
   475 void TreeItem::setHideInExport(bool b) 
   476 {
   477 	if (isBranchLikeType() )
   478 	{
   479 		hideExport=b;
   480 		/* FIXME-1 call setVis and updateContentsSize...
   481 		if (b)
   482 			systemFlags->activate("hideInExport");
   483 		else	
   484 			systemFlags->deactivate("hideInExport");
   485 		calcBBoxSize();
   486 		positionBBox();
   487 		requestReposition();	
   488 		*/
   489 	}
   490 }	
   491 
   492 bool TreeItem::hideInExport()
   493 {
   494 	return hideExport;
   495 }	
   496 
   497 bool TreeItem::isHidden()
   498 {
   499 	return hidden;
   500 }	
   501 
   502 
   503 LinkableMapObj* TreeItem::getLMO()	// FIXME-3  VM should be unnecessary in the end
   504 {
   505 	return lmo;
   506 }
   507 
   508 void TreeItem::setLMO(LinkableMapObj *l)
   509 {
   510 	lmo=l;
   511 }
   512