Skip to content
Snippets Groups Projects
usermodel.cpp 6.41 KiB
Newer Older
/********************************************************************************************
 *                                                                                          *
 * Copyright (C) 2017 Armin Felder, Dennis Beier                                            *
 * This file is part of RocketChatMobileEngine <https://git.fairkom.net/chat/fairchat>.     *
 *                                                                                          *
 * RocketChatMobileEngine is free software: you can redistribute it and/or modify           *
 * it under the terms of the GNU General Public License as published by                     *
 * the Free Software Foundation, either version 3 of the License, or                        *
 * (at your option) any later version.                                                      *
 *                                                                                          *
 * RocketChatMobileEngine is distributed in the hope that it will be useful,                *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of                           *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                            *
 * GNU General Public License for more details.                                             *
 *                                                                                          *
 * You should have received a copy of the GNU General Public License                        *
 * along with RocketChatMobileEngine. If not, see <http://www.gnu.org/licenses/>.           *
 *                                                                                          *
 ********************************************************************************************/



Armin Felder's avatar
Armin Felder committed
#include "usermodel.h"

Armin Felder's avatar
as  
Armin Felder committed
#include <QDateTime>

Armin Felder's avatar
Armin Felder committed
UserModel::UserModel( QObject *parent ): QAbstractListModel( parent )
{

}

int UserModel::rowCount( const QModelIndex &parent ) const
{
    Q_UNUSED( parent );
    int count = userOfCurrentChannel.count();
Armin Felder's avatar
Armin Felder committed
    qDebug() << "count  of current channel users" << count;
    return count;
}

QVariant UserModel::data( const QModelIndex &index, int role ) const
{
    auto userList = userOfCurrentChannel.values();
Armin Felder's avatar
Armin Felder committed

    if ( userList.count() < index.row() ) {
        return QVariant();
    }

Armin Felder's avatar
Armin Felder committed
    const auto &user = userList.at( index.row() );
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
    auto roleType = static_cast<UserRoles>( role );
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
    switch ( roleType ) {
        case UserRoles::UserName:
            return user->getUserName();
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
        case UserRoles::name:
            return user->getName();
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
        case UserRoles::UserId:
            return  user->getUserId();
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
        case UserRoles::status: {
                int status = 2;
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
                switch ( user->getStatus() ) {
                    case RocketChatUser::status::ONLINE :
                        status = 0;
                        break;
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
                    case RocketChatUser::status::AWAY :
                        status = 1;
                        break;
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
                    case RocketChatUser::status::OFFLINE:
                        status = 2;
                        break;

                    case RocketChatUser::status::BUSY:
                        status = 3;
                        break;
                }

                return status;
            }
Armin Felder's avatar
Armin Felder committed
    }

Armin Felder's avatar
Armin Felder committed
    return QVariant();
}

bool UserModel::insertUser( const QString &channelId, const QSharedPointer<RocketChatUser> &user )
Armin Felder's avatar
Armin Felder committed
{
Armin Felder's avatar
Armin Felder committed
    beginResetModel();
Armin Felder's avatar
Armin Felder committed

    if ( !user.isNull() ) {
Armin Felder's avatar
Armin Felder committed
        QSharedPointer<RocketChatUser> userToAdd;
        mMutex.lock();
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
        if ( mAllUsers.contains( user->getUserId() ) ) {
            auto oldUser = mAllUsers[user->getUserId()];
Armin Felder's avatar
Armin Felder committed

            if ( !user->getSurname().isEmpty() ) {
                oldUser->setSurname( user->getSurname() );
            }

            if ( !user->getLastname().isEmpty() ) {
                oldUser->setLastname( user->getLastname() );
            }

            if ( !user->getName().isEmpty() ) {
                oldUser->setName( user->getName() );
            }

            if ( !user->getUserId().isEmpty() ) {
                oldUser->setUserId( user->getUserId() );
            }

            userToAdd = oldUser;
        } else {
            userToAdd = user;
Armin Felder's avatar
Armin Felder committed
            mAllUsers.insert( userToAdd->getUserId(), userToAdd );
            connect( userToAdd.data(), &RocketChatUser::statusChanged, this, &UserModel::refreshUserList );
Armin Felder's avatar
Armin Felder committed
        }

        userMap.insert( channelId, userToAdd );
        mMutex.unlock();
Armin Felder's avatar
Armin Felder committed
        setCurrent( getCurrent() );
Armin Felder's avatar
Armin Felder committed
        return true;
    }
Armin Felder's avatar
Armin Felder committed
    endResetModel();
Armin Felder's avatar
Armin Felder committed
    //TODO: give some meainingfull return
    return true;
Armin Felder's avatar
Armin Felder committed
}

Armin Felder's avatar
Armin Felder committed
void UserModel::refreshUserList()
{
    beginResetModel();
    endResetModel();
}

Armin Felder's avatar
Armin Felder committed
QString UserModel::getCurrent() const
{
    return current;
}

void UserModel::setCurrent( const QString &value )
{
    current = value;
    mMutex.lock();
    userOfCurrentChannel.clear();
    beginResetModel();
Armin Felder's avatar
Armin Felder committed
    QList<QSharedPointer<RocketChatUser>> userList = userMap.values( value );
    mMutex.unlock();
Armin Felder's avatar
Armin Felder committed

Armin Felder's avatar
Armin Felder committed
    for ( const auto &current : userList ) {
Armin Felder's avatar
Armin Felder committed
        userOfCurrentChannel.insert( current->getUserId(), current );
Armin Felder's avatar
Armin Felder committed
}

void UserModel::onCurrentChannelChanged( const QString &newText )
{
    current = newText;
}

Armin Felder's avatar
Armin Felder committed
QSharedPointer<RocketChatUser> UserModel::getUserById( const QString &pId )
Armin Felder's avatar
Armin Felder committed
{
    QSharedPointer<RocketChatUser> user;
Armin Felder's avatar
Armin Felder committed
    //mMutex.lock();

    if ( mAllUsers.contains( pId ) ) {
        user = mAllUsers[pId];
    }

Armin Felder's avatar
Armin Felder committed
    //mMutex.unlock();
    return user;
Armin Felder's avatar
Armin Felder committed
}

Armin Felder's avatar
Armin Felder committed
void UserModel::addUser( const QSharedPointer<RocketChatUser> &pUser )
Armin Felder's avatar
Armin Felder committed
{
    if ( !pUser.isNull() ) {
        mMutex.lock();
Armin Felder's avatar
as  
Armin Felder committed

        if ( !mAllUsers.contains( pUser->getUserId() ) ) {
            mAllUsers.insert( pUser->getUserId(), pUser );
            connect( pUser.data(), &RocketChatUser::statusChanged, this, &UserModel::refreshUserList );
        } else {
            auto oldUser = mAllUsers[pUser->getUserId()];
            oldUser->setStatus( pUser->getStatus() );
        }

        mMutex.unlock();
Armin Felder's avatar
Armin Felder committed
    }
}

Armin Felder's avatar
Armin Felder committed
QHash<int, QByteArray> UserModel::roleNames() const
{
    QHash<int, QByteArray> roles;
Armin Felder's avatar
Armin Felder committed
    roles[static_cast<int>( UserRoles::UserName )] = QByteArrayLiteral( "username" );
    roles[static_cast<int>( UserRoles::UserId )] =  QByteArrayLiteral( "userId" );
    roles[static_cast<int>( UserRoles::name )] = QByteArrayLiteral( "name" );
    roles[static_cast<int>( UserRoles::status )] = QByteArrayLiteral( "status" );
Armin Felder's avatar
Armin Felder committed
    return roles;
}