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 }