findresultmodel.cpp
author insilmaril
Tue, 02 Mar 2010 13:59:19 +0000
changeset 825 1ad892c1a709
child 829 832e96c9abb6
permissions -rw-r--r--
Added file for later dockwidget showing all search results at once
insilmaril@825
     1
#include <QtGui>
insilmaril@825
     2
insilmaril@825
     3
#include "findresultitem.h"
insilmaril@825
     4
#include "findresultmodel.h"
insilmaril@825
     5
insilmaril@825
     6
FindResultModel::FindResultModel( QObject *parent)
insilmaril@825
     7
    : QAbstractItemModel(parent)
insilmaril@825
     8
{
insilmaril@825
     9
    QVector<QVariant> rootData;
insilmaril@825
    10
	rootData << "Foo"<<"bar";
insilmaril@825
    11
insilmaril@825
    12
    rootItem = new FindResultItem(rootData);
insilmaril@825
    13
    //setupModelData(data.split(QString("\n")), rootItem);
insilmaril@825
    14
}
insilmaril@825
    15
insilmaril@825
    16
insilmaril@825
    17
FindResultModel::~FindResultModel()
insilmaril@825
    18
{
insilmaril@825
    19
    delete rootItem;
insilmaril@825
    20
}
insilmaril@825
    21
insilmaril@825
    22
int FindResultModel::columnCount(const QModelIndex & /* parent */) const
insilmaril@825
    23
{
insilmaril@825
    24
    return rootItem->columnCount();
insilmaril@825
    25
}
insilmaril@825
    26
insilmaril@825
    27
QVariant FindResultModel::data(const QModelIndex &index, int role) const
insilmaril@825
    28
{
insilmaril@825
    29
    if (!index.isValid())
insilmaril@825
    30
        return QVariant();
insilmaril@825
    31
insilmaril@825
    32
    if (role != Qt::DisplayRole && role != Qt::EditRole)
insilmaril@825
    33
        return QVariant();
insilmaril@825
    34
insilmaril@825
    35
    FindResultItem *item = getItem(index);
insilmaril@825
    36
insilmaril@825
    37
    return item->data(index.column());
insilmaril@825
    38
}
insilmaril@825
    39
insilmaril@825
    40
Qt::ItemFlags FindResultModel::flags(const QModelIndex &index) const
insilmaril@825
    41
{
insilmaril@825
    42
    if (!index.isValid())
insilmaril@825
    43
        return 0;
insilmaril@825
    44
insilmaril@825
    45
    return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
insilmaril@825
    46
}
insilmaril@825
    47
insilmaril@825
    48
FindResultItem *FindResultModel::getItem(const QModelIndex &index) const
insilmaril@825
    49
{
insilmaril@825
    50
    if (index.isValid()) {
insilmaril@825
    51
        FindResultItem *item = static_cast<FindResultItem*>(index.internalPointer());
insilmaril@825
    52
        if (item) return item;
insilmaril@825
    53
    }
insilmaril@825
    54
    return rootItem;
insilmaril@825
    55
}
insilmaril@825
    56
insilmaril@825
    57
QVariant FindResultModel::headerData(int section, Qt::Orientation orientation,
insilmaril@825
    58
                               int role) const
insilmaril@825
    59
{
insilmaril@825
    60
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
insilmaril@825
    61
        return rootItem->data(section);
insilmaril@825
    62
insilmaril@825
    63
    return QVariant();
insilmaril@825
    64
}
insilmaril@825
    65
insilmaril@825
    66
QModelIndex FindResultModel::index(int row, int column, const QModelIndex &parent) const
insilmaril@825
    67
{
insilmaril@825
    68
    if (parent.isValid() && parent.column() != 0)
insilmaril@825
    69
        return QModelIndex();
insilmaril@825
    70
insilmaril@825
    71
    FindResultItem *parentItem = getItem(parent);
insilmaril@825
    72
insilmaril@825
    73
    FindResultItem *childItem = parentItem->child(row);
insilmaril@825
    74
    if (childItem)
insilmaril@825
    75
        return createIndex(row, column, childItem);
insilmaril@825
    76
    else
insilmaril@825
    77
        return QModelIndex();
insilmaril@825
    78
}
insilmaril@825
    79
