diff -r 36eb4b8f409e -r 1ad892c1a709 findresultmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/findresultmodel.cpp Tue Mar 02 13:59:19 2010 +0000 @@ -0,0 +1,229 @@ +#include + +#include "findresultitem.h" +#include "findresultmodel.h" + +FindResultModel::FindResultModel( QObject *parent) + : QAbstractItemModel(parent) +{ + QVector rootData; + rootData << "Foo"<<"bar"; + + rootItem = new FindResultItem(rootData); + //setupModelData(data.split(QString("\n")), rootItem); +} + + +FindResultModel::~FindResultModel() +{ + delete rootItem; +} + +int FindResultModel::columnCount(const QModelIndex & /* parent */) const +{ + return rootItem->columnCount(); +} + +QVariant FindResultModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role != Qt::DisplayRole && role != Qt::EditRole) + return QVariant(); + + FindResultItem *item = getItem(index); + + return item->data(index.column()); +} + +Qt::ItemFlags FindResultModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +FindResultItem *FindResultModel::getItem(const QModelIndex &index) const +{ + if (index.isValid()) { + FindResultItem *item = static_cast(index.internalPointer()); + if (item) return item; + } + return rootItem; +} + +QVariant FindResultModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + return rootItem->data(section); + + return QVariant(); +} + +QModelIndex FindResultModel::index(int row, int column, const QModelIndex &parent) const +{ + if (parent.isValid() && parent.column() != 0) + return QModelIndex(); + + FindResultItem *parentItem = getItem(parent); + + FindResultItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +bool FindResultModel::insertColumns(int position, int columns, const QModelIndex &parent) +{ + bool success; + + beginInsertColumns(parent, position, position + columns - 1); + success = rootItem->insertColumns(position, columns); + endInsertColumns(); + + return success; +} + +bool FindResultModel::insertRows(int position, int rows, const QModelIndex &parent) +{ + FindResultItem *parentItem = getItem(parent); + bool success; + + beginInsertRows(parent, position, position + rows - 1); + success = parentItem->insertChildren(position, rows, rootItem->columnCount()); + endInsertRows(); + + return success; +} + +QModelIndex FindResultModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + FindResultItem *childItem = getItem(index); + FindResultItem *parentItem = childItem->parent(); + + if (parentItem == rootItem) + return QModelIndex(); + + return createIndex(parentItem->childNumber(), 0, parentItem); +} + +bool FindResultModel::removeColumns(int position, int columns, const QModelIndex &parent) +{ + bool success; + + beginRemoveColumns(parent, position, position + columns - 1); + success = rootItem->removeColumns(position, columns); + endRemoveColumns(); + + if (rootItem->columnCount() == 0) + removeRows(0, rowCount()); + + return success; +} + +bool FindResultModel::removeRows(int position, int rows, const QModelIndex &parent) +{ + FindResultItem *parentItem = getItem(parent); + bool success = true; + + beginRemoveRows(parent, position, position + rows - 1); + success = parentItem->removeChildren(position, rows); + endRemoveRows(); + + return success; +} + +int FindResultModel::rowCount(const QModelIndex &parent) const +{ + FindResultItem *parentItem = getItem(parent); + + return parentItem->childCount(); +} + +bool FindResultModel::setData(const QModelIndex &index, const QVariant &value, + int role) +{ + if (role != Qt::EditRole) + return false; + + FindResultItem *item = getItem(index); + bool result = item->setData(index.column(), value); + + if (result) + emit dataChanged(index, index); + + return result; +} + +bool FindResultModel::setHeaderData(int section, Qt::Orientation orientation, + const QVariant &value, int role) +{ + if (role != Qt::EditRole || orientation != Qt::Horizontal) + return false; + + bool result = rootItem->setData(section, value); + + if (result) + emit headerDataChanged(orientation, section, section); + + return result; +} + +void FindResultModel::setupModelData(const QStringList &lines, FindResultItem *parent) +{ + QList parents; + QList indentations; + parents << parent; + indentations << 0; + + int number = 0; + + while (number < lines.count()) { + int position = 0; + while (position < lines[number].length()) { + if (lines[number].mid(position, 1) != " ") + break; + position++; + } + + QString lineData = lines[number].mid(position).trimmed(); + + if (!lineData.isEmpty()) { + // Read the column data from the rest of the line. + QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts); + QVector columnData; + for (int column = 0; column < columnStrings.count(); ++column) + columnData << columnStrings[column]; + + if (position > indentations.last()) { + // The last child of the current parent is now the new parent + // unless the current parent has no children. + + if (parents.last()->childCount() > 0) { + parents << parents.last()->child(parents.last()->childCount()-1); + indentations << position; + } + } else { + while (position < indentations.last() && parents.count() > 0) { + parents.pop_back(); + indentations.pop_back(); + } + } + + // Append a new item to the current parent's list of children. + FindResultItem *parent = parents.last(); + parent->insertChildren(parent->childCount(), 1, rootItem->columnCount()); + for (int column = 0; column < columnData.size(); ++column) + parent->child(parent->childCount() - 1)->setData(column, columnData[column]); + } + + number++; + } +}