SVN commit 1005659 by gkiagia: - Add an AccountManager class in libkcallprivate that will handle internally everything related to accounts and connections. - Remove the ContactsModel and use the new AccountManager to provide models for accounts and contacts. - Do some extra refactoring/cleanup in most libkcallprivate classes. M +1 -1 contactlistcontroller.cpp M +5 -31 kcallapplication.cpp M +2 -6 kcallapplication.h M +1 -1 libkcallprivate/CMakeLists.txt M +31 -6 libkcallprivate/accountitem.cpp M +6 -4 libkcallprivate/accountitem.h A libkcallprivate/accountmanager.cpp [License: LGPL (v2.1+)] A libkcallprivate/accountmanager.h libkcallprivate/contactsmodel.h#1004729 [License: LGPL (v2.1+)] A libkcallprivate/constants.h libkcallprivate/contactitem.h#1004729 [License: LGPL (v2.1+)] M +30 -3 libkcallprivate/contactitem.cpp M +9 -3 libkcallprivate/contactitem.h D libkcallprivate/contactsmodel.cpp D libkcallprivate/contactsmodel.h M +3 -3 libkcallprivate/groupmembersmodel.cpp M +1 -0 libkcallprivate/groupmembersmodel.h M +12 -3 libkcallprivate/treemodel.cpp M +2 -19 libkcallprivate/treemodel.h M +7 -7 mainwindow.cpp --- trunk/playground/network/kcall/contactlistcontroller.cpp #1005658:1005659 @@ -15,7 +15,7 @@ along with this program. If not, see . */ #include "contactlistcontroller.h" -#include "libkcallprivate/contactsmodel.h" +#include "libkcallprivate/constants.h" #include #include #include --- trunk/playground/network/kcall/kcallapplication.cpp #1005658:1005659 @@ -18,17 +18,14 @@ #include "mainwindow.h" #include "systrayicon.h" #include "knotifyapprover.h" -#include "libkcallprivate/contactsmodel.h" +#include "libkcallprivate/accountmanager.h" #include -#include -#include #include struct KCallApplication::Private { QPointer mainWindow; - ContactsModel *contactsModel; - Tp::AccountManagerPtr accountManager; + AccountManager *accountManager; Tp::ClientRegistrarPtr registrar; Tp::SharedPtr systrayIcon; Tp::SharedPtr knotifyApprover; @@ -38,11 +35,7 @@ : KUniqueApplication(), d(new Private) { d->mainWindow = NULL; - d->contactsModel = new ContactsModel(this); - d->accountManager = Tp::AccountManager::create(); - connect(d->accountManager->becomeReady(), - SIGNAL(finished(Tp::PendingOperation *)), - SLOT(onAccountManagerReady(Tp::PendingOperation *))); + d->accountManager = new AccountManager(this); d->registrar = Tp::ClientRegistrar::create(); d->systrayIcon = Tp::SharedPtr(new SystrayIcon()); @@ -65,9 +58,9 @@ return 0; } -ContactsModel *KCallApplication::contactsModel() const +AccountManager *KCallApplication::accountManager() const { - return d->contactsModel; + return d->accountManager; } void KCallApplication::showHideMainWindow() @@ -80,23 +73,4 @@ } } -void KCallApplication::onAccountManagerReady(Tp::PendingOperation *op) -{ - if ( op->isError() ) { - kError() << "Account manager failed to become ready:" << op->errorMessage(); - return; //TODO handle this error - } - - foreach(const QString & a, d->accountManager->validAccountPaths()) { - d->contactsModel->addAccount(d->accountManager->busName(), a); - } - - connect(d->accountManager.data(), SIGNAL(accountCreated(QString)), SLOT(onAccountCreated(QString))); -} - -void KCallApplication::onAccountCreated(const QString & path) -{ - d->contactsModel->addAccount(d->accountManager->busName(), path); -} - #include "kcallapplication.moc" --- trunk/playground/network/kcall/kcallapplication.h #1005658:1005659 @@ -19,7 +19,7 @@ #include namespace Tp { class PendingOperation; } -class ContactsModel; +class AccountManager; class KCallApplication : public KUniqueApplication { @@ -29,7 +29,7 @@ virtual ~KCallApplication(); virtual int newInstance(); - ContactsModel *contactsModel() const; + AccountManager *accountManager() const; static inline KCallApplication *instance() { return static_cast(QCoreApplication::instance()); } @@ -37,10 +37,6 @@ public slots: void showHideMainWindow(); -private slots: - void onAccountManagerReady(Tp::PendingOperation *op); - void onAccountCreated(const QString & path); - private: struct Private; Private *const d; --- trunk/playground/network/kcall/libkcallprivate/CMakeLists.txt #1005658:1005659 @@ -3,7 +3,7 @@ set(libkcallprivate_SRCS treemodel.cpp - contactsmodel.cpp + accountmanager.cpp pendingcontacts.cpp accountitem.cpp contactitem.cpp --- trunk/playground/network/kcall/libkcallprivate/accountitem.cpp #1005658:1005659 @@ -17,15 +17,16 @@ #include "accountitem.h" #include "pendingcontacts.h" #include "contactitem.h" +#include "constants.h" #include +#include #include #include -AccountItem::AccountItem(const QString & busName, const QString & path, - TreeModelItem *parent, TreeModel *model) - : ContactsModelItem(parent, model) +AccountItem::AccountItem(const Tp::AccountPtr & account, TreeModelItem *parent) + : QObject(), TreeModelItem(parent) { - m_account = Tp::Account::create(busName, path); + m_account = account; connect(m_account->becomeReady(), SIGNAL(finished(Tp::PendingOperation*)), SLOT(onAccountReady(Tp::PendingOperation*))); } @@ -49,7 +50,10 @@ m_account->protocol(), m_account->displayName()); } case Qt::DecorationRole: - return iconForPresence((Tp::ConnectionPresenceType)data(KCall::PresenceRole).value().type); + { + uint presenceType = data(KCall::PresenceRole).value().type; + return KIcon(iconForPresence(presenceType)); + } case KCall::PresenceRole: { Tp::SimplePresence presence = m_account->currentPresence(); @@ -146,9 +150,30 @@ QVector contactItems; foreach(const Tp::ContactPtr & contact, pc->contacts()) { - contactItems.append(new ContactItem(contact, this, model())); + contactItems.append(new ContactItem(contact, this)); } appendChildren(contactItems); } +QString AccountItem::iconForPresence(uint presenceType) const +{ + switch (presenceType) { + case Tp::ConnectionPresenceTypeOffline: + return QLatin1String("user-offline"); + case Tp::ConnectionPresenceTypeAvailable: + return QLatin1String("user-online"); + case Tp::ConnectionPresenceTypeAway: + return QLatin1String("user-away"); + case Tp::ConnectionPresenceTypeExtendedAway: + return QLatin1String("user-away-extended"); + case Tp::ConnectionPresenceTypeHidden: + return QLatin1String("user-invisible"); + case Tp::ConnectionPresenceTypeBusy: + return QLatin1String("user-busy"); + default: + kWarning() << "presence type is unset/unknown/invalid. value:" << presenceType; + return QString(); + } +} + #include "accountitem.moc" --- trunk/playground/network/kcall/libkcallprivate/accountitem.h #1005658:1005659 @@ -17,15 +17,14 @@ #ifndef ACCOUNTITEM_H #define ACCOUNTITEM_H -#include "contactsmodel.h" +#include "treemodel.h" #include -class AccountItem : public ContactsModelItem +class AccountItem : public QObject, public TreeModelItem { Q_OBJECT public: - AccountItem(const QString & busName, const QString & path, - TreeModelItem *parent, TreeModel *model); + AccountItem(const Tp::AccountPtr & account, TreeModelItem *parent); virtual QVariant data(int role) const; @@ -35,8 +34,11 @@ void onContactsReady(Tp::PendingOperation*); void onAccountInvalidated(Tp::DBusProxy *proxy, const QString & errorName, const QString & errorMessage); + //make emitDataChange available as a slot + inline void emitDataChange() { TreeModelItem::emitDataChange(); } private: + QString iconForPresence(uint presenceType) const; Tp::AccountPtr m_account; }; --- trunk/playground/network/kcall/libkcallprivate/contactitem.cpp #1005658:1005659 @@ -15,9 +15,13 @@ along with this program. If not, see . */ #include "contactitem.h" +#include "constants.h" +#include +#include +#include -ContactItem::ContactItem(const Tp::ContactPtr & contact, TreeModelItem *parent, TreeModel *model) - : ContactsModelItem(parent, model), m_contact(contact) +ContactItem::ContactItem(const Tp::ContactPtr & contact, TreeModelItem *parent) + : QObject(), TreeModelItem(parent), m_contact(contact) { connect(m_contact.data(), SIGNAL(aliasChanged(QString)), SLOT(emitDataChange())); connect(m_contact.data(), SIGNAL(simplePresenceChanged(QString, uint, QString)), @@ -30,7 +34,7 @@ case Qt::DisplayRole: return m_contact->alias(); case Qt::DecorationRole: - return iconForPresence((Tp::ConnectionPresenceType)m_contact->presenceType()); + return KIcon(iconForPresence(m_contact->presenceType())); case KCall::ItemTypeRole: return QByteArray("contact"); case KCall::ObjectPtrRole: @@ -39,3 +43,26 @@ return QVariant(); } } + +QString ContactItem::iconForPresence(uint presenceType) const +{ + switch (presenceType) { + case Tp::ConnectionPresenceTypeOffline: + return QLatin1String("user-offline"); + case Tp::ConnectionPresenceTypeAvailable: + return QLatin1String("user-online"); + case Tp::ConnectionPresenceTypeAway: + return QLatin1String("user-away"); + case Tp::ConnectionPresenceTypeExtendedAway: + return QLatin1String("user-away-extended"); + case Tp::ConnectionPresenceTypeHidden: + return QLatin1String("user-invisible"); + case Tp::ConnectionPresenceTypeBusy: + return QLatin1String("user-busy"); + default: + kWarning() << "presence type is unset/unknown/invalid. value:" << presenceType; + return QString(); + } +} + +#include "contactitem.moc" --- trunk/playground/network/kcall/libkcallprivate/contactitem.h #1005658:1005659 @@ -17,17 +17,23 @@ #ifndef CONTACTITEM_H #define CONTACTITEM_H -#include "contactsmodel.h" +#include "treemodel.h" #include -class ContactItem : public ContactsModelItem +class ContactItem : public QObject, public TreeModelItem { + Q_OBJECT public: - ContactItem(const Tp::ContactPtr & contact, TreeModelItem *parent, TreeModel *model); + ContactItem(const Tp::ContactPtr & contact, TreeModelItem *parent); virtual QVariant data(int role) const; +protected slots: + //make emitDataChange available as a slot + inline void emitDataChange() { TreeModelItem::emitDataChange(); } + private: + QString iconForPresence(uint presenceType) const; Tp::ContactPtr m_contact; }; --- trunk/playground/network/kcall/libkcallprivate/groupmembersmodel.cpp #1005658:1005659 @@ -21,8 +21,8 @@ { public: inline GroupContactItem(const Tp::ContactPtr & contact, KCall::GroupMembersListType listType, - TreeModelItem *parent, TreeModel *model) - : ContactItem(contact, parent, model), m_listType(listType) + TreeModelItem *parent) + : ContactItem(contact, parent), m_listType(listType) { } @@ -90,7 +90,7 @@ if ( d->contactItems.contains(contact->id()) ) { d->contactItems[contact->id()]->setListType(listType); } else { - GroupContactItem *item = new GroupContactItem(contact, listType, root(), this); + GroupContactItem *item = new GroupContactItem(contact, listType, root()); d->contactItems[contact->id()] = item; root()->appendChild(item); } --- trunk/playground/network/kcall/libkcallprivate/groupmembersmodel.h #1005658:1005659 @@ -18,6 +18,7 @@ #define GROUPMEMBERSMODEL_H #include "treemodel.h" +#include "constants.h" #include class KCALLPRIVATE_EXPORT GroupMembersModel : public TreeModel --- trunk/playground/network/kcall/libkcallprivate/treemodel.cpp #1005658:1005659 @@ -26,13 +26,22 @@ QList children; }; -TreeModelItem::TreeModelItem(TreeModelItem *parent, TreeModel *model) +TreeModelItem::TreeModelItem(TreeModel *model) : d(new Private) { - d->parent = parent; + Q_ASSERT(model); + d->parent = NULL; d->model = model; } +TreeModelItem::TreeModelItem(TreeModelItem *parent) + : d(new Private) +{ + Q_ASSERT(parent && parent->model()); + d->parent = parent; + d->model = parent->model(); +} + TreeModelItem::~TreeModelItem() { qDeleteAll(d->children); @@ -143,7 +152,7 @@ TreeModel::TreeModel(QObject *parent) : QAbstractItemModel(parent) { - m_root = new TreeModelItem(NULL, this); + m_root = new TreeModelItem(this); } TreeModel::~TreeModel() --- trunk/playground/network/kcall/libkcallprivate/treemodel.h #1005658:1005659 @@ -25,7 +25,8 @@ { Q_DISABLE_COPY(TreeModelItem); public: - TreeModelItem(TreeModelItem *parent, TreeModel *model); + TreeModelItem(TreeModel *model); + TreeModelItem(TreeModelItem *parent); virtual ~TreeModelItem(); virtual QVariant data(int role) const; @@ -75,22 +76,4 @@ TreeModelItem *m_root; }; -namespace KCall -{ - enum ExtraModelRoles { - ItemTypeRole = Qt::UserRole, - ObjectPtrRole, - GroupMembersListTypeRole, - PresenceRole - }; - - enum GroupMembersListType { - CurrentMembers, - LocalPendingMembers, - RemotePendingMembers - }; -} - -Q_DECLARE_METATYPE(KCall::GroupMembersListType) - #endif --- trunk/playground/network/kcall/mainwindow.cpp #1005658:1005659 @@ -18,7 +18,8 @@ #include "ui_mainwindow.h" #include "kcallapplication.h" #include "contactlistcontroller.h" -#include "libkcallprivate/contactsmodel.h" +#include "libkcallprivate/accountmanager.h" +#include "libkcallprivate/constants.h" #include #include #include @@ -37,10 +38,11 @@ ui->setupUi(centralWidget); setCentralWidget(centralWidget); - ui->contactsTreeView->setModel(KCallApplication::instance()->contactsModel()); - new ContactListController(ui->contactsTreeView, KCallApplication::instance()->contactsModel()); + QAbstractItemModel *model = KCallApplication::instance()->accountManager()->contactsModel(); + ui->contactsTreeView->setModel(model); + new ContactListController(ui->contactsTreeView, model); - ui->accountComboBox->setModel(KCallApplication::instance()->contactsModel()); + ui->accountComboBox->setModel(model); connect(ui->dialAudioButton, SIGNAL(clicked()), SLOT(onDialAudioButtonClicked())); connect(ui->dialVideoButton, SIGNAL(clicked()), SLOT(onDialVideoButtonClicked())); @@ -85,9 +87,7 @@ return; } - TreeModel *model = qobject_cast(ui->accountComboBox->model()); - Q_ASSERT(model); - + QAbstractItemModel *model = ui->accountComboBox->model(); Tp::AccountPtr account = model->index(row, 0).data(KCall::ObjectPtrRole).value(); Q_ASSERT( !account.isNull() );