Create a reaction model that provides all the required data for `ReactionDelegate` so that none need to be calculated in QML. This also cleans up the API for `ReactionDelegate`
111 lines
2.9 KiB
C++
111 lines
2.9 KiB
C++
// SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com>
|
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
|
|
#include "reactionmodel.h"
|
|
|
|
#include <QDebug>
|
|
|
|
#include <KLocalizedString>
|
|
|
|
#include "neochatuser.h"
|
|
|
|
ReactionModel::ReactionModel(QObject *parent, QList<Reaction> reactions, NeoChatUser *localUser)
|
|
: QAbstractListModel(parent)
|
|
, m_localUser(localUser)
|
|
{
|
|
setReactions(reactions);
|
|
}
|
|
|
|
QVariant ReactionModel::data(const QModelIndex &index, int role) const
|
|
{
|
|
if (!index.isValid()) {
|
|
return {};
|
|
}
|
|
|
|
if (index.row() >= rowCount()) {
|
|
qDebug() << "ReactionModel, something's wrong: index.row() >= rowCount()";
|
|
return {};
|
|
}
|
|
|
|
const auto &reaction = m_reactions.at(index.row());
|
|
|
|
if (role == TextRole) {
|
|
if (reaction.authors.count() > 1) {
|
|
return reaction.reaction + QStringLiteral(" %1").arg(reaction.authors.count());
|
|
} else {
|
|
return reaction.reaction;
|
|
}
|
|
}
|
|
|
|
if (role == ReactionRole) {
|
|
return reaction.reaction;
|
|
}
|
|
|
|
if (role == ToolTipRole) {
|
|
QString text;
|
|
|
|
for (int i = 0; i < reaction.authors.count() && i < 3; i++) {
|
|
if (i != 0) {
|
|
if (i < reaction.authors.count() - 1) {
|
|
text += QStringLiteral(", ");
|
|
} else {
|
|
text += i18nc("Separate the usernames of users", " and ");
|
|
}
|
|
}
|
|
text += reaction.authors.at(i).toMap()["displayName"].toString();
|
|
}
|
|
|
|
if (reaction.authors.count() > 3) {
|
|
text += i18ncp("%1 is the number of other users", " and %1 other", " and %1 others", reaction.authors.count() - 3);
|
|
}
|
|
|
|
text = i18ncp("%2 is the users who reacted and %3 the emoji that was given",
|
|
"%2 reacted with %3",
|
|
"%2 reacted with %3",
|
|
reaction.authors.count(),
|
|
text,
|
|
reaction.reaction);
|
|
return text;
|
|
}
|
|
|
|
if (role == AuthorsRole) {
|
|
return reaction.authors;
|
|
}
|
|
|
|
if (role == HasLocalUser) {
|
|
for (auto author : reaction.authors) {
|
|
if (author.toMap()["id"] == m_localUser->id()) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
int ReactionModel::rowCount(const QModelIndex &parent) const
|
|
{
|
|
Q_UNUSED(parent)
|
|
return m_reactions.count();
|
|
}
|
|
|
|
void ReactionModel::setReactions(QList<Reaction> reactions)
|
|
{
|
|
beginResetModel();
|
|
m_reactions.clear();
|
|
m_reactions = reactions;
|
|
endResetModel();
|
|
}
|
|
|
|
QHash<int, QByteArray> ReactionModel::roleNames() const
|
|
{
|
|
return {
|
|
{TextRole, "text"},
|
|
{ReactionRole, "reaction"},
|
|
{ToolTipRole, "toolTip"},
|
|
{AuthorsRole, "authors"},
|
|
{HasLocalUser, "hasLocalUser"},
|
|
};
|
|
}
|