source: SMSSender/frontend/gui/ui/main.cpp @ 362:f5af940455b5

separation-frontend-backend
Last change on this file since 362:f5af940455b5 was 362:f5af940455b5, checked in by Sämy Zehnder <saemy.zehnder@…>, 5 years ago
  • Adds a parent to every dialog s.t. they do not create an own entry in the task bar.
File size: 23.7 KB
Line 
1/*
2 smssender - A frontend for fast and easy SMS sending over different gateways.
3 Copyright (C) 2007-2014, gorrión. See http://smssender.gorrion.ch
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18#include "main.h"
19
20#include <algorithm>
21
22#include <QCompleter>
23#include <QDebug>
24#include <QMainWindow>
25#include <QMessageBox>
26#include <QSortFilterProxyModel>
27
28#include "common/business/iaccount_tasks.h"
29#include "common/domain/snumber.h"
30#include "frontend/business/erroraccount.h"
31#include "frontend/gui/ui/about.h"
32#include "frontend/gui/ui/accountlist.h"
33#include "frontend/gui/ui/addressbook.h"
34#include "frontend/gui/ui/completers/bettercompleter.h"
35#include "frontend/gui/ui/components/taskstatusbar.h"
36#include "frontend/gui/ui/editaccount.h"
37#include "frontend/gui/ui/editcontact.h"
38#include "frontend/gui/ui/models/aliascompletionmodel.h"
39#include "frontend/gui/ui/models/loadedaccountmodel.h"
40#include "frontend/gui/ui/sendingdialog.h"
41#include "frontend/gui/ui/settingsdialog.h"
42#include "frontend/gui/ui/updatedialog.h"
43
44namespace UI {
45
46Main::Main(const Bootstrap &bootstrap)
47    : QMainWindow()
48    , m_bootstrap(bootstrap)
49    , m_managerFactory(m_bootstrap.managerFactory())
50    , m_recipientAddingEnabled(true)
51{
52        ui.setupUi(this);
53
54        ui.lblSMSSent->hide();
55
56        /* Accounts */
57    accountModel_       = new AccountTreeModel(this, true, m_managerFactory.accountManager(), *m_managerFactory.gatewayManager());
58    accountFilterModel_ = new LoadedAccountModel(this, *m_managerFactory.accountManager());
59        accountFilterModel_->setSourceModel(accountModel_);
60        accountFilterModel_->setSortCaseSensitivity(Qt::CaseInsensitive);
61        accountFilterModel_->setDynamicSortFilter(true);
62    accountFilterModel_->sort(AccountTreeModel::ColName);
63        ui.lstAccounts->setModel(accountFilterModel_);
64        ui.lstAccounts->setModelColumn(AccountTreeModel::ColNameWFreeCount);
65    connect(ui.lstAccounts->model(), SIGNAL(layoutChanged()),
66            this, SLOT(onAccountRowInserted()));
67
68        /* Contact / Groups */
69    contactGroupListModel_ = new ContactGroupListModel(this, *m_managerFactory.contactManager(), *m_managerFactory.groupManager());
70        contactGroupSortModel_ = new QSortFilterProxyModel(this);
71        contactGroupSortModel_->setSourceModel(contactGroupListModel_);
72        contactGroupSortModel_->setDynamicSortFilter(true);
73        contactGroupSortModel_->setSortCaseSensitivity(Qt::CaseInsensitive);
74        contactGroupSortModel_->sort(0, Qt::AscendingOrder);
75    ui.lstContacts->setModel(contactGroupSortModel_);
76
77        QSortFilterProxyModel* completionModel = new AliasCompletionModel(this);
78    completionModel->setSourceModel(contactGroupListModel_);
79    BetterCompleter* aliasCompleter = new BetterCompleter(completionModel, this);
80    aliasCompleter->setCompletionMode(QCompleter::PopupCompletion);
81    aliasCompleter->setCaseSensitivity(Qt::CaseInsensitive);
82    //aliasCompleter->popup()->setIconSize(QSize(32, 42));
83
84    //ui.lstContacts->setCompleter(new QCompleter(completionModel));
85    ui.lstContacts->setCompleter(aliasCompleter);
86    ui.lstContacts->view()->setIconSize(QSize(24, 31)); // The icon size on the drop down
87
88    connect(ui.lstContacts->lineEdit(), SIGNAL(returnPressed()),
89            this, SLOT(on_lstContacts_returnPressed()));
90    connect(ui.lstContacts, SIGNAL(activated(int)),
91            this, SLOT(on_btnAddRecipient_clicked()));
92    connect(ui.lstContacts->completer(), SIGNAL(activated(const QString&)),
93            this, SLOT(on_lstContacts_completerActivated(const QString&)));
94
95    connect(m_managerFactory.accountInitManager(), SIGNAL(accountInitStateChanged(IAccount*)),
96            this, SLOT(onAccountInitStateChanged(IAccount*)));
97    connect(m_managerFactory.accountInitManager(), SIGNAL(accountInitFailed(IAccount*, const EException&)),
98            this, SLOT(onAccountInitFailed(IAccount*, const EException&)));
99
100    connect(&m_bootstrap, SIGNAL(accountsLoaded()),
101            this, SLOT(onAccountsLoaded()));
102
103    connect(m_managerFactory.settingsManager(), SIGNAL(settingChanged(int)),
104            this, SLOT(onSettingChanged(int)));
105
106
107    TaskStatusBar* tsb = new TaskStatusBar();
108    ui.statusbar->addPermanentWidget(tsb);
109
110
111    // Initialize the form
112    on_treeRecipients_itemSelectionChanged();
113    enableSendBtnIfAllFilled();
114
115    // Set the Ctrl+W shortcut
116    new QShortcut(QKeySequence("Ctrl+W"), this, SLOT(close()));
117
118    recalculateSMSCosts();
119    setShortcuts();
120
121        ui.lstContacts->setCurrentIndex(-1);
122
123    if (m_managerFactory.settingsManager()->getCheckForUpdates()) {
124        if (m_managerFactory.updateManager()->isUpdateAvailable(UpdateManager::utEdge)) {
125            onUpdateAvailable(m_managerFactory.updateManager()->newestVersion(UpdateManager::utEdge), UpdateManager::utEdge);
126        } else {
127            connect(m_managerFactory.updateManager(), SIGNAL(updateAvailable(const SVersion&, UpdateManager::UpdateType)),
128                    this, SLOT(onUpdateAvailable(const SVersion&, UpdateManager::UpdateType)));
129        }
130        }
131
132    m_managerFactory.guiManager()->setMainMenu(IGuiIntegrationHelper::File, ui.menuFile, ui.actionExit);
133    m_managerFactory.guiManager()->setMainMenu(IGuiIntegrationHelper::Edit, ui.menuEdit, ui.actionPreferences);
134    m_managerFactory.guiManager()->setMainMenu(IGuiIntegrationHelper::Help, ui.menuHelp, ui.actionAbout);
135
136    QTimer::singleShot(500, this, SLOT(checkForAccounts()));
137}
138
139/**
140 * Check if an account is already created or show the account creation dialog otherwise.
141 */
142void Main::checkForAccounts() {
143    if (m_managerFactory.gatewayManager()->gateways().isEmpty()) {
144        // If no gateway is there, then abort.
145        return;
146    }
147
148    if (m_managerFactory.accountManager()->accounts().isEmpty()) {
149        QScopedPointer<EditAccount> ea(
150                    new EditAccount(this, NULL, *m_managerFactory.accountManager(), *m_managerFactory.gatewayManager()));
151        if (ea->exec() == QDialog::Accepted){ // Wait for return
152            m_managerFactory.accountManager()->saveAccount(ea->account());
153        }
154    }
155}
156
157void Main::changeEvent(QEvent* event) {
158    if (event->type() == QEvent::LanguageChange) {
159        ui.retranslateUi(this);
160        recalculateSMSCosts(); // Display costs in the new language
161    }
162    QMainWindow::changeEvent(event);
163}
164
165IAccount* Main::selectedAccount() const {
166    QModelIndex idx = accountFilterModel_->mapToSource(accountFilterModel_->index(ui.lstAccounts->currentIndex(), 0));
167    return accountModel_->dataObject(idx);
168}
169
170
171void Main::setShortcuts() {
172    // Remove the old shortcuts
173    foreach (QShortcut* shortcut, m_shortcuts) {
174        m_shortcuts.remove(shortcut);
175        delete shortcut;
176    }
177
178    // Set the new ones
179    m_shortcuts.insert(new QShortcut(m_managerFactory.settingsManager()->getNewMessageShortCut(),
180                                    this, SLOT(on_shortcutNewMessage())));
181    m_shortcuts.insert(new QShortcut(m_managerFactory.settingsManager()->getClearMessageTextShortCut(),
182                                    this, SLOT(on_shortcutClearMessageText())));
183    m_shortcuts.insert(new QShortcut(m_managerFactory.settingsManager()->getClearRecipientsShortCut(),
184                                    this, SLOT(on_shortcutClearRecipients())));
185    m_shortcuts.insert(new QShortcut(m_managerFactory.settingsManager()->getSendShortCut(),
186                                    this, SLOT(on_shortcutSendMessage())));
187}
188
189
190/* Contacts & Recipients... */
191bool Main::isContactNode(const QTreeWidgetItem* node){
192    return nodeToContact.contains(const_cast<QTreeWidgetItem*>(node));
193}
194bool Main::isGroupNode(const QTreeWidgetItem* node){
195    return nodeToGroup.contains(const_cast<QTreeWidgetItem*>(node));
196}
197
198const SContact *Main::getContactOfNode(const QTreeWidgetItem* node){
199    if (!isContactNode(node)){
200        return NULL;
201    } else {
202        return nodeToContact.value(const_cast<QTreeWidgetItem*>(node));
203    }
204}
205const SGroup *Main::getGroupOfNode(const QTreeWidgetItem* node){
206    if (!isGroupNode(node)){
207        return NULL;
208    } else {
209        return nodeToGroup.value(const_cast<QTreeWidgetItem*>(node));
210    }
211}
212
213bool Main::isNodeContactOrHasContact(const QTreeWidgetItem* node, const SContact& contact){
214    if (isContactNode(node)){
215        const SContact *contact_ = getContactOfNode(node);
216        if (&contact == contact_){
217            return true;
218        }
219    } else {
220        // group...
221        for (int x = 0; x < node->childCount(); ++x){
222            if (isNodeContactOrHasContact(node->child(x), contact)){
223                return true;
224            }
225        }
226    }
227    return false;
228
229}
230
231bool Main::isContactAlreadyRecipient(const SContact& contact){
232    return getRecipientContacts(true).contains(&contact);
233}
234bool Main::isGroupAlreadyRecipient(const SGroup& group){
235    return getRecipientGroups().contains(&group);
236}
237
238QSet<const SContact*> Main::getRecipientContacts(bool withGroupContacts) {
239    return getRecipientContacts(withGroupContacts, NULL);
240}
241QSet<const SContact*> Main::getRecipientContacts(bool withGroupContacts, QTreeWidgetItem* node) {
242    QSet<const SContact*> result;
243
244    if (node == NULL) {
245        for (int i = 0; i < ui.treeRecipients->topLevelItemCount(); ++i) {
246            result.unite(getRecipientContacts(withGroupContacts, ui.treeRecipients->topLevelItem(i)));
247        }
248    }
249
250    if (isContactNode(node)) {
251        result.insert(getContactOfNode(node));
252    } else if (withGroupContacts && isGroupNode(node)) {
253        for (int i = 0; i < node->childCount(); ++i) {
254            result.unite(getRecipientContacts(withGroupContacts, node->child(i)));
255        }
256    }
257
258    return result;
259}
260
261QSet<const SGroup *> Main::getRecipientGroups() {
262    QSet<const SGroup*> result;
263    for (int x = 0; x < ui.treeRecipients->topLevelItemCount(); ++x){
264        if (isGroupNode(ui.treeRecipients->topLevelItem(x))){
265            result.insert(getGroupOfNode(ui.treeRecipients->topLevelItem(x)));
266        }
267    }
268    return result;
269}
270
271
272void Main::addRecipient(const SContact& contact, QTreeWidgetItem* parent){
273    if (isContactAlreadyRecipient(contact)){
274        return;
275    }
276
277    // TODO: Check if the given recipient/number is a valid recipient for the selected gateway
278
279    contactGroupListModel_->addFilteredContact(contact);
280
281    QTreeWidgetItem* node;
282    if (parent) {
283        node = new QTreeWidgetItem(parent); // parent->addChild is done in here
284    } else {
285        node = new QTreeWidgetItem(ui.treeRecipients);
286        ui.treeRecipients->addTopLevelItem(node);
287    }
288
289    node->setText(0, contact.name());
290    node->setIcon(0, QPixmap::fromImage(contact.image()));
291    nodeToContact.insert(node, &contact);
292}
293
294void Main::addRecipient(const SGroup& group){
295    if (isGroupAlreadyRecipient(group)){
296        return;
297    }
298
299    QTreeWidgetItem* node = new QTreeWidgetItem(ui.treeRecipients);
300    ui.treeRecipients->addTopLevelItem(node);
301
302    node->setText(0, group.name());
303    node->setIcon(0, QPixmap::fromImage(group.image()));
304    nodeToGroup.insert(node, &group);
305
306    foreach (const SContact *contact, group.contacts()) {
307        addRecipient(*contact, node);
308    }
309}
310
311void Main::removeNode(QTreeWidgetItem* node){
312    QTreeWidgetItem* parent = node->parent();
313    if (parent){
314        parent->removeChild(node);
315
316        if (parent->childCount() == 0){
317            removeRecipient(parent);
318        }
319    } else {
320        ui.treeRecipients->takeTopLevelItem(ui.treeRecipients->indexOfTopLevelItem(node));
321    }
322}
323void Main::removeRecipient(QTreeWidgetItem* node){
324    if (isContactNode(node)){
325        const SContact *contact = nodeToContact.value(node);
326        contactGroupListModel_->removeFilteredContact(*contact);
327
328        removeNode(node);
329        nodeToContact.remove(node);
330    } else { // Group
331        for (int x = 0; x < node->childCount(); ++x){
332            removeRecipient(node->child(x)); // Remove all contacts of this group
333        }
334
335        removeNode(node);
336        nodeToGroup.remove(node);
337    }
338}
339
340bool Main::isAllFilled() {
341    return (ui.txtMessage->toPlainText().trimmed() != "")
342            && (ui.treeRecipients->topLevelItemCount() > 0)
343            && (ui.lstAccounts->currentIndex() > -1);
344}
345void Main::enableSendBtnIfAllFilled() {
346    ui.btnSend->setEnabled(this->isAllFilled());
347}
348
349
350void Main::clearMessage() {
351    ui.txtMessage->clear();
352    ui.txtMessage->setFocus();
353}
354void Main::clearRecipients() {
355    while (ui.treeRecipients->topLevelItemCount() > 0) {
356        removeRecipient(ui.treeRecipients->topLevelItem(0));
357    }
358}
359
360void Main::sendMessage() {
361    if (!this->isAllFilled()) {
362        return;
363    }
364
365    IAccount* account = selectedAccount();
366    QString message = ui.txtMessage->toPlainText().trimmed() +
367            m_managerFactory.suffixManager()->suffixIfEnabled();
368    QSet<const SContact*> recipients = getRecipientContacts(true);
369
370    if (account) {
371        ISMSSendTask* task = account->createSMSSendTask(message, recipients);
372
373        if (task) {
374            connect(task, SIGNAL(exceptionOccured(STask*)),
375                    this, SLOT(onSMSSendingErrorOccured(STask*)), Qt::DirectConnection);
376            connect(task, SIGNAL(finished(STask*)),
377                    this, SLOT(onSMSSendingFinished(STask*)), Qt::DirectConnection);
378
379            QScopedPointer<QDialog> sd(m_managerFactory.guiManager()->createNewSendingDialog(this, task));
380
381            task->start();
382
383            sd->exec();
384        }
385    }
386}
387
388
389/* SLOTS... */
390
391void Main::on_btnSend_clicked() {
392    sendMessage();
393}
394
395void Main::on_treeRecipients_itemSelectionChanged(){
396    ui.btnRemoveRecipient->setEnabled(ui.treeRecipients->selectedItems().count() > 0);
397}
398
399void Main::on_lstContacts_editTextChanged(const QString& text) {
400    if (text == "") {
401        ui.lstContacts->hidePopup();
402        ui.lstContacts->setCurrentIndex(-1);
403    }
404}
405void Main::on_lstContacts_returnPressed() {
406    if (ui.lstContacts->currentIndex() < 0) {
407        SNumber number(ui.lstContacts->lineEdit()->text().trimmed(), SNumber::GuessFormat);
408        if (!number.isValid()) {
409            // If nothing is selected in the completion, just use the topmost completion
410            ui.lstContacts->completer()->setCurrentRow(0);
411            ui.lstContacts->lineEdit()->setText(ui.lstContacts->completer()->currentCompletion());
412        } else {
413            // There was entered a valid number, so do not select any completion but search after the number.
414            on_btnAddRecipient_clicked();
415        }
416    }
417}
418void Main::on_lstContacts_completerActivated(const QString& text) {
419    Q_UNUSED(text);
420    if (ui.lstContacts->completer()->currentRow() >= 0) {
421        if (ui.lstContacts->currentIndex() == -1) {
422            ui.lstContacts->setCurrentIndex(ui.lstContacts->findText(ui.lstContacts->currentText()));
423        }
424        QTimer::singleShot(0, this, SLOT(on_btnAddRecipient_clicked()));
425    }
426}
427
428void Main::on_btnAddRecipient_clicked(){
429    if (!m_recipientAddingEnabled) return;
430    m_recipientAddingEnabled = false; // Ignore multiple calls of btnAddRecipient-clicked events
431
432    QModelIndex idx = contactGroupSortModel_->mapToSource(contactGroupSortModel_->index(ui.lstContacts->currentIndex(), 0));
433    if (idx.isValid()) {
434        ContactGroupContainer recipientCntr = contactGroupListModel_->dataObject(idx);
435        if (recipientCntr.contact) {
436            addRecipient(*recipientCntr.contact);
437        } else {
438            addRecipient(*recipientCntr.group);
439        }
440    } else {
441        SNumber number(ui.lstContacts->lineEdit()->text().trimmed(), SNumber::GuessFormat);
442        if (number.isValid()) {
443            const SContact *recipient = m_managerFactory.contactManager()->contactByNumber(number);
444
445            if (recipient) {
446                addRecipient(*recipient);
447            } else {
448                QScopedPointer<SContact> recipient(new SContact);
449                SContact *r = recipient.data();
450                recipient->setNumber(number);
451
452                if (QMessageBox::Yes == QMessageBox::question(this, tr("SMSSender"),
453                                                              tr("This number is not yet in your address book. Do you want to add it?"),
454                                                              QMessageBox::Yes | QMessageBox::No,
455                                                              QMessageBox::Yes)) {
456                    QScopedPointer<EditContact> ec(new EditContact(
457                                                       this, recipient.data(), false,
458                                                       *m_managerFactory.contactManager(), *m_managerFactory.groupManager()));
459                    if (ec->exec() == QDialog::Accepted) { // Wait for return
460                        m_managerFactory.contactManager()->saveContact(recipient.take()); // Takes ownership
461                    }
462                }
463                if (recipient->name() == "") {
464                    recipient->setName(number.toString(SNumber::IsoFormat));
465                }
466
467                recipient.take(); // FIXME: Memleak when not managed by contactmanager! (add it to contactmanager w/o saving?)
468                addRecipient(*r);
469            }
470        }
471    }
472    ui.lstContacts->setCurrentIndex(-1);
473    // Clear the text in the edit, even if the completer is messing around
474    QTimer::singleShot(0, ui.lstContacts->lineEdit(), SLOT(clear()));
475
476    enableSendBtnIfAllFilled();
477
478    QTimer::singleShot(20, this, SLOT(reenableRecipientAdding()));
479}
480void Main::reenableRecipientAdding() {
481    m_recipientAddingEnabled = true;
482}
483
484void Main::on_btnRemoveRecipient_clicked(){
485    QListIterator<QTreeWidgetItem*> i(ui.treeRecipients->selectedItems());
486    while (i.hasNext()){
487        removeRecipient(i.next());
488    }
489    enableSendBtnIfAllFilled();
490}
491
492
493/* File menu */
494
495void Main::on_actionNewMessage_triggered(bool checked) {
496    Q_UNUSED(checked);
497
498    clearMessage();
499    clearRecipients();
500}
501
502/* Edit menu */
503
504void Main::on_actionAccounts_triggered(bool checked) {
505    Q_UNUSED(checked);
506
507    QScopedPointer<AccountList> al(new AccountList(this, m_managerFactory.accountManager(), *m_managerFactory.gatewayManager()));
508    al->exec();
509}
510
511void Main::on_actionAddressBook_triggered(bool checked){
512    Q_UNUSED(checked);
513
514    QScopedPointer<AddressBook> ab(
515                new AddressBook(this, m_managerFactory.contactManager(), m_managerFactory.groupManager(),
516                                *m_managerFactory.contactImporterManager(), m_managerFactory.guiManager()));
517    ab->exec();
518}
519
520void Main::on_actionPreferences_triggered(bool checked){
521    Q_UNUSED(checked);
522
523    QScopedPointer<SettingsDialog> s(
524                new SettingsDialog(this, m_managerFactory.settingsManager(),
525                                   m_managerFactory.suffixManager(), m_managerFactory.updateManager()));
526        s->exec();
527}
528
529
530/* Help menu */
531
532void Main::on_actionAbout_triggered(bool checked){
533    Q_UNUSED(checked);
534
535    QScopedPointer<About> a(new About(this, m_bootstrap.libraries()));
536    a->exec();
537}
538
539
540void Main::recalculateSMSCosts() const {
541    IAccount* account = selectedAccount();
542
543    int i = 0;
544
545    QString msg = ui.txtMessage->toPlainText().trimmed();
546    if (!msg.isEmpty()) {
547        i = 1;
548        if (account) {
549            i = account->costsForText(msg + m_managerFactory.suffixManager()->suffixIfEnabled());
550        }
551    }
552    ui.lblTextSize->setText(tr("%1 SMS").arg(i));
553}
554
555
556void Main::on_txtMessage_textChanged() {
557    ui.lblSMSSent->hide();
558    recalculateSMSCosts();
559    enableSendBtnIfAllFilled();
560}
561
562void Main::on_lstAccounts_currentIndexChanged(int index) {
563    Q_UNUSED(index);
564
565    recalculateSMSCosts();
566    enableSendBtnIfAllFilled();
567}
568
569
570/* Shortcuts */
571
572void Main::on_shortcutNewMessage() {
573    clearMessage();
574    clearRecipients();
575}
576
577void Main::on_shortcutClearMessageText() {
578    clearMessage();
579}
580
581void Main::on_shortcutClearRecipients() {
582    clearRecipients();
583}
584
585void Main::on_shortcutSendMessage() {
586    sendMessage();
587}
588
589
590
591/* Settings */
592
593void Main::onSettingChanged(int setting) {
594    switch (setting) {
595        case Settings::AddSuffix:
596        case Settings::SMSSuffix:
597            recalculateSMSCosts();
598            break;
599
600        case Settings::ShortcutNewMessage:
601        case Settings::ShortcutClearMessageText:
602        case Settings::ShortcutCleanRecipients:
603        case Settings::ShortcutSend:
604            setShortcuts();
605            break;
606
607        default:
608            break;
609    }
610}
611
612
613
614/* Account loading */
615void Main::onAccountInitStateChanged(IAccount* account) {
616    Q_UNUSED(account);
617
618    enableSendBtnIfAllFilled();
619}
620
621void Main::onAccountInitFailed(IAccount* account, const EException& exception) {
622    qWarning() << exception.chainedWhat();
623    m_managerFactory.guiManager()->execErrorDialog(
624                this,
625                tr("An error occured while initializing the account \"%1\".")
626                    .arg(account->name()),
627                exception);
628}
629
630void Main::onAccountsLoaded() {
631    QString errorMsg;
632    QString detailedMsg;
633
634    QSet<IAccount *> erroneousAccounts =
635        m_managerFactory.accountManager()->erroneousAccounts();
636    if (!erroneousAccounts.empty()) {
637        foreach(IAccount* account, erroneousAccounts) {
638            const EException &ex = static_cast<ErrorAccount*>(account)->error();
639
640            errorMsg += QString("[%1]: %2\n").arg(account->name(), ex.unchainedWhat());
641            if (ex.hasChainedException()) {
642                detailedMsg += QString("[%1]: %2\n").arg(account->name(), ex.chainedException().chainedWhat());
643            }
644        }
645        errorMsg.remove(QRegExp("\n$"));
646        detailedMsg.remove(QRegExp("\n$"));
647
648        QMessageBox msg(QMessageBox::Warning, tr("Error occured"),
649                        tr("Errors occured while loading your accounts."), QMessageBox::Ok, this);
650        msg.setDefaultButton(QMessageBox::Ok);
651        msg.setInformativeText(errorMsg);
652        msg.setDetailedText(detailedMsg);
653        msg.exec();
654    }
655}
656
657void Main::onAccountRowInserted() {
658    if (ui.lstAccounts->count() <= 0) {
659        return;
660    }
661
662    if ((ui.lstAccounts->currentIndex() == -1)
663            || (ui.lstAccounts->currentIndex() >= (ui.lstAccounts->count() - 1))) {
664        // No account selected, but one is loaded now -> autoselect one
665        ui.lstAccounts->setCurrentIndex(ui.lstAccounts->count() - 1);
666    }
667}
668
669void Main::onSMSSendingFinished(STask* task) {
670    metaObject()->invokeMethod(this, "smsSendingFinished", Qt::QueuedConnection, Q_ARG(STask::Result, task->taskResult()));
671}
672void Main::smsSendingFinished(STask::Result taskResult) {
673    Q_ASSERT(QThread::currentThread() == thread());
674
675    if (taskResult == STask::rSuccess) {
676        ui.lblSMSSent->show();
677
678        if (m_managerFactory.settingsManager()->getShowSentConfirmation()) {
679            QMessageBox::information(this, tr("SMS sent"),
680                                     tr("The sms has been sent."),
681                                     QMessageBox::Ok, QMessageBox::Ok);
682        }
683    }
684}
685
686void Main::onSMSSendingErrorOccured(STask* task) {
687    metaObject()->invokeMethod(this, "smsSendingErrorOccured", Qt::QueuedConnection, Q_ARG(const EException&, task->exception()));
688}
689void Main::smsSendingErrorOccured(const EException &exception) {
690    Q_ASSERT(QThread::currentThread() == thread());
691
692    qWarning() << exception.chainedWhat();
693    m_managerFactory.guiManager()->execErrorDialog(
694                this, tr("An error occured while sending the sms."), exception);
695}
696
697
698void Main::onUpdateAvailable(const SVersion& newVersion, UpdateManager::UpdateType type) {
699    Q_UNUSED(type);
700
701    UpdateDialog* d = new UpdateDialog(this, newVersion);
702    d->exec();
703    delete d;
704}
705
706} // namespace UI
Note: See TracBrowser for help on using the repository browser.