2026-04-17 15:43:49 +02:00
|
|
|
#include "ConversationListModel.h"
|
|
|
|
|
|
|
|
|
|
ConversationListModel::ConversationListModel(QObject* parent)
|
|
|
|
|
: QAbstractListModel(parent)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ConversationListModel::rowCount(const QModelIndex& parent) const
|
|
|
|
|
{
|
|
|
|
|
if (parent.isValid()) return 0;
|
|
|
|
|
return m_items.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QVariant ConversationListModel::data(const QModelIndex& index, int role) const
|
|
|
|
|
{
|
|
|
|
|
if (!index.isValid() || index.row() >= m_items.size())
|
|
|
|
|
return {};
|
|
|
|
|
|
|
|
|
|
const auto& item = m_items.at(index.row());
|
|
|
|
|
switch (role) {
|
|
|
|
|
case ConversationIdRole: return item.conversationId;
|
|
|
|
|
case DisplayNameRole: return item.displayName;
|
|
|
|
|
case LastActivityRole: return item.lastActivity;
|
|
|
|
|
case UnreadCountRole: return item.unreadCount;
|
|
|
|
|
default: return {};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QHash<int, QByteArray> ConversationListModel::roleNames() const
|
|
|
|
|
{
|
|
|
|
|
return {
|
|
|
|
|
{ ConversationIdRole, "conversationId" },
|
|
|
|
|
{ DisplayNameRole, "displayName" },
|
|
|
|
|
{ LastActivityRole, "lastActivity" },
|
|
|
|
|
{ UnreadCountRole, "unreadCount" }
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConversationListModel::addConversation(const QString& id, const QString& displayName,
|
2026-05-15 09:41:23 +02:00
|
|
|
const QDateTime& lastActivity)
|
2026-04-17 15:43:49 +02:00
|
|
|
{
|
|
|
|
|
if (contains(id)) return;
|
|
|
|
|
|
|
|
|
|
beginInsertRows(QModelIndex(), m_items.size(), m_items.size());
|
2026-05-15 09:41:23 +02:00
|
|
|
m_items.append({ id, displayName, lastActivity, 0 });
|
2026-04-17 15:43:49 +02:00
|
|
|
endInsertRows();
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-15 09:41:23 +02:00
|
|
|
void ConversationListModel::updateDisplayName(const QString& id, const QString& displayName)
|
|
|
|
|
{
|
|
|
|
|
int idx = indexOf(id);
|
|
|
|
|
if (idx < 0) return;
|
|
|
|
|
|
|
|
|
|
if (m_items[idx].displayName == displayName) return;
|
|
|
|
|
m_items[idx].displayName = displayName;
|
|
|
|
|
emit dataChanged(index(idx), index(idx), { DisplayNameRole });
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-17 15:43:49 +02:00
|
|
|
void ConversationListModel::updateLastActivity(const QString& id, const QDateTime& lastActivity)
|
|
|
|
|
{
|
|
|
|
|
int idx = indexOf(id);
|
|
|
|
|
if (idx < 0) return;
|
|
|
|
|
|
|
|
|
|
m_items[idx].lastActivity = lastActivity;
|
|
|
|
|
emit dataChanged(index(idx), index(idx), { LastActivityRole });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConversationListModel::incrementUnread(const QString& id)
|
|
|
|
|
{
|
|
|
|
|
int idx = indexOf(id);
|
|
|
|
|
if (idx < 0) return;
|
|
|
|
|
|
|
|
|
|
m_items[idx].unreadCount++;
|
|
|
|
|
emit dataChanged(index(idx), index(idx), { UnreadCountRole });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConversationListModel::clearUnread(const QString& id)
|
|
|
|
|
{
|
|
|
|
|
int idx = indexOf(id);
|
|
|
|
|
if (idx < 0) return;
|
|
|
|
|
|
|
|
|
|
if (m_items[idx].unreadCount == 0) return;
|
|
|
|
|
m_items[idx].unreadCount = 0;
|
|
|
|
|
emit dataChanged(index(idx), index(idx), { UnreadCountRole });
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-15 09:41:23 +02:00
|
|
|
void ConversationListModel::removeConversation(const QString& id)
|
|
|
|
|
{
|
|
|
|
|
int idx = indexOf(id);
|
|
|
|
|
if (idx < 0) return;
|
|
|
|
|
|
|
|
|
|
beginRemoveRows(QModelIndex(), idx, idx);
|
|
|
|
|
m_items.removeAt(idx);
|
|
|
|
|
endRemoveRows();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConversationListModel::clear()
|
|
|
|
|
{
|
|
|
|
|
if (m_items.isEmpty()) return;
|
|
|
|
|
beginResetModel();
|
|
|
|
|
m_items.clear();
|
|
|
|
|
endResetModel();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-17 15:43:49 +02:00
|
|
|
bool ConversationListModel::contains(const QString& id) const
|
|
|
|
|
{
|
|
|
|
|
return indexOf(id) >= 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ConversationListModel::indexOf(const QString& id) const
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < m_items.size(); ++i) {
|
|
|
|
|
if (m_items[i].conversationId == id)
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|