treemodel.cpp
author insilmaril
Thu, 02 Apr 2009 09:46:29 +0000
changeset 750 ff3b01ce0960
parent 746 ee6b0f3a4c2f
child 754 db0ec4bcf416
permissions -rw-r--r--
More moving from BranchObj to BranchItem
insilmaril@725
     1
#include <QtGui>
insilmaril@725
     2
insilmaril@741
     3
#include <iostream>
insilmaril@741
     4
using namespace std;
insilmaril@741
     5
insilmaril@750
     6
#include "branchitem.h"
insilmaril@725
     7
#include "treeitem.h"
insilmaril@725
     8
#include "treemodel.h"
insilmaril@725
     9
insilmaril@725
    10
TreeModel::TreeModel(QObject *parent)
insilmaril@725
    11
    : QAbstractItemModel(parent)
insilmaril@725
    12
{
insilmaril@725
    13
    QList<QVariant> rootData;
insilmaril@725
    14
    rootData << "Heading" << "Type" <<"Note";
insilmaril@725
    15
    rootItem = new TreeItem(rootData);
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
QVariant TreeModel::data(const QModelIndex &index, int role) const
insilmaril@725
    24
{
insilmaril@725
    25
    if (!index.isValid())
insilmaril@725
    26
        return QVariant();
insilmaril@725
    27
insilmaril@725
    28
    if (role != Qt::DisplayRole)
insilmaril@725
    29
        return QVariant();
insilmaril@725
    30
insilmaril@745
    31
    TreeItem *item = getItem (index);
insilmaril@725
    32
insilmaril@725
    33
    return item->data(index.column());
insilmaril@725
    34
}
insilmaril@725
    35
insilmaril@725
    36
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
insilmaril@725
    37
{
insilmaril@725
    38
    if (!index.isValid())
insilmaril@725
    39
        return Qt::ItemIsEnabled;
insilmaril@725
    40
insilmaril@725
    41
    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
insilmaril@725
    42
}
insilmaril@725
    43
insilmaril@725
    44
QVariant TreeModel::headerData(int section, Qt::Orientation orientation,
insilmaril@725
    45
                               int role) const
insilmaril@725
    46
{
insilmaril@725
    47
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
insilmaril@725
    48
        return rootItem->data(section);
insilmaril@725
    49
insilmaril@725
    50
    return QVariant();
insilmaril@725
    51
}
insilmaril@725
    52
insilmaril@725
    53
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
insilmaril@725
    54
            const
insilmaril@725
    55
{
insilmaril@725
    56
    TreeItem *parentItem;
insilmaril@725
    57
insilmaril@725
    58
    if (!parent.isValid())
insilmaril@725
    59
        parentItem = rootItem;
insilmaril@725
    60
    else
insilmaril@745
    61
        parentItem = getItem (parent);
insilmaril@725
    62
insilmaril@725
    63
    TreeItem *childItem = parentItem->child(row);
insilmaril@725
    64
    if (childItem)
insilmaril@725
    65
        return createIndex(row, column, childItem);
insilmaril@725
    66
    else
insilmaril@725
    67
        return QModelIndex();
insilmaril@725
    68
}
insilmaril@725
    69
insilmaril@725
    70
QModelIndex TreeModel::parent(const QModelIndex &index) const
insilmaril@725
    71
{
insilmaril@725
    72
    if (!index.isValid())
insilmaril@725
    73
        return QModelIndex();
insilmaril@725
    74
insilmaril@745
    75
    TreeItem *ti= getItem (index);
insilmaril@745
    76
    TreeItem *parentItem = ti->parent();
insilmaril@725
    77
insilmaril@745
    78
	//cout << "TreeModel::parent  ti="<<ti<<" "<<ti->getHeading().toStdString()<<"  pi="<<parentItem<<"  "<<endl;
insilmaril@725
    79
    if (parentItem == rootItem)
insilmaril@725
    80
        return QModelIndex();
insilmaril@725
    81
insilmaril@745
    82
	if (!parentItem)
insilmaril@745
    83
	{
insilmaril@745
    84
		cout <<"TreeModel::parent      ti=="<<ti<<"  "<<ti->getHeading().toStdString()<<endl;
insilmaril@746
    85
        return QModelIndex();	// FIXME-3 do this to avoid segfault, but why?
insilmaril@746
    86
		                        // see also my question on qt-interest in march
insilmaril@745
    87
	}	
insilmaril@745
    88
insilmaril@745
    89
    return createIndex(parentItem->childNumber(), 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@745
    99
        parentItem = getItem (parent);
insilmaril@725
   100
insilmaril@725
   101
    return parentItem->childCount();
insilmaril@725
   102
}
insilmaril@725
   103
insilmaril@741
   104
int TreeModel::columnCount(const QModelIndex &parent) const
insilmaril@726
   105
{
insilmaril@741
   106
    if (parent.isValid())
insilmaril@745
   107
        return getItem (parent)->columnCount();
insilmaril@741
   108
    else
insilmaril@741
   109
        return rootItem->columnCount();
insilmaril@726
   110
}
insilmaril@726
   111
insilmaril@750
   112
BranchItem* TreeModel::next(BranchItem* &current, BranchItem* &previous, int &d0)
insilmaril@741
   113
{
insilmaril@741
   114
	// Walk through map beginning at current with previous==0
insilmaril@741
   115
	// Start at root, if current==NULL
insilmaril@750
   116
	if (!current) current=(BranchItem*)rootItem;
insilmaril@741
   117
insilmaril@741
   118
	// Are we just beginning to walk the map?
insilmaril@741
   119
	if (!previous)
insilmaril@741
   120
	{
insilmaril@741
   121
		previous=current;
insilmaril@741
   122
		d0=current->depth();
insilmaril@741
   123
		current=current->getFirstBranch();
insilmaril@741
   124
		return current;
insilmaril@741
   125
	}
insilmaril@741
   126
insilmaril@741
   127
	//std::cout << " cur="<<current->getHeading().toStdString();
insilmaril@741
   128
	//std::cout << " prev="<<previous->getHeading().toStdString()<<std::endl;
insilmaril@741
   129
insilmaril@741
   130
	// Going up or down (deeper)?
insilmaril@741
   131
	if (current->depth() > previous->depth() )
insilmaril@741
   132
	{	
insilmaril@741
   133
		// Coming from above
insilmaril@741
   134
		// Trying  to go down deeper
insilmaril@741
   135
		if (current->branchCount() >0 )
insilmaril@741
   136
		{
insilmaril@741
   137
			previous=current;
insilmaril@741
   138
			current=current->getFirstBranch();
insilmaril@741
   139
			return current;
insilmaril@741
   140
		}	
insilmaril@741
   141
		// turn around and go up again
insilmaril@741
   142
	}	
insilmaril@741
   143
insilmaril@741
   144
	// Coming from below,
insilmaril@741
   145
	// Trying to go down again to siblings
insilmaril@741
   146
insilmaril@750
   147
	BranchItem *sibling=current->getBranchNum (previous->num()+1);
insilmaril@741
   148
insilmaril@741
   149
	if (sibling)
insilmaril@741
   150
	{	
insilmaril@741
   151
		// Found sibling of previous, go there
insilmaril@741
   152
		previous=current;
insilmaril@741
   153
		current=sibling;
insilmaril@741
   154
		return current;
insilmaril@741
   155
	} 
insilmaril@741
   156
insilmaril@741
   157
	// Go up and try to find siblings of current
insilmaril@741
   158
	previous=current;
insilmaril@750
   159
	current=(BranchItem*)current->parent();
insilmaril@741
   160
insilmaril@741
   161
	// Check if we still can go somewhere
insilmaril@741
   162
	if (!current) return current;
insilmaril@741
   163
	
insilmaril@741
   164
	while (current && current->depth() < previous->depth() )
insilmaril@741
   165
		next (current,previous,d0);
insilmaril@741
   166
		
insilmaril@741
   167
	return current;
insilmaril@741
   168
}
insilmaril@741
   169
insilmaril@745
   170
bool TreeModel::insertRows ( int row, int count, const QModelIndex & parent)
insilmaril@745
   171
{
insilmaril@745
   172
	std::cout << "TreeModel insertRows()\n";
insilmaril@745
   173
	int last=row+count-1;
insilmaril@745
   174
	beginInsertRows (parent,row,last);
insilmaril@745
   175
insilmaril@745
   176
	for (int i=row; i<=last; i++)
insilmaril@745
   177
	{
insilmaril@745
   178
		std::cout << "TreeModel::insertRows inserting i="<<i<<std::endl;
insilmaril@745
   179
	}
insilmaril@745
   180
	endInsertRows ();
insilmaril@745
   181
	return true;
insilmaril@745
   182
}
insilmaril@745
   183
insilmaril@727
   184
bool TreeModel::removeRows ( int row, int count, const QModelIndex & parent)
insilmaril@727
   185
{
insilmaril@727
   186
	int last=row+count-1;
insilmaril@745
   187
	cout << "TreeModel::removeRows row="<<row<<"  count="<<count<<"  last="<<last<<endl;
insilmaril@745
   188
    TreeItem *pi= getItem (parent);
insilmaril@745
   189
	cout << "  pi="<<pi<<"  "<<pi->getHeading().toStdString()<<endl;
insilmaril@727
   190
	beginRemoveRows (parent,row,last);
insilmaril@727
   191
insilmaril@727
   192
	for (int i=row; i<=last; i++)
insilmaril@727
   193
	{
insilmaril@745
   194
		cout << "TreeModel::removeRows removing i="<<i<<std::endl;
insilmaril@727
   195
		pi->removeChild (row);
insilmaril@727
   196
	}
insilmaril@745
   197
	endRemoveRows ();
insilmaril@745
   198
	return true;
insilmaril@745
   199
}
insilmaril@727
   200
insilmaril@745
   201
TreeItem *TreeModel::getItem(const QModelIndex &index) const
insilmaril@745
   202
{
insilmaril@745
   203
    if (index.isValid()) {
insilmaril@745
   204
		TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
insilmaril@745
   205
insilmaril@745
   206
        if (item) return item;
insilmaril@745
   207
    }
insilmaril@745
   208
    return rootItem;
insilmaril@727
   209
}
insilmaril@727
   210
insilmaril@726
   211
QModelIndex TreeModel::index (TreeItem* ti)
insilmaril@726
   212
{
insilmaril@726
   213
	return createIndex (ti->row(),ti->column(),ti);
insilmaril@726
   214
}
insilmaril@726
   215