-
Armin Felder authoredArmin Felder authored
messagemodel.cpp 4.97 KiB
#include "messagemodel.h"
MessagesModel::MessagesModel()
{
}
QVariant MessagesModel::data( const QModelIndex &index, int role ) const
{
int row = index.row();
QSharedPointer<RocketChatMessage> messageAtIndex = messagesOfCurrentChannel.at( row );
if ( role == MessageRoles::type ) {
return messageAtIndex->getMessageType();
}
if ( role == MessageRoles::text ) {
return messageAtIndex->getMessageString();
}
if ( role == MessageRoles::linkurl ) {
if ( !messageAtIndex->getAttachments().empty() ) {
return messageAtIndex->getAttachments().first()->getUrl();
} else {
qWarning() << "linkurl not found";
}
}
if ( role == author ) {
return messageAtIndex->getAuthor();
}
if ( role == date ) {
return messageAtIndex->getFormattedDate();
}
if ( role == time ) {
return messageAtIndex->getFormattedTime();
}
if ( role == ownMessage ) {
return messageAtIndex->getOwnMessage();
}
if ( role == width ) {
if ( !messageAtIndex->getAttachments().empty() ) {
return messageAtIndex->getAttachments().first()->getWidth();
} else {
qWarning() << "height not found";
}
}
if ( role == height ) {
if ( !messageAtIndex->getAttachments().empty() ) {
return messageAtIndex->getAttachments().first()->getHeight();
} else {
qWarning() << "height not found";
}
}
if(role == formattedDate)
return messageAtIndex->getFormattedDate();
if(role == formattedTime)
return messageAtIndex->getFormattedTime();
if(role == messageType)
return messageAtIndex->getMessageType();
qWarning() << "MessagesModel data not found for row";
return QVariant();
}
QString MessagesModel::getCurrent() const
{
return current;
}
void MessagesModel::setCurrent( const QString &value )
{
QMutexLocker(&this->mutex);
current = value;
beginResetModel();
if ( mChannelMap.contains( value ) ) {
messagesOfCurrentChannel = mChannelMap[value]->getMessageRepo()->timestampIndex().values().toVector();
duplicateCheck.clear();
for ( auto currentMessage : messagesOfCurrentChannel ) {
duplicateCheck.insert( currentMessage->getId() );
}
} else {
duplicateCheck.clear();
messagesOfCurrentChannel.clear();
}
endResetModel();
emit countChanged();
}
int MessagesModel::rowCount( const QModelIndex &parent ) const
{
Q_UNUSED( parent );
qDebug() << "number of messages in model" << messagesOfCurrentChannel.count();
int count = 0;
if ( messagesOfCurrentChannel.isEmpty() ) {
return 0;
}
count = messagesOfCurrentChannel.count();
return count;
}
bool MessagesModel::addChannel(QSharedPointer<RocketChatChannel> channel)
{
QString id = channel->getRoomId();
if(mChannelMap.contains(id))
return false;
mChannelMap.insert(id, channel);
connect(channel.data(),&RocketChatChannel::messageAdded,this,[=](QString id, qint64 timestamp){
Q_UNUSED(id)
onNewMessage(channel,timestamp);
});
return true;
}
QHash<int, QByteArray> MessagesModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[text] = "msg";
roles[author] = "author";
roles[linkurl] = "linkurl";
roles[type] = "type";
roles[date] = "date";
roles[time] = "time";
roles[ownMessage] = "ownMessage";
roles[height] = "height";
roles[width ] = "width";
roles[formattedDate ] = "formattedDate";
roles[formattedTime] = "formattedTime";
roles[messageType] = "messageType";
return roles;
}
void MessagesModel::onNewMessage( QSharedPointer<RocketChatChannel> channel, qint64 timestamp )
{
QMutexLocker(&this->mutex);
if(timestamp == 0){
setCurrent(current);
}
if ( channel->getRoomId() == current ) {
auto message = channel->getMessageRepo()->timestampIndex()[timestamp];
if(message.isNull())
return;
int row = messagesOfCurrentChannel.findPosition(message);
if ( !duplicateCheck.contains( message->getId() ) ) {
beginInsertRows( QModelIndex(), row, row );
messagesOfCurrentChannel.insert( row, message );
mInsertCount++;
endInsertRows();
duplicateCheck.insert( message->getId() );
}
if ( !buffered ) {
mInsertCount = 0;
emit countChanged();
}
}
}
void MessagesModel::onBeginInsertList( QString pChannelId )
{
if ( pChannelId == current ) {
buffered = true;
mInsertCount = 0;
}
}
void MessagesModel::onEndInsertList( QString pChannelId )
{
if ( pChannelId == current ) {
buffered = false;
if ( mInsertCount ) {
mInsertCount = 0;
emit countChanged();
}
}
}
void MessagesModel::addChannelSlot(QSharedPointer<RocketChatChannel> channel)
{
addChannel(channel);
}