insilmaril@825
    80
bool FindResultModel::insertColumns(int position, int columns, const QModelIndex &parent)
insilmaril@825
    81
{
insilmaril@825
    82
    bool success;
insilmaril@825
    83
insilmaril@825
    84
    beginInsertColumns(parent, position, position + columns - 1);
insilmaril@825
    85
    success = rootItem->insertColumns(position, columns);
insilmaril@825
    86
    endInsertColumns();
insilmaril@825
    87
insilmaril@825
    88
    return success;
insilmaril@825
    89
}
insilmaril@825
    90
insilmaril@825
    91
bool FindResultModel::insertRows(int position, int rows, const QModelIndex &parent)
insilmaril@825
    92
{
insilmaril@825
    93
    FindResultItem *parentItem = getItem(parent);
insilmaril@825
    94
    bool success;
insilmaril@825
    95
insilmaril@825
    96
    beginInsertRows(parent, position, position + rows - 1);
insilmaril@825
    97
    success = parentItem->insertChildren(position, rows, rootItem->columnCount());
insilmaril@825
    98
    endInsertRows();
insilmaril@825
    99
insilmaril@825
   100
    return success;
insilmaril@825
   101
}
insilmaril@825
   102
insilmaril@825
   103
QModelIndex FindResultModel::parent(const QModelIndex &index) const
insilmaril@825
   104
{
insilmaril@825
   105
    if (!index.isValid())
insilmaril@825
   106
        return QModelIndex();
insilmaril@825
   107
insilmaril@825
   108
    FindResultItem *childItem = getItem(index);
insilmaril@825
   109
    FindResultItem *parentItem = childItem->parent();
insilmaril@825
   110
insilmaril@825
   111
    if (parentItem == rootItem)
insilmaril@825
   112
        return QModelIndex();
insilmaril@825
   113
insilmaril@825
   114
    return createIndex(parentItem->childNumber(), 0, parentItem);
insilmaril@825
   115
}
insilmaril@825
   116
insilmaril@825
   117
bool FindResultModel::removeColumns(int position, int columns, const QModelIndex &parent)
insilmaril@825
   118
{
insilmaril@825
   119
    bool success;
insilmaril@825
   120
insilmaril@825
   121
    beginRemoveColumns(parent, position, position + columns - 1);
insilmaril@825
   122
    success = rootItem->removeColumns(position, columns);
insilmaril@825
   123
    endRemoveColumns();
insilmaril@825
   124
insilmaril@825
   125
    if (rootItem->columnCount() == 0)
insilmaril@825
   126
        removeRows(0, rowCount());
insilmaril@825
   127
insilmaril@825
   128
    return success;
insilmaril@825
   129
}
insilmaril@825
   130
insilmaril@825
   131
bool FindResultModel::removeRows(int position, int rows, const QModelIndex &parent)
insilmaril@825
   132
{
insilmaril@825
   133
    FindResultItem *parentItem = getItem(parent);
insilmaril@825
   134
    bool success = true;
insilmaril@825
   135
insilmaril@825
   136
    beginRemoveRows(parent, position, position + rows - 1);
insilmaril@825
   137
    success = parentItem->removeChildren(position, rows);
insilmaril@825
   138
    endRemoveRows();
insilmaril@825
   139
insilmaril@825
   140
    return success;
insilmaril@825
   141
}
insilmaril@825
   142
insilmaril@825
   143
int FindResultModel::rowCount(const QModelIndex &parent) const
insilmaril@825
   144
{
insilmaril@825
   145
    FindResultItem *parentItem = getItem(parent);
insilmaril@825
   146
insilmaril@825
   147
    return parentItem->childCount();
insilmaril@825
   148
}
insilmaril@825
   149
insilmaril@825
   150
bool FindResultModel::setData(const QModelIndex &index, const QVariant &value,
insilmaril@825
   151
                        int role)
