treeitem.cpp
author insilmaril
Tue, 18 Aug 2009 12:39:07 +0000
changeset 788 78ba80b54bc4
parent 787 c6bb4fdcc55f
child 790 133e2ed6b9c5
permissions -rw-r--r--
Fix for segfault when deleting MCO (invalid QModelIndex needs to be returned in index(TreeItem*) )
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@746
     8
#include "vymmodel.h"
insilmaril@725
     9
insilmaril@758
    10
using namespace std;
insilmaril@758
    11
insilmaril@772
    12
extern FlagRow* standardFlagsMaster;
insilmaril@758
    13
insilmaril@776
    14
TreeItem::TreeItem()
insilmaril@776
    15
{
insilmaril@788
    16
	//cout << "Constr. TI  this="<<this<<endl;
insilmaril@776
    17
	init();
insilmaril@776
    18
	itemData.clear();
insilmaril@776
    19
	rootItem=this;
insilmaril@776
    20
	parentItem=NULL;
insilmaril@776
    21
}
insilmaril@776
    22
insilmaril@776
    23
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
insilmaril@725
    24
{
insilmaril@773
    25
	//cout << "Constructor TreeItem this="<<this<<"  parent="<<parent<<endl;
insilmaril@756
    26
	init();
insilmaril@756
    27
    parentItem = parent;
insilmaril@756
    28
    itemData = data;
insilmaril@773
    29
	
insilmaril@773
    30
	rootItem=this;
insilmaril@773
    31
	if (parentItem )
insilmaril@773
    32
		rootItem=parentItem->rootItem;
insilmaril@756
    33
}
insilmaril@756
    34
insilmaril@756
    35
TreeItem::~TreeItem()
insilmaril@756
    36
{
insilmaril@756
    37
	//cout << "Destructor TreeItem "<<getHeadingStd()<<endl;
insilmaril@756
    38
	TreeItem *ti;
insilmaril@756
    39
	while (!childItems.isEmpty())
insilmaril@756
    40
	{
insilmaril@756
    41
		ti=childItems.takeFirst();
insilmaril@756
    42
		switch (ti->getType() )
insilmaril@756
    43
		{
insilmaril@756
    44
			case TreeItem::MapCenter:
insilmaril@773
    45
				delete (BranchItem*)ti;
insilmaril@756
    46
				break;
insilmaril@756
    47
			case TreeItem::Branch:
insilmaril@756
    48
				delete (BranchItem*)ti;
insilmaril@756
    49
				break;
insilmaril@788
    50
			case TreeItem::Image:
insilmaril@788
    51
				delete (ImageItem*)ti;
insilmaril@788
    52
				break;
insilmaril@788
    53
			case TreeItem::Attribute:
insilmaril@788
    54
				delete (AttributeItem*)ti;
insilmaril@788
    55
				break;
insilmaril@756
    56
			default:
insilmaril@756
    57
				delete ti;
insilmaril@756
    58
				break;
insilmaril@756
    59
		}
insilmaril@756
    60
	}	
insilmaril@756
    61
}
insilmaril@756
    62
insilmaril@756
    63
insilmaril@756
    64
void TreeItem::init()
insilmaril@756
    65
{
insilmaril@746
    66
	model=NULL;
insilmaril@746
    67
insilmaril@738
    68
	branchOffset=0;
insilmaril@741
    69
	branchCounter=0;
insilmaril@746
    70
insilmaril@763
    71
	imageOffset=0;
insilmaril@763
    72
	imageCounter=0;
insilmaril@763
    73
insilmaril@786
    74
	attributeCounter=0;
insilmaril@786
    75
	attributeOffset=0;
insilmaril@786
    76
insilmaril@746
    77
	note.setNote(""); 
insilmaril@786
    78
	// note.setFontHint (textEditor->getFontHintDefault() );	//FIXME-3
insilmaril@746
    79
	// isNoteInEditor=false;
insilmaril@753
    80
insilmaril@753
    81
	hidden=false;
insilmaril@776
    82
	hideExport=false;
insilmaril@754
    83
insilmaril@754
    84
	// Reset ID
insilmaril@754
    85
	objID="";
insilmaril@772
    86
insilmaril@772
    87
	standardFlags.setMasterRow (standardFlagsMaster);
insilmaril@725
    88
}
insilmaril@725
    89
insilmaril@746
    90
