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"