treemodel.cpp
author insilmaril
Mon, 06 Oct 2008 11:10:20 +0000
changeset 726 7f43b93242aa
parent 725 7ea31701156e
child 727 96402b172173
permissions -rw-r--r--
Various fixes, also from 1.12. branch
insilmaril@725
     1
#include <QtGui>
insilmaril@725
     2
insilmaril@725
     3
#include "treeitem.h"
insilmaril@725
     4
#include "treemodel.h"
insilmaril@725
     5
insilmaril@726
     6
TreeItem* TreeModel::itFirst=NULL;
insilmaril@726
     7
TreeItem* TreeModel::itCur=NULL;
insilmaril@726
     8
insilmaril@725
     9
TreeModel::TreeModel(QObject *parent)
insilmaril@725
    10
    : QAbstractItemModel(parent)
insilmaril@725
    11
{
insilmaril@725
    12
    QList<QVariant> rootData;
insilmaril@725
    13
    rootData << "Heading" << "Type" <<"Note";
insilmaril@725
    14
    rootItem = new TreeItem(rootData);
insilmaril@726
    15
 //   setupModelData(rootItem);
insilmaril@725
    16
}
insilmaril@725
    17
insilmaril@725
    18
TreeModel::~TreeModel()
insilmaril@725
    19
{
insilmaril@725
    20
    delete rootItem;
insilmaril@725
    21
}
insilmaril@725
    22
insilmaril@725
    23
int TreeModel::columnCount(const QModelIndex &parent) const
insilmaril@725
    24
{
insilmaril@725
    25
    if (parent.isValid())
insilmaril@725
    26
        return static_cast<TreeItem*>(parent.internalPointer())->columnCount();
insilmaril@725
    27
    else
insilmaril@725
    28
        return rootItem->columnCount();
insilmaril@725
    29
}
insilmaril@725
    30
insilmaril@725
    31
QVariant TreeModel::data(const QModelIndex &index, int role) const
insilmaril@725
    32
{
insilmaril@725
    33
    if (!index.isValid())
insilmaril@725
    34
        return QVariant();
insilmaril@725
    35
insilmaril@725
    36
    if (role != Qt::DisplayRole)
insilmaril@725
    37
        return QVariant();
insilmaril@725
    38
insilmaril@725
    39
    TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
insilmaril@725
    40
insilmaril@725
    41
    return item->data(index.column());
insilmaril@725
    42
}
insilmaril@725
    43
insilmaril@725
    44
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
insilmaril@725
    45
{
insilmaril@725
    46
    if (!index.isValid())
insilmaril@725
    47
        return Qt::ItemIsEnabled;
insilmaril@725
    48
insilmaril@725
    49
    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
insilmaril@725
    50
}
insilmaril@725
    51
insilmaril@725
    52
QVariant TreeModel::headerData(int section, Qt::Orientation orientation,
insilmaril@725
    53
                               int role) const
insilmaril@725
    54
{
insilmaril@725
    55
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
insilmaril@725
    56
        return rootItem->data(section);
insilmaril@725
    57
insilmaril@725
    58
    return QVariant();
insilmaril@725
    59
}
insilmaril@725
    60
insilmaril@725
    61
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
insilmaril@725
    62
            const
insilmaril@725
    63
{
insilmaril@725
    64
    TreeItem *parentItem;
insilmaril@725
    65
insilmaril@725
    66
    if (!parent.isValid())
insilmaril@725
    67
        parentItem = rootItem;
insilmaril@725
    68
    else
insilmaril@725
    69
        parentItem = static_cast<TreeItem*>(parent.internalPointer());
insilmaril@725
    70
insilmaril@725
    71
    TreeItem *childItem = parentItem->child(row);
insilmaril@725
    72
    if (childItem)
insilmaril@725
    73
        return createIndex(row, column, childItem);
insilmaril@725
    74
    else
insilmaril@725
    75
        return QModelIndex();
insilmaril@725
    76
}
insilmaril@725
    77
insilmaril@725
    78
QModelIndex TreeModel::parent(const QModelIndex &index) const
insilmaril@725
    79
{
insilmaril@725
    80
    if (!index.isValid())
insilmaril@725
    81
        return QModelIndex();
insilmaril@725
    82
insilmaril@725
    83
    TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());
insilmaril@725
    84
    TreeItem *parentItem = childItem->parent();
insilmaril@725
    85
insilmaril@725
    86
    if (parentItem == rootItem)
insilmaril@725
    87
        return QModelIndex();
insilmaril@725
    88
insilmaril@725
    89
    return createIndex(parentItem->row(), 0, parentItem);
insilmaril@725
    90
}
insilmaril@725
    91
