File indexing completed on 2024-06-02 05:20:34
0001 /* 0002 SPDX-FileCopyrightText: 2018-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "emaillineedit.h" 0008 #include "sieveeditoremaillineditplugin_debug.h" 0009 #include <Akonadi/EmailAddressSelectionDialog> 0010 #include <KPluginFactory> 0011 #include <KStatefulBrush> 0012 0013 #include <KColorScheme> 0014 #include <KLocalizedString> 0015 #include <QHBoxLayout> 0016 #include <QLineEdit> 0017 #include <QToolButton> 0018 #include <QTreeView> 0019 #include <memory> 0020 0021 K_PLUGIN_CLASS_WITH_JSON(EmailLineEdit, "emaillineedit.json") 0022 0023 EmailLineEdit::EmailLineEdit(QWidget *parent, const QList<QVariant> &) 0024 : KSieveUi::AbstractSelectEmailLineEdit(parent) 0025 , mLineEdit(new QLineEdit(this)) 0026 , mEmailButton(new QToolButton(this)) 0027 { 0028 auto mainLayout = new QHBoxLayout(this); 0029 mainLayout->setObjectName(QLatin1StringView("mainlayout")); 0030 mainLayout->setContentsMargins({}); 0031 0032 mLineEdit->setObjectName(QLatin1StringView("lineedit")); 0033 mLineEdit->setClearButtonEnabled(true); 0034 mLineEdit->setPlaceholderText(i18n("Click on button for selecting contacts...")); 0035 connect(mLineEdit, &QLineEdit::textChanged, this, &EmailLineEdit::slotTextChanged); 0036 mainLayout->addWidget(mLineEdit); 0037 0038 mEmailButton->setText(i18n("...")); 0039 mEmailButton->setObjectName(QLatin1StringView("emailbutton")); 0040 mEmailButton->setToolTip(i18n("Select Emails")); 0041 mainLayout->addWidget(mEmailButton); 0042 connect(mEmailButton, &QToolButton::clicked, this, &EmailLineEdit::slotSelectEmail); 0043 verifyAkonadiStatus(); 0044 connect(Akonadi::ServerManager::self(), &Akonadi::ServerManager::stateChanged, this, &EmailLineEdit::akonadiStateChanged); 0045 verifyAddress(); 0046 } 0047 0048 EmailLineEdit::~EmailLineEdit() = default; 0049 0050 void EmailLineEdit::akonadiStateChanged(Akonadi::ServerManager::State state) 0051 { 0052 mEmailButton->setVisible(state == Akonadi::ServerManager::Running); 0053 } 0054 0055 void EmailLineEdit::verifyAkonadiStatus() 0056 { 0057 const Akonadi::ServerManager::State state = Akonadi::ServerManager::self()->state(); 0058 mEmailButton->setVisible(state == Akonadi::ServerManager::Running); 0059 } 0060 0061 void EmailLineEdit::insertAddresses(const KContacts::Addressee::List &list) 0062 { 0063 QString currentText = mLineEdit->text(); 0064 bool firstElement = currentText.isEmpty(); 0065 for (const KContacts::Addressee &contact : list) { 0066 if (!firstElement) { 0067 currentText.append(QLatin1Char(';')); 0068 } else { 0069 firstElement = false; 0070 } 0071 currentText.append(contact.preferredEmail()); 0072 } 0073 mLineEdit->setText(currentText); 0074 } 0075 0076 void EmailLineEdit::slotSelectEmail() 0077 { 0078 std::unique_ptr<Akonadi::AbstractEmailAddressSelectionDialog> dlg; 0079 const KPluginMetaData editWidgetPlugin(QStringLiteral("pim6/akonadi/emailaddressselectionldapdialogplugin")); 0080 0081 const auto result = KPluginFactory::instantiatePlugin<Akonadi::AbstractEmailAddressSelectionDialog>(editWidgetPlugin); 0082 if (result) { 0083 dlg.reset(result.plugin); 0084 } else { 0085 dlg = std::make_unique<Akonadi::EmailAddressSelectionDialog>(this); 0086 } 0087 dlg->setWindowTitle(i18nc("@title:window", "Select Emails")); 0088 dlg->view()->view()->setSelectionMode(multiSelection() ? QAbstractItemView::MultiSelection : QAbstractItemView::SingleSelection); 0089 connect(dlg.get(), &Akonadi::AbstractEmailAddressSelectionDialog::insertAddresses, this, &EmailLineEdit::insertAddresses); 0090 if (dlg->exec()) { 0091 const Akonadi::EmailAddressSelection::List lstAddress = dlg->selectedAddresses(); 0092 if (!lstAddress.isEmpty()) { 0093 bool firstElement = true; 0094 QString result; 0095 for (const Akonadi::EmailAddressSelection &value : lstAddress) { 0096 if (!firstElement) { 0097 result.append(QLatin1Char(';')); 0098 } else { 0099 firstElement = false; 0100 } 0101 result.append(value.email()); 0102 } 0103 mLineEdit->setText(result); 0104 } 0105 } 0106 } 0107 0108 void EmailLineEdit::setText(const QString &str) 0109 { 0110 mLineEdit->setText(str); 0111 } 0112 0113 QString EmailLineEdit::text() const 0114 { 0115 return mLineEdit->text(); 0116 } 0117 0118 bool EmailLineEdit::isValid() const 0119 { 0120 return mEmailIsValid; 0121 } 0122 0123 void EmailLineEdit::slotTextChanged() 0124 { 0125 verifyAddress(); 0126 Q_EMIT valueChanged(); 0127 } 0128 0129 void EmailLineEdit::verifyAddress() 0130 { 0131 #ifndef QT_NO_STYLE_STYLESHEET 0132 QString styleSheet; 0133 const QString lineEditText = text(); 0134 mEmailIsValid = lineEditText.contains(QLatin1Char('@')); 0135 if (mNegativeBackground.isEmpty()) { 0136 KStatefulBrush bgBrush = KStatefulBrush(KColorScheme::View, KColorScheme::NegativeText); 0137 mNegativeBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush(palette()).color().name()); 0138 } 0139 if (!mEmailIsValid) { 0140 styleSheet = mNegativeBackground; 0141 } 0142 mLineEdit->setStyleSheet(styleSheet); 0143 #endif 0144 } 0145 0146 #include "emaillineedit.moc" 0147 0148 #include "moc_emaillineedit.cpp"