insilmaril@746
    91
/*
insilmaril@786
    92
void TreeItem::copy (OrnamentedObj* other)	//FIXME-3	probably need deep copy of branches and data!
insilmaril@746
    93
insilmaril@746
    94
{
insilmaril@746
    95
	note.copy (other->note);
insilmaril@746
    96
	model=other->model;
insilmaril@754
    97
	hideExport=officially 
insilmaril@754
    98
	other->hideExport;
insilmaril@746
    99
}
insilmaril@746
   100
*/
insilmaril@746
   101
insilmaril@746
   102
void TreeItem::setModel (VymModel *m)
insilmaril@746
   103
{
insilmaril@746
   104
	model=m;
insilmaril@746
   105
}
insilmaril@746
   106
insilmaril@746
   107
VymModel* TreeItem::getModel ()
insilmaril@746
   108
{
insilmaril@746
   109
	return model;
insilmaril@746
   110
}
insilmaril@741
   111
insilmaril@776
   112
int TreeItem::getRowNumAppend (TreeItem *item)
insilmaril@776
   113
{	
insilmaril@776
   114
	switch (item->type)
insilmaril@776
   115
	{
insilmaril@786
   116
		case Attribute: return attributeOffset + attributeCounter;
insilmaril@786
   117
		case Image: return imageOffset + imageCounter;
insilmaril@776
   118
		case MapCenter: return branchOffset + branchCounter;
insilmaril@776
   119
		case Branch: return branchOffset + branchCounter;
insilmaril@776
   120
		default: return -1;
insilmaril@776
   121
	}
insilmaril@776
   122
}
insilmaril@776
   123
insilmaril@725
   124
void TreeItem::appendChild(TreeItem *item)
insilmaril@725
   125
{
insilmaril@756
   126
	item->parentItem=this;
insilmaril@773
   127
	item->rootItem=rootItem;
insilmaril@746
   128
	item->setModel (model);
insilmaril@741
   129
insilmaril@786
   130
	if (item->type == Attribute)
insilmaril@786
   131
	{
insilmaril@786
   132
		// attribute are on top of list
insilmaril@786
   133
		childItems.insert (attributeCounter,item);
insilmaril@786
   134
		attributeCounter++;
insilmaril@786
   135
		imageOffset++;
insilmaril@786
   136
		branchOffset++;
insilmaril@786
   137
	}
insilmaril@786
   138
insilmaril@776
   139
	if (item->type == Image)
insilmaril@738
   140
	{
insilmaril@786
   141
		childItems.insert (imageCounter+imageOffset,item);
insilmaril@776
   142
		imageCounter++;
insilmaril@776
   143
		branchOffset++;
insilmaril@776
   144
	}
insilmaril@776
   145
insilmaril@776
   146
	if (item->isBranchLikeType())
insilmaril@776
   147
	{
insilmaril@776
   148
		// branches are on bottom of list
insilmaril@776
   149
		childItems.append(item);
insilmaril@741
   150
		branchCounter++;
insilmaril@788
   151
insilmaril@788
   152
		// Set correct type		//FIXME-3 DUP in constr branchitem
insilmaril@788
   153
		if (this==rootItem)
insilmaril@788
   154
			item->setType(MapCenter);
insilmaril@788
   155
		else
insilmaril@788
   156
			item->setType (Branch);
insilmaril@738
   157
	}
insilmaril@725
   158
}
insilmaril@725
   159
insilmaril@727
   160
void TreeItem::removeChild(int row)
insilmaril@727
   161
{
insilmaril@745
   162
    if (row<0 || row > childItems.size()-1)
insilmaril@745
   163
		qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
insilmaril@745
   164
	else
insilmaril@727
   165
	{
insilmaril@786
   166
		if (childItems.at(row)->type==Attribute)
insilmaril@786
   167
		{
insilmaril@786
   168
			attributeCounter--;
insilmaril@786
   169
			imageOffset--;
insilmaril@786
   170
			branchOffset--;
insilmaril@786
   171
		}	
insilmaril@776
   172
		if (childItems.at(row)->type==Image)
insilmaril@776
   173
		{
insilmaril@776
   174
			imageCounter--;
insilmaril@786
   175
			branchOffset--;
insilmaril@776
   176
		}	
insilmaril@786
   177
		if (childItems.at(row)->isBranchLikeType())
insilmaril@786
   178
			branchCounter--;
insilmaril@786
   179
insilmaril@755
   180
		childItems.removeAt (row);
insilmaril@745
   181
	}
insilmaril@727
   182
}
insilmaril@727
   183
