diff options
Diffstat (limited to 'framework/src/domain/composercontroller.cpp')
-rw-r--r-- | framework/src/domain/composercontroller.cpp | 129 |
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 | |||
115 | QAbstractItemModel *ComposerController::toModel() const | ||
116 | { | ||
117 | return mToModel.data(); | ||
118 | } | ||
119 | |||
120 | void ComposerController::addTo(const QString &s) | ||
121 | { | ||
122 | auto list = mToModel->stringList(); | ||
123 | list.append(s); | ||
124 | mToModel->setStringList(list); | ||
125 | updateSendAction(); | ||
126 | } | ||
127 | |||
128 | void ComposerController::removeTo(const QString &s) | ||
129 | { | ||
130 | auto list = mToModel->stringList(); | ||
131 | list.removeAll(s); | ||
132 | mToModel->setStringList(list); | ||
133 | updateSendAction(); | ||
134 | } | ||
135 | |||
136 | QAbstractItemModel *ComposerController::ccModel() const | ||
137 | { | ||
138 | return mCcModel.data(); | ||
139 | } | ||
140 | |||
141 | void ComposerController::addCc(const QString &s) | ||
142 | { | ||
143 | auto list = mCcModel->stringList(); | ||
144 | list.append(s); | ||
145 | mCcModel->setStringList(list); | ||
146 | updateSendAction(); | ||
147 | } | ||
148 | |||
149 | void ComposerController::removeCc(const QString &s) | ||
150 | { | ||
151 | auto list = mCcModel->stringList(); | ||
152 | list.removeAll(s); | ||
153 | mCcModel->setStringList(list); | ||
154 | updateSendAction(); | ||
155 | } | ||
156 | |||
157 | QAbstractItemModel *ComposerController::bccModel() const | ||
158 | { | ||
159 | return mBccModel.data(); | ||
160 | } | ||
161 | |||
162 | void ComposerController::addBcc(const QString &s) | ||
163 | { | ||
164 | auto list = mBccModel->stringList(); | ||
165 | list.append(s); | ||
166 | mBccModel->setStringList(list); | ||
167 | updateSendAction(); | ||
168 | } | ||
169 | |||
170 | void 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 | ||
112 | Completer *ComposerController::recipientCompleter() const | 178 | Completer *ComposerController::recipientCompleter() const |
@@ -119,10 +185,42 @@ Selector *ComposerController::identitySelector() const | |||
119 | return mIdentitySelector.data(); | 185 | return mIdentitySelector.data(); |
120 | } | 186 | } |
121 | 187 | ||
188 | static 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 | |||
199 | static void applyAddresses(const QString &list, std::function<void(const QByteArray &, const QByteArray &)> callback) | ||
200 | { | ||
201 | applyAddresses(KEmailAddress::splitAddressList(list), callback); | ||
202 | } | ||
203 | |||
204 | |||
205 | static 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 | |||
122 | void ComposerController::setMessage(const KMime::Message::Ptr &msg) | 218 | void 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 | ||
168 | void 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 | |||
179 | KMime::Message::Ptr ComposerController::assembleMessage() | 266 | KMime::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 | ||
213 | void ComposerController::updateSendAction() | 300 | void 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 | ||