treeitem.cpp
author insilmaril
Tue, 28 Apr 2009 09:51:48 +0000
changeset 758 04039e47ac74
parent 757 c6908bc17d78
child 760 59614eaf5fbb
permissions -rw-r--r--
colors work again
     1 #include <iostream>
     2 #include <QStringList>
     3 
     4 #include "treeitem.h"
     5 
     6 #include "branchobj.h"
     7 #include "branchitem.h"
     8 #include "vymmodel.h"
     9 
    10 using namespace std;
    11 
    12 
    13 TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
    14 {
    15 	init();
    16     parentItem = parent;
    17     itemData = data;
    18 }
    19 
    20 TreeItem::~TreeItem()
    21 {
    22 	//cout << "Destructor TreeItem "<<getHeadingStd()<<endl;
    23 	TreeItem *ti;
    24 	while (!childItems.isEmpty())
    25 	{
    26 		ti=childItems.takeFirst();
    27 		switch (ti->getType() )
    28 		{
    29 			case TreeItem::MapCenter:
    30 				delete (MapCenterItem*)ti;
    31 				break;
    32 			case TreeItem::Branch:
    33 				delete (BranchItem*)ti;
    34 				break;
    35 			default:
    36 				delete ti;
    37 				break;
    38 		}
    39 	}	
    40 }
    41 
    42 
    43 void TreeItem::init()
    44 {
    45 	model=NULL;
    46 
    47     parentItem = NULL;
    48     itemData.clear();
    49 	lmo=NULL;	
    50 
    51 	branchOffset=0;
    52 	branchCounter=0;
    53 	lastSelectedBranchNum=-1;
    54 
    55 	note.setNote(""); 
    56 	// note.setFontHint (textEditor->getFontHintDefault() );	//FIXME-2
    57 	// isNoteInEditor=false;
    58 
    59 	hidden=false;
    60 
    61 	// Reset ID
    62 	objID="";
    63 
    64 
    65 }
    66 
    67 QString TreeItem::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset)
    68 {
    69 	cout << "TreeItem::saveToDir called directly for ("<<getHeadingStd()<<"), instead of inherited type...\n";	//FIXME-1 triggered on save
    70 	return QString();
    71 }
    72 
    73 
    74 /*
    75 void TreeItem::copy (OrnamentedObj* other)	//FIXME-2	probably need deep copy of branches and data!
    76 
    77 {
    78 	note.copy (other->note);
    79 	model=other->model;
    80 	hideExport=officially 
    81 	other->hideExport;
    82 }
    83 */
    84 
    85 void TreeItem::setModel (VymModel *m)
    86 {
    87 	model=m;
    88 }
    89 
    90 VymModel* TreeItem::getModel ()
    91 {
    92 	return model;
    93 }
    94 
    95 void TreeItem::appendChild(TreeItem *item)
    96 {
    97     childItems.append(item);
    98 	item->parentItem=this;
    99 	item->setModel (model);
   100 
   101 	if (item->type == Branch || item->type ==MapCenter)
   102 	{
   103 		if (branchCounter==0)
   104 			branchOffset=childItems.count()-1;
   105 		branchCounter++;
   106 	}
   107 }
   108 
   109 void TreeItem::removeChild(int row)
   110 {
   111     if (row<0 || row > childItems.size()-1)
   112 		qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
   113 	else
   114 	{
   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::setHeadingColor (QColor color)
   242 {
   243 	headingColor=color;
   244 }
   245 
   246 QColor TreeItem::getHeadingColor ()
   247 {
   248 	return headingColor;
   249 }
   250 
   251 void TreeItem::setNote(const QString s)
   252 {
   253 	note.setNote(s);
   254 	// updateNoteFlag();  FIXME-2 needed?
   255 	if (model) 
   256 		model->emitNoteHasChanged (this);
   257 }
   258 
   259 void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor)
   260 {
   261 	note=n;
   262 	// updateNoteFlag();  FIXME-2 needed?
   263 	if (model && updateNoteEditor)	
   264 		model->emitNoteHasChanged (this);
   265 }
   266 
   267 QString TreeItem::getNote()
   268 {
   269 	return note.getNote();
   270 }
   271 
   272 NoteObj TreeItem::getNoteObj()
   273 {
   274 	return note;
   275 }
   276 
   277 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
   278 {
   279     return note.getNoteASCII(indent,width);
   280 }
   281 
   282 QString TreeItem::getNoteASCII()
   283 {
   284     return note.getNoteASCII();
   285 }
   286 
   287 QString TreeItem::getNoteOpenDoc()
   288 {
   289     return note.getNoteOpenDoc();
   290 }
   291 
   292 void TreeItem::setType(const Type t)
   293 {
   294 	type=t;
   295 	itemData[1]=getTypeName();
   296 }
   297 
   298 TreeItem::Type TreeItem::getType()
   299 {
   300 	return type;
   301 }
   302 
   303 bool TreeItem::isBranchLikeType() const
   304 {
   305 	if (type==Branch ||type==MapCenter) return true;
   306 	return false;
   307 }
   308 
   309 QString TreeItem::getTypeName()
   310 {
   311 	switch (type)
   312 	{
   313 		case Undefined: return QString ("Undefined");
   314 		case MapCenter: return QString ("MapCenter");
   315 		case Branch: return QString ("Branch");
   316 		case Image: return QString ("Image");
   317 		default: return QString ("TreeItem::getTypeName no typename defined?!");
   318 	}
   319 }
   320 
   321 void TreeItem::setID (const QString &s)
   322 {
   323 	objID=s;
   324 }
   325 
   326 QString TreeItem::getID()
   327 {
   328 	return objID;
   329 }
   330 
   331 
   332 TreeItem* TreeItem::getChildNum(const int &n)
   333 {
   334 	if (n>=0 && n<childItems.count() )
   335 		return childItems.at(n);
   336 	else
   337 		return NULL;
   338 }
   339 
   340 BranchItem* TreeItem::getFirstBranch()
   341 {
   342 	if (branchCounter>0)
   343 		return getBranchNum (branchOffset);
   344 	else
   345 		return NULL;
   346 }
   347 
   348 BranchItem* TreeItem::getLastBranch()
   349 {
   350 	if (branchCounter>0)
   351 		return getBranchNum (branchOffset + branchCounter-1);
   352 	else
   353 		return NULL;
   354 }
   355 
   356 
   357 BranchItem* TreeItem::getBranchNum(const int &n)
   358 {
   359 	if (branchCounter>0)
   360 		return (BranchItem*)getChildNum (branchOffset + n);
   361 	else
   362 		return NULL;
   363 }
   364 
   365 BranchObj* TreeItem::getBranchObjNum(const int &n)
   366 {
   367 	if (branchCounter>0)
   368 	{
   369 		return (BranchObj*)(getChildNum (branchOffset+n)->lmo);
   370 	} else
   371 		return NULL;
   372 }
   373 
   374 void TreeItem::setLastSelectedBranch()
   375 {
   376 	if (parentItem)
   377 		parentItem->lastSelectedBranchNum=parentItem->childItems.indexOf(this);
   378 }
   379 
   380 TreeItem* TreeItem::findBySelectString (const QString &s)  //FIXME-1
   381 {
   382 /*
   383 	LinkableMapObj *lmo=this;
   384 	QString part;
   385 	QString typ;
   386 	QString num;
   387 	while (!s.isEmpty() )
   388 	{
   389 		part=s.section(",",0,0);
   390 		typ=part.left (3);
   391 		num=part.right(part.length() - 3);
   392 		if (typ=="mc:")
   393 		{
   394 			if (depth>0)
   395 				return false;	// in a subtree there is no center
   396 			else
   397 				break;
   398 		} else
   399 			if (typ=="bo:")
   400 				lmo=lmo->getTreeItem()->getBranchObjNum (num.toInt());
   401 			else
   402 				if (typ=="fi:")
   403 					lmo=((BranchObj*)lmo)->getFloatImageNum (num.toUInt());
   404 		if (!lmo) break;
   405 		
   406 		if (s.contains(","))
   407 			s=s.right(s.length() - part.length() -1 );
   408 		else	
   409 			break;
   410 	}
   411 	*/
   412 	return NULL;
   413 }
   414 
   415 void TreeItem::setLastSelectedBranch(int i)
   416 {
   417 		lastSelectedBranchNum=i;
   418 }
   419 
   420 TreeItem* TreeItem::getLastSelectedBranch()
   421 {
   422 	return getBranchNum (lastSelectedBranchNum);
   423 }
   424 
   425 
   426 void TreeItem::setHideTmp (HideTmpMode mode)
   427 {
   428 	if (isBranchLikeType() )
   429 		((BranchItem*)this)->updateVisibility();
   430 		/*
   431 	if (type==Image)
   432 		//updateVisibility();
   433 	*/
   434 
   435 /*
   436 
   437 		if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
   438 		{
   439 			// Hide stuff according to hideExport flag and parents
   440 			//setVisibility (false);
   441 			updateVisibility();
   442 			//FIXME-2 hidden=true;
   443 		}else
   444 		{
   445 			// Do not hide, but still take care of scrolled status
   446 			
   447 
   448 			XXXXXXXX treeItem should be THIS
   449 
   450 			move visible to TreeItem???
   451 
   452 			BranchObj now has updateContents
   453 
   454 			maybe also start "bool TreeItem::branchlikeType"
   455 
   456 
   457 
   458 			if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
   459 				setVisibility (false);
   460 			else
   461 				setVisibility (true);
   462 			//FIXME-2 hidden=false;
   463 		}	
   464 
   465 */
   466 		// And take care of my children
   467 		for (int i=0; i<branchCount(); ++i)
   468 			getBranchNum(i)->setHideTmp (mode);
   469 }
   470 
   471 bool TreeItem::hasHiddenExportParent()
   472 {
   473 	// Calls parents recursivly to
   474 	// find out, if we or parents are temp. hidden
   475 
   476 	if (hidden || hideExport) return true;
   477 
   478 	if (parentItem) 
   479 		return parentItem->hasHiddenExportParent();
   480 	else
   481 		return false;
   482 }
   483 
   484 
   485 void TreeItem::setHideInExport(bool b) 
   486 {
   487 	if (isBranchLikeType() )
   488 	{
   489 		hideExport=b;
   490 		/* FIXME-1 call setVis and updateContentsSize...
   491 		if (b)
   492 			systemFlags->activate("hideInExport");
   493 		else	
   494 			systemFlags->deactivate("hideInExport");
   495 		calcBBoxSize();
   496 		positionBBox();
   497 		requestReposition();	
   498 		*/
   499 	}
   500 }	
   501 
   502 bool TreeItem::hideInExport()
   503 {
   504 	return hideExport;
   505 }	
   506 
   507 bool TreeItem::isHidden()
   508 {
   509 	return hidden;
   510 }	
   511 
   512 
   513 LinkableMapObj* TreeItem::getLMO()	// FIXME-3  VM should be unnecessary in the end
   514 {
   515 	return lmo;
   516 }
   517 
   518 void TreeItem::setLMO(LinkableMapObj *l)
   519 {
   520 	lmo=l;
   521 }
   522