insilmaril@788
   184
/*
insilmaril@788
   185
void TreeItem::clear()	// FIXME-2 used in vymmodel addMapInsert, but needs to be used via model and emit layout changes...
insilmaril@772
   186
{
insilmaril@788
   187
	cout << "TI::clear\n";
insilmaril@772
   188
	while ( childItems.size()>0)
insilmaril@772
   189
	{
insilmaril@772
   190
		branchCounter--;
insilmaril@772
   191
		childItems.removeAt (0);
insilmaril@772
   192
	}
insilmaril@772
   193
}
insilmaril@788
   194
*/
insilmaril@772
   195
insilmaril@725
   196
TreeItem *TreeItem::child(int row)
insilmaril@725
   197
{
insilmaril@725
   198
    return childItems.value(row);
insilmaril@725
   199
}
insilmaril@725
   200
insilmaril@725
   201
int TreeItem::childCount() const
insilmaril@725
   202
{
insilmaril@725
   203
    return childItems.count();
insilmaril@725
   204
}
insilmaril@725
   205
insilmaril@745
   206
int TreeItem::childNumber() const
insilmaril@745
   207
{
insilmaril@745
   208
    if (parentItem)
insilmaril@745
   209
        return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
insilmaril@745
   210
insilmaril@745
   211
    return 0;
insilmaril@745
   212
}
insilmaril@745
   213
insilmaril@725
   214
int TreeItem::columnCount() const
insilmaril@725
   215
{
insilmaril@725
   216
    return itemData.count();
insilmaril@725
   217
}
insilmaril@741
   218
insilmaril@741
   219
int TreeItem::branchCount() const
insilmaril@741
   220
{
insilmaril@741
   221
    return branchCounter;
insilmaril@741
   222
}
insilmaril@749
   223
insilmaril@749
   224
int TreeItem::imageCount() const
insilmaril@749
   225
{
insilmaril@776
   226
    return imageCounter; 
insilmaril@749
   227
}
insilmaril@749
   228
insilmaril@749
   229
int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?)
insilmaril@749
   230
{
insilmaril@749
   231
	int xlinkCounter=0;
insilmaril@749
   232
    return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated...
insilmaril@749
   233
}
insilmaril@749
   234
insilmaril@786
   235
int TreeItem::attributeCount() const 
insilmaril@786
   236
{
insilmaril@786
   237
    return attributeCounter; 
insilmaril@786
   238
}
insilmaril@786
   239
insilmaril@727
   240
int TreeItem::row() const
insilmaril@727
   241
{
insilmaril@727
   242
    if (parentItem)
insilmaril@727
   243
        return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
insilmaril@727
   244
insilmaril@788
   245
	cout << "TI::row() pI=NULL this="<<this<<"  ***************\n";
insilmaril@727
   246
    return 0;
insilmaril@727
   247
}
insilmaril@727
   248
insilmaril@727
   249
int TreeItem::column() const
insilmaril@727
   250
{
insilmaril@727
   251
    return 0;
insilmaril@727
   252
}
insilmaril@727
   253
insilmaril@740
   254
int TreeItem::depth() 
insilmaril@740
   255
{
insilmaril@787
   256
	// Rootitem d=-1
insilmaril@787
   257
	// MapCenter d=0
insilmaril@755
   258
	int d=-2;
insilmaril@740
   259
	TreeItem *ti=this;
insilmaril@740
   260
	while (ti!=NULL)
insilmaril@740
   261
	{
insilmaril@740
   262
		ti=ti->parent();
insilmaril@740
   263
		d++;
insilmaril@740
   264
	}
insilmaril@740
   265
	return d;
insilmaril@740
   266
}
insilmaril@740
   267
insilmaril@727
   268
TreeItem *TreeItem::parent()
insilmaril@727
   269
{
insilmaril@727
   270
    return parentItem;
insilmaril@727
   271
}
insilmaril@727
   272
insilmaril@755
   273
int TreeItem::childNum()
insilmaril@755
   274
{
insilmaril@755
   275
	return parentItem->childItems.indexOf (this);
insilmaril@755
   276
}
insilmaril@755
   277
insilmaril@741
   278
