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"