File indexing completed on 2024-05-12 05:10:43
0001 /* 0002 SPDX-FileCopyrightText: 2014 Sandro Knauß <knauss@kolabsys.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "calfilterpartstatusproxymodel_p.h" 0008 #include "calendarutils.h" 0009 #include "utils_p.h" 0010 0011 #include <Akonadi/Collection> 0012 #include <Akonadi/EntityTreeModel> 0013 #include <Akonadi/Item> 0014 0015 #include <KCalendarCore/Incidence> 0016 // #include <email.h> 0017 0018 #include <KIdentityManagementCore/IdentityManager> 0019 0020 using namespace Akonadi; 0021 0022 class Akonadi::CalFilterPartStatusProxyModelPrivate 0023 { 0024 public: 0025 explicit CalFilterPartStatusProxyModelPrivate() 0026 : mIdentityManager(KIdentityManagementCore::IdentityManager::self()) 0027 { 0028 } 0029 0030 QList<KCalendarCore::Attendee::PartStat> mBlockedStatusList; 0031 KIdentityManagementCore::IdentityManager *const mIdentityManager; 0032 bool mFilterVirtual = false; 0033 }; 0034 0035 void CalFilterPartStatusProxyModel::slotIdentitiesChanged() 0036 { 0037 invalidate(); 0038 } 0039 0040 CalFilterPartStatusProxyModel::CalFilterPartStatusProxyModel(QObject *parent) 0041 : QSortFilterProxyModel(parent) 0042 , d(new CalFilterPartStatusProxyModelPrivate()) 0043 { 0044 QObject::connect(d->mIdentityManager, 0045 qOverload<>(&KIdentityManagementCore::IdentityManager::changed), 0046 this, 0047 &CalFilterPartStatusProxyModel::slotIdentitiesChanged); 0048 } 0049 0050 CalFilterPartStatusProxyModel::~CalFilterPartStatusProxyModel() = default; 0051 0052 const QList<KCalendarCore::Attendee::PartStat> &CalFilterPartStatusProxyModel::blockedStatusList() const 0053 { 0054 return d->mBlockedStatusList; 0055 } 0056 0057 void CalFilterPartStatusProxyModel::setBlockedStatusList(const QList<KCalendarCore::Attendee::PartStat> &blockStatusList) 0058 { 0059 d->mBlockedStatusList = blockStatusList; 0060 } 0061 0062 bool CalFilterPartStatusProxyModel::filterVirtual() const 0063 { 0064 return d->mFilterVirtual; 0065 } 0066 0067 void CalFilterPartStatusProxyModel::setFilterVirtual(bool filterVirtual) 0068 { 0069 d->mFilterVirtual = filterVirtual; 0070 } 0071 0072 bool CalFilterPartStatusProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const 0073 { 0074 const QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); 0075 if (!idx.isValid()) { 0076 return false; 0077 } 0078 0079 const auto item = idx.data(Akonadi::EntityTreeModel::ItemRole).value<Akonadi::Item>(); 0080 if (!item.isValid()) { 0081 return false; 0082 } 0083 0084 const KCalendarCore::Incidence::Ptr incidence = CalendarUtils::incidence(item); 0085 if (!incidence) { 0086 return false; 0087 } 0088 0089 // Incidences from virtual collections are always ok 0090 const auto col = idx.data(Akonadi::EntityTreeModel::ParentCollectionRole).value<Akonadi::Collection>(); 0091 if (!d->mFilterVirtual && col.isVirtual()) { 0092 return true; 0093 } 0094 0095 // always show if we are the organizer 0096 if (CalendarUtils::thatIsMe(incidence->organizer().email())) { 0097 return true; 0098 } 0099 0100 const auto attendees = incidence->attendees(); 0101 for (const KCalendarCore::Attendee &attendee : attendees) { 0102 if (CalendarUtils::thatIsMe(attendee)) { 0103 return !d->mBlockedStatusList.contains(attendee.status()); 0104 } 0105 } 0106 0107 // We are not attendee, so we accept the incidence 0108 return true; 0109 } 0110 0111 #include "moc_calfilterpartstatusproxymodel_p.cpp"