File indexing completed on 2024-05-19 05:11:14

0001 /*
0002   SPDX-FileCopyrightText: 2008 Bruno Virlet <bvirlet@kdemail.net>
0003   SPDX-FileCopyrightText: 2009 KDAB
0004   SPDX-FileContributor: Frank Osterfeld <osterfeld@kde.org>
0005 
0006   SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "calendarmodel_p.h"
0010 
0011 #include "calendarutils.h"
0012 #include <Akonadi/ItemFetchScope>
0013 #include <Akonadi/Monitor>
0014 #include <KCalendarCore/Event>
0015 #include <KCalendarCore/Journal>
0016 #include <KCalendarCore/Todo>
0017 
0018 #include <KLocalizedString>
0019 
0020 #include <QIcon>
0021 
0022 using namespace Akonadi;
0023 
0024 class Akonadi::CalendarModelPrivate
0025 {
0026 public:
0027     CalendarModelPrivate() = default;
0028 
0029     QWeakPointer<CalendarModel> m_weakPointer;
0030 };
0031 
0032 CalendarModel::CalendarModel(Akonadi::Monitor *monitor)
0033     : EntityTreeModel(monitor)
0034     , d(new CalendarModelPrivate())
0035 {
0036     monitor->itemFetchScope().fetchAllAttributes(true);
0037 }
0038 
0039 CalendarModel::Ptr CalendarModel::create(Monitor *monitor)
0040 {
0041     auto model = new CalendarModel(monitor);
0042     CalendarModel::Ptr modelPtr = CalendarModel::Ptr(model);
0043     model->setWeakPointer(modelPtr.toWeakRef());
0044     return modelPtr;
0045 }
0046 
0047 CalendarModel::~CalendarModel() = default;
0048 
0049 QWeakPointer<CalendarModel> CalendarModel::weakPointer() const
0050 {
0051     return d->m_weakPointer;
0052 }
0053 
0054 void CalendarModel::setWeakPointer(const QWeakPointer<CalendarModel> &weakPointer)
0055 {
0056     d->m_weakPointer = weakPointer;
0057 }
0058 
0059 QVariant CalendarModel::entityData(const Akonadi::Item &item, int column, int role) const
0060 {
0061     const KCalendarCore::Incidence::Ptr inc = CalendarUtils::incidence(item);
0062     if (!inc) {
0063         return {};
0064     }
0065 
0066     switch (role) {
0067     case Qt::DecorationRole: {
0068         if (column != Summary) {
0069             return {};
0070         }
0071         const auto incType{inc->type()};
0072         if (incType == KCalendarCore::IncidenceBase::TypeTodo) {
0073             return QIcon::fromTheme(QStringLiteral("view-pim-tasks"));
0074         } else if (incType == KCalendarCore::IncidenceBase::TypeJournal) {
0075             return QIcon::fromTheme(QStringLiteral("view-pim-journal"));
0076         } else if (incType == KCalendarCore::IncidenceBase::TypeEvent) {
0077             return QIcon::fromTheme(QStringLiteral("view-calendar"));
0078         }
0079         return QIcon::fromTheme(QStringLiteral("network-wired"));
0080     }
0081     case Qt::DisplayRole:
0082         switch (column) {
0083         case Summary:
0084             return inc->summary();
0085 
0086         case DateTimeStart:
0087             return inc->dtStart().toString();
0088 
0089         case DateTimeEnd:
0090             return inc->dateTime(KCalendarCore::Incidence::RoleEndTimeZone).toString();
0091 
0092         case DateTimeDue:
0093             if (KCalendarCore::Todo::Ptr t = CalendarUtils::todo(item)) {
0094                 return t->dtDue().toString();
0095             } else {
0096                 return {};
0097             }
0098 
0099         case Priority:
0100             if (KCalendarCore::Todo::Ptr t = CalendarUtils::todo(item)) {
0101                 return t->priority();
0102             } else {
0103                 return {};
0104             }
0105 
0106         case PercentComplete:
0107             if (KCalendarCore::Todo::Ptr t = CalendarUtils::todo(item)) {
0108                 return t->percentComplete();
0109             } else {
0110                 return {};
0111             }
0112 
0113         case Type:
0114             return inc->typeStr();
0115         default:
0116             break;
0117         }
0118 
0119         return {};
0120     case SortRole:
0121         switch (column) {
0122         case Summary:
0123             return inc->summary();
0124 
0125         case DateTimeStart:
0126             return inc->dtStart().toUTC();
0127 
0128         case DateTimeEnd:
0129             return inc->dateTime(KCalendarCore::Incidence::RoleEndTimeZone).toUTC();
0130 
0131         case DateTimeDue:
0132             if (KCalendarCore::Todo::Ptr t = CalendarUtils::todo(item)) {
0133                 return t->dtDue().toUTC();
0134             } else {
0135                 return {};
0136             }
0137 
0138         case Priority:
0139             if (KCalendarCore::Todo::Ptr t = CalendarUtils::todo(item)) {
0140                 return t->priority();
0141             } else {
0142                 return {};
0143             }
0144 
0145         case PercentComplete:
0146             if (KCalendarCore::Todo::Ptr t = CalendarUtils::todo(item)) {
0147                 return t->percentComplete();
0148             } else {
0149                 return {};
0150             }
0151 
0152         case Type:
0153             return inc->type();
0154 
0155         default:
0156             break;
0157         }
0158 
0159         return {};
0160 
0161     case RecursRole:
0162         return inc->recurs();
0163 
0164     default:
0165         return {};
0166     }
0167 }
0168 
0169 QVariant CalendarModel::entityData(const Akonadi::Collection &collection, int column, int role) const
0170 {
0171     return EntityTreeModel::entityData(collection, column, role);
0172 }
0173 
0174 int CalendarModel::entityColumnCount(EntityTreeModel::HeaderGroup headerSet) const
0175 {
0176     if (headerSet == EntityTreeModel::ItemListHeaders) {
0177         return ItemColumnCount;
0178     } else {
0179         return CollectionColumnCount;
0180     }
0181 }
0182 
0183 QVariant CalendarModel::entityHeaderData(int section, Qt::Orientation orientation, int role, EntityTreeModel::HeaderGroup headerSet) const
0184 {
0185     if (role != Qt::DisplayRole || orientation != Qt::Horizontal) {
0186         return {};
0187     }
0188 
0189     if (headerSet == EntityTreeModel::ItemListHeaders) {
0190         switch (section) {
0191         case Summary:
0192             return i18nc("@title:column calendar event summary", "Summary");
0193         case DateTimeStart:
0194             return i18nc("@title:column calendar event start date and time", "Start Date and Time");
0195         case DateTimeEnd:
0196             return i18nc("@title:column calendar event end date and time", "End Date and Time");
0197         case Type:
0198             return i18nc("@title:column calendar event type", "Type");
0199         case DateTimeDue:
0200             return i18nc("@title:column todo item due date and time", "Due Date and Time");
0201         case Priority:
0202             return i18nc("@title:column todo item priority", "Priority");
0203         case PercentComplete:
0204             return i18nc("@title:column todo item completion in percent", "Complete");
0205         default:
0206             return {};
0207         }
0208     }
0209 
0210     if (headerSet == EntityTreeModel::CollectionTreeHeaders) {
0211         switch (section) {
0212         case CollectionTitle:
0213             return i18nc("@title:column calendar title", "Calendar");
0214         default:
0215             return {};
0216         }
0217     }
0218     return {};
0219 }
0220 
0221 #include "moc_calendarmodel_p.cpp"