File: modelutils.cpp

package info (click to toggle)
gammaray 3.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 21,612 kB
  • sloc: cpp: 94,643; ansic: 2,227; sh: 336; python: 164; yacc: 90; lex: 82; xml: 61; makefile: 26
file content (60 lines) | stat: -rw-r--r-- 1,833 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
  modelutils.cpp

  This file is part of GammaRay, the Qt application inspection and manipulation tool.

  SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
  Author: Kevin Funk <kevin.funk@kdab.com>

  SPDX-License-Identifier: GPL-2.0-or-later

  Contact KDAB at <info@kdab.com> for commercial licensing options.
*/

#include "modelutils.h"

#include <QAbstractItemModel>

using namespace GammaRay;

QModelIndexList ModelUtils::match(const QModelIndex &start, int role, MatchAcceptor accept,
                                  int hits, Qt::MatchFlags flags)
{
    if (!start.isValid() || role < 0)
        return QModelIndexList();

    const QAbstractItemModel *model = start.model();
    const QModelIndex parentIndex = model->parent(start);
    bool recurse = flags & Qt::MatchRecursive;
    bool wrap = flags & Qt::MatchWrap;
    bool allHits = (hits == -1);
    int from = start.row();
    int to = model->rowCount(parentIndex);

    QModelIndexList result;

    // iterates twice if wrapping
    for (int i = 0; (wrap && i < 2) || (!wrap && i < 1); ++i) {
        for (int r = from; (r < to) && (allHits || result.size() < hits); ++r) {
            QModelIndex idx = model->index(r, start.column(), parentIndex);
            if (!idx.isValid())
                continue;

            const QVariant v = model->data(idx, role);
            if (accept(v))
                result << idx;

            // search the hierarchy
            if (recurse && model->hasChildren(idx)) {
                result += match(model->index(0, idx.column(), idx), role,
                                accept, (allHits ? -1 : hits - result.size()), flags);
            }
        }

        // prepare for the next iteration
        from = 0;
        to = start.row();
    }

    return result;
}