1/*
2 Copyright (c) 2007 Bruno Virlet <bruno.virlet@gmail.com>
3 Copyright (c) 2009 Stephen Kelly <steveire@gmail.com>
4
5 This library is free software; you can redistribute it and/or modify it
6 under the terms of the GNU Library General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or (at your
8 option) any later version.
9
10 This library is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13 License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 02110-1301, USA.
19*/
20
21#include "entityrightsfiltermodel.h"
22
23#include "entitytreemodel.h"
24
25#include <kdebug.h>
26
27using namespace Akonadi;
28
29namespace Akonadi {
30
31/**
32 * @internal
33 */
34class EntityRightsFilterModelPrivate
35{
36public:
37 EntityRightsFilterModelPrivate(EntityRightsFilterModel *parent)
38 : q_ptr(parent)
39 , mAccessRights(Collection::AllRights)
40 {
41 }
42
43 bool rightsMatches(const QModelIndex &index) const
44 {
45 if (mAccessRights == Collection::AllRights ||
46 mAccessRights == Collection::ReadOnly) {
47 return true;
48 }
49
50 const Collection collection = index.data(EntityTreeModel::CollectionRole).value<Collection>();
51 if (collection.isValid()) {
52 return (mAccessRights &collection.rights());
53 } else {
54 const Item item = index.data(EntityTreeModel::ItemRole).value<Item>();
55 if (item.isValid()) {
56 const Collection collection = index.data(EntityTreeModel::ParentCollectionRole).value<Collection>();
57 return (mAccessRights &collection.rights());
58 } else {
59 return false;
60 }
61 }
62 }
63
64 Q_DECLARE_PUBLIC(EntityRightsFilterModel)
65 EntityRightsFilterModel *q_ptr;
66
67 Collection::Rights mAccessRights;
68};
69
70}
71
72EntityRightsFilterModel::EntityRightsFilterModel(QObject *parent)
73 : KRecursiveFilterProxyModel(parent)
74 , d_ptr(new EntityRightsFilterModelPrivate(this))
75{
76}
77
78EntityRightsFilterModel::~EntityRightsFilterModel()
79{
80 delete d_ptr;
81}
82
83void EntityRightsFilterModel::setAccessRights(Collection::Rights rights)
84{
85 Q_D(EntityRightsFilterModel);
86 d->mAccessRights = rights;
87 invalidateFilter();
88}
89
90Collection::Rights EntityRightsFilterModel::accessRights() const
91{
92 Q_D(const EntityRightsFilterModel);
93 return d->mAccessRights;
94}
95
96bool EntityRightsFilterModel::acceptRow(int sourceRow, const QModelIndex &sourceParent) const
97{
98 Q_D(const EntityRightsFilterModel);
99
100 const QModelIndex modelIndex = sourceModel()->index(sourceRow, 0, sourceParent);
101
102 return d->rightsMatches(modelIndex);
103}
104
105Qt::ItemFlags EntityRightsFilterModel::flags(const QModelIndex &index) const
106{
107 Q_D(const EntityRightsFilterModel);
108
109 if (d->rightsMatches(index)) {
110 return KRecursiveFilterProxyModel::flags(index);
111 } else {
112 return KRecursiveFilterProxyModel::flags(index) &~(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
113 }
114}
115
116QModelIndexList EntityRightsFilterModel::match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const
117{
118 if (role < Qt::UserRole) {
119 return QSortFilterProxyModel::match(start, role, value, hits, flags);
120 }
121
122 QModelIndexList list;
123 QModelIndex proxyIndex;
124 foreach (const QModelIndex &idx, sourceModel()->match(mapToSource(start), role, value, hits, flags)) {
125 proxyIndex = mapFromSource(idx);
126 if (proxyIndex.isValid())
127 list << proxyIndex;
128 }
129
130 return list;
131}
132