// SPDX-FileCopyrightText: 2023 James Graham // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL #include "reactionmodel.h" #include #include #include "neochatuser.h" ReactionModel::ReactionModel(QObject *parent, QList 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 reactions) { beginResetModel(); m_reactions.clear(); m_reactions = reactions; endResetModel(); } QHash ReactionModel::roleNames() const { return { {TextRole, "text"}, {ReactionRole, "reaction"}, {ToolTipRole, "toolTip"}, {AuthorsRole, "authors"}, {HasLocalUser, "hasLocalUser"}, }; } #include "moc_reactionmodel.cpp"