source: SMSSender/frontend/gui/ui/main.cpp @ 374:159b8dc48877

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