insilmaril@725
    92
int TreeModel::rowCount(const QModelIndex &parent) const
insilmaril@725
    93
{
insilmaril@725
    94
    TreeItem *parentItem;
insilmaril@725
    95
insilmaril@725
    96
    if (!parent.isValid())
insilmaril@725
    97
        parentItem = rootItem;
insilmaril@725
    98
    else
insilmaril@725
    99
        parentItem = static_cast<TreeItem*>(parent.internalPointer());
insilmaril@725
   100
insilmaril@725
   101
    return parentItem->childCount();
insilmaril@725
   102
}
insilmaril@725
   103
insilmaril@726
   104
TreeItem* TreeModel::first()
insilmaril@726
   105
{
insilmaril@726
   106
	itCur=NULL;	
insilmaril@726
   107
	itFirst=rootItem;
insilmaril@726
   108
	return rootItem; 
insilmaril@726
   109
}
insilmaril@726
   110
	
insilmaril@726
   111
TreeItem* TreeModel::next()
insilmaril@726
   112
{
insilmaril@726
   113
/*
insilmaril@726
   114
	BranchObj *bo;
insilmaril@726
   115
	BranchObj *lmo;
insilmaril@726
   116
	BranchObj *po=(BranchObj*)parObj;
insilmaril@726
   117
insilmaril@726
   118
	if (branch.isEmpty())
insilmaril@726
   119
		bo=NULL;
insilmaril@726
   120
	else
insilmaril@726
   121
		bo=branch.first();
insilmaril@726
   122
insilmaril@726
   123
	if (!itCur)
insilmaril@726
   124
	{
insilmaril@726
   125
		// no itCur, we are just beginning
insilmaril@726
   126
		if (bo) 
insilmaril@726
   127
		{
insilmaril@726
   128
			// we have children, return first one
insilmaril@726
   129
			itCur=this;
insilmaril@726
   130
			return bo;
insilmaril@726
   131
		}	
insilmaril@726
   132
		else
insilmaril@726
   133
		{
insilmaril@726
   134
			// No children, so there is no next
insilmaril@726
   135
			itCur=this;
insilmaril@726
   136
			return NULL;
insilmaril@726
   137
		}	
insilmaril@726
   138
	}
insilmaril@726
   139
insilmaril@726
   140
	// We have an itCur
insilmaril@726
   141
	if (itCur==po)
insilmaril@726
   142
	{	// We come from parent
insilmaril@726
   143
		if (bo)
insilmaril@726
   144
		{
insilmaril@726
   145
			// there are children, go there
insilmaril@726
   146
			itCur=this;
insilmaril@726
   147
			return bo;
insilmaril@726
   148
		}	
insilmaril@726
   149
		else
insilmaril@726
   150
		{	// no children, try to go up again
insilmaril@726
   151
			if (po)
insilmaril@726
   152
			{
insilmaril@726
   153
				// go back to parent and try to find next there
insilmaril@726
   154
				itCur=this;
insilmaril@726
   155
				lmo=po->next();
insilmaril@726
   156
				itCur=this;
insilmaril@726
   157
				return lmo;
insilmaril@726
   158
insilmaril@726
   159
			}	
insilmaril@726
   160
			else
insilmaril@726
   161
			{
insilmaril@726
   162
				// can't go up, I am mapCenter, no next
insilmaril@726
   163
				itCur=NULL;
insilmaril@726
   164
				return NULL;
insilmaril@726
   165
			}	
insilmaril@726
   166
		}
insilmaril@726
   167
	}
insilmaril@726
   168
insilmaril@726
   169
	// We don't come from parent, but from brother or children
insilmaril@726
   170
insilmaril@726
   171
	// Try to find last child, where we came from, in my own children
insilmaril@726
   172
	bool searching=true;
insilmaril@726
   173
	int i=0;
insilmaril@726
   174
	while (i<branch.size())
insilmaril@726
   175
	{
insilmaril@726
   176
		// Try to find itCur in my own children
insilmaril@726
   177
		if (itCur==branch.at(i))
insilmaril@726
   178
		{
insilmaril@726
   179
			// ok, we come from my own children
insilmaril@726
   180
			if (i<branch.size()-1)
insilmaril@726
   181
				bo=branch.at(i+1);
insilmaril@726
   182
			 else
insilmaril@726
   183
				bo=NULL;
insilmaril@726
   184
			searching=false;
insilmaril@726
   185
			i=branch.size();
insilmaril@726
   186
		} 	
insilmaril@726
   187
		++i;	
insilmaril@726
   188
	}
insilmaril@726
   189
	if (!searching)
insilmaril@726
   190
	{	// found itCur in my children
insilmaril@726
   191
		if (bo)
insilmaril@726
   192
		{
insilmaril@726
   193
			// found a brother of lastLMO 
insilmaril@726
   194
			itCur=this;
insilmaril@726
   195
			return bo;
insilmaril@726
   196
		}	
insilmaril@726
   197
		else
insilmaril@726
   198
		{
insilmaril@726
   199
			if (po)
insilmaril@726
   200
			{
insilmaril@726
   201
				if (this==itFirst) return NULL;	// Stop at starting point
insilmaril@726
   202
				// go up
insilmaril@726
   203
				itCur=this;
insilmaril@726
   204
				lmo=po->next();
insilmaril@726
   205
				itCur=this;
insilmaril@726
   206
				return lmo;
insilmaril@726
   207
			}
insilmaril@726
   208
			else
insilmaril@726
   209
			{
insilmaril@726
   210
				// can't go up, I am mapCenter
insilmaril@726
   211
				itCur=NULL;
insilmaril@726
   212
				return NULL;
insilmaril@726
   213
			}	
insilmaril@726
   214
		}
insilmaril@726
   215
	}
insilmaril@726
   216
insilmaril@726
   217
	// couldn't find last child, it must be a nephew of mine
insilmaril@726
   218
	if (branch.size()>0)
insilmaril@726
   219
	{
insilmaril@726
   220
		// proceed with my first child
insilmaril@726
   221
		itCur=this;	
insilmaril@726
   222
		return branch.first();
insilmaril@726
   223
	}	
insilmaril@726
   224
	else
insilmaril@726
   225
	{
insilmaril@726
   226
		// or go back to my parents
insilmaril@726
   227
		if (po)
insilmaril@726
   228
		{
insilmaril@726
   229
			// go up
insilmaril@726
   230
			itCur=this;
insilmaril@726
   231
			lmo=po->next();
insilmaril@726
   232
			itCur=this;
insilmaril@726
   233
			return lmo;
insilmaril@726
   234
		}	
insilmaril@726
   235
		else
insilmaril@726
   236
		{
insilmaril@726
   237
			// can't go up, I am mapCenter
insilmaril@726
   238
			itCur=NULL;
insilmaril@726
   239
			return NULL;
insilmaril@726
   240
		}	
insilmaril@726
   241
	}	
insilmaril@726
   242
	*/
insilmaril@726
   243
}
insilmaril@726
   244
