From 0ef55c3bf02f8730ab821c3409c71e67bd382ecc Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 12 Jun 2017 22:11:52 +0200 Subject: Working but ugly editor for recipients in composer What remains to be done is: * proper delegates * removal of recipeients * at some point d&d of recipients * Perhaps something that encapsulates the whole list and the model in a nicer way --- framework/src/domain/composercontroller.cpp | 129 +++++++++++++++++++++++----- framework/src/domain/composercontroller.h | 22 ++++- 2 files changed, 127 insertions(+), 24 deletions(-) (limited to 'framework/src/domain') diff --git a/framework/src/domain/composercontroller.cpp b/framework/src/domain/composercontroller.cpp index 332101ac..cbc43afe 100644 --- a/framework/src/domain/composercontroller.cpp +++ b/framework/src/domain/composercontroller.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -82,7 +81,10 @@ ComposerController::ComposerController() action_send{new Kube::ControllerAction{this, &ComposerController::send}}, action_saveAsDraft{new Kube::ControllerAction{this, &ComposerController::saveAsDraft}}, mRecipientCompleter{new RecipientCompleter}, - mIdentitySelector{new IdentitySelector{*this}} + mIdentitySelector{new IdentitySelector{*this}}, + mToModel{new QStringListModel}, + mCcModel{new QStringListModel}, + mBccModel{new QStringListModel} { updateSaveAsDraftAction(); // mSendAction->monitorProperty(); @@ -93,10 +95,8 @@ ComposerController::ComposerController() // actionDepends(); // TODO do in constructor - QObject::connect(this, &ComposerController::toChanged, &ComposerController::updateSendAction); QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSendAction); QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSendAction); - QObject::connect(this, &ComposerController::toChanged, &ComposerController::updateSaveAsDraftAction); QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSaveAsDraftAction); QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSaveAsDraftAction); updateSendAction(); @@ -107,6 +107,72 @@ void ComposerController::clear() Controller::clear(); //Reapply account and identity from selection mIdentitySelector->reapplyCurrentIndex(); + mToModel->setStringList({}); + mCcModel->setStringList({}); + mBccModel->setStringList({}); +} + +QAbstractItemModel *ComposerController::toModel() const +{ + return mToModel.data(); +} + +void ComposerController::addTo(const QString &s) +{ + auto list = mToModel->stringList(); + list.append(s); + mToModel->setStringList(list); + updateSendAction(); +} + +void ComposerController::removeTo(const QString &s) +{ + auto list = mToModel->stringList(); + list.removeAll(s); + mToModel->setStringList(list); + updateSendAction(); +} + +QAbstractItemModel *ComposerController::ccModel() const +{ + return mCcModel.data(); +} + +void ComposerController::addCc(const QString &s) +{ + auto list = mCcModel->stringList(); + list.append(s); + mCcModel->setStringList(list); + updateSendAction(); +} + +void ComposerController::removeCc(const QString &s) +{ + auto list = mCcModel->stringList(); + list.removeAll(s); + mCcModel->setStringList(list); + updateSendAction(); +} + +QAbstractItemModel *ComposerController::bccModel() const +{ + return mBccModel.data(); +} + +void ComposerController::addBcc(const QString &s) +{ + auto list = mBccModel->stringList(); + list.append(s); + mBccModel->setStringList(list); + updateSendAction(); +} + +void ComposerController::removeBcc(const QString &s) +{ + auto list = mBccModel->stringList(); + list.removeAll(s); + mBccModel->setStringList(list); + updateSendAction(); } Completer *ComposerController::recipientCompleter() const @@ -119,10 +185,42 @@ Selector *ComposerController::identitySelector() const return mIdentitySelector.data(); } +static void applyAddresses(const QStringList &list, std::function callback) +{ + for (const auto &to : list) { + QByteArray displayName; + QByteArray addrSpec; + QByteArray comment; + KEmailAddress::splitAddress(to.toUtf8(), displayName, addrSpec, comment); + callback(addrSpec, displayName); + } +} + +static void applyAddresses(const QString &list, std::function callback) +{ + applyAddresses(KEmailAddress::splitAddressList(list), callback); +} + + +static QStringList getStringListFromAddresses(const QString &s) +{ + QStringList list; + applyAddresses(s, [&](const QByteArray &addrSpec, const QByteArray &displayName) { + if (displayName.isEmpty()) { + list << QString{addrSpec}; + } else { + list << QString("%1 <%2>").arg(QString{displayName}).arg(QString{addrSpec}); + } + }); + return list; +} + void ComposerController::setMessage(const KMime::Message::Ptr &msg) { - setTo(msg->to(true)->asUnicodeString()); - setCc(msg->cc(true)->asUnicodeString()); + mToModel->setStringList(getStringListFromAddresses(msg->to(true)->asUnicodeString())); + mCcModel->setStringList(getStringListFromAddresses(msg->cc(true)->asUnicodeString())); + mBccModel->setStringList(getStringListFromAddresses(msg->bcc(true)->asUnicodeString())); + setSubject(msg->subject(true)->asUnicodeString()); setBody(msg->body()); setExistingMessage(msg); @@ -165,32 +263,21 @@ void ComposerController::recordForAutocompletion(const QByteArray &addrSpec, con } } -void applyAddresses(const QString &list, std::function callback) -{ - for (const auto &to : KEmailAddress::splitAddressList(list)) { - QByteArray displayName; - QByteArray addrSpec; - QByteArray comment; - KEmailAddress::splitAddress(to.toUtf8(), displayName, addrSpec, comment); - callback(addrSpec, displayName); - } -} - KMime::Message::Ptr ComposerController::assembleMessage() { auto mail = mExistingMessage; if (!mail) { mail = KMime::Message::Ptr::create(); } - applyAddresses(getTo(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { + applyAddresses(mToModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { mail->to(true)->addAddress(addrSpec, displayName); recordForAutocompletion(addrSpec, displayName); }); - applyAddresses(getCc(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { + applyAddresses(mCcModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { mail->cc(true)->addAddress(addrSpec, displayName); recordForAutocompletion(addrSpec, displayName); }); - applyAddresses(getBcc(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { + applyAddresses(mBccModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { mail->bcc(true)->addAddress(addrSpec, displayName); recordForAutocompletion(addrSpec, displayName); }); @@ -212,7 +299,7 @@ KMime::Message::Ptr ComposerController::assembleMessage() void ComposerController::updateSendAction() { - auto enabled = !getTo().isEmpty() && !getSubject().isEmpty() && !getAccountId().isEmpty(); + auto enabled = !mToModel->stringList().isEmpty() && !getSubject().isEmpty() && !getAccountId().isEmpty(); sendAction()->setEnabled(enabled); } diff --git a/framework/src/domain/composercontroller.h b/framework/src/domain/composercontroller.h index 92467d05..87349d0c 100644 --- a/framework/src/domain/composercontroller.h +++ b/framework/src/domain/composercontroller.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -47,9 +48,6 @@ class ComposerController : public Kube::Controller Q_OBJECT //Interface properties - KUBE_CONTROLLER_PROPERTY(QString, To, to) - KUBE_CONTROLLER_PROPERTY(QString, Cc, cc) - KUBE_CONTROLLER_PROPERTY(QString, Bcc, bcc) KUBE_CONTROLLER_PROPERTY(QString, Subject, subject) KUBE_CONTROLLER_PROPERTY(QString, Body, body) @@ -65,6 +63,10 @@ class ComposerController : public Kube::Controller Q_PROPERTY (Selector* identitySelector READ identitySelector CONSTANT) //Q_PROPERTY (QValidator* subjectValidator READ subjectValidator CONSTANT) + Q_PROPERTY (QAbstractItemModel* toModel READ toModel CONSTANT) + Q_PROPERTY (QAbstractItemModel* ccModel READ ccModel CONSTANT) + Q_PROPERTY (QAbstractItemModel* bccModel READ bccModel CONSTANT) + KUBE_CONTROLLER_ACTION(send) KUBE_CONTROLLER_ACTION(saveAsDraft) @@ -76,6 +78,17 @@ public: Q_INVOKABLE void loadMessage(const QVariant &draft, bool loadAsDraft); + QAbstractItemModel *toModel() const; + QAbstractItemModel *ccModel() const; + QAbstractItemModel *bccModel() const; + + Q_INVOKABLE void addTo(const QString &); + Q_INVOKABLE void removeTo(const QString &); + Q_INVOKABLE void addCc(const QString &); + Q_INVOKABLE void removeCc(const QString &); + Q_INVOKABLE void addBcc(const QString &); + Q_INVOKABLE void removeBcc(const QString &); + public slots: virtual void clear() Q_DECL_OVERRIDE; @@ -90,4 +103,7 @@ private: QScopedPointer mRecipientCompleter; QScopedPointer mIdentitySelector; + QScopedPointer mToModel; + QScopedPointer mCcModel; + QScopedPointer mBccModel; }; -- cgit v1.2.3