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