Skip to content
Snippets Groups Projects
messagemodel.cpp 5 KiB
Newer Older
Armin Felder's avatar
Armin Felder committed
#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(const QSharedPointer<RocketChatChannel> &channel)
Armin Felder's avatar
Armin Felder committed
{
    QString id = channel->getRoomId();
    if(mChannelMap.contains(id))
        return false;
    mChannelMap.insert(id, channel);
    connect(channel.data(),&RocketChatChannel::messageAdded,this,[=](QString id, qint64 timestamp){
Armin Felder's avatar
Armin Felder committed
        Q_UNUSED(id)
Armin Felder's avatar
Armin Felder committed
        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( const QSharedPointer<RocketChatChannel> &channel, qint64 timestamp )
Armin Felder's avatar
Armin Felder committed
{
    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( const QString &pChannelId )
Armin Felder's avatar
Armin Felder committed
{
    if ( pChannelId == current ) {
        buffered = true;
        mInsertCount = 0;
    }
}

void MessagesModel::onEndInsertList( const QString &pChannelId )
Armin Felder's avatar
Armin Felder committed
{
    if ( pChannelId == current ) {
        buffered = false;

        if ( mInsertCount ) {
            mInsertCount = 0;
            emit countChanged();
        }
    }
}

void MessagesModel::addChannelSlot(const QSharedPointer<RocketChatChannel> &channel)
Armin Felder's avatar
Armin Felder committed
{
    addChannel(channel);
}