insilmaril@726
   245
QModelIndex TreeModel::index (TreeItem* ti)
insilmaril@726
   246
{
insilmaril@726
   247
	return createIndex (ti->row(),ti->column(),ti);
insilmaril@726
   248
}
insilmaril@726
   249
insilmaril@726
   250
TreeItem* TreeModel::LMOToItem (LinkableMapObj *lmo)// FIXME not used so far!!!
insilmaril@726
   251
{
insilmaril@726
   252
	TreeItem *ti=rootItem;		
insilmaril@726
   253
}
insilmaril@726
   254
insilmaril@726
   255
void TreeModel::setupModelData(TreeItem *root)	// FIXME not needed anymore
insilmaril@725
   256
{
insilmaril@725
   257
	QList<QVariant> cData;
insilmaril@725
   258
insilmaril@725
   259
	cData << "Center of map" << "MapCenter"<<"Data 1";
insilmaril@725
   260
	TreeItem *mco=new TreeItem (cData,root);
insilmaril@725
   261
	root->appendChild (mco);
insilmaril@725
   262
insilmaril@725
   263
	cData.clear();
insilmaril@725
   264
	cData << "Main A" << "Branch"<<"Data 2";
insilmaril@725
   265
	TreeItem *bo=new TreeItem (cData,mco);
insilmaril@725
   266
	mco->appendChild (bo);
insilmaril@725
   267
	TreeItem *mainA=bo;
insilmaril@725
   268
insilmaril@725
   269
	cData.clear();
insilmaril@725
   270
	cData << "Sub a" << "Branch"<<"Data";
insilmaril@725
   271
	bo=new TreeItem (cData,mainA);
insilmaril@725
   272
	mainA->appendChild (bo);
insilmaril@725
   273
insilmaril@725
   274
	cData.clear();
insilmaril@725
   275
	cData << "Sub b" << "Branch"<<"Data";
insilmaril@725
   276
	bo=new TreeItem (cData,mainA);
insilmaril@725
   277
	mainA->appendChild (bo);
insilmaril@725
   278
insilmaril@725
   279
	cData.clear();
insilmaril@725
   280
	cData << "Main B"<<"Branch" <<"Data 3";
insilmaril@725
   281
	mco->appendChild(new TreeItem(cData, mco));
insilmaril@725
   282
}