10 #include "customfieldslistwidget.h"
11 #include "../utils/utils.h"
13 #include "customfieldmanager_p.h"
14 #include "customfieldslistdelegate.h"
15 #include <KContacts/Addressee>
16 #include <QSortFilterProxyModel>
18 #include <QVBoxLayout>
20 using namespace ContactEditor;
22 CustomFieldsListWidget::CustomFieldsListWidget(
QWidget *parent)
25 , mModel(new CustomFieldsModel(this))
28 mCustomFieldList->setObjectName(QStringLiteral(
"customfieldlist"));
29 mCustomFieldList->setSortingEnabled(
true);
30 mCustomFieldList->setRootIsDecorated(
false);
31 auto customFieldDelegate =
new ContactEditor::CustomFieldsListDelegate(mCustomFieldList,
this);
32 mCustomFieldList->setItemDelegate(customFieldDelegate);
33 topLayout->addWidget(mCustomFieldList);
36 proxyModel->setDynamicSortFilter(
true);
37 proxyModel->setSourceModel(mModel);
38 mCustomFieldList->setModel(proxyModel);
39 mCustomFieldList->setColumnHidden(2,
true);
42 CustomFieldsListWidget::~CustomFieldsListWidget() =
default;
46 CustomField::List externalCustomFields;
48 CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions();
51 for (
const QString &custom : customs) {
55 ContactEditor::Utils::splitCustomField(custom, app, name, value);
65 blacklist << QStringLiteral(
"BlogFeed") << QStringLiteral(
"X-IMAddress") << QStringLiteral(
"X-Profession") << QStringLiteral(
"X-Office")
66 << QStringLiteral(
"X-ManagersName") << QStringLiteral(
"X-AssistantsName") << QStringLiteral(
"X-Anniversary")
67 << QStringLiteral(
"X-SpousesName") << QStringLiteral(
"MailPreferedFormatting") << QStringLiteral(
"MailAllowToRemoteContent")
68 << QStringLiteral(
"CRYPTOPROTOPREF") << QStringLiteral(
"OPENPGPFP") << QStringLiteral(
"SMIMEFP") << QStringLiteral(
"CRYPTOSIGNPREF")
69 << QStringLiteral(
"CRYPTOENCRYPTPREF");
72 for (
const QString &blacklistEntry : std::as_const(blacklist)) {
73 upperCaseBlacklist << blacklistEntry.toUpper();
75 blacklist.
unite(upperCaseBlacklist);
82 bool isLocalCustomField =
false;
83 const int localCustomFieldsCount(mLocalCustomFields.count());
84 for (
int i = 0; i < localCustomFieldsCount; ++i) {
85 if (mLocalCustomFields[i].key() == name) {
86 mLocalCustomFields[i].setValue(value);
87 isLocalCustomField =
true;
93 bool isGlobalCustomField =
false;
94 const int globalCustomFieldsCount(globalCustomFields.count());
95 for (
int i = 0; i < globalCustomFieldsCount; ++i) {
96 if (globalCustomFields[i].key() == name) {
97 globalCustomFields[i].setValue(value);
98 isGlobalCustomField =
true;
104 if (!isLocalCustomField && !isGlobalCustomField) {
108 CustomField customField(name, name, CustomField::TextType, CustomField::LocalScope);
109 customField.setValue(value);
111 mLocalCustomFields << customField;
115 CustomField customField(key, key, CustomField::TextType, CustomField::ExternalScope);
116 customField.setValue(value);
118 externalCustomFields << customField;
123 mModel->setCustomFields(CustomField::List() << mLocalCustomFields << globalCustomFields << externalCustomFields);
128 const CustomField::List customFields = mModel->customFields();
129 for (
const CustomField &customField : customFields) {
131 if (customField.scope() != CustomField::ExternalScope) {
132 if (!customField.value().isEmpty()) {
133 contact.
insertCustom(QStringLiteral(
"KADDRESSBOOK"), customField.key(), customField.value());
135 contact.
removeCustom(QStringLiteral(
"KADDRESSBOOK"), customField.key());
143 for (
const CustomField &oldCustomField : std::as_const(mLocalCustomFields)) {
144 if (oldCustomField.scope() != CustomField::ExternalScope) {
145 bool fieldStillExists =
false;
146 for (
const CustomField &newCustomField : std::as_const(customFields)) {
147 if (newCustomField.scope() != CustomField::ExternalScope) {
148 if (newCustomField.key() == oldCustomField.key()) {
149 fieldStillExists =
true;
155 if (!fieldStillExists) {
156 contact.
removeCustom(QStringLiteral(
"KADDRESSBOOK"), oldCustomField.key());
162 CustomField::List globalCustomFields;
163 for (
const CustomField &customField : std::as_const(customFields)) {
164 if (customField.scope() == CustomField::GlobalScope) {
165 globalCustomFields << customField;
169 CustomFieldManager::setGlobalCustomFieldDescriptions(globalCustomFields);
172 void CustomFieldsListWidget::setReadOnly(
bool readOnly)
174 mCustomFieldList->setEnabled(!readOnly);
177 void CustomFieldsListWidget::slotAddNewField(
const CustomField &field)
179 const int lastRow = mModel->rowCount();
180 mModel->insertRow(lastRow);
181 mModel->setData(mModel->index(lastRow, 2), field.key(),
Qt::EditRole);
182 mModel->setData(mModel->index(lastRow, 0), field.title(),
Qt::EditRole);
183 mModel->setData(mModel->index(lastRow, 0), field.type(), CustomFieldsModel::TypeRole);
184 mModel->setData(mModel->index(lastRow, 0), field.scope(), CustomFieldsModel::ScopeRole);
187 void CustomFieldsListWidget::setLocalCustomFieldDescriptions(
const QVariantList &descriptions)
189 mLocalCustomFields.clear();
190 mLocalCustomFields.reserve(descriptions.count());
191 for (
const QVariant &description : descriptions) {
192 mLocalCustomFields.append(CustomField::fromVariantMap(description.toMap(), CustomField::LocalScope));
196 QVariantList CustomFieldsListWidget::localCustomFieldDescriptions()
const
198 const CustomField::List customFields = mModel->customFields();
200 QVariantList descriptions;
201 for (
const CustomField &field : customFields) {
202 if (field.scope() == CustomField::LocalScope) {
203 descriptions.append(field.toVariantMap());