File indexing completed on 2024-05-12 05:12:44

0001 /*
0002     SPDX-FileCopyrightText: 2008 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "collectionattributespage.h"
0008 
0009 #include <KLocalizedString>
0010 
0011 #include <Akonadi/AttributeFactory>
0012 #include <Akonadi/Collection>
0013 
0014 #include <QStandardItemModel>
0015 
0016 using namespace Akonadi;
0017 
0018 CollectionAttributePage::CollectionAttributePage(QWidget *parent)
0019     : CollectionPropertiesPage(parent)
0020 {
0021     setPageTitle(i18n("Attributes"));
0022     ui.setupUi(this);
0023 
0024     connect(ui.addButton, &QPushButton::clicked, this, &CollectionAttributePage::addAttribute);
0025     connect(ui.deleteButton, &QPushButton::clicked, this, &CollectionAttributePage::delAttribute);
0026     connect(ui.attrName, &QLineEdit::textChanged, this, [this](const QString &str) {
0027         ui.addButton->setEnabled(!str.trimmed().isEmpty());
0028     });
0029     ui.addButton->setEnabled(false);
0030     ui.deleteButton->setEnabled(false);
0031 }
0032 
0033 void CollectionAttributePage::load(const Collection &col)
0034 {
0035     const Attribute::List list = col.attributes();
0036     mModel = new QStandardItemModel(list.count(), 2);
0037 
0038     QStringList labels;
0039     labels << i18n("Attribute") << i18n("Value");
0040     mModel->setHorizontalHeaderLabels(labels);
0041 
0042     for (int i = 0; i < list.count(); ++i) {
0043         QModelIndex index = mModel->index(i, 0);
0044         Q_ASSERT(index.isValid());
0045         mModel->setData(index, QString::fromLatin1(list.at(i)->type()));
0046         mModel->item(i, 0)->setEditable(false);
0047         index = mModel->index(i, 1);
0048         Q_ASSERT(index.isValid());
0049         mModel->setData(index, QString::fromLatin1(list.at(i)->serialized()));
0050         mModel->itemFromIndex(index)->setFlags(Qt::ItemIsEditable | mModel->flags(index));
0051     }
0052     ui.attrView->setModel(mModel);
0053     connect(mModel, &QStandardItemModel::itemChanged, this, &CollectionAttributePage::attributeChanged);
0054     connect(ui.attrView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this]() {
0055         ui.deleteButton->setEnabled(ui.attrView->selectionModel()->selectedRows().count() > 0);
0056     });
0057 }
0058 
0059 void CollectionAttributePage::save(Collection &col)
0060 {
0061     for (const QString &del : std::as_const(mDeleted)) {
0062         col.removeAttribute(del.toLatin1());
0063     }
0064     for (int i = 0; i < mModel->rowCount(); ++i) {
0065         const QModelIndex typeIndex = mModel->index(i, 0);
0066         Q_ASSERT(typeIndex.isValid());
0067         if (!mChanged.contains(typeIndex.data().toString())) {
0068             continue;
0069         }
0070         const QModelIndex valueIndex = mModel->index(i, 1);
0071         Q_ASSERT(valueIndex.isValid());
0072         Attribute *attr = AttributeFactory::createAttribute(mModel->data(typeIndex).toString().toLatin1());
0073         Q_ASSERT(attr);
0074         attr->deserialize(mModel->data(valueIndex).toString().toLatin1());
0075         col.addAttribute(attr);
0076     }
0077 }
0078 
0079 void CollectionAttributePage::addAttribute()
0080 {
0081     if (ui.attrName->text().isEmpty()) {
0082         return;
0083     }
0084     const QString attr = ui.attrName->text();
0085     mChanged.insert(attr);
0086     mDeleted.remove(attr);
0087     const int row = mModel->rowCount();
0088     mModel->insertRow(row);
0089     QModelIndex index = mModel->index(row, 0);
0090     Q_ASSERT(index.isValid());
0091     mModel->setData(index, attr);
0092     ui.attrName->clear();
0093 }
0094 
0095 void CollectionAttributePage::delAttribute()
0096 {
0097     QModelIndexList selection = ui.attrView->selectionModel()->selectedRows();
0098     if (selection.count() != 1) {
0099         return;
0100     }
0101     const QString attr = selection.first().data().toString();
0102     mChanged.remove(attr);
0103     mDeleted.insert(attr);
0104     mModel->removeRow(selection.first().row());
0105 }
0106 
0107 void CollectionAttributePage::attributeChanged(QStandardItem *item)
0108 {
0109     const QString attr = mModel->data(mModel->index(item->row(), 0)).toString();
0110     mDeleted.remove(attr);
0111     mChanged.insert(attr);
0112 }
0113 
0114 #include "moc_collectionattributespage.cpp"