#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); }