File indexing completed on 2024-06-23 05:06:48
0001 /* 0002 SPDX-FileCopyrightText: 2008 Tobias Koenig <tokoe@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <QStringList> 0010 0011 #include "collectionstatistics.h" 0012 #include "entitydisplayattribute.h" 0013 #include "item.h" 0014 0015 namespace Akonadi 0016 { 0017 /** 0018 * @internal 0019 */ 0020 namespace CollectionUtils 0021 { 0022 [[nodiscard]] inline bool isVirtualParent(const Collection &collection) 0023 { 0024 return (collection.parentCollection() == Collection::root() && collection.isVirtual()); 0025 } 0026 0027 [[nodiscard]] inline bool isReadOnly(const Collection &collection) 0028 { 0029 return !(collection.rights() & Collection::CanCreateItem); 0030 } 0031 0032 [[nodiscard]] inline bool isRoot(const Collection &collection) 0033 { 0034 return (collection == Collection::root()); 0035 } 0036 0037 [[nodiscard]] inline bool isResource(const Collection &collection) 0038 { 0039 return (collection.parentCollection() == Collection::root()); 0040 } 0041 0042 [[nodiscard]] inline bool isStructural(const Collection &collection) 0043 { 0044 return collection.contentMimeTypes().isEmpty(); 0045 } 0046 0047 [[nodiscard]] inline bool isFolder(const Collection &collection) 0048 { 0049 return (!isRoot(collection) && !isResource(collection) && !isStructural(collection) 0050 && collection.resource() != QLatin1StringView("akonadi_search_resource")); 0051 } 0052 0053 [[nodiscard]] inline bool isUnifiedMailbox(const Collection &collection) 0054 { 0055 return collection.resource() == QLatin1StringView("akonadi_unifiedmailbox_agent"); 0056 } 0057 0058 [[nodiscard]] inline QString defaultIconName(const Collection &col) 0059 { 0060 if (CollectionUtils::isVirtualParent(col)) { 0061 return QStringLiteral("edit-find"); 0062 } 0063 if (col.isVirtual()) { 0064 return QStringLiteral("document-preview"); 0065 } 0066 if (CollectionUtils::isResource(col)) { 0067 return QStringLiteral("network-server"); 0068 } 0069 if (CollectionUtils::isStructural(col)) { 0070 return QStringLiteral("folder-grey"); 0071 } 0072 if (CollectionUtils::isReadOnly(col)) { 0073 return QStringLiteral("folder-grey"); 0074 } 0075 0076 const QStringList content = col.contentMimeTypes(); 0077 if ((content.size() == 1) || (content.size() == 2 && content.contains(Collection::mimeType()))) { 0078 if (content.contains(QLatin1StringView("text/x-vcard")) || content.contains(QLatin1StringView("text/directory")) 0079 || content.contains(QLatin1StringView("text/vcard"))) { 0080 return QStringLiteral("x-office-address-book"); 0081 } 0082 // TODO: add all other content types and/or fix their mimetypes 0083 if (content.contains(QLatin1StringView("akonadi/event")) || content.contains(QLatin1StringView("text/ical"))) { 0084 return QStringLiteral("view-pim-calendar"); 0085 } 0086 if (content.contains(QLatin1StringView("akonadi/task"))) { 0087 return QStringLiteral("view-pim-tasks"); 0088 } 0089 } else if (content.isEmpty()) { 0090 return QStringLiteral("folder-grey"); 0091 } 0092 return QStringLiteral("folder"); 0093 } 0094 [[nodiscard]] inline QString displayIconName(const Collection &col) 0095 { 0096 QString iconName = defaultIconName(col); 0097 if (col.hasAttribute<EntityDisplayAttribute>() && !col.attribute<EntityDisplayAttribute>()->iconName().isEmpty()) { 0098 if (!col.attribute<EntityDisplayAttribute>()->activeIconName().isEmpty() && col.statistics().unreadCount() > 0) { 0099 iconName = col.attribute<EntityDisplayAttribute>()->activeIconName(); 0100 } else { 0101 iconName = col.attribute<EntityDisplayAttribute>()->iconName(); 0102 } 0103 } 0104 return iconName; 0105 } 0106 [[nodiscard]] inline bool hasValidHierarchicalRID(const Collection &col) 0107 { 0108 if (col == Collection::root()) { 0109 return true; 0110 } 0111 if (col.remoteId().isEmpty()) { 0112 return false; 0113 } 0114 return hasValidHierarchicalRID(col.parentCollection()); 0115 } 0116 [[nodiscard]] inline bool hasValidHierarchicalRID(const Item &item) 0117 { 0118 return !item.remoteId().isEmpty() && hasValidHierarchicalRID(item.parentCollection()); 0119 } 0120 0121 /** Returns the collection represented by @p index. 0122 * @param index has to be provided by an EntityTreeModel instance or a proxy model on top of one. 0123 */ 0124 [[nodiscard]] AKONADICORE_EXPORT Collection fromIndex(const QModelIndex &index); 0125 } 0126 0127 }