summaryrefslogtreecommitdiffstats
path: root/framework/src/domain/composercontroller.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-12 22:11:52 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-12 22:11:52 +0200
commit0ef55c3bf02f8730ab821c3409c71e67bd382ecc (patch)
treebbe8478e476bccd7f2dd9f99b1796848510f40d5 /framework/src/domain/composercontroller.cpp
parentc8372a71b128eeb4f0440736e36c372d61b5a9a2 (diff)
downloadkube-0ef55c3bf02f8730ab821c3409c71e67bd382ecc.tar.gz
kube-0ef55c3bf02f8730ab821c3409c71e67bd382ecc.zip
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
Diffstat (limited to 'framework/src/domain/composercontroller.cpp')
-rw-r--r--framework/src/domain/composercontroller.cpp129
1 files changed, 108 insertions, 21 deletions
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 @@
27#include <QSortFilterProxyModel> 27#include <QSortFilterProxyModel>
28#include <QList> 28#include <QList>
29#include <QDebug> 29#include <QDebug>
30#include <QQmlEngine>
31#include <sink/store.h> 30#include <sink/store.h>
32#include <sink/log.h> 31#include <sink/log.h>
33 32
@@ -82,7 +81,10 @@ ComposerController::ComposerController()
82 action_send{new Kube::ControllerAction{this, &ComposerController::send}}, 81 action_send{new Kube::ControllerAction{this, &ComposerController::send}},
83 action_saveAsDraft{new Kube::ControllerAction{this, &ComposerController::saveAsDraft}}, 82 action_saveAsDraft{new Kube::ControllerAction{this, &ComposerController::saveAsDraft}},
84 mRecipientCompleter{new RecipientCompleter}, 83 mRecipientCompleter{new RecipientCompleter},
85 mIdentitySelector{new IdentitySelector{*this}} 84 mIdentitySelector{new IdentitySelector{*this}},
85 mToModel{new QStringListModel},
86 mCcModel{new QStringListModel},
87 mBccModel{new QStringListModel}
86{ 88{
87 updateSaveAsDraftAction(); 89 updateSaveAsDraftAction();
88 // mSendAction->monitorProperty<To>(); 90 // mSendAction->monitorProperty<To>();
@@ -93,10 +95,8 @@ ComposerController::ComposerController()
93 // actionDepends<ControllerAction, To, Subject>(); 95 // actionDepends<ControllerAction, To, Subject>();
94 // TODO do in constructor 96 // TODO do in constructor
95 97
96 QObject::connect(this, &ComposerController::toChanged, &ComposerController::updateSendAction);
97 QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSendAction); 98 QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSendAction);
98 QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSendAction); 99 QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSendAction);
99 QObject::connect(this, &ComposerController::toChanged, &ComposerController::updateSaveAsDraftAction);
100 QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSaveAsDraftAction); 100 QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSaveAsDraftAction);
101 QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSaveAsDraftAction); 101 QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSaveAsDraftAction);
102 updateSendAction(); 102 updateSendAction();
@@ -107,6 +107,72 @@ void ComposerController::clear()
107 Controller::clear(); 107 Controller::clear();
108 //Reapply account and identity from selection 108 //Reapply account and identity from selection
109 mIdentitySelector->reapplyCurrentIndex(); 109 mIdentitySelector->reapplyCurrentIndex();
110 mToModel->setStringList({});
111 mCcModel->setStringList({});
112 mBccModel->setStringList({});
113}
114
115QAbstractItemModel *ComposerController::toModel() const
116{
117 return mToModel.data();
118}
119
120void ComposerController::addTo(const QString &s)
121{
122 auto list = mToModel->stringList();
123 list.append(s);
124 mToModel->setStringList(list);
125 updateSendAction();
126}
127
128void ComposerController::removeTo(const QString &s)
129{
130 auto list = mToModel->stringList();
131 list.removeAll(s);
132 mToModel->setStringList(list);
133 updateSendAction();
134}
135
136QAbstractItemModel *ComposerController::ccModel() const
137{
138 return mCcModel.data();
139}
140
141void ComposerController::addCc(const QString &s)
142{
143 auto list = mCcModel->stringList();
144 list.append(s);
145 mCcModel->setStringList(list);
146 updateSendAction();
147}
148
149void ComposerController::removeCc(const QString &s)
150{
151 auto list = mCcModel->stringList();
152 list.removeAll(s);
153 mCcModel->setStringList(list);
154 updateSendAction();
155}
156
157QAbstractItemModel *ComposerController::bccModel() const
158{
159 return mBccModel.data();
160}
161
162void ComposerController::addBcc(const QString &s)
163{
164 auto list = mBccModel->stringList();
165 list.append(s);
166 mBccModel->setStringList(list);
167 updateSendAction();
168}
169
170void ComposerController::removeBcc(const QString &s)
171{
172 auto list = mBccModel->stringList();
173 list.removeAll(s);
174 mBccModel->setStringList(list);
175 updateSendAction();
110} 176}
111 177
112Completer *ComposerController::recipientCompleter() const 178Completer *ComposerController::recipientCompleter() const
@@ -119,10 +185,42 @@ Selector *ComposerController::identitySelector() const
119 return mIdentitySelector.data(); 185 return mIdentitySelector.data();
120} 186}
121 187
188static void applyAddresses(const QStringList &list, std::function<void(const QByteArray &, const QByteArray &)> callback)
189{
190 for (const auto &to : list) {
191 QByteArray displayName;
192 QByteArray addrSpec;
193 QByteArray comment;
194 KEmailAddress::splitAddress(to.toUtf8(), displayName, addrSpec, comment);
195 callback(addrSpec, displayName);
196 }
197}
198
199static void applyAddresses(const QString &list, std::function<void(const QByteArray &, const QByteArray &)> callback)
200{
201 applyAddresses(KEmailAddress::splitAddressList(list), callback);
202}
203
204
205static QStringList getStringListFromAddresses(const QString &s)
206{
207 QStringList list;
208 applyAddresses(s, [&](const QByteArray &addrSpec, const QByteArray &displayName) {
209 if (displayName.isEmpty()) {
210 list << QString{addrSpec};
211 } else {
212 list << QString("%1 <%2>").arg(QString{displayName}).arg(QString{addrSpec});
213 }
214 });
215 return list;
216}
217
122void ComposerController::setMessage(const KMime::Message::Ptr &msg) 218void ComposerController::setMessage(const KMime::Message::Ptr &msg)
123{ 219{
124 setTo(msg->to(true)->asUnicodeString()); 220 mToModel->setStringList(getStringListFromAddresses(msg->to(true)->asUnicodeString()));
125 setCc(msg->cc(true)->asUnicodeString()); 221 mCcModel->setStringList(getStringListFromAddresses(msg->cc(true)->asUnicodeString()));
222 mBccModel->setStringList(getStringListFromAddresses(msg->bcc(true)->asUnicodeString()));
223
126 setSubject(msg->subject(true)->asUnicodeString()); 224 setSubject(msg->subject(true)->asUnicodeString());
127 setBody(msg->body()); 225 setBody(msg->body());
128 setExistingMessage(msg); 226 setExistingMessage(msg);
@@ -165,32 +263,21 @@ void ComposerController::recordForAutocompletion(const QByteArray &addrSpec, con
165 } 263 }
166} 264}
167 265
168void applyAddresses(const QString &list, std::function<void(const QByteArray &, const QByteArray &)> callback)
169{
170 for (const auto &to : KEmailAddress::splitAddressList(list)) {
171 QByteArray displayName;
172 QByteArray addrSpec;
173 QByteArray comment;
174 KEmailAddress::splitAddress(to.toUtf8(), displayName, addrSpec, comment);
175 callback(addrSpec, displayName);
176 }
177}
178
179KMime::Message::Ptr ComposerController::assembleMessage() 266KMime::Message::Ptr ComposerController::assembleMessage()
180{ 267{
181 auto mail = mExistingMessage; 268 auto mail = mExistingMessage;
182 if (!mail) { 269 if (!mail) {
183 mail = KMime::Message::Ptr::create(); 270 mail = KMime::Message::Ptr::create();
184 } 271 }
185 applyAddresses(getTo(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { 272 applyAddresses(mToModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) {
186 mail->to(true)->addAddress(addrSpec, displayName); 273 mail->to(true)->addAddress(addrSpec, displayName);
187 recordForAutocompletion(addrSpec, displayName); 274 recordForAutocompletion(addrSpec, displayName);
188 }); 275 });
189 applyAddresses(getCc(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { 276 applyAddresses(mCcModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) {
190 mail->cc(true)->addAddress(addrSpec, displayName); 277 mail->cc(true)->addAddress(addrSpec, displayName);
191 recordForAutocompletion(addrSpec, displayName); 278 recordForAutocompletion(addrSpec, displayName);
192 }); 279 });
193 applyAddresses(getBcc(), [&](const QByteArray &addrSpec, const QByteArray &displayName) { 280 applyAddresses(mBccModel->stringList(), [&](const QByteArray &addrSpec, const QByteArray &displayName) {
194 mail->bcc(true)->addAddress(addrSpec, displayName); 281 mail->bcc(true)->addAddress(addrSpec, displayName);
195 recordForAutocompletion(addrSpec, displayName); 282 recordForAutocompletion(addrSpec, displayName);
196 }); 283 });
@@ -212,7 +299,7 @@ KMime::Message::Ptr ComposerController::assembleMessage()
212 299
213void ComposerController::updateSendAction() 300void ComposerController::updateSendAction()
214{ 301{
215 auto enabled = !getTo().isEmpty() && !getSubject().isEmpty() && !getAccountId().isEmpty(); 302 auto enabled = !mToModel->stringList().isEmpty() && !getSubject().isEmpty() && !getAccountId().isEmpty();
216 sendAction()->setEnabled(enabled); 303 sendAction()->setEnabled(enabled);
217} 304}
218 305