File indexing completed on 2024-05-12 05:21:22

0001 /*
0002   SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
0003   SPDX-FileContributor: Tobias Koenig <tokoe@kdab.com>
0004 
0005   SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "collectiongeneralpage.h"
0009 #include <Akonadi/BlockAlarmsAttribute>
0010 #include <Akonadi/Collection>
0011 #include <Akonadi/EntityDisplayAttribute>
0012 #include <PimCommon/PimUtil>
0013 
0014 #include <KCalendarCore/Event>
0015 #include <KCalendarCore/Journal>
0016 #include <KCalendarCore/Todo>
0017 
0018 #include <KIconButton>
0019 #include <KLocalizedString>
0020 #include <QLineEdit>
0021 
0022 #include <QCheckBox>
0023 #include <QFormLayout>
0024 #include <QHBoxLayout>
0025 
0026 #include <Akonadi/CollectionAnnotationsAttribute>
0027 #include <PimCommonAkonadi/CollectionTypeUtil>
0028 #include <PimCommonAkonadi/IncidencesForWidget>
0029 
0030 using namespace Akonadi;
0031 using namespace CalendarSupport;
0032 
0033 CollectionGeneralPage::CollectionGeneralPage(QWidget *parent)
0034     : CollectionPropertiesPage(parent)
0035 {
0036     setObjectName(QLatin1StringView("CalendarSupport::CollectionGeneralPage"));
0037     setPageTitle(i18nc("@title:tab General settings for a folder.", "General"));
0038 }
0039 
0040 void CollectionGeneralPage::init(const Akonadi::Collection &collection)
0041 {
0042     auto topLayout = new QFormLayout(this);
0043 
0044     mNameEdit = new QLineEdit(this);
0045     mNameEdit->setToolTip(i18nc("@info:tooltip", "Set the folder name"));
0046     mNameEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter a name here to set the name of this folder."));
0047     topLayout->addRow(i18nc("@label:textbox Name of the folder.", "&Name:"), mNameEdit);
0048 
0049     // should replies to mails in this folder be kept in this same folder?
0050     mBlockAlarmsCheckBox = new QCheckBox(i18nc("@option:check", "Block reminders locally"), this);
0051     mBlockAlarmsCheckBox->setToolTip(i18nc("@info:tooltip", "Ignore reminders from this calendar"));
0052     mBlockAlarmsCheckBox->setWhatsThis(i18nc("@info:whatsthis",
0053                                              "Check this box if you do not want to receive reminders from items "
0054                                              "associated with this calendar."));
0055     topLayout->addRow(QString(), mBlockAlarmsCheckBox);
0056 
0057     auto hbox = new QHBoxLayout();
0058     mIconCheckBox = new QCheckBox(i18nc("@option:check", "&Use custom icon:"), this);
0059     mIconCheckBox->setToolTip(i18nc("@info:tooltip", "Set a custom icon"));
0060     mIconCheckBox->setWhatsThis(i18nc("@info:whatsthis", "Check this box if you want to set a custom icon for this folder."));
0061     mIconButton = new KIconButton(this);
0062     mIconButton->setIconSize(16);
0063     hbox->addWidget(mIconCheckBox);
0064     hbox->addWidget(mIconButton);
0065     hbox->addStretch();
0066     topLayout->addRow(QString(), hbox);
0067 
0068     if ((collection.parentCollection() != Akonadi::Collection::root()) && PimCommon::Util::isImapResource(collection.resource())) {
0069         const auto annotationAttribute = collection.attribute<Akonadi::CollectionAnnotationsAttribute>();
0070 
0071         const QMap<QByteArray, QByteArray> annotations = (annotationAttribute ? annotationAttribute->annotations() : QMap<QByteArray, QByteArray>());
0072 
0073         PimCommon::CollectionTypeUtil collectionUtil;
0074         const PimCommon::CollectionTypeUtil::IncidencesFor incidencesFor =
0075             collectionUtil.incidencesForFromString(QLatin1StringView(annotations.value(PimCommon::CollectionTypeUtil ::kolabIncidencesFor())));
0076         mIncidencesForComboBox = new PimCommon::IncidencesForWidget(this);
0077         topLayout->addRow(PimCommon::IncidencesForWidget::labelName(), mIncidencesForComboBox);
0078 
0079         mIncidencesForComboBox->setCurrentIndex(incidencesFor);
0080     }
0081 }
0082 
0083 CollectionGeneralPage::~CollectionGeneralPage() = default;
0084 
0085 void CollectionGeneralPage::load(const Akonadi::Collection &collection)
0086 {
0087     init(collection);
0088     mNameEdit->setEnabled(collection.rights() & Collection::CanChangeCollection);
0089 
0090     const QString displayName = collection.displayName();
0091 
0092     mNameEdit->setText(displayName);
0093     mBlockAlarmsCheckBox->setChecked(collection.hasAttribute<BlockAlarmsAttribute>() && collection.attribute<BlockAlarmsAttribute>()->isEverythingBlocked());
0094 
0095     QString iconName;
0096     if (collection.hasAttribute<EntityDisplayAttribute>()) {
0097         iconName = collection.attribute<EntityDisplayAttribute>()->iconName();
0098     }
0099 
0100     if (iconName.isEmpty()) {
0101         const QStringList mimeTypes = collection.contentMimeTypes();
0102         if (collection.contentMimeTypes().count() > 1 || collection.contentMimeTypes().contains(KCalendarCore::Event::eventMimeType())) {
0103             mIconButton->setIcon(QIcon::fromTheme(QStringLiteral("view-pim-calendar")));
0104         } else if (collection.contentMimeTypes().contains(KCalendarCore::Todo::todoMimeType())) {
0105             mIconButton->setIcon(QIcon::fromTheme(QStringLiteral("view-pim-tasks")));
0106         } else if (collection.contentMimeTypes().contains(KCalendarCore::Journal::journalMimeType())) {
0107             mIconButton->setIcon(QIcon::fromTheme(QStringLiteral("view-pim-journal")));
0108         } else if (mimeTypes.isEmpty()) {
0109             mIconButton->setIcon(QIcon::fromTheme(QStringLiteral("folder-grey")));
0110         } else {
0111             mIconButton->setIcon(QIcon::fromTheme(QStringLiteral("folder")));
0112         }
0113     } else {
0114         mIconButton->setIcon(iconName);
0115     }
0116     mIconCheckBox->setChecked(!iconName.isEmpty());
0117 }
0118 
0119 void CollectionGeneralPage::save(Collection &collection)
0120 {
0121     if (collection.hasAttribute<EntityDisplayAttribute>() && !collection.attribute<EntityDisplayAttribute>()->displayName().isEmpty()) {
0122         collection.attribute<EntityDisplayAttribute>()->setDisplayName(mNameEdit->text());
0123     } else {
0124         collection.setName(mNameEdit->text());
0125     }
0126 
0127     auto attr = collection.attribute<BlockAlarmsAttribute>(Collection::AddIfMissing);
0128     attr->blockEverything(mBlockAlarmsCheckBox->isChecked());
0129 
0130     if (mIconCheckBox->isChecked()) {
0131         collection.attribute<EntityDisplayAttribute>(Collection::AddIfMissing)->setIconName(mIconButton->icon());
0132     } else if (collection.hasAttribute<EntityDisplayAttribute>()) {
0133         collection.attribute<EntityDisplayAttribute>()->setIconName(QString());
0134     }
0135     auto annotationsAttribute = collection.attribute<Akonadi::CollectionAnnotationsAttribute>(Collection::AddIfMissing);
0136 
0137     QMap<QByteArray, QByteArray> annotations = annotationsAttribute->annotations();
0138 
0139     PimCommon::CollectionTypeUtil collectionUtil;
0140     if (mIncidencesForComboBox && mIncidencesForComboBox->isEnabled()) {
0141         annotations[PimCommon::CollectionTypeUtil::kolabIncidencesFor()] =
0142             collectionUtil.incidencesForToString(static_cast<PimCommon::CollectionTypeUtil::IncidencesFor>(mIncidencesForComboBox->currentIndex())).toLatin1();
0143     }
0144 
0145     if (annotations.isEmpty()) {
0146         collection.removeAttribute<Akonadi::CollectionAnnotationsAttribute>();
0147     } else {
0148         annotationsAttribute->setAnnotations(annotations);
0149     }
0150 }
0151 
0152 #include "moc_collectiongeneralpage.cpp"