int TreeItem::num()
insilmaril@741
   279
{
insilmaril@741
   280
	switch (type)
insilmaril@741
   281
	{
insilmaril@776
   282
		case MapCenter: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
insilmaril@776
   283
		case Branch: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
insilmaril@776
   284
		case Image: return parentItem->childItems.indexOf (this) - parentItem->imageOffset;
insilmaril@787
   285
		case Attribute: return parentItem->childItems.indexOf (this) - parentItem->attributeOffset;
insilmaril@741
   286
		default: return -1;
insilmaril@741
   287
	}
insilmaril@749
   288
}
insilmaril@749
   289
insilmaril@749
   290
int TreeItem::num (TreeItem *item)
insilmaril@749
   291
{
insilmaril@749
   292
	if (!item) return -1;
insilmaril@776
   293
	if (!childItems.contains(item)) return -1;
insilmaril@749
   294
	switch (item->getType())
insilmaril@749
   295
	{
insilmaril@763
   296
		case MapCenter: return childItems.indexOf (item) - branchOffset;
insilmaril@763
   297
		case Branch: return childItems.indexOf (item) - branchOffset;
insilmaril@763
   298
		case Image: return parentItem->childItems.indexOf (item) - imageOffset;
insilmaril@787
   299
		case Attribute: return parentItem->childItems.indexOf (item) - attributeOffset;
insilmaril@749
   300
		default: return -1;
insilmaril@749
   301
	}
insilmaril@741
   302
}
insilmaril@766
   303
void TreeItem::setType(const Type t)
insilmaril@766
   304
{
insilmaril@766
   305
	type=t;
insilmaril@766
   306
	itemData[1]=getTypeName();
insilmaril@766
   307
}
insilmaril@766
   308
insilmaril@766
   309
TreeItem::Type TreeItem::getType()
insilmaril@766
   310
{
insilmaril@788
   311
	if (type==Branch && depth()==0) return MapCenter;	//FIXME-2 should not be necesssary
insilmaril@766
   312
	return type;
insilmaril@766
   313
}
insilmaril@766
   314
insilmaril@766
   315
bool TreeItem::isBranchLikeType() const
insilmaril@766
   316
{
insilmaril@766
   317
	if (type==Branch ||type==MapCenter) return true;
insilmaril@766
   318
	return false;
insilmaril@766
   319
}
insilmaril@766
   320
insilmaril@766
   321
QString TreeItem::getTypeName()
insilmaril@766
   322
{
insilmaril@766
   323
	switch (type)
insilmaril@766
   324
	{
insilmaril@766
   325
		case Undefined: return QString ("Undefined");
insilmaril@766
   326
		case MapCenter: return QString ("MapCenter");
insilmaril@766
   327
		case Branch: return QString ("Branch");
insilmaril@766
   328
		case Image: return QString ("Image");
insilmaril@788
   329
		case Attribute: return QString ("Attribute");
insilmaril@766
   330
		default: return QString ("TreeItem::getTypeName no typename defined?!");
insilmaril@766
   331
	}
insilmaril@766
   332
}
insilmaril@766
   333
insilmaril@725
   334
insilmaril@725
   335
QVariant TreeItem::data(int column) const
insilmaril@725
   336
{
insilmaril@725
   337
    return itemData.value(column);
insilmaril@725
   338
}
insilmaril@725
   339
insilmaril@726
   340
void TreeItem::setHeading (const QString s)
insilmaril@725
   341
{
insilmaril@726
   342
	itemData[0]=s;
insilmaril@726
   343
}
insilmaril@726
   344
insilmaril@753
   345
QString TreeItem::getHeading () const
insilmaril@726
   346
{
insilmaril@726
   347
	return itemData[0].toString();
insilmaril@726
   348
}
insilmaril@726
   349
insilmaril@755
   350
std::string TreeItem::getHeadingStd () const
insilmaril@753
   351
{
insilmaril@753
   352
	return itemData[0].toString().toStdString();
insilmaril@753
   353
}
insilmaril@753
   354
insilmaril@758
   355
void TreeItem::setHeadingColor (QColor color)
insilmaril@758
   356
{
insilmaril@758
   357
	headingColor=color;
insilmaril@758
   358
}
insilmaril@758
   359
insilmaril@758
   360
