1/*
2 Copyright (c) 2009 Tobias Koenig <tokoe@kde.org>
3
4 This library is free software; you can redistribute it and/or modify it
5 under the terms of the GNU Library General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or (at your
7 option) any later version.
8
9 This library is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12 License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the
16 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 02110-1301, USA.
18*/
19
20#include "asyncselectionhandler_p.h"
21
22#include <akonadi/entitytreemodel.h>
23
24using namespace Akonadi;
25
26AsyncSelectionHandler::AsyncSelectionHandler(QAbstractItemModel *model, QObject *parent)
27 : QObject(parent)
28 , mModel(model)
29{
30 Q_ASSERT(mModel);
31
32 connect(mModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
33 this, SLOT(rowsInserted(QModelIndex,int,int)));
34}
35
36AsyncSelectionHandler::~AsyncSelectionHandler()
37{
38}
39
40bool AsyncSelectionHandler::scanSubTree(const QModelIndex &index, bool searchForItem)
41{
42 if (searchForItem) {
43 const Item::Id id = index.data(EntityTreeModel::ItemIdRole).toLongLong();
44
45 if (mItem.id() == id) {
46 emit itemAvailable(index);
47 return true;
48 }
49 } else {
50 const Collection::Id id = index.data(EntityTreeModel::CollectionIdRole).toLongLong();
51
52 if (mCollection.id() == id) {
53 emit collectionAvailable(index);
54 return true;
55 }
56 }
57
58 for (int row = 0; row < mModel->rowCount(index); ++row) {
59 const QModelIndex childIndex = mModel->index(row, 0, index);
60 if (scanSubTree(childIndex, searchForItem)) {
61 return true;
62 }
63 }
64
65 return false;
66}
67
68void AsyncSelectionHandler::waitForCollection(const Collection &collection)
69{
70 mCollection = collection;
71
72 scanSubTree(QModelIndex(), false);
73}
74
75void AsyncSelectionHandler::waitForItem(const Item &item)
76{
77 mItem = item;
78
79 scanSubTree(QModelIndex(), true);
80}
81
82void AsyncSelectionHandler::rowsInserted(const QModelIndex &parent, int start, int end)
83{
84 for (int i = start; i <= end; ++i) {
85 scanSubTree(mModel->index(i, 0, parent), false);
86 scanSubTree(mModel->index(i, 0, parent), true);
87 }
88}
89
90#include "moc_asyncselectionhandler_p.cpp"
91