insilmaril@825
   152
{
insilmaril@825
   153
    if (role != Qt::EditRole)
insilmaril@825
   154
        return false;
insilmaril@825
   155
insilmaril@825
   156
    FindResultItem *item = getItem(index);
insilmaril@825
   157
    bool result = item->setData(index.column(), value);
insilmaril@825
   158
insilmaril@825
   159
    if (result)
insilmaril@825
   160
        emit dataChanged(index, index);
insilmaril@825
   161
insilmaril@825
   162
    return result;
insilmaril@825
   163
}
insilmaril@825
   164
insilmaril@825
   165
bool FindResultModel::setHeaderData(int section, Qt::Orientation orientation,
insilmaril@825
   166
                              const QVariant &value, int role)
insilmaril@825
   167
{
insilmaril@825
   168
    if (role != Qt::EditRole || orientation != Qt::Horizontal)
insilmaril@825
   169
        return false;
insilmaril@825
   170
insilmaril@825
   171
    bool result = rootItem->setData(section, value);
insilmaril@825
   172
insilmaril@825
   173
    if (result)
insilmaril@825
   174
        emit headerDataChanged(orientation, section, section);
insilmaril@825
   175
insilmaril@825
   176
    return result;
insilmaril@825
   177
}
insilmaril@825
   178
insilmaril@825
   179
void FindResultModel::setupModelData(const QStringList &lines, FindResultItem *parent)
insilmaril@825
   180
{
insilmaril@825
   181
    QList<FindResultItem*> parents;
insilmaril@825
   182
    QList<int> indentations;
insilmaril@825
   183
    parents << parent;
insilmaril@825
   184
    indentations << 0;
insilmaril@825
   185
insilmaril@825
   186
    int number = 0;
insilmaril@825
   187
insilmaril@825
   188
    while (number < lines.count()) {
insilmaril@825
   189
        int position = 0;
insilmaril@825
   190
        while (position < lines[number].length()) {
insilmaril@825
   191
            if (lines[number].mid(position, 1) != " ")
insilmaril@825
   192
                break;
insilmaril@825
   193
            position++;
insilmaril@825
   194
        }
insilmaril@825
   195
insilmaril@825
   196
        QString lineData = lines[number].mid(position).trimmed();
insilmaril@825
   197
insilmaril@825
   198
        if (!lineData.isEmpty()) {
insilmaril@825
   199
            // Read the column data from the rest of the line.
insilmaril@825
   200
            QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts);
insilmaril@825
   201
            QVector<QVariant> columnData;
insilmaril@825
   202
            for (int column = 0; column < columnStrings.count(); ++column)
insilmaril@825
   203
                columnData << columnStrings[column];
insilmaril@825
   204
insilmaril@825
   205
            if (position > indentations.last()) {
insilmaril@825
   206
                // The last child of the current parent is now the new parent
insilmaril@825
   207
                // unless the current parent has no children.
insilmaril@825
   208
insilmaril@825
   209
                if (parents.last()->childCount() > 0) {
insilmaril@825
   210
                    parents << parents.last()->child(parents.last()->childCount()-1);
insilmaril@825
   211
                    indentations << position;
insilmaril@825
   212
                }
insilmaril@825
   213
            } else {
insilmaril@825
   214
                while (position < indentations.last() && parents.count() > 0) {
insilmaril@825
   215
                    parents.pop_back();
insilmaril@825
   216
                    indentations.pop_back();
insilmaril@825
   217
                }
insilmaril@825
   218
            }
insilmaril@825
   219
insilmaril@825
   220
            // Append a new item to the current parent's list of children.
insilmaril@825
   221
            FindResultItem *parent = parents.last();
insilmaril@825
   222
            parent->insertChildren(parent->childCount(), 1, rootItem->columnCount());
insilmaril@825
   223
            for (int column = 0; column < columnData.size(); ++column)
insilmaril@825
   224
                parent->child(parent->childCount() - 1)->setData(column, columnData[column]);
insilmaril@825
   225
        }
insilmaril@825
   226
insilmaril@825
   227
        number++;
insilmaril@825
   228
    }
insilmaril@825
   229
}