QColor TreeItem::getHeadingColor ()
insilmaril@758
   361
{
insilmaril@758
   362
	return headingColor;
insilmaril@758
   363
}
insilmaril@758
   364
insilmaril@767
   365
void TreeItem::setURL (const QString &u)
insilmaril@741
   366
{
insilmaril@767
   367
	url=u;
insilmaril@767
   368
	if (!url.isEmpty())
insilmaril@767
   369
		systemFlags.activate ("system-url");
insilmaril@767
   370
	else
insilmaril@767
   371
		systemFlags.deactivate ("system-url");
insilmaril@767
   372
}
insilmaril@767
   373
insilmaril@767
   374
QString TreeItem::getURL ()
insilmaril@767
   375
{
insilmaril@767
   376
	return url;
insilmaril@767
   377
}
insilmaril@767
   378
insilmaril@767
   379
void TreeItem::setVymLink (const QString &vl)
insilmaril@767
   380
{
insilmaril@767
   381
	if (!vl.isEmpty())
insilmaril@767
   382
	{
insilmaril@767
   383
		// We need the relative (from loading) 
insilmaril@767
   384
		// or absolute path (from User event)
insilmaril@767
   385
		// and build the absolute path.
insilmaril@767
   386
		// Note: If we have relative, use path of
insilmaril@767
   387
		// current map to build absolute path
insilmaril@767
   388
		QDir d(vl);
insilmaril@767
   389
		if (!d.path().startsWith ("/"))
insilmaril@767
   390
		{
insilmaril@767
   391
			QString p=model->getDestPath();
insilmaril@767
   392
			int i=p.findRev("/",-1);
insilmaril@767
   393
			d.setPath(p.left(i)+"/"+vl);
insilmaril@767
   394
			d.convertToAbs();
insilmaril@767
   395
		}
insilmaril@767
   396
		vymLink=d.path();
insilmaril@767
   397
		systemFlags.activate("system-vymLink");
insilmaril@767
   398
	}	
insilmaril@767
   399
	else	
insilmaril@767
   400
	{
insilmaril@767
   401
		systemFlags.deactivate("system-vymLink");
insilmaril@767
   402
		vymLink.clear();
insilmaril@767
   403
	}	
insilmaril@767
   404
}
insilmaril@767
   405
insilmaril@767
   406
QString TreeItem::getVymLink ()
insilmaril@767
   407
{
insilmaril@767
   408
	return vymLink;
insilmaril@767
   409
}
insilmaril@767
   410
insilmaril@767
   411
void TreeItem::setNote(const QString &s)
insilmaril@767
   412
{
insilmaril@767
   413
	NoteObj n;
insilmaril@767
   414
	n.setNote(s);
insilmaril@767
   415
	setNoteObj (n,false);
insilmaril@767
   416
}
insilmaril@767
   417
insilmaril@767
   418
void TreeItem::clearNote()
insilmaril@767
   419
{
insilmaril@767
   420
	note.clear();
insilmaril@767
   421
	systemFlags.deactivate ("system-note");
insilmaril@746
   422
}
insilmaril@746
   423
insilmaril@776
   424
void TreeItem::setNoteObj(const NoteObj &n, bool updateNoteEditor){
insilmaril@746
   425
	note=n;
insilmaril@767
   426
	if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
insilmaril@767
   427
		systemFlags.activate ("system-note");
insilmaril@767
   428
	if (note.isEmpty() && systemFlags.isActive ("system-note"))
insilmaril@767
   429
		systemFlags.deactivate ("system-note");
insilmaril@741
   430
}
insilmaril@741
   431
insilmaril@741
   432
QString TreeItem::getNote()
insilmaril@741
   433
{
insilmaril@746
   434
	return note.getNote();
insilmaril@746
   435
}
insilmaril@746
   436
insilmaril@768
   437
bool TreeItem::hasEmptyNote()
insilmaril@768
   438
{
insilmaril@768
   439
	return note.isEmpty();
insilmaril@768
   440
}
insilmaril@768
   441
insilmaril@746
   442
NoteObj TreeItem::getNoteObj()
insilmaril@746
   443
{
insilmaril@746
   444
	return note;
insilmaril@746
   445
}
insilmaril@746
   446
insilmaril@746
   447
QString TreeItem::getNoteASCII(const QString &indent, const int &width)
insilmaril@746
   448
{
insilmaril@746
   449
    return note.getNoteASCII(indent,width);
insilmaril@746
   450
}
insilmaril@746
   451
