Changeset 56:e63ceb8090cd in SMSSender


Ignore:
Timestamp:
Feb 2, 2010 9:53:45 AM (9 years ago)
Author:
Sämy Zehnder <saemy.zehnder@…>
Branch:
3.0
Convert:
svn:3639001d-8e34-449c-bb86-3782b86c4877/branches/3.0@55
Message:
  • Renamed accountmodel to accounttreemodel
  • Implemented creation of new contact if number is unknown in vcmain
  • Areacode is now in its own field in vceditcontact
  • Accountlist in vcmain is now controlled by a model (Needs filtering of only active ones)
  • Settingspath is dynamic and user-based now
Files:
18 edited
2 moved

Legend:

Unmodified
Added
Removed
  • gateways/SwisscomXtraZone/src/business/BCGateway.cpp

    r43 r56  
    2525QImage BCGateway::icon() const {
    2626    return QImage(":/images/SwisscomXtraZone.ico");
     27}
     28
     29QSet<int> BCGateway::validRecipientCountryCodes() const {
     30    QSet<int> result;
     31    result.insert(41); // CH
     32    return result;
    2733}
    2834
  • gateways/SwisscomXtraZone/src/business/BCGateway.h

    r43 r56  
    2626
    2727    /* IGateway */
    28     virtual QString        name() const;
    29     virtual QImage         icon() const;
     28    QString        name() const;
     29    QImage         icon() const;
     30    QSet<int>      validRecipientCountryCodes() const;
    3031
    31     virtual IAccount*      createAccountInstance(IStorage* storage) const;
     32    IAccount*      createAccountInstance(IStorage* storage) const;
    3233
    33     virtual QList<QString> splitTextToLongSMS(const QString& text) const;
    34     virtual QList<QString> splitTextToShortSMS(const QString& text) const;
     34    QList<QString> splitTextToLongSMS(const QString& text) const;
     35    QList<QString> splitTextToShortSMS(const QString& text) const;
    3536
    36     virtual IAccountSettingsWidget* getAccountSettingsWidget(QWidget* parent = 0) const;
     37    IAccountSettingsWidget* getAccountSettingsWidget(QWidget* parent = 0) const;
    3738
    3839
    39     virtual QString        addonText() const;
    40     virtual void           setAddonText(const QString& addonText);
     40    QString        addonText() const;
     41    void           setAddonText(const QString& addonText);
    4142
    42     virtual int            longSMSLength() const;
    43     virtual void           setLongSMSLength(int longSMSLength);
     43    int            longSMSLength() const;
     44    void           setLongSMSLength(int longSMSLength);
    4445
    4546protected:
  • lib/libdatatypes/src/business/BCContact.cpp

    r55 r56  
    6666void BCContact::setImage(const QImage& image){
    6767    SET_IF_DIFFERENT(image_, image);
     68    image_ = image_.scaledToWidth(50, Qt::SmoothTransformation);
    6869    emit contactEvents()->dataChanged();
    6970}
  • lib/libdatatypes/src/snumber.cpp

    r43 r56  
    2525 *  aa      area code (2-digits)
    2626 *  aaa     area code (3-digits)
    27  *
    2827 *  AAA     area code trim zeros
    2928 *
     
    3433const QString SNumber::IsoFormat      = "'+'cc' 'aaa' 'u"; // +41 079 1234567
    3534const QString SNumber::IsoFormatShort = "'+'CC' 'AAA' 'u"; // +41 79 1234567
     35const QString SNumber::GuessFormat    = "%%guess%%";
    3636
    3737SNumber::SNumber() {
    3838    clear();
    3939}
    40 SNumber::SNumber(const QString& numberStr, const QString& format /* = SNumber::IsoFormat */) {
     40SNumber::SNumber(const QString& numberStr, const QString& format) {
    4141    setNumber(numberStr, format);
    4242}
     
    7272
    7373/* CC & AAA are not applicable here! */
    74 bool SNumber::setNumber(const QString& numberStr, const QString& format /* = SNumber::IsoFormat */){
     74bool SNumber::setNumber(const QString& numberStr, const QString& format){
     75    if (format == SNumber::GuessFormat) {
     76        QStringList formats;
     77        formats.append("'+'cc' 'aaa' 'u");// +41 079 1234567
     78        formats.append("'+'cc' 'aa' 'u"); // +41 79 1234567
     79        formats.append("'+'cc' 'a' 'u");  // +41 7 1234567
     80        formats.append("'+'c' 'aaa' 'u"); // +1 079 1234567
     81        formats.append("'+'c' 'aa' 'u");  // +1 79 1234567
     82        formats.append("'+'c' 'a' 'u");   // +1 7 1234567
     83        formats.append("'+'cc' 'aaau");   // +41 0791234567 (Attention! A part of the usernumber could be interpreted as the areacode)
     84        formats.append("'+'cc' 'aau");    // +41 791234567 (Attention! A part of the usernumber could be interpreted as the areacode)
     85        formats.append("'+'cc' 'au");     // +41 71234567 (Attention! A part of the usernumber could be interpreted as the areacode)
     86        formats.append("'+'c' 'aaau");    // +1 0791234567 (Attention! A part of the usernumber could be interpreted as the areacode)
     87        formats.append("'+'c' 'aau");     // +1 791234567 (Attention! A part of the usernumber could be interpreted as the areacode)
     88        formats.append("'+'c' 'au");      // +1 71234567 (Attention! A part of the usernumber could be interpreted as the areacode)
     89
     90        foreach(QString format_, formats) {
     91            if (setNumber(numberStr, format_)) {
     92                return true;
     93            }
     94        }
     95        return false;
     96    }
     97
    7598    clear();
    7699
    77     qDebug() << numberStr;
    78     qDebug() << format;
     100    qDebug() << "Checking " + format + " on " + numberStr;
    79101
    80102    const QLatin1Char quote('\'');
     
    85107    int  j = 0;
    86108    for (int i = 0; i < format.count(); i++) {
     109        if (numberStr.count() <= j) {
     110            clear();
     111            break;
     112        }
     113
    87114        if (format.at(i) == quote) {
    88115            inQuote = !inQuote;
     
    129156            j++;
    130157        } else {
     158            if (format.mid(i, 2) == "CC") {
     159                qWarning() << "CC not supported here!";
     160            } else if (format.mid(i, 3) == "AAA") {
     161                qWarning() << "AAA not supported here!";
     162            }
    131163            clear();
    132164            break;
     
    168200}
    169201
    170 QString SNumber::toString(const QString& format /* = SNumber::IsoFormat */) const {
     202QString SNumber::toString(const QString& format) const {
    171203    if (!isValid()) {
    172204        return "";
     
    219251}
    220252
    221 void SNumber::fromString(const QString& string, const QString& format /* = SNumber::IsoFormat */) {
    222     setNumber(string, format);
     253bool SNumber::readFromString(const QString& string, const QString& format) {
     254    return setNumber(string, format);
     255}
     256SNumber SNumber::fromString(const QString& string, const QString& format) {
     257    return SNumber(string, format);
    223258}
    224259
  • lib/libdatatypes/src/snumber.h

    r43 r56  
    1717    static const QString IsoFormat;
    1818    static const QString IsoFormatShort;
     19    static const QString GuessFormat;
    1920
    2021public:
     
    3435
    3536    QString toString(const QString& format = SNumber::IsoFormat) const;
    36     void    fromString(const QString& string, const QString& format = SNumber::IsoFormat);
     37    bool    readFromString(const QString& string, const QString& format = SNumber::IsoFormat);
    3738
    3839    bool        operator==(const SNumber& n) const;
    3940    inline bool operator!=(const SNumber& n) const { return !(*this == n); }
    4041
     42    static SNumber fromString(const QString& string, const QString& format = SNumber::IsoFormat);
    4143protected:
    4244    void setCountryCode(short countryCode);
  • lib/libinterfaces/src/business/igateway.h

    r43 r56  
    1212#include <QString>
    1313#include <QList>
     14#include <QSet>
    1415#include <QWidget>
    1516#include <QImage>
     
    2829    virtual QString        name() const =0;
    2930    virtual QImage         icon() const =0;
     31    virtual QSet<int>      validRecipientCountryCodes() const =0;
    3032
    3133    virtual IAccount*      createAccountInstance() const =0;
     
    3436    virtual IStorage*      defaultStorage() const =0;
    3537    virtual void           setDefaultStorage(IStorage* storage) =0;
    36 
    3738
    3839    virtual QList<QString> splitTextToLongSMS(const QString& text) const =0;
  • smssender.pro

    r55 r56  
    2121    lib/libutils/src \
    2222    include
    23 HEADERS += src/ui/models/grouptablemodel.h \
     23HEADERS += src/ui/models/accounttreemodel.h \
     24    src/ui/models/loadedaccountmodel.h \
     25    src/ui/models/grouptablemodel.h \
    2426    src/ui/models/contacttablemodel.h \
    2527    src/persistence/storage/DAAccountListManager.h \
     
    2830    src/ui/models/aliascompletionmodel.h \
    2931    src/ui/completers/bettercompleter.h \
    30     src/ui/models/accountmodel.h \
    3132    src/ui/delegates/aligndelegate.h \
    3233    src/ui/components/clearbutton.h \
     
    5758    src/ui/VCMain/vcmain.h \
    5859    src/ui/VCSettings/vcsettings.h
    59 SOURCES += src/ui/models/grouptablemodel.cpp \
     60SOURCES += src/ui/models/accounttreemodel.cpp \
     61    src/ui/models/loadedaccountmodel.cpp \
     62    src/ui/models/grouptablemodel.cpp \
    6063    src/ui/models/contacttablemodel.cpp \
    6164    src/persistence/storage/DAAccountListManager.cpp \
     
    6467    src/ui/models/aliascompletionmodel.cpp \
    6568    src/ui/completers/bettercompleter.cpp \
    66     src/ui/models/accountmodel.cpp \
    6769    src/ui/delegates/aligndelegate.cpp \
    6870    src/ui/components/clearbutton.cpp \
  • src/business/BCContactManager.cpp

    r43 r56  
    5959}
    6060
    61 IContact* BCContactManager::getContact(int contactId){
     61IContact* BCContactManager::getContact(int contactId) const {
    6262    return contactList_.value(contactId);
    6363}
    6464
    65 QSet<IContact*> BCContactManager::getContactList(){
     65QSet<IContact*> BCContactManager::getContactList() const {
    6666    return contactList_.values().toSet();
    6767}
     
    8383}
    8484
     85IContact* BCContactManager::getContactByNumber(const SNumber number) const {
     86    foreach (IContact* contact, getContactList()) {
     87        if (number == contact->number()) {
     88            return contact;
     89        }
     90    }
     91    return NULL;
     92}
     93
     94
    8595void BCContactManager::contactIdChanged(int oldId, int newId) {
    8696    IContact* contact = contactList_.take(oldId);
  • src/business/BCContactManager.h

    r43 r56  
    66 */
    77
    8 #ifndef CONTACTMANAGER_H_
    9 #define CONTACTMANAGER_H_
     8#ifndef BC_CONTACTMANAGER_H_
     9#define BC_CONTACTMANAGER_H_
    1010
    1111#include <QObject>
     
    1414
    1515#include <icontact.h>
     16#include <snumber.h>
    1617
    1718class BCContactManager: public QObject {
     
    2122    static BCContactManager* instance();
    2223
    23     virtual IContact*        getContact(int contactId);
    24     virtual QSet<IContact*>  getContactList();
    25     virtual void             saveContact(IContact* contact);
    26     virtual void             removeContact(int contactId);
     24    IContact*        getContact(int contactId) const;
     25    QSet<IContact*>  getContactList() const;
     26    void             saveContact(IContact* contact);
     27    void             removeContact(int contactId);
     28
     29    IContact*        getContactByNumber(const SNumber number) const;
    2730
    2831signals:
    29     void                     contactAdded(IContact* contact);
    30     void                     contactUpdated(IContact* contact);
    31     void                     contactRemoved(IContact* contact);
     32    void             contactAdded(IContact* contact);
     33    void             contactUpdated(IContact* contact);
     34    void             contactRemoved(IContact* contact);
    3235
    3336protected:
     
    3538    virtual ~BCContactManager(){};
    3639
    37     virtual void             readContactsFromStorage();
     40    virtual void     readContactsFromStorage();
    3841
    3942protected slots:
    40     void                     contactIdChanged(int oldId, int newId);
    41     void                     contactDataChanged();
     43    void             contactIdChanged(int oldId, int newId);
     44    void             contactDataChanged();
    4245
    4346private:
  • src/business/BCSettings.cpp

    r43 r56  
    1010#include <QDirIterator>
    1111#include <QFileInfo>
     12#include <QCoreApplication>
     13#include <QDesktopServices>
    1214
    1315#include "../persistence/PersistenceFactory.h"
     
    2426}
    2527
     28QString BCSettings::getSettingsPath(){
     29    if (QFile::exists(qApp->applicationDirPath() + "/data.db")) {
     30        return qApp->applicationDirPath() + "/";
     31    } else {
     32        return QDesktopServices::storageLocation(QDesktopServices::DataLocation) + "/gorrion/SMSSender/";
     33    }
     34}
    2635
    2736const QString BCSettings::getLocalePath(){
    28     return "locale/";
     37    return qApp->applicationDirPath() + "/locale/";
    2938}
    3039
     
    117126
    118127
    119 QString BCSettings::getSettingsPath(){
    120     return "./";
    121 }
    122 
    123 
    124128void BCSettings::setLocale(const QLocale& locale){
    125129    return getSettings()->setLocale(locale);
  • src/ui/VCAccountList/vcaccountlist.cpp

    r55 r56  
    2222        ui.setupUi(this);
    2323
    24     model_      = new AccountModel(this);
     24    model_      = new AccountTreeModel(this);
    2525    proxyModel_ = new BetterCompletionModel(this);
    2626    proxyModel_->setFilterKeyColumn(-1);
     
    3232    ui.tblViewAccounts->resizeRowsToContents();
    3333    ui.tblViewAccounts->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
    34     ui.tblViewAccounts->horizontalHeader()->setResizeMode(AccountModel::ColName, QHeaderView::Stretch);
    35     ui.tblViewAccounts->sortByColumn(AccountModel::ColName, Qt::AscendingOrder);
     34    ui.tblViewAccounts->horizontalHeader()->setResizeMode(AccountTreeModel::ColName, QHeaderView::Stretch);
     35    ui.tblViewAccounts->sortByColumn(AccountTreeModel::ColName, Qt::AscendingOrder);
    3636    ui.tblViewAccounts->resizeColumnsToContents();
    3737    ui.tblViewAccounts->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
  • src/ui/VCAccountList/vcaccountlist.h

    r55 r56  
    1111#include <iaccount.h>
    1212
    13 #include "../models/accountmodel.h"
     13#include "../models/accounttreemodel.h"
    1414
    1515class VCAccountList: public QDialog {
     
    2323    Ui::VCAccountListClass ui;
    2424
    25     AccountModel*          model_;
     25    AccountTreeModel*      model_;
    2626    QSortFilterProxyModel* proxyModel_;
    2727
  • src/ui/VCAddressBook/vcaddressbook.ui

    r55 r56  
    199199          <size>
    200200           <width>50</width>
    201            <height>64</height>
     201           <height>0</height>
    202202          </size>
    203203         </property>
  • src/ui/VCEditContact/vceditcontact.cpp

    r43 r56  
    66#include <QtGui/QFileDialog>
    77#include <QtGui/QMessageBox>
    8 
     8#include <QDebug>
    99#include <QStringList>
     10#include <QSortFilterProxyModel>
    1011
    1112#include "../UIHelper.h"
     
    2526
    2627        ui.edtName->setText(contact->name());
    27         ui.edtNumber->setText(contact->number().toString(SNumber::IsoFormatShort));
     28        if (!contact->number().isValid()) {
     29            ui.edtCountryCode->setText("+41");
     30            ui.edtNumber->setText("");
     31        } else {
     32        ui.edtCountryCode->setText(contact->number().toString("'+'CC"));
     33        ui.edtNumber->setText(contact->number().toString("AAA' 'u"));
     34        }
    2835
    2936        // Load aliases
    30     QStringList aliases = contact->aliases();
    31     for (int x = 0; x < aliases.size(); ++x){
    32         QString alias = aliases.at(x);
    33         ui.lstAliases->addItem(alias);
    34     }
    35     ui.lstAliases->sortItems();
     37        foreach (QString alias, contact->aliases()) {
     38            addAliasItem(alias);
     39        }
     40        QSortFilterProxyModel* model = new QSortFilterProxyModel(this);
     41        model->setSourceModel(ui.lstAliases->model());
     42        model->setDynamicSortFilter(true);
     43        model->setSortCaseSensitivity(Qt::CaseInsensitive);
     44        model->sort(0, Qt::AscendingOrder);
     45//    ui.lstAliases->sortItems();
    3646
    3747    setIcon(contact->image());
     
    4050    // First "signal" to initialize some slots
    4151    on_lstAliases_itemSelectionChanged();
     52}
     53VCEditContact::~VCEditContact() {
     54
    4255}
    4356
     
    118131// Aliases
    119132
    120 QString VCEditContact::editAlias(const QString& alias){
     133QListWidgetItem* VCEditContact::addAliasItem(const QString& alias) {
     134    QListWidgetItem* item = new QListWidgetItem(alias);
     135    item->setFlags(item->flags() | Qt::ItemIsEditable);
     136    ui.lstAliases->addItem(item);
     137}
     138/*
     139void VCEditContact::editAlias(const QString& alias){
    121140    bool ok;
    122     QString text = QInputDialog::getText(this, tr("SMSSender"),
     141    QString newAlias = QInputDialog::getText(this, tr("SMSSender"),
    123142                                         tr("Enter an alias for that contact:"),
    124143                                         QLineEdit::Normal,
    125144                                         alias, &ok);
    126145    if (ok){
    127         text = text.trimmed();
     146        if ((alias != "") && (newAlias.trimmed() == "")){
     147            if (QMessageBox::Yes ==  QMessageBox::information(this, tr("SMSSender"),
     148                                                              tr("You entered a empty value. Do you want to delete this alias?"),
     149                                                              QMessageBox::Yes,
     150                                                              QMessageBox::No | QMessageBox::Default | QMessageBox::Escape)) {
     151                foreach (QListWidgetItem* item, ui.lstAliases->findItems(alias, Qt::MatchFixedString)) {
     152                    ui.lstAliases->takeItem(ui.lstAliases->indexFromItem(item)->row());
     153                }
     154            }
     155        }
     156
     157        if (ui.lstAliases->findItems(alias, Qt::MatchFixedString).count() > 0){ // Is it already in the list?
     158            QMessageBox::information(this, tr("SMSSender"),
     159                                     tr("This contact is already known under this alias."),
     160                                     QMessageBox::Ok | QMessageBox::Default | QMessageBox::Escape);
     161        }
     162
     163        newAliases = newAlias.split(",");
     164        foreach (QString newAlias, newAliases) {
     165            newAlias = newAlias.trimmed();
     166
     167            if (ui.lstAliases->findItems(alias, Qt::MatchFixedString).count() == 0){ // Is it already in the list?
     168                ui.lstAliases->insertItem(ui.lstAliases->count(), alias);
     169            }
     170        }
     171
     172
     173
    128174        return text;
    129175    }else{
    130176        return alias;
    131177    }
    132 }
     178}*/
    133179
    134180void VCEditContact::on_lstAliases_itemSelectionChanged(){
    135181    ui.btnRemoveAlias->setEnabled(ui.lstAliases->selectedItems().count() > 0);
     182    ui.btnEditAlias->setEnabled(ui.lstAliases->selectedItems().count() > 0);
    136183}
    137184
    138185void VCEditContact::on_btnAddAlias_clicked(){
    139     QString alias = editAlias(QString());
    140 
    141     if (alias != ""){ // If empty, then do not add it
    142         if (ui.lstAliases->findItems(alias, Qt::MatchFixedString).count() == 0){ // Is it already in the list?
    143             ui.lstAliases->insertItem(ui.lstAliases->count(), alias);
    144         }else{
    145             QMessageBox::information(this, tr("SMSSender"),
    146                                      tr("This contact is already known under this alias."),
    147                                      QMessageBox::Ok | QMessageBox::Default | QMessageBox::Escape);
    148         }
    149     }
    150 }
    151 
    152 void VCEditContact::on_lstAliases_itemDoubleClicked(QListWidgetItem* item){
     186    QList<QListWidgetItem*> emptyItems = ui.lstAliases->findItems("", Qt::MatchFixedString);
     187    if (emptyItems.isEmpty()) {
     188        emptyItems.append(addAliasItem(""));
     189    }
     190    ui.lstAliases->setFocus();
     191    emptyItems.first()->setSelected(true);
     192    on_btnEditAlias_clicked();
     193}
     194void VCEditContact::on_btnEditAlias_clicked() {
     195    QList<QListWidgetItem*> selectedItems = ui.lstAliases->selectedItems();
     196    if (!selectedItems.isEmpty()) {
     197        ui.lstAliases->setFocus();
     198        ui.lstAliases->editItem(selectedItems.first());
     199    }
     200}
     201
     202
     203void VCEditContact::on_lstAliases_itemChanged(QListWidgetItem* item) {
     204    QString alias = item->text().trimmed();
     205
     206    QList<QListWidgetItem*> items = ui.lstAliases->findItems(alias, Qt::MatchFixedString);
     207    items.removeAll(item);
     208    if (items.count() > 0){ // Is it already in the list?
     209        QMessageBox::information(this, tr("SMSSender"),
     210                                 tr("This contact is already known under this alias."),
     211                                 QMessageBox::Ok | QMessageBox::Default | QMessageBox::Escape);
     212        ui.lstAliases->editItem(item);
     213        return;
     214    }
     215
     216    ui.lstAliases->takeItem(ui.lstAliases->row(item));
     217    foreach (QString newAlias, alias.split(",", QString::SkipEmptyParts)) {
     218        newAlias = newAlias.trimmed();
     219
     220        if (ui.lstAliases->findItems(newAlias, Qt::MatchFixedString).count() == 0){ // Is it already in the list?
     221            addAliasItem(newAlias);
     222        }
     223    }
     224//    ui.lstAliases->sortItems();
     225}
     226
     227/*void VCEditContact::on_lstAliases_itemDoubleClicked(QListWidgetItem* item){
    153228    QString alias = editAlias(item->text());
    154229
    155     if (alias == ""){
    156         if (QMessageBox::Yes ==  QMessageBox::information(this, tr("SMSSender"),
    157                                                           tr("You entered a empty value. Do you want to delete this alias?"),
    158                                                           QMessageBox::Yes,
    159                                                           QMessageBox::No | QMessageBox::Default | QMessageBox::Escape)) {
    160             ui.lstAliases->takeItem(ui.lstAliases->row(item));
    161         }
    162     }else{
    163         item->setText(alias);
    164     }
    165 }
     230}*/
    166231
    167232void VCEditContact::on_btnRemoveAlias_clicked(){
     
    170235    }
    171236
    172     if (QMessageBox::Yes == QMessageBox::warning(this, tr("SMSSender"),
    173                                                  tr("Do you really want to remove this alias?"),
    174                                                  QMessageBox::Yes,
    175                                                  QMessageBox::No | QMessageBox::Default | QMessageBox::Escape)){
     237    if ((ui.lstAliases->selectedItems().first()->text().trimmed() == "") ||
     238        (QMessageBox::Yes == QMessageBox::warning(this, tr("SMSSender"),
     239                                                  tr("Do you really want to remove this alias?"),
     240                                                  QMessageBox::Yes,
     241                                                  QMessageBox::No | QMessageBox::Default | QMessageBox::Escape))){
    176242        // Remove it from the list
    177243        ui.lstAliases->takeItem(ui.lstAliases->row(ui.lstAliases->selectedItems().first()));
     
    199265
    200266        contact_->setName(ui.edtName->text());
    201         // TODO: test some different formats
    202         contact_->setNumber(SNumber(ui.edtNumber->text()));
    203 
     267        contact_->setNumber(SNumber(ui.edtCountryCode->text() + " " + ui.edtNumber->text(), SNumber::GuessFormat));
    204268        QStringList aliases;
    205269        for (int x = 0; x < ui.lstAliases->count(); x++){
    206             aliases.append(ui.lstAliases->item(x)->text());
     270            QString alias = ui.lstAliases->item(x)->text().trimmed();
     271            if (alias != "") {
     272                aliases.append(alias);
     273            }
    207274        }
    208275        contact_->setAliases(aliases);
    209276
    210         contactImage_ = contactImage_.scaledToHeight(72, Qt::SmoothTransformation);
    211277        contact_->setImage(contactImage_);
    212278
  • src/ui/VCEditContact/vceditcontact.h

    r43 r56  
    1313public:
    1414    VCEditContact(IContact* contact, QWidget *parent = 0);
    15     ~VCEditContact(){};
     15    ~VCEditContact();
    1616
    1717private:
     
    2121    QImage  contactImage_;
    2222
    23     QString editAlias(const QString& alias);
     23    //QString editAlias(const QString& alias);
     24    QListWidgetItem* addAliasItem(const QString& alias);
    2425
    2526    void    addBtnIconMenu();
     
    3637
    3738    void on_btnAddAlias_clicked();
     39    void on_btnEditAlias_clicked();
    3840    void on_btnRemoveAlias_clicked();
    39     void on_lstAliases_itemDoubleClicked(QListWidgetItem* item);
     41//    void on_lstAliases_itemDoubleClicked(QListWidgetItem* item);
     42    void on_lstAliases_itemChanged(QListWidgetItem* item);
    4043    void on_lstAliases_itemSelectionChanged();
    4144
  • src/ui/VCEditContact/vceditcontact.ui

    r22 r56  
    3030      <string>Contact information</string>
    3131     </property>
    32      <layout class="QFormLayout" name="formLayout">
     32     <layout class="QGridLayout" name="gridLayout_3">
    3333      <item row="0" column="0">
    3434       <widget class="QLabel" name="label">
     
    3838       </widget>
    3939      </item>
    40       <item row="0" column="1">
     40      <item row="0" column="1" colspan="2">
    4141       <widget class="QLineEdit" name="edtName"/>
    4242      </item>
     
    4949      </item>
    5050      <item row="1" column="1">
     51       <widget class="QLineEdit" name="edtCountryCode">
     52        <property name="sizePolicy">
     53         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
     54          <horstretch>0</horstretch>
     55          <verstretch>0</verstretch>
     56         </sizepolicy>
     57        </property>
     58        <property name="maximumSize">
     59         <size>
     60          <width>41</width>
     61          <height>16777215</height>
     62         </size>
     63        </property>
     64       </widget>
     65      </item>
     66      <item row="1" column="2">
    5167       <widget class="QLineEdit" name="edtNumber"/>
    5268      </item>
     
    141157      </item>
    142158      <item row="0" column="2">
     159       <widget class="QPushButton" name="btnEditAlias">
     160        <property name="minimumSize">
     161         <size>
     162          <width>34</width>
     163          <height>34</height>
     164         </size>
     165        </property>
     166        <property name="maximumSize">
     167         <size>
     168          <width>34</width>
     169          <height>34</height>
     170         </size>
     171        </property>
     172        <property name="toolTip">
     173         <string>Edit account</string>
     174        </property>
     175        <property name="text">
     176         <string/>
     177        </property>
     178        <property name="icon">
     179         <iconset resource="../../../lib/resource.qrc">
     180          <normaloff>:/ico/edit.png</normaloff>:/ico/edit.png</iconset>
     181        </property>
     182       </widget>
     183      </item>
     184      <item row="0" column="3">
    143185       <spacer name="horizontalSpacer">
    144186        <property name="orientation">
     
    153195       </spacer>
    154196      </item>
    155       <item row="1" column="0" colspan="3">
     197      <item row="1" column="0" colspan="4">
    156198       <widget class="QListWidget" name="lstAliases">
     199        <property name="editTriggers">
     200         <set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set>
     201        </property>
     202        <property name="alternatingRowColors">
     203         <bool>true</bool>
     204        </property>
    157205        <property name="sortingEnabled">
    158206         <bool>true</bool>
  • src/ui/VCMain/vcmain.cpp

    r43 r56  
    99#include <algorithm>
    1010
     11#include <snumber.h>
     12#include <typeconvert.h>
     13
     14#include <icontact.h>
     15
     16#include "../../business/BusinessFactory.h"
    1117#include "../../business/BCAccountManager.h"
    1218#include "../../business/BCContactManager.h"
    1319#include "../../business/BCGroupManager.h"
    1420
    15 #include <typeconvert.h>
    16 
    1721#include "../UIHelper.h"
    1822
    1923#include "../VCAccountList/vcaccountlist.h"
    2024#include "../VCAddressBook/vcaddressbook.h"
     25#include "../VCEditContact/vceditcontact.h"
    2126#include "../VCSettings/vcsettings.h"
    2227
     
    3035        ui.setupUi(this);
    3136
    32         //contactListModel = new QStringListModel;
    33         //contactListModel = new AliasModel;
    34 
     37        /* Accounts */
     38        accountModel_       = new AccountTreeModel(this);
     39        accountFilterModel_ = new QSortFilterProxyModel(this);
     40        accountFilterModel_->setSourceModel(accountModel_);
     41        accountFilterModel_->setSortCaseSensitivity(Qt::CaseInsensitive);
     42        accountFilterModel_->setDynamicSortFilter(true);
     43        accountFilterModel_->setFilterKeyColumn(AccountTreeModel::ColEnabled);
     44        accountFilterModel_->setFilterRole(Qt::CheckStateRole);
     45        accountFilterModel_->setFilterFixedString("1"); // Get only enabled ones
     46        accountFilterModel_->sort(AccountTreeModel::ColName, Qt::AscendingOrder);
     47        ui.lstAccounts->setModel(accountFilterModel_);
     48
     49        /* Contact / Groups */
    3550        contactGroupListModel_ = new ContactGroupListModel(this);
    36         QSortFilterProxyModel* sortModel = new QSortFilterProxyModel(this);
    37     sortModel->setSourceModel(contactGroupListModel_);
    38     ui.lstContacts->setModel(sortModel);
     51        contactGroupSortModel_ = new QSortFilterProxyModel(this);
     52        contactGroupSortModel_->setSourceModel(contactGroupListModel_);
     53        contactGroupSortModel_->setDynamicSortFilter(true);
     54        contactGroupSortModel_->setSortCaseSensitivity(Qt::CaseInsensitive);
     55        contactGroupSortModel_->sort(0, Qt::AscendingOrder);
     56    ui.lstContacts->setModel(contactGroupSortModel_);
    3957
    4058        QSortFilterProxyModel* completionModel = new AliasCompletionModel(this);
     
    4664    ui.lstContacts->setCompleter(aliasCompleter);
    4765    ui.lstContacts->completer()->popup()->setIconSize(QSize(24, 24));
    48     //ui.lstContacts->setEditable(true);
    49 
    50     /*connect(ui.lstContacts->lineEdit(), SIGNAL(textChanged()),
    51             aliasCompleter, SLOT());*/
     66
    5267    connect(ui.lstContacts->lineEdit(), SIGNAL(returnPressed()),
    5368            this, SLOT(on_btnAddRecipient_clicked()));
     
    5570    connect(aliasCompleter, SIGNAL(highlighted(const QString&)),
    5671            this, SLOT(on_lstContacts_completer_changed(const QString&)));
     72
    5773
    5874    connect(BCAccountLoadManager::instance(), SIGNAL(accountLoadStateChanged(IAccount*, AccountLoadState)),
     
    6480
    6581
    66         init();
    67 
    68         ui.lstContacts->setCurrentIndex(-1);
    69 }
    70 
    71 void VCMain::init(){
    72     //refillAccountList();
    73     refillContactList();
    74 
    7582    // First "signal" to initialize some slots
    7683    on_treeRecipients_itemSelectionChanged();
    77 }
    78 
     84
     85        ui.lstContacts->setCurrentIndex(-1);
     86}
    7987
    8088/* Contacts & Recipients... */
    81 
    82 void VCMain::refillContactList(){
    83     // TODO: Make usage of aliases...
    84 /*
    85     contactListModel->removeRows(0, contactListModel->rowCount());
    86     //ui.lstContacts->clear();
    87     contactStrToContact.clear();
    88     groupStrToGroup.clear();
    89 
    90     QPixmap blankIcon = QPixmap(":/ico/blank.png");
    91 
    92     foreach (IContact* contact, BCContactManager::instance()->getContactList()) {
    93         QPixmap icon = QPixmap::fromImage(contact->image());
    94         if (icon.isNull()){
    95             icon = blankIcon;
    96         }
    97         QString contactStr = contact->name();
    98         QString aliasStr;
    99         QStringListIterator i(contact->aliases());
    100         while (i.hasNext()) {
    101             aliasStr += i.next() + ", ";
    102         }
    103         aliasStr.remove(QRegExp(", $"));
    104         if (aliasStr != "") {
    105             contactStr += " (" + aliasStr + ")";
    106         }
    107 
    108         contactListModel->insertRow(contactListModel->rowCount());
    109         contactListModel->setData(contactListModel->index(contactListModel->rowCount() - 1, 0), QIcon(icon), Qt::DecorationRole);
    110         contactListModel->setData(contactListModel->index(contactListModel->rowCount() - 1, 0), contactStr, Qt::DisplayRole);
    111 
    112         //ui.lstContacts->addItem(QIcon(icon), contactStr);
    113         contactStrToContact.insert(contactStr, contact);
    114     }
    115 
    116     foreach (IGroup* group, BCGroupManager::instance()->getGroupList()) {
    117         QPixmap icon = QPixmap::fromImage(group->image());
    118         if (icon.isNull()){
    119             icon = blankIcon;
    120         }
    121 
    122         QString groupStr = "<" + group->name() + ">";
    123 
    124         contactListModel->insertRow(contactListModel->rowCount());
    125         contactListModel->setData(contactListModel->index(contactListModel->rowCount() - 1, 0), QIcon(icon), Qt::DecorationRole);
    126         contactListModel->setData(contactListModel->index(contactListModel->rowCount() - 1, 0), groupStr, Qt::DisplayRole);
    127 //        ui.lstContacts->addItem(QIcon(icon), "<" + group->name() + ">");
    128         groupStrToGroup.insert(groupStr, group);
    129     }
    130     ui.lstContacts->model()->sort(0);
    131 
    132     //ui.lstContacts->insertItem(0, blankIcon, ""); // Empty item at first position to prevent default recipient selection
    133     ui.lstContacts->setCurrentIndex(-1); */
    134 }
    135 
    136 
    13789bool VCMain::isContactNode(const QTreeWidgetItem* node){
    13890    return nodeToContact.contains(const_cast<QTreeWidgetItem*>(node));
     
    218170    }
    219171
     172    // TODO: Check if the given recipient/number is a valid recipient for the selected gateway
     173
    220174    contactGroupListModel_->addFilteredContact(contact);
    221175
     
    281235
    282236void VCMain::reloadAccountList() {
    283     accountStrToAccount.clear();
     237/*    accountStrToAccount.clear();
    284238    QComboBox* accLst = ui.lstAccounts;
    285239
     
    294248    int index = accLst->findText(selectedAccount);
    295249    index = std::max(index, 0);
    296     accLst->setCurrentIndex(index);
     250    accLst->setCurrentIndex(index);*/
    297251}
    298252
     
    311265
    312266void VCMain::sendMessage() {
    313     IAccount* account          = accountStrToAccount[ui.lstAccounts->currentText()];
     267    QModelIndex idx            = accountFilterModel_->mapToSource(accountFilterModel_->index(ui.lstAccounts->currentIndex(), 0));
     268    IAccount* account          = accountModel_->dataObject(idx);
    314269    QString message            = ui.txtMessage->toPlainText().trimmed();
    315270    QSet<IContact*> recipients = getRecipientContacts(true);
    316271
    317     account->sendSMS(message, recipients);
    318     QMessageBox::information(this, tr("SMS sent"), tr("Your sms has successfully been sent."), QMessageBox::Ok, QMessageBox::Ok);
     272    if (account != NULL) {
     273        account->sendSMS(message, recipients);
     274        QMessageBox::information(this, tr("SMS sent"), tr("Your sms has successfully been sent."), QMessageBox::Ok, QMessageBox::Ok);
     275    }
    319276}
    320277
     
    337294
    338295void VCMain:: on_btnAddRecipient_clicked(){
    339     QModelIndex idx = contactGroupListModel_->index(ui.lstContacts->currentIndex());
     296    QModelIndex idx = contactGroupSortModel_->mapToSource(contactGroupSortModel_->index(ui.lstContacts->currentIndex(), 0));
    340297    if (idx.isValid()) {
    341298        IInterface* recipient = contactGroupListModel_->dataObject(idx);
     
    343300        addRecipient(dynamic_cast<IGroup*>(recipient));
    344301    } else {
    345         // TODO: Add new numbers to the address book
     302        SNumber number = SNumber::fromString(ui.lstContacts->lineEdit()->text().trimmed(), SNumber::GuessFormat);
     303        if (!number.isValid()) {
     304            number = SNumber::fromString("+41 " + ui.lstContacts->lineEdit()->text().trimmed(), SNumber::GuessFormat);
     305        }
     306        if (number.isValid()) {
     307            IContact* recipient = BCContactManager::instance()->getContactByNumber(number);
     308
     309            if (recipient != NULL) {
     310                addRecipient(recipient);
     311            } else {
     312                IContact* recipient = BusinessFactory::instance()->getContactInstance();
     313                recipient->setNumber(number);
     314
     315                if (QMessageBox::Yes == QMessageBox::question(this, tr("SMSSender"),
     316                                                              tr("This number is not yet in your address book. Do you want to add it?"),
     317                                                              QMessageBox::Yes,
     318                                                              QMessageBox::No | QMessageBox::Default | QMessageBox::Escape)){
     319                    VCEditContact* ec = new VCEditContact(recipient, this);
     320                    if (ec->exec() == QDialog::Accepted){ // Wait for return
     321                        BCContactManager::instance()->saveContact(recipient);
     322                    }
     323                }
     324                if (recipient->name() == "") {
     325                    recipient->setName(number.toString(SNumber::IsoFormatShort));
     326                }
     327                addRecipient(recipient);
     328            }
     329        }
    346330    }
    347331    ui.lstContacts->setCurrentIndex(-1);
  • src/ui/VCMain/vcmain.h

    r43 r56  
    22#define VCMAIN_H
    33
     4#include "ui_vcmain.h"
     5
    46#include <QStringListModel>
    57#include <QMap>
    6 #include <QtGui/QMainWindow>
    7 #include <QtGui/QTreeWidgetItem>
     8#include <QMainWindow>
     9#include <QTreeWidgetItem>
     10#include <QSortFilterProxyModel>
    811
    912#include <icontact.h>
     
    1215#include "../../business/BCAccountLoadManager.h"
    1316
    14 #include "ui_vcmain.h"
    15 
     17#include "../models/accounttreemodel.h"
    1618#include "../models/contactgroupmodel.h"
    1719
     
    2628    Ui::VCMainClass ui;
    2729
     30    AccountTreeModel*                 accountModel_;
     31    QSortFilterProxyModel*            accountFilterModel_;
     32
    2833    ContactGroupListModel*            contactGroupListModel_;
    29     //    QStringListModel*                 contactListModel;
     34    QSortFilterProxyModel*            contactGroupSortModel_;
    3035
    3136    QMap<QString, IAccount*>          accountStrToAccount;
    32     /*QMap<QString, IContact*>          contactStrToContact;
    33     QMap<QString, IGroup*>            groupStrToGroup;*/
    3437
    3538    QMap<QTreeWidgetItem*, IContact*> nodeToContact;
    3639    QMap<QTreeWidgetItem*, IGroup*>   nodeToGroup;
    3740
    38     void init();
    39     void refillContactList();
    40 
    4141    /* Recipient list */
    42     bool isContactNode(const QTreeWidgetItem* node);
    43     bool isGroupNode(const QTreeWidgetItem* node);
    44     IContact* getContactOfNode(const QTreeWidgetItem* node);
    45     IGroup*   getGroupOfNode(const QTreeWidgetItem* node);
    46     bool isNodeContactOrHasContact(const QTreeWidgetItem* node, IContact* contact);
    47     bool isContactAlreadyRecipient(IContact* contact);
    48     bool isGroupAlreadyRecipient(IGroup* group);
     42    bool            isContactNode(const QTreeWidgetItem* node);
     43    bool            isGroupNode(const QTreeWidgetItem* node);
     44    IContact*       getContactOfNode(const QTreeWidgetItem* node);
     45    IGroup*         getGroupOfNode(const QTreeWidgetItem* node);
     46    bool            isNodeContactOrHasContact(const QTreeWidgetItem* node, IContact* contact);
     47    bool            isContactAlreadyRecipient(IContact* contact);
     48    bool            isGroupAlreadyRecipient(IGroup* group);
    4949
    5050    void            addRecipient(IContact* contact, QTreeWidgetItem* parent = NULL);
     
    5656    QSet<IGroup*>   getRecipientGroups();
    5757
     58    /* Account */
    5859    void reloadAccountList();
     60
    5961    void enableSendBtnIfAllFilled();
    6062
  • src/ui/models/accounttreemodel.cpp

    r55 r56  
    1 #include "accountmodel.h"
     1#include "accounttreemodel.h"
    22
    33#include <QDebug>
    44
    5 AccountModel::AccountModel(QObject* parent)
     5AccountTreeModel::AccountTreeModel(QObject* parent)
    66    : QAbstractTableModel(parent)
    77{
    88    connect(BCAccountManager::instance(), SIGNAL(accountAdded(IAccount*)),
    99            this, SLOT(accountUpdated(IAccount*)));
    10     connect(BCAccountManager::instance(), SIGNAL(accountDataChanged(IAccount*)),
     10    connect(BCAccountManager::instance(), SIGNAL(accountUpdated(IAccount*)),
    1111            this, SLOT(accountUpdated(IAccount*)));
    1212    connect(BCAccountManager::instance(), SIGNAL(accountRemoved(IAccount*)),
    1313            this, SLOT(accountUpdated(IAccount*)));
    1414}
    15 AccountModel::~AccountModel() {
     15AccountTreeModel::~AccountTreeModel() {
    1616    disconnect(BCAccountManager::instance(), SIGNAL(accountAdded(IAccount*)),
    1717               this, SLOT(accountUpdated(IAccount*)));
    18     disconnect(BCAccountManager::instance(), SIGNAL(accountDataChanged(IAccount*)),
     18    disconnect(BCAccountManager::instance(), SIGNAL(accountUpdated(IAccount*)),
    1919               this, SLOT(accountUpdated(IAccount*)));
    2020    disconnect(BCAccountManager::instance(), SIGNAL(accountRemoved(IAccount*)),
     
    2222}
    2323
    24 void AccountModel::accountUpdated(IAccount* account) {
     24void AccountTreeModel::accountUpdated(IAccount* account) {
    2525    int row = BCAccountManager::instance()->getAccountList().values().indexOf(account);
    2626
     
    3535}
    3636
    37 QVariant AccountModel::headerData(int section, Qt::Orientation orientation, int role) const {
     37QVariant AccountTreeModel::headerData(int section, Qt::Orientation orientation, int role) const {
    3838    if (orientation == Qt::Horizontal) {
    3939        if (role == Qt::DisplayRole) {
     
    5151}
    5252
    53 IAccount* AccountModel::dataObject(const QModelIndex& index) const {
     53IAccount* AccountTreeModel::dataObject(const QModelIndex& index) const {
    5454    return BCAccountManager::instance()->getAccountList().values().at(index.row());
    5555}
    5656
    57 QVariant AccountModel::data(const QModelIndex& index, int role) const {
     57QVariant AccountTreeModel::data(const QModelIndex& index, int role) const {
    5858    QList<IAccount*> accounts = BCAccountManager::instance()->getAccountList().values();
    5959    if (!index.isValid() || index.row() < 0 || index.row() >= accounts.size())
     
    9696}
    9797
    98 Qt::ItemFlags AccountModel::flags(const QModelIndex& index) const {
     98Qt::ItemFlags AccountTreeModel::flags(const QModelIndex& index) const {
    9999    if (!index.isValid())
    100100        return Qt::ItemIsEnabled;
     
    106106}
    107107
    108 bool AccountModel::setData(const QModelIndex& index, const QVariant& value, int role /* = Qt::EditRole */) {
     108bool AccountTreeModel::setData(const QModelIndex& index, const QVariant& value, int role /* = Qt::EditRole */) {
    109109    if (!index.isValid()) {
    110110        return false;
     
    127127}
    128128
    129 int AccountModel::columnCount(const QModelIndex& parent) const {
     129int AccountTreeModel::columnCount(const QModelIndex& parent) const {
    130130    return (parent.isValid()) ? 0 : MaxCol+1;
    131131}
    132132
    133 int AccountModel::rowCount(const QModelIndex& parent) const {
     133int AccountTreeModel::rowCount(const QModelIndex& parent) const {
    134134    return (parent.isValid()) ? 0 : BCAccountManager::instance()->getAccountList().count();
    135135}
    136136
    137 bool AccountModel::removeRows(int row, int count, const QModelIndex& parent) {
     137bool AccountTreeModel::removeRows(int row, int count, const QModelIndex& parent) {
    138138    if (parent.isValid())
    139139        return false;
  • src/ui/models/accounttreemodel.h

    r55 r56  
    1 #ifndef UI_ACCOUNTMODEL_H
    2 #define UI_ACCOUNTMODEL_H
     1#ifndef UI_ACCOUNTTREEMODEL_H
     2#define UI_ACCOUNTTREEMODEL_H
    33
    44#include <QObject>
     
    88#include "../../business/BCAccountManager.h"
    99
    10 class AccountModel: public QAbstractTableModel {
     10class AccountTreeModel: public QAbstractTableModel {
    1111    Q_OBJECT
    1212
     
    1515
    1616public:
    17     AccountModel(QObject* parent = 0);
    18     ~AccountModel();
     17    AccountTreeModel(QObject* parent = 0);
     18    ~AccountTreeModel();
    1919
    2020    enum Columns {
     
    3838
    3939
    40 #endif // UI_ACCOUNTMODEL_H
     40#endif // UI_ACCOUNTTREEMODEL_H
    4141
Note: See TracChangeset for help on using the changeset viewer.