3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-23 07:35:54 +00:00
Brooklyn/plasma/workspace/applets/kicker/plugin/recentcontactsmodel.cpp
2022-03-05 22:41:29 +05:00

233 lines
6.5 KiB
C++

/*
SPDX-FileCopyrightText: 2012 Aurélien Gâteau <agateau@kde.org>
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "recentcontactsmodel.h"
#include "actionlist.h"
#include "contactentry.h"
#include <QAction>
#include <KLocalizedString>
#include <KActivities/Stats/ResultModel>
#include <KActivities/Stats/Terms>
#include <KPeople/PersonData>
#include <kpeople/widgets/actions.h> //FIXME TODO: Pretty include in KPeople broken.
#include <kpeople/widgets/persondetailsdialog.h>
namespace KAStats = KActivities::Stats;
using namespace KAStats;
using namespace KAStats::Terms;
RecentContactsModel::RecentContactsModel(QObject *parent)
: ForwardingModel(parent)
{
refresh();
}
RecentContactsModel::~RecentContactsModel()
{
}
QString RecentContactsModel::description() const
{
return i18n("Contacts");
}
QVariant RecentContactsModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {
return QVariant();
}
QString id = sourceModel()->data(index, ResultModel::ResourceRole).toString();
KPeople::PersonData *data = nullptr;
if (m_idToData.contains(id)) {
data = m_idToData[id];
}
if (!data) {
const_cast<RecentContactsModel *>(this)->insertPersonData(id, index.row());
return QVariant();
}
if (role == Qt::DisplayRole) {
return data->name();
} else if (role == Qt::DecorationRole) {
return data->presenceIconName();
} else if (role == Kicker::FavoriteIdRole) {
return id;
} else if (role == Kicker::HasActionListRole) {
return true;
} else if (role == Kicker::ActionListRole) {
QVariantList actionList;
const QVariantMap &forgetAction = Kicker::createActionItem(i18n("Forget Contact"), QStringLiteral("edit-clear-history"), QStringLiteral("forget"));
actionList << forgetAction;
const QVariantMap &forgetAllAction =
Kicker::createActionItem(i18n("Forget All Contacts"), QStringLiteral("edit-clear-history"), QStringLiteral("forgetAll"));
actionList << forgetAllAction;
actionList << Kicker::createSeparatorActionItem();
actionList << Kicker::createActionItem(i18n("Show Contact Information…"), QStringLiteral("identity"), QStringLiteral("showContactInfo"));
return actionList;
} else if (role == Kicker::DescriptionRole) {
return QString();
}
return QVariant();
}
bool RecentContactsModel::trigger(int row, const QString &actionId, const QVariant &argument)
{
Q_UNUSED(argument)
bool withinBounds = row >= 0 && row < rowCount();
if (actionId.isEmpty() && withinBounds) {
QString id = sourceModel()->data(sourceModel()->index(row, 0), ResultModel::ResourceRole).toString();
const QList<QAction *> actionList = KPeople::actionsForPerson(id, this);
if (!actionList.isEmpty()) {
QAction *chat = nullptr;
for (QAction *action : actionList) {
const QVariant &actionType = action->property("actionType");
if (!actionType.isNull() && actionType.toInt() == KPeople::ActionType::TextChatAction) {
chat = action;
}
}
if (chat) {
chat->trigger();
return true;
}
}
return false;
} else if (actionId == QLatin1String("showContactInfo") && withinBounds) {
ContactEntry::showPersonDetailsDialog(sourceModel()->data(sourceModel()->index(row, 0), ResultModel::ResourceRole).toString());
} else if (actionId == QLatin1String("forget") && withinBounds) {
if (sourceModel()) {
ResultModel *resultModel = static_cast<ResultModel *>(sourceModel());
resultModel->forgetResource(row);
}
return false;
} else if (actionId == QLatin1String("forgetAll")) {
if (sourceModel()) {
ResultModel *resultModel = static_cast<ResultModel *>(sourceModel());
resultModel->forgetAllResources();
}
return false;
}
return false;
}
bool RecentContactsModel::hasActions() const
{
return rowCount();
}
QVariantList RecentContactsModel::actions() const
{
QVariantList actionList;
if (rowCount()) {
actionList << Kicker::createActionItem(i18n("Forget All Contacts"), QStringLiteral("edit-clear-history"), QStringLiteral("forgetAll"));
}
return actionList;
}
void RecentContactsModel::refresh()
{
QObject *oldModel = sourceModel();
// clang-format off
auto query = UsedResources
| RecentlyUsedFirst
| Agent(QStringLiteral("KTp"))
| Type::any()
| Activity::current()
| Url::startsWith(QStringLiteral("ktp"))
| Limit(15);
// clang-format on
ResultModel *model = new ResultModel(query);
QModelIndex index;
if (model->canFetchMore(index)) {
model->fetchMore(index);
}
// FIXME TODO: Don't wipe entire cache on transactions.
connect(model, &QAbstractItemModel::rowsInserted, this, &RecentContactsModel::buildCache, Qt::UniqueConnection);
connect(model, &QAbstractItemModel::rowsRemoved, this, &RecentContactsModel::buildCache, Qt::UniqueConnection);
connect(model, &QAbstractItemModel::rowsMoved, this, &RecentContactsModel::buildCache, Qt::UniqueConnection);
connect(model, &QAbstractItemModel::modelReset, this, &RecentContactsModel::buildCache, Qt::UniqueConnection);
setSourceModel(model);
buildCache();
delete oldModel;
}
void RecentContactsModel::buildCache()
{
qDeleteAll(m_idToData);
m_idToData.clear();
m_dataToRow.clear();
QString id;
for (int i = 0; i < sourceModel()->rowCount(); ++i) {
id = sourceModel()->data(sourceModel()->index(i, 0), ResultModel::ResourceRole).toString();
if (!m_idToData.contains(id)) {
insertPersonData(id, i);
}
}
}
void RecentContactsModel::insertPersonData(const QString &id, int row)
{
KPeople::PersonData *data = new KPeople::PersonData(id);
m_idToData[id] = data;
m_dataToRow[data] = row;
connect(data, &KPeople::PersonData::dataChanged, this, &RecentContactsModel::personDataChanged);
}
void RecentContactsModel::personDataChanged()
{
KPeople::PersonData *data = static_cast<KPeople::PersonData *>(sender());
if (m_dataToRow.contains(data)) {
int row = m_dataToRow[data];
QModelIndex idx = sourceModel()->index(row, 0);
Q_EMIT dataChanged(idx, idx);
}
}