insilmaril@746
   452
QString TreeItem::getNoteASCII()
insilmaril@746
   453
{
insilmaril@746
   454
    return note.getNoteASCII();
insilmaril@746
   455
}
insilmaril@746
   456
insilmaril@746
   457
QString TreeItem::getNoteOpenDoc()
insilmaril@746
   458
{
insilmaril@746
   459
    return note.getNoteOpenDoc();
insilmaril@741
   460
}
insilmaril@741
   461
insilmaril@766
   462
void TreeItem::activateStandardFlag (const QString &name)
insilmaril@726
   463
{
insilmaril@766
   464
	standardFlags.activate (name);
insilmaril@767
   465
	model->emitDataHasChanged(this);
insilmaril@726
   466
}
insilmaril@726
   467
insilmaril@766
   468
void TreeItem::deactivateStandardFlag (const QString &name)
insilmaril@726
   469
{
insilmaril@766
   470
	standardFlags.deactivate (name);
insilmaril@767
   471
	model->emitDataHasChanged(this);
insilmaril@726
   472
}
insilmaril@726
   473
insilmaril@767
   474
void TreeItem::deactivateAllStandardFlags ()
insilmaril@753
   475
{
insilmaril@767
   476
	standardFlags.deactivateAll ();
insilmaril@767
   477
	model->emitDataHasChanged(this);
insilmaril@767
   478
}
insilmaril@767
   479
insilmaril@767
   480
void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
insilmaril@767
   481
{
insilmaril@767
   482
	standardFlags.toggle (name,master);
insilmaril@767
   483
	model->emitDataHasChanged(this);
insilmaril@753
   484
}
insilmaril@753
   485
insilmaril@766
   486
bool TreeItem::isActiveStandardFlag (const QString &name)
insilmaril@726
   487
{
insilmaril@766
   488
	return standardFlags.isActive (name);
insilmaril@725
   489
}
insilmaril@725
   490
insilmaril@767
   491
QStringList TreeItem::activeStandardFlagNames ()
insilmaril@767
   492
{
insilmaril@767
   493
	return standardFlags.activeFlagNames();
insilmaril@767
   494
}
insilmaril@767
   495
insilmaril@770
   496
FlagRow* TreeItem::getStandardFlagRow()
insilmaril@770
   497
{
insilmaril@770
   498
	return &standardFlags;
insilmaril@770
   499
}
insilmaril@770
   500
insilmaril@776
   501
/* FIXME-3 void TreeItem::updateToolBar()
insilmaril@770
   502
{
insilmaril@770
   503
	standardFlags.updateToolBar();
insilmaril@770
   504
}
insilmaril@770
   505
*/
insilmaril@776
   506
QStringList TreeItem::activeSystemFlagNames ()
insilmaril@767
   507
{
insilmaril@767
   508
	return systemFlags.activeFlagNames();
insilmaril@767
   509
}
insilmaril@767
   510
insilmaril@767
   511
bool TreeItem::canMoveDown()
insilmaril@767
   512
{
insilmaril@767
   513
	switch (type)
insilmaril@767
   514
	{
insilmaril@767
   515
		case Undefined: return false;
insilmaril@767
   516
		case MapCenter: 
insilmaril@767
   517
		case Branch: 
insilmaril@767
   518
			if (!parentItem) return false;
insilmaril@767
   519
			if (parentItem->num (this) < parentItem->branchCount()-1)
insilmaril@767
   520
				return true;
insilmaril@767
   521
			else
insilmaril@767
   522
				return false;
insilmaril@767
   523
			break;	
insilmaril@767
   524
		case Image: return false;
insilmaril@767
   525
		default: return false;
insilmaril@767
   526
	}
insilmaril@767
   527
}
insilmaril@767
   528
insilmaril@767
   529
bool TreeItem::canMoveUp()
insilmaril@767
   530
{
insilmaril@767
   531
	switch (type)
insilmaril@767
   532
	{
insilmaril@767
   533
		case Undefined: return false;
insilmaril@767
   534
		case MapCenter: 
insilmaril@767
   535
		case Branch: 
insilmaril@767
   536
			if (!parentItem) return false;
insilmaril@767
   537
			if (parentItem->num (this) > 0)
insilmaril@767
   538
				return true;
insilmaril@767
   539
			else
insilmaril@767
   540
				return false;
insilmaril@767
   541
			break;	
insilmaril@767
   542
		case Image: return false;
insilmaril@767
   543
		default: return false;
insilmaril@767
   544
	}
insilmaril@767
   545
}
insilmaril@767
   546
