treemodel.cpp
author insilmaril
Mon, 23 Mar 2009 09:06:51 +0000
changeset 745 2d4cc445a86a
parent 741 1b4d1ea6ea8c
child 746 ee6b0f3a4c2f
permissions -rw-r--r--
still working on insert/remove of rows
insilmaril@725
     1
#include <QtGui>
insilmaril@725
     2
insilmaril@741
     3
#include <iostream>
insilmaril@741
     4
using namespace std;
insilmaril@741
     5
insilmaril@725
     6
#include "treeitem.h"
insilmaril@725
     7
#include "treemodel.h"
insilmaril@725
     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@725
    15
}
insilmaril@725
    16
insilmaril@725
    17
TreeModel::~TreeModel()
insilmaril@725
    18
{
insilmaril@725
    19
    delete rootItem;
insilmaril@725
    20
}
insilmaril@725
    21
insilmaril@725
    22
QVariant TreeModel::data(const QModelIndex &index, int role) const
insilmaril@725
    23
{
insilmaril@725
    24
    if (!index.isValid())
insilmaril@725
    25
        return QVariant();
insilmaril@725
    26
insilmaril@725
    27
    if (role != Qt::DisplayRole)
insilmaril@725
    28
        return QVariant();
insilmaril@725
    29
insilmaril@745
    30
    TreeItem *item = getItem (index);
insilmaril@725
    31
insilmaril@725
    32
    return item->data(index.column());
insilmaril@725
    33
}
insilmaril@725
    34
insilmaril@725
    35
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
insilmaril@725
    36
{
insilmaril@725
    37
    if (!index.isValid())
insilmaril@725
    38
        return Qt::ItemIsEnabled;
insilmaril@725
    39
insilmaril@725
    40
    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
insilmaril@725
    41
}
insilmaril@725
    42
insilmaril@725
    43
QVariant TreeModel::headerData(int section, Qt::Orientation orientation,
insilmaril@725
    44
                               int role) const
insilmaril@725
    45
{
insilmaril@725
    46
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
insilmaril@725
    47
        return rootItem->data(section);
insilmaril@725
    48
insilmaril@725
    49
    return QVariant();
insilmaril@725
    50
}
insilmaril@725
    51
insilmaril@725
    52
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
insilmaril@725
    53
            const
insilmaril@725
    54
{
insilmaril@725
    55
    TreeItem *parentItem;
insilmaril@725
    56
insilmaril@725
    57
    if (!parent.isValid())
insilmaril@725
    58
        parentItem = rootItem;
insilmaril@725
    59
    else
insilmaril@745
    60
        parentItem = getItem (parent);
insilmaril@725
    61
insilmaril@725
    62
    TreeItem *childItem = parentItem->child(row);
insilmaril@725
    63
    if (childItem)
insilmaril@725
    64
        return createIndex(row, column, childItem);
insilmaril@725
    65
    else
insilmaril@725
    66
        return QModelIndex();
insilmaril@725
    67
}
insilmaril@725
    68
insilmaril@725
    69
QModelIndex TreeModel::parent(const QModelIndex &index) const
insilmaril@725
    70
{
insilmaril@725
    71
    if (!index.isValid())
insilmaril@725
    72
        return QModelIndex();
insilmaril@725
    73
insilmaril@745
    74
    TreeItem *ti= getItem (index);
insilmaril@745
    75
    TreeItem *parentItem = ti->parent();
insilmaril@725
    76
insilmaril@745
    77
	//cout << "TreeModel::parent  ti="<<ti<<" "<<ti->getHeading().toStdString()<<"  pi="<<parentItem<<"  "<<endl;
insilmaril@725
    78
    if (parentItem == rootItem)
insilmaril@725
    79
        return QModelIndex();
insilmaril@725
    80
insilmaril@745
    81
	if (!parentItem)
insilmaril@745
    82
	{
insilmaril@745
    83
		cout <<"TreeModel::parent      ti=="<<ti<<"  "<<ti->getHeading().toStdString()<<endl;
insilmaril@745
    84
        return QModelIndex();	// FIXME do this to avoid segfault, but why?
insilmaril@745
    85
	}	
insilmaril@745
    86
insilmaril@745
    87
    return createIndex(parentItem->childNumber(), 0, parentItem);
insilmaril@725
    88
}
insilmaril@725
    89
insilmaril@725
    90
int TreeModel::rowCount(const QModelIndex &parent) const
insilmaril@725
    91
{
insilmaril@725
    92
    TreeItem *parentItem;
insilmaril@725
    93
insilmaril@725
    94
    if (!parent.isValid())
insilmaril@725
    95
        parentItem = rootItem;
insilmaril@725
    96
    else
insilmaril@745
    97
        parentItem = getItem (parent);
insilmaril@725
    98
insilmaril@725
    99
    return parentItem->childCount();
insilmaril@725
   100
}
insilmaril@725
   101
