[SCM] ktp-common-internals packaging branch, master, updated. debian/15.12.1-2-1839-gf0635e9
Maximiliano Curia
maxy at moszumanska.debian.org
Mon May 9 09:05:16 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-common-internals.git;a=commitdiff;h=3737f85
The following commit has been merged in the master branch:
commit 3737f85af335b0634d31c7d82a0e222f3475581c
Author: Dominik Cermak <d.cermak at arcor.de>
Date: Wed Jun 27 17:30:13 2012 +0200
Respect filters for counters
The counting is done in the AccountsFilterModel now.
So to have those counters one will have to use the AccountsFilterModel.
BUG: 300956
FIXED-IN: 0.5
REVIEW: 105130
---
KTp/Models/accounts-filter-model.cpp | 193 ++++++++++++++++++++++++++++++++++-
KTp/Models/accounts-filter-model.h | 14 ++-
KTp/Models/accounts-model-item.cpp | 27 +----
KTp/Models/accounts-model-item.h | 2 -
KTp/Models/accounts-model.cpp | 6 +-
KTp/Models/groups-model-item.cpp | 23 +----
KTp/Models/groups-model-item.h | 2 -
KTp/Models/groups-model.cpp | 9 +-
8 files changed, 207 insertions(+), 69 deletions(-)
diff --git a/KTp/Models/accounts-filter-model.cpp b/KTp/Models/accounts-filter-model.cpp
index c17b335..bd8eaa4 100644
--- a/KTp/Models/accounts-filter-model.cpp
+++ b/KTp/Models/accounts-filter-model.cpp
@@ -4,6 +4,7 @@
* Copyright (C) 2011 David Edmundson <kde at davidedmundson.co.uk>
* Copyright (C) 2011 Martin Klapetek <martin dot klapetek at gmail dot com>
* Copyright (C) 2012 Daniele E. Domenichelli <daniele.domenichelli at gmail.com>
+ * Copyright (C) 2012 Dominik Cermak <d.cermak at arcor.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,6 +28,7 @@
#include "groups-model-item.h"
#include "contact-model-item.h"
#include "accounts-model-item.h"
+#include "proxy-tree-node.h"
#include <presence.h>
@@ -70,19 +72,24 @@ public:
bool filterAcceptsAccount(const QModelIndex &index) const;
bool filterAcceptsContact(const QModelIndex &index) const;
bool filterAcceptsGroup(const QModelIndex &index) const;
+
+ QHash<QString, int> m_onlineContactsCounts;
+ QHash<QString, int> m_totalContactsCounts;
};
bool AccountsFilterModel::Private::filterAcceptsAccount(const QModelIndex &index) const
{
- //hide disabled accounts
+ // Hide disabled accounts
if (!index.data(AccountsModel::EnabledRole).toBool()) {
return false;
}
- //hide
+
+ // Hide disconnected accounts
if (index.data(AccountsModel::ConnectionStatusRole).toUInt()
!= Tp::ConnectionStatusConnected) {
return false;
}
+
return true;
}
@@ -303,8 +310,28 @@ bool AccountsFilterModel::Private::filterAcceptsContact(const QModelIndex &index
bool AccountsFilterModel::Private::filterAcceptsGroup(const QModelIndex &index) const
{
+ QVariant item = index.data(AccountsModel::ItemRole);
+ GroupsModelItem *gmItem = item.value<GroupsModelItem*>();
+
if (presenceTypeFilterFlags != DoNotFilterByPresence) {
- if (index.data(AccountsModel::OnlineUsersCountRole).toInt() == 0) {
+ // If there is no cached value, create one
+ if (!m_onlineContactsCounts.contains(gmItem->groupName())) {
+ q->countContacts(index);
+ }
+
+ // Don't accept groups with no online contacts
+ if (m_onlineContactsCounts.value(gmItem->groupName()) == 0) {
+ return false;
+ }
+ }
+ else {
+ // If there is no cached value, create one
+ if (!m_totalContactsCounts.contains(gmItem->groupName())) {
+ q->countContacts(index);
+ }
+
+ // Don't accept groups with no total contacts
+ if (m_totalContactsCounts.value(gmItem->groupName()) == 0) {
return false;
}
}
@@ -322,6 +349,86 @@ AccountsFilterModel::~AccountsFilterModel()
delete d;
}
+QVariant AccountsFilterModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid()) {
+ return QVariant();
+ }
+
+ QModelIndex sourceIndex = mapToSource(index);
+ if (!sourceIndex.isValid()) {
+ return QVariant();
+ }
+
+ // Special handling for the counts
+ if (role == AccountsModel::OnlineUsersCountRole) {
+ QVariant item = sourceIndex.data(AccountsModel::ItemRole);
+ if (item.canConvert<GroupsModelItem*>()) {
+ GroupsModelItem *gmItem = item.value<GroupsModelItem*>();
+ // If there is no cached value, create one
+ if (!d->m_onlineContactsCounts.contains(gmItem->groupName())) {
+ countContacts(sourceIndex);
+ }
+ return d->m_onlineContactsCounts.value(gmItem->groupName());
+ } else if (item.canConvert<AccountsModelItem*>()) {
+ AccountsModelItem *amItem = item.value<AccountsModelItem*>();
+ // If there is no cached value, create one
+ if (!d->m_onlineContactsCounts.contains(amItem->data(AccountsModel::IdRole).toString())) {
+ countContacts(sourceIndex);
+ }
+ return d->m_onlineContactsCounts.value(amItem->data(AccountsModel::IdRole).toString());
+ }
+ } else if (role == AccountsModel::TotalUsersCountRole) {
+ QVariant item = sourceIndex.data(AccountsModel::ItemRole);
+ if (item.canConvert<GroupsModelItem*>()) {
+ GroupsModelItem *gmItem = item.value<GroupsModelItem*>();
+ // If there is no cached value, create one
+ if (!d->m_totalContactsCounts.contains(gmItem->groupName())) {
+ countContacts(sourceIndex);
+ }
+ return d->m_totalContactsCounts.value(gmItem->groupName());
+ } else if (item.canConvert<AccountsModelItem*>()) {
+ AccountsModelItem *amItem = item.value<AccountsModelItem*>();
+ // If there is no cached value, create one
+ if (!d->m_totalContactsCounts.contains(amItem->data(AccountsModel::IdRole).toString())) {
+ countContacts(sourceIndex);
+ }
+ return d->m_totalContactsCounts.value(amItem->data(AccountsModel::IdRole).toString());
+ }
+ }
+
+ // In all other cases just delegate it to the source model
+ return sourceModel()->data(mapToSource(index), role);
+}
+
+void AccountsFilterModel::setSourceModel(QAbstractItemModel *sourceModel)
+{
+ // Disconnect the previous source model
+ disconnect(this->sourceModel(),
+ SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ this,
+ SLOT(countContacts(QModelIndex)));
+
+ // Clear all cached values as they aren't valid anymore because the source model changed.
+ d->m_onlineContactsCounts.clear();
+ d->m_totalContactsCounts.clear();
+ QSortFilterProxyModel::setSourceModel(sourceModel);
+
+ // Connect the new source model
+ connect(this->sourceModel(),
+ SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ this,
+ SLOT(countContacts(QModelIndex)));
+}
+
+void AccountsFilterModel::invalidateFilter()
+{
+ // Clear all cached values as they aren't valid anymore because the filter changed.
+ d->m_onlineContactsCounts.clear();
+ d->m_totalContactsCounts.clear();
+ QSortFilterProxyModel::invalidateFilter();
+}
+
AccountsFilterModel::SortMode AccountsFilterModel::sortMode() const
{
switch (sortRole()) {
@@ -615,6 +722,86 @@ void AccountsFilterModel::setGroupsFilterMatchFlags(Qt::MatchFlags groupsFilterM
}
}
+void AccountsFilterModel::countContacts(const QModelIndex &index) const
+{
+ QVariant item = index.data(AccountsModel::ItemRole);
+ if (item.canConvert<GroupsModelItem*>()) {
+ GroupsModelItem *gmItem = item.value<GroupsModelItem*>();
+
+ // Count the online contacts
+ int tmpCounter = 0;
+
+ for (int i = 0; i < gmItem->size(); ++i) {
+ ProxyTreeNode* proxyNode = qobject_cast<ProxyTreeNode*>(gmItem->childAt(i));
+ Q_ASSERT(proxyNode);
+
+ // We want all online contacts that are accepted by the filter
+ if (filterAcceptsRow(gmItem->indexOf(gmItem->childAt(i)), index)
+ && proxyNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeOffline
+ && proxyNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeUnknown) {
+ tmpCounter++;
+ }
+ }
+
+ d->m_onlineContactsCounts.insert(gmItem->groupName(), tmpCounter);
+
+ // Now count the total contacts accepted by the filter (but ignore presence filter).
+ // Save the presenceTypeFilterFlags to reapply them later, because we need to disable
+ // presence filtering to get the right numbers
+ PresenceTypeFilterFlags saved = presenceTypeFilterFlags();
+ d->presenceTypeFilterFlags = AccountsFilterModel::DoNotFilterByPresence;
+
+ tmpCounter = 0;
+ for (int i = 0; i < gmItem->size(); ++i) {
+ if (filterAcceptsRow(gmItem->indexOf(gmItem->childAt(i)), index)) {
+ tmpCounter++;
+ }
+ }
+
+ // Restore the saved presenceTypeFilterFlags
+ d->presenceTypeFilterFlags = saved;
+
+ d->m_totalContactsCounts.insert(gmItem->groupName(), tmpCounter);
+ } else if (item.canConvert<AccountsModelItem*>()) {
+ AccountsModelItem *amItem = item.value<AccountsModelItem*>();
+
+ // Count the online contacts
+ int tmpCounter = 0;
+
+ for (int i = 0; i < amItem->size(); ++i) {
+ ContactModelItem* contactNode = qobject_cast<ContactModelItem*>(amItem->childAt(i));
+ Q_ASSERT(contactNode);
+
+ // We want all online contacts that are accepted by the filter
+ if (filterAcceptsRow(amItem->indexOf(amItem->childAt(i)), index)
+ && contactNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeOffline
+ && contactNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeUnknown) {
+ tmpCounter++;
+ }
+ }
+
+ d->m_onlineContactsCounts.insert(amItem->data(AccountsModel::IdRole).toString(), tmpCounter);
+
+ // Now count the total contacts accepted by the filter (but ignore presence filter).
+ // Save the presenceTypeFilterFlags to reapply them later, because we need to disable
+ // presence filtering to get the right numbers
+ PresenceTypeFilterFlags saved = presenceTypeFilterFlags();
+ d->presenceTypeFilterFlags = AccountsFilterModel::DoNotFilterByPresence;
+
+ tmpCounter = 0;
+ for (int i = 0; i < amItem->size(); ++i) {
+ if (filterAcceptsRow(amItem->indexOf(amItem->childAt(i)), index)) {
+ tmpCounter++;
+ }
+ }
+
+ // Restore the saved presenceTypeFilterFlags
+ d->presenceTypeFilterFlags = saved;
+
+ d->m_totalContactsCounts.insert(amItem->data(AccountsModel::IdRole).toString(), tmpCounter);
+ }
+}
+
bool AccountsFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
diff --git a/KTp/Models/accounts-filter-model.h b/KTp/Models/accounts-filter-model.h
index 9ed824a..b0d7402 100644
--- a/KTp/Models/accounts-filter-model.h
+++ b/KTp/Models/accounts-filter-model.h
@@ -192,6 +192,10 @@ public:
AccountsFilterModel(QObject *parent = 0);
virtual ~AccountsFilterModel();
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual void setSourceModel(QAbstractItemModel *sourceModel);
+ void invalidateFilter();
+
SortMode sortMode() const;
void resetSortMode();
Q_SLOT void setSortMode(SortMode sortMode);
@@ -257,12 +261,14 @@ public:
Q_SLOT void setGroupsFilterMatchFlags(Qt::MatchFlags groupsFilterMatchFlags);
Q_SIGNAL void groupsFilterMatchFlagsChanged(Qt::MatchFlags groupsFilterMatchFlags);
+ Q_SLOT void countContacts(const QModelIndex &index) const;
+
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
- bool lessThan ( const QModelIndex &left, const QModelIndex &right ) const;
-QModelIndexList match(const QModelIndex &start, int role,
- const QVariant &value, int hits,
- Qt::MatchFlags flags) const;
+ bool lessThan (const QModelIndex &left, const QModelIndex &right) const;
+ QModelIndexList match(const QModelIndex &start, int role,
+ const QVariant &value, int hits,
+ Qt::MatchFlags flags) const;
private:
class Private;
diff --git a/KTp/Models/accounts-model-item.cpp b/KTp/Models/accounts-model-item.cpp
index 1d65af3..b85e9e3 100644
--- a/KTp/Models/accounts-model-item.cpp
+++ b/KTp/Models/accounts-model-item.cpp
@@ -34,8 +34,7 @@
struct AccountsModelItem::Private
{
Private(const Tp::AccountPtr &account)
- : mAccount(account),
- mOnlineCount(0)
+ : mAccount(account)
{
}
@@ -43,7 +42,6 @@ struct AccountsModelItem::Private
void setStatusMessage(const QString &value);
Tp::AccountPtr mAccount;
- int mOnlineCount;
};
void AccountsModelItem::Private::setStatus(const QString &value)
@@ -195,10 +193,6 @@ QVariant AccountsModelItem::data(int role) const
return mPriv->mAccount->connectionStatus();
case AccountsModel::ConnectionStatusReasonRole:
return mPriv->mAccount->connectionStatusReason();
- case AccountsModel::TotalUsersCountRole:
- return size();
- case AccountsModel::OnlineUsersCountRole:
- return mPriv->mOnlineCount;
default:
return QVariant();
}
@@ -300,7 +294,7 @@ void AccountsModelItem::onContactsChanged(const Tp::Contacts &addedContacts,
Q_EMIT childrenAdded(this, newNodes);
}
- countOnlineContacts();
+ onChanged();
}
void AccountsModelItem::onStatusChanged(Tp::ConnectionStatus status)
@@ -408,22 +402,7 @@ void AccountsModelItem::addKnownContacts()
Q_EMIT childrenAdded(this, newNodes);
}
- countOnlineContacts();
-}
-
-void AccountsModelItem::countOnlineContacts()
-{
- int tmpCounter = 0;
- for (int i = 0; i < size(); ++i) {
- ContactModelItem* contactNode = qobject_cast<ContactModelItem*>(childAt(i));
- Q_ASSERT(contactNode);
- if (contactNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeOffline
- && contactNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeUnknown) {
- tmpCounter++;
- }
- }
-
- mPriv->mOnlineCount = tmpCounter;
+ onChanged();
}
#include "accounts-model-item.moc"
diff --git a/KTp/Models/accounts-model-item.h b/KTp/Models/accounts-model-item.h
index 11554a9..5401202 100644
--- a/KTp/Models/accounts-model-item.h
+++ b/KTp/Models/accounts-model-item.h
@@ -55,8 +55,6 @@ public:
void clearContacts();
- void countOnlineContacts();
-
Q_SIGNALS:
void connectionStatusChanged(const QString &accountId, int status);
diff --git a/KTp/Models/accounts-model.cpp b/KTp/Models/accounts-model.cpp
index 795a1f4..8233a37 100644
--- a/KTp/Models/accounts-model.cpp
+++ b/KTp/Models/accounts-model.cpp
@@ -152,10 +152,7 @@ void AccountsModel::onItemChanged(TreeNode *node)
{
if (node->parent()) {
//if it is a group item
- if (node->parent() == mPriv->mTree) {
- qobject_cast<AccountsModelItem*>(node)->countOnlineContacts();
- } else {
- qobject_cast<AccountsModelItem*>(node->parent())->countOnlineContacts();
+ if (node->parent() != mPriv->mTree) {
Q_EMIT dataChanged(index(node->parent()), index(node->parent()));
}
}
@@ -173,6 +170,7 @@ void AccountsModel::onItemsAdded(TreeNode *parent, const QList<TreeNode *> &node
}
endInsertRows();
Q_EMIT accountCountChanged();
+ Q_EMIT dataChanged(index(parent), index(parent));
}
void AccountsModel::onItemsRemoved(TreeNode *parent, int first, int last)
diff --git a/KTp/Models/groups-model-item.cpp b/KTp/Models/groups-model-item.cpp
index 00dbede..c85ffbf 100644
--- a/KTp/Models/groups-model-item.cpp
+++ b/KTp/Models/groups-model-item.cpp
@@ -35,8 +35,7 @@
struct GroupsModelItem::Private
{
Private(const QString &groupName)
- : mGroupName(groupName),
- mOnlineUsersCount(0)
+ : mGroupName(groupName)
{
}
@@ -44,7 +43,6 @@ struct GroupsModelItem::Private
QString groupName();
QString mGroupName;
- int mOnlineUsersCount;
};
void GroupsModelItem::Private::setGroupName(const QString& value)
@@ -82,10 +80,6 @@ QVariant GroupsModelItem::data(int role) const
/* drop through*/
case GroupsModel::GroupNameRole:
return mPriv->mGroupName;
- case AccountsModel::TotalUsersCountRole:
- return size();
- case AccountsModel::OnlineUsersCountRole:
- return mPriv->mOnlineUsersCount;
default:
return QVariant();
}
@@ -127,18 +121,3 @@ void GroupsModelItem::removeProxyContact(ProxyTreeNode *proxyNode)
//the group counters needs to be updated
Q_EMIT changed(this);
}
-
-void GroupsModelItem::countOnlineContacts()
-{
- int tmpCounter = 0;
- for (int i = 0; i < size(); ++i) {
- ProxyTreeNode* proxyNode = qobject_cast<ProxyTreeNode*>(childAt(i));
- Q_ASSERT(proxyNode);
- if (proxyNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeOffline
- && proxyNode->data(AccountsModel::PresenceTypeRole).toUInt() != Tp::ConnectionPresenceTypeUnknown) {
- tmpCounter++;
- }
- }
-
- mPriv->mOnlineUsersCount = tmpCounter;
-}
diff --git a/KTp/Models/groups-model-item.h b/KTp/Models/groups-model-item.h
index 26dcb00..19365d5 100644
--- a/KTp/Models/groups-model-item.h
+++ b/KTp/Models/groups-model-item.h
@@ -54,8 +54,6 @@ public:
void addProxyContact(ProxyTreeNode* proxyNode);
void removeProxyContact(ProxyTreeNode* proxyNode);
- void countOnlineContacts();
-
private Q_SLOTS:
diff --git a/KTp/Models/groups-model.cpp b/KTp/Models/groups-model.cpp
index 6e295ab..f0d607d 100644
--- a/KTp/Models/groups-model.cpp
+++ b/KTp/Models/groups-model.cpp
@@ -170,14 +170,7 @@ void GroupsModel::onItemChanged(TreeNode* node)
{
if (node->parent()) {
//if it is a group item
- if (node->parent() == mPriv->mTree) {
- GroupsModelItem *groupItem = qobject_cast<GroupsModelItem*>(node);
- Q_ASSERT(groupItem);
- groupItem->countOnlineContacts();
- } else {
- GroupsModelItem *groupItem = qobject_cast<GroupsModelItem*>(node->parent());
- Q_ASSERT(groupItem);
- groupItem->countOnlineContacts();
+ if (node->parent() != mPriv->mTree) {
Q_EMIT dataChanged(index(node->parent()), index(node->parent()));
}
}
--
ktp-common-internals packaging
More information about the pkg-kde-commits
mailing list