File indexing completed on 2024-06-23 05:18:28

0001 /*
0002  * SPDX-FileCopyrightText: 2010 Volker Krause <vkrause@kde.org>
0003  *
0004  * Based on kmail/kmcomposewin.cpp
0005  * SPDX-FileCopyrightText: 2009 Constantin Berzan <exit3219@gmail.com>
0006  *
0007  * Based on KMail code by:
0008  * SPDX-FileCopyrightText: 1997 Markus Wuebben <markus.wuebben@kde.org>
0009  *
0010  * SPDX-License-Identifier: GPL-2.0-or-later
0011  */
0012 
0013 #include "signaturecontroller.h"
0014 #include "composer-ng/richtextcomposerng.h"
0015 #include "composer-ng/richtextcomposersignatures.h"
0016 #include "settings/messagecomposersettings.h"
0017 
0018 #include <KIdentityManagementCore/Identity>
0019 #include <KIdentityManagementCore/IdentityManager>
0020 #include <KIdentityManagementWidgets/IdentityCombo>
0021 
0022 using namespace MessageComposer;
0023 
0024 class MessageComposer::SignatureControllerPrivate
0025 {
0026 public:
0027     SignatureControllerPrivate() = default;
0028 
0029     uint m_currentIdentityId = 0;
0030     KIdentityManagementWidgets::IdentityCombo *m_identityCombo = nullptr;
0031     MessageComposer::RichTextComposerNg *m_editor = nullptr;
0032 };
0033 
0034 SignatureController::SignatureController(QObject *parent)
0035     : QObject(parent)
0036     , d(new MessageComposer::SignatureControllerPrivate)
0037 {
0038 }
0039 
0040 SignatureController::~SignatureController() = default;
0041 
0042 void SignatureController::setEditor(MessageComposer::RichTextComposerNg *editor)
0043 {
0044     d->m_editor = editor;
0045 }
0046 
0047 void SignatureController::setIdentityCombo(KIdentityManagementWidgets::IdentityCombo *combo)
0048 {
0049     d->m_identityCombo = combo;
0050     d->m_currentIdentityId = combo->currentIdentity();
0051     resume();
0052 }
0053 
0054 void SignatureController::identityChanged(uint id)
0055 {
0056     Q_ASSERT(d->m_identityCombo);
0057     const KIdentityManagementCore::Identity &newIdentity = d->m_identityCombo->identityManager()->identityForUoid(id);
0058     if (newIdentity.isNull() || !d->m_editor) {
0059         return;
0060     }
0061 
0062     const KIdentityManagementCore::Identity &oldIdentity = d->m_identityCombo->identityManager()->identityForUoidOrDefault(d->m_currentIdentityId);
0063 
0064     const KIdentityManagementCore::Signature oldSig = const_cast<KIdentityManagementCore::Identity &>(oldIdentity).signature();
0065     const KIdentityManagementCore::Signature newSig = const_cast<KIdentityManagementCore::Identity &>(newIdentity).signature();
0066     const bool replaced = d->m_editor->composerSignature()->replaceSignature(oldSig, newSig);
0067 
0068     // Just append the signature if there was no old signature
0069     if (!replaced && oldSig.rawText().isEmpty()) {
0070         applySignature(newSig);
0071     }
0072 
0073     d->m_currentIdentityId = id;
0074 }
0075 
0076 void SignatureController::suspend()
0077 {
0078     if (d->m_identityCombo) {
0079         disconnect(d->m_identityCombo, &KIdentityManagementWidgets::IdentityCombo::identityChanged, this, &SignatureController::identityChanged);
0080     }
0081 }
0082 
0083 void SignatureController::resume()
0084 {
0085     if (d->m_identityCombo) {
0086         connect(d->m_identityCombo, &KIdentityManagementWidgets::IdentityCombo::identityChanged, this, &SignatureController::identityChanged);
0087     }
0088 }
0089 
0090 void SignatureController::appendSignature()
0091 {
0092     insertSignatureHelper(KIdentityManagementCore::Signature::End);
0093 }
0094 
0095 void SignatureController::prependSignature()
0096 {
0097     insertSignatureHelper(KIdentityManagementCore::Signature::Start);
0098 }
0099 
0100 void SignatureController::insertSignatureAtCursor()
0101 {
0102     insertSignatureHelper(KIdentityManagementCore::Signature::AtCursor);
0103 }
0104 
0105 void SignatureController::cleanSpace()
0106 {
0107     if (!d->m_editor || !d->m_identityCombo) {
0108         return;
0109     }
0110     const KIdentityManagementCore::Identity &ident = d->m_identityCombo->identityManager()->identityForUoidOrDefault(d->m_identityCombo->currentIdentity());
0111     const KIdentityManagementCore::Signature signature = const_cast<KIdentityManagementCore::Identity &>(ident).signature();
0112     d->m_editor->composerSignature()->cleanWhitespace(signature);
0113 }
0114 
0115 void SignatureController::insertSignatureHelper(KIdentityManagementCore::Signature::Placement placement)
0116 {
0117     if (!d->m_identityCombo || !d->m_editor) {
0118         return;
0119     }
0120 
0121     // Identity::signature() is not const, although it should be, therefore the
0122     // const_cast.
0123     auto &ident =
0124         const_cast<KIdentityManagementCore::Identity &>(d->m_identityCombo->identityManager()->identityForUoidOrDefault(d->m_identityCombo->currentIdentity()));
0125     const KIdentityManagementCore::Signature signature = ident.signature();
0126 
0127     if (signature.isInlinedHtml() && signature.type() == KIdentityManagementCore::Signature::Inlined) {
0128         Q_EMIT enableHtml();
0129     }
0130 
0131     KIdentityManagementCore::Signature::AddedText addedText = KIdentityManagementCore::Signature::AddNewLines;
0132     if (MessageComposer::MessageComposerSettings::self()->dashDashSignature()) {
0133         addedText |= KIdentityManagementCore::Signature::AddSeparator;
0134     }
0135     d->m_editor->insertSignature(signature, placement, addedText);
0136     if ((placement == KIdentityManagementCore::Signature::Start) || (placement == KIdentityManagementCore::Signature::End)) {
0137         Q_EMIT signatureAdded();
0138     }
0139 }
0140 
0141 void SignatureController::applySignature(const KIdentityManagementCore::Signature &signature)
0142 {
0143     if (!d->m_editor) {
0144         return;
0145     }
0146 
0147     if (MessageComposer::MessageComposerSettings::self()->autoTextSignature() == QLatin1StringView("auto")) {
0148         KIdentityManagementCore::Signature::AddedText addedText = KIdentityManagementCore::Signature::AddNewLines;
0149         if (MessageComposer::MessageComposerSettings::self()->dashDashSignature()) {
0150             addedText |= KIdentityManagementCore::Signature::AddSeparator;
0151         }
0152         if (MessageComposer::MessageComposerSettings::self()->prependSignature()) {
0153             d->m_editor->insertSignature(signature, KIdentityManagementCore::Signature::Start, addedText);
0154         } else {
0155             d->m_editor->insertSignature(signature, KIdentityManagementCore::Signature::End, addedText);
0156         }
0157     }
0158 }
0159 
0160 #include "moc_signaturecontroller.cpp"