insilmaril@741
   102
int TreeModel::columnCount(const QModelIndex &parent) const
insilmaril@726
   103
{
insilmaril@741
   104
    if (parent.isValid())
insilmaril@745
   105
        return getItem (parent)->columnCount();
insilmaril@741
   106
    else
insilmaril@741
   107
        return rootItem->columnCount();
insilmaril@726
   108
}
insilmaril@726
   109
insilmaril@741
   110
TreeItem* TreeModel::next(TreeItem* &current, TreeItem* &previous, int &d0)
insilmaril@741
   111
{
insilmaril@741
   112
	// Walk through map beginning at current with previous==0
insilmaril@741
   113
	// Start at root, if current==NULL
insilmaril@741
   114
	if (!current) current=rootItem;
insilmaril@741
   115
insilmaril@741
   116
	// Are we just beginning to walk the map?
insilmaril@741
   117
	if (!previous)
insilmaril@741
   118
	{
insilmaril@741
   119
		previous=current;
insilmaril@741
   120
		d0=current->depth();
insilmaril@741
   121
		current=current->getFirstBranch();
insilmaril@741
   122
		return current;
insilmaril@741
   123
	}
insilmaril@741
   124
insilmaril@741
   125
	//std::cout << " cur="<<current->getHeading().toStdString();
insilmaril@741
   126
	//std::cout << " prev="<<previous->getHeading().toStdString()<<std::endl;
insilmaril@741
   127
insilmaril@741
   128
	// Going up or down (deeper)?
insilmaril@741
   129
	if (current->depth() > previous->depth() )
insilmaril@741
   130
	{	
insilmaril@741
   131
		// Coming from above
insilmaril@741
   132
		// Trying  to go down deeper
insilmaril@741
   133
		if (current->branchCount() >0 )
insilmaril@741
   134
		{
insilmaril@741
   135
			previous=current;
insilmaril@741
   136
			current=current->getFirstBranch();
insilmaril@741
   137
			return current;
insilmaril@741
   138
		}	
insilmaril@741
   139
		// turn around and go up again
insilmaril@741
   140
	}	
insilmaril@741
   141
insilmaril@741
   142
	// Coming from below,
insilmaril@741
   143
	// Trying to go down again to siblings
insilmaril@741
   144
insilmaril@741
   145
	TreeItem *sibling=current->getBranchNum (previous->num()+1);
insilmaril@741
   146
insilmaril@741
   147
	if (sibling)
insilmaril@741
   148
	{	
insilmaril@741
   149
		// Found sibling of previous, go there
insilmaril@741
   150
		previous=current;
insilmaril@741
   151
		current=sibling;
insilmaril@741
   152
		return current;
insilmaril@741
   153
	} 
insilmaril@741
   154
insilmaril@741
   155
	// Go up and try to find siblings of current
insilmaril@741
   156
	previous=current;
insilmaril@741
   157
	current=current->parent();
insilmaril@741
   158
insilmaril@741
   159
	// Check if we still can go somewhere
insilmaril@741
   160
	if (!current) return current;
insilmaril@741
   161
	
insilmaril@741
   162
	while (current && current->depth() < previous->depth() )
insilmaril@741
   163
		next (current,previous,d0);
insilmaril@741
   164
		
insilmaril@741
   165
	return current;
insilmaril@741
   166
}
insilmaril@741
   167
insilmaril@745
   168
bool TreeModel::insertRows ( int row, int count, const QModelIndex & parent)
insilmaril@745
   169
{
insilmaril@745
   170
	std::cout << "TreeModel insertRows()\n";
insilmaril@745
   171
	int last=row+count-1;
insilmaril@745
   172
	beginInsertRows (parent,row,last);
insilmaril@745
   173
insilmaril@745
   174
	for (int i=row; i<=last; i++)
insilmaril@745
   175
	{
insilmaril@745
   176
		std::cout << "TreeModel::insertRows inserting i="<<i<<std::endl;
insilmaril@745
   177
	}
insilmaril@745
   178
	endInsertRows ();
insilmaril@745
   179
	return true;
insilmaril@745
   180
}
insilmaril@745
   181
insilmaril@727
   182
bool TreeModel::removeRows ( int row, int count, const QModelIndex & parent)
insilmaril@727
   183
{
insilmaril@727
   184
	int last=row+count-1;
insilmaril@745
   185
	cout << "TreeModel::removeRows row="<<row<<"  count="<<count<<"  last="<<last<<endl;
insilmaril@745
   186
    TreeItem *pi= getItem (parent);
insilmaril@745
   187
	cout << "  pi="<<pi<<"  "<<pi->getHeading().toStdString()<<endl;
insilmaril@745
   188
	cout << "  ok0\n";
insilmaril@727
   189
	beginRemoveRows (parent,row,last);
insilmaril@745
   190
	cout << "  ok1\n";
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