insilmaril@754
   547
void TreeItem::setID (const QString &s)
insilmaril@754
   548
{
insilmaril@754
   549
	objID=s;
insilmaril@754
   550
}
insilmaril@754
   551
insilmaril@754
   552
QString TreeItem::getID()
insilmaril@754
   553
{
insilmaril@754
   554
	return objID;
insilmaril@754
   555
}
insilmaril@754
   556
insilmaril@754
   557
insilmaril@738
   558
TreeItem* TreeItem::getChildNum(const int &n)
insilmaril@738
   559
{
insilmaril@738
   560
	if (n>=0 && n<childItems.count() )
insilmaril@738
   561
		return childItems.at(n);
insilmaril@738
   562
	else
insilmaril@738
   563
		return NULL;
insilmaril@738
   564
}
insilmaril@738
   565
insilmaril@750
   566
BranchItem* TreeItem::getFirstBranch()
insilmaril@738
   567
{
insilmaril@741
   568
	if (branchCounter>0)
insilmaril@738
   569
		return getBranchNum (branchOffset);
insilmaril@738
   570
	else
insilmaril@738
   571
		return NULL;
insilmaril@738
   572
}
insilmaril@738
   573
insilmaril@750
   574
BranchItem* TreeItem::getLastBranch()
insilmaril@738
   575
{
insilmaril@741
   576
	if (branchCounter>0)
insilmaril@741
   577
		return getBranchNum (branchOffset + branchCounter-1);
insilmaril@738
   578
	else
insilmaril@738
   579
		return NULL;
insilmaril@738
   580
}
insilmaril@738
   581
insilmaril@763
   582
BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
insilmaril@763
   583
{
insilmaril@763
   584
	if (!currentBranch) return NULL;
insilmaril@763
   585
	int n=num (currentBranch)+1;
insilmaril@763
   586
	if (n<branchCounter)
insilmaril@763
   587
		return getBranchNum (branchOffset + n);
insilmaril@763
   588
	else
insilmaril@763
   589
		return NULL;
insilmaril@763
   590
}
insilmaril@763
   591
insilmaril@738
   592
insilmaril@750
   593
BranchItem* TreeItem::getBranchNum(const int &n)
insilmaril@738
   594
{
insilmaril@776
   595
	if (n>=0 && n<branchCounter)
insilmaril@750
   596
		return (BranchItem*)getChildNum (branchOffset + n);
insilmaril@738
   597
	else
insilmaril@738
   598
		return NULL;
insilmaril@738
   599
}
insilmaril@738
   600
insilmaril@750
   601
BranchObj* TreeItem::getBranchObjNum(const int &n)
insilmaril@750
   602
{
insilmaril@776
   603
	if (n>=0 && n<branchCounter)
insilmaril@750
   604
	{
insilmaril@776
   605
		return (BranchObj*)(getBranchNum(n)->getLMO());
insilmaril@750
   606
	} else
insilmaril@750
   607
		return NULL;
insilmaril@750
   608
}
insilmaril@750
   609
insilmaril@776
   610
ImageItem* TreeItem::getImageNum (const int &n)
insilmaril@776
   611
{
insilmaril@776
   612
	if (n>=0 && n<imageCounter)
insilmaril@776
   613
		return (ImageItem*)getChildNum (imageOffset + n);
insilmaril@776
   614
	else
insilmaril@776
   615
		return NULL;
insilmaril@776
   616
}
insilmaril@776
   617
insilmaril@776
   618
FloatImageObj* TreeItem::getImageObjNum (const int &n)	// FIXME-5 what about SVGs later?
insilmaril@776
   619
{
insilmaril@776
   620
	if (imageCounter>0 )
insilmaril@776
   621
		return (FloatImageObj*)(getImageNum(n)->getLMO());
insilmaril@776
   622
	else
insilmaril@776
   623
		return NULL;
insilmaril@776
   624
}
insilmaril@753
   625
insilmaril@779
   626
insilmaril@781
   627
