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"