28 #include "TreeModel.h"
30 TreeModel::TreeModel(
const QString &data, QObject *parent)
31 : QAbstractItemModel(parent)
33 QList<QVariant> rootData;
34 rootData <<
"Title" <<
"Summary";
36 setupModelData(data.split(QString(
"\n")), rootItem);
39 TreeModel::~TreeModel()
44 int TreeModel::columnCount(
const QModelIndex &parent)
const
47 return static_cast<TreeItem*>(parent.internalPointer())->columnCount();
49 return rootItem->columnCount();
52 QVariant TreeModel::data(
const QModelIndex &index,
int role)
const
57 if (role != Qt::DisplayRole)
62 return item->data(index.column());
65 Qt::ItemFlags TreeModel::flags(
const QModelIndex &index)
const
70 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
73 QVariant TreeModel::headerData(
int section, Qt::Orientation orientation,
76 if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
77 return rootItem->data(section);
82 QModelIndex TreeModel::index(
int row,
int column,
const QModelIndex &parent)
85 if (!hasIndex(row, column, parent))
90 if (!parent.isValid())
91 parentItem = rootItem;
93 parentItem =
static_cast<TreeItem*
>(parent.internalPointer());
95 TreeItem *childItem = parentItem->child(row);
97 return createIndex(row, column, childItem);
102 QModelIndex TreeModel::parent(
const QModelIndex &index)
const
104 if (!index.isValid())
105 return QModelIndex();
108 TreeItem *parentItem = childItem->parent();
110 if (parentItem == rootItem)
111 return QModelIndex();
113 return createIndex(parentItem->row(), 0, parentItem);
116 int TreeModel::rowCount(
const QModelIndex &parent)
const
119 if (parent.column() > 0)
122 if (!parent.isValid())
123 parentItem = rootItem;
125 parentItem =
static_cast<TreeItem*
>(parent.internalPointer());
127 return parentItem->childCount();
130 void TreeModel::setupModelData(
const QStringList &lines,
TreeItem *parent)
132 QList<TreeItem*> parents;
133 QList<int> indentations;
139 while (number < lines.count()) {
141 while (position < lines[number].length()) {
142 if (lines[number].mid(position, 1) !=
" ")
147 QString lineData = lines[number].mid(position).trimmed();
149 if (!lineData.isEmpty()) {
151 QStringList columnStrings = lineData.split(
"\t", QString::SkipEmptyParts);
152 QList<QVariant> columnData;
153 for (
int column = 0; column < columnStrings.count(); ++column)
154 columnData << columnStrings[column];
156 if (position > indentations.last()) {
160 if (parents.last()->childCount() > 0) {
161 parents << parents.last()->child(parents.last()->childCount()-1);
162 indentations << position;
165 while (position < indentations.last() && parents.count() > 0) {
167 indentations.pop_back();
172 parents.last()->appendChild(
new TreeItem(columnData, parents.last()));