void TreeItem::setHideTmp (HideTmpMode mode)  //FIXME-2
insilmaril@753
   628
{
insilmaril@753
   629
	if (isBranchLikeType() )
insilmaril@753
   630
		((BranchItem*)this)->updateVisibility();
insilmaril@753
   631
		/*
insilmaril@753
   632
	if (type==Image)
insilmaril@753
   633
		//updateVisibility();
insilmaril@753
   634
	*/
insilmaril@753
   635
insilmaril@753
   636
/*
insilmaril@753
   637
insilmaril@753
   638
		if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
insilmaril@753
   639
		{
insilmaril@753
   640
			// Hide stuff according to hideExport flag and parents
insilmaril@753
   641
			//setVisibility (false);
insilmaril@753
   642
			updateVisibility();
insilmaril@753
   643
			//FIXME-2 hidden=true;
insilmaril@753
   644
		}else
insilmaril@753
   645
		{
insilmaril@753
   646
			// Do not hide, but still take care of scrolled status
insilmaril@753
   647
			
insilmaril@753
   648
insilmaril@753
   649
			XXXXXXXX treeItem should be THIS
insilmaril@753
   650
insilmaril@753
   651
			move visible to TreeItem???
insilmaril@753
   652
insilmaril@753
   653
			BranchObj now has updateContents
insilmaril@753
   654
insilmaril@753
   655
			maybe also start "bool TreeItem::branchlikeType"
insilmaril@753
   656
insilmaril@753
   657
insilmaril@753
   658
insilmaril@753
   659
			if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
insilmaril@753
   660
				setVisibility (false);
insilmaril@753
   661
			else
insilmaril@753
   662
				setVisibility (true);
insilmaril@753
   663
			//FIXME-2 hidden=false;
insilmaril@753
   664
		}	
insilmaril@753
   665
insilmaril@753
   666
*/
insilmaril@753
   667
		// And take care of my children
insilmaril@753
   668
		for (int i=0; i<branchCount(); ++i)
insilmaril@753
   669
			getBranchNum(i)->setHideTmp (mode);
insilmaril@753
   670
}
insilmaril@753
   671
insilmaril@753
   672
bool TreeItem::hasHiddenExportParent()
insilmaril@753
   673
{
insilmaril@753
   674
	// Calls parents recursivly to
insilmaril@753
   675
	// find out, if we or parents are temp. hidden
insilmaril@753
   676
insilmaril@753
   677
	if (hidden || hideExport) return true;
insilmaril@753
   678
insilmaril@753
   679
	if (parentItem) 
insilmaril@753
   680
		return parentItem->hasHiddenExportParent();
insilmaril@753
   681
	else
insilmaril@753
   682
		return false;
insilmaril@753
   683
}
insilmaril@753
   684
insilmaril@753
   685
insilmaril@753
   686
void TreeItem::setHideInExport(bool b) 
insilmaril@753
   687
{
insilmaril@776
   688
	if (type==Branch || type==Image)
insilmaril@753
   689
	{
insilmaril@753
   690
		hideExport=b;
insilmaril@753
   691
		if (b)
insilmaril@777
   692
			systemFlags.activate("system-hideInExport");
insilmaril@753
   693
		else	
insilmaril@777
   694
			systemFlags.deactivate("system-hideInExport");
insilmaril@753
   695
	}
insilmaril@753
   696
}	
insilmaril@753
   697
insilmaril@753
   698
bool TreeItem::hideInExport()
insilmaril@753
   699
{
insilmaril@753
   700
	return hideExport;
insilmaril@753
   701
}	
insilmaril@753
   702
insilmaril@753
   703
bool TreeItem::isHidden()
insilmaril@753
   704
{
insilmaril@753
   705
	return hidden;
insilmaril@753
   706
}	
insilmaril@753
   707
insilmaril@779
   708
QString TreeItem::getGeneralAttr()
insilmaril@777
   709
{
insilmaril@780
   710
	QString s;
insilmaril@779
   711
	if (hideExport)
insilmaril@780
   712
		 s+=attribut("hideInExport","true");
insilmaril@780
   713
	if (!url.isEmpty())
insilmaril@780
   714
		s+=attribut ("url",url);
insilmaril@780
   715
	if (!vymLink.isEmpty())
insilmaril@780
   716
		s+=attribut ("vymLink",vymLink);
insilmaril@780
   717
	return s;	
insilmaril@777
   718
}
insilmaril@753
   719
insilmaril@726
   720