Skip to content
Snippets Groups Projects
emojismodel.cpp 3.93 KiB
Newer Older
Armin Felder's avatar
d
Armin Felder committed
#include "emojismodel.h"
Armin Felder's avatar
sa  
Armin Felder committed
#include <QDebug>
Armin Felder's avatar
d
Armin Felder committed

EmojisModel::EmojisModel()
{
Armin Felder's avatar
Armin Felder committed
    mDuplicateCheck.reserve( 2000 );
Armin Felder's avatar
d
Armin Felder committed
}

int EmojisModel::rowCount( const QModelIndex &parent ) const
{
Armin Felder's avatar
Armin Felder committed
    Q_UNUSED( parent );

Armin Felder's avatar
d
Armin Felder committed
    if ( mData.contains( mCurrentCategory ) ) {
        return mData[mCurrentCategory].size();
    }
Armin Felder's avatar
as  
Armin Felder committed

    return 0;

Armin Felder's avatar
d
Armin Felder committed
}

QVariant EmojisModel::data( const QModelIndex &index, int role ) const
{
    int row = index.row();

    auto list = mData[mCurrentCategory];
    auto emoji = list[row];

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

    switch ( roleType ) {
        case EmojiRoles::emojiText:
Armin Felder's avatar
d
Armin Felder committed
            return emoji->getIdentifier();

Armin Felder's avatar
Armin Felder committed
        case EmojiRoles::image:
Armin Felder's avatar
d
Armin Felder committed
            return emoji->getFilePath();

Armin Felder's avatar
Armin Felder committed
        case EmojiRoles::category:
Armin Felder's avatar
d
Armin Felder committed
            return emoji->getCategory();

Armin Felder's avatar
Armin Felder committed
        case EmojiRoles::order:
Armin Felder's avatar
d
Armin Felder committed
            return emoji->getOrder();

Armin Felder's avatar
Armin Felder committed
        case EmojiRoles::custom:
Armin Felder's avatar
d
Armin Felder committed
            if ( emoji->getCategory() == "custom" ) {
                return true;
            } else {
                return false;
            }
    }
}

Armin Felder's avatar
Armin Felder committed
void EmojisModel::addEmoji( const QSharedPointer<Emoji> &pEmoji )
Armin Felder's avatar
d
Armin Felder committed
{
    if ( !mDuplicateCheck.contains( pEmoji->getIdentifier() ) ) {
        auto category = pEmoji->getCategory();
        int order = pEmoji->getOrder();

        if ( mData.contains( category ) ) {
            auto list = mData[category];
            auto firstElem = list.first();
            auto lastElem = list.last();

            if ( order <= firstElem->getOrder() ) {
                list.prepend( pEmoji );
            } else if ( order >= lastElem->getOrder() ) {
                list.append( pEmoji );
            } else {
                int orderDiffLast = lastElem->getOrder() - order;
                int listLength = list.length();

                if ( orderDiffLast > order ) {
                    for ( int i = listLength; i >= 0; i-- ) {
                        if ( list[i]->getOrder() >= order ) {
                            list.insert( i - 1, pEmoji );
                        }
                    }
                } else {
                    for ( int i = 0; i < listLength; i++ ) {
                        if ( list[i]->getOrder() <= order ) {
                            list.insert( i, pEmoji );
                        }
                    }
                }
            }

        } else {
            mData.insert( category, {pEmoji} );
        }

        mDuplicateCheck.insert( pEmoji->getIdentifier() );
    }
}

Armin Felder's avatar
Armin Felder committed
void EmojisModel::addEmojisByCategory( const QString &pCategory, const QList<QSharedPointer<Emoji> > &pList )
Armin Felder's avatar
d
Armin Felder committed
{
    if ( mCurrentCategory == pCategory ) {
        beginResetModel();
    }

    if ( !mData.contains( pCategory ) ) {
        mData.insert( pCategory, QList<QSharedPointer<Emoji>>() );
Armin Felder's avatar
Armin Felder committed
        mData[pCategory].reserve( 600 );
Armin Felder's avatar
d
Armin Felder committed
    }

    for ( auto &element : pList ) {
Armin Felder's avatar
d
Armin Felder committed
        if ( !mDuplicateCheck.contains( element->getIdentifier() ) ) {
            mDuplicateCheck.insert( element->getIdentifier() );
Armin Felder's avatar
as  
Armin Felder committed
            mData[pCategory].append( element );
Armin Felder's avatar
d
Armin Felder committed
        }
    }

    if ( mCurrentCategory == pCategory ) {
        endResetModel();
    }

}

void EmojisModel::clear()
{
    mData.clear();
    mDuplicateCheck.clear();
    mCurrentCategory.clear();
}

QHash<int, QByteArray> EmojisModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[static_cast<int>( EmojiRoles::emojiText )] = QByteArrayLiteral( "emojiText" );
    roles[static_cast<int>( EmojiRoles::category )] = QByteArrayLiteral( "category" );
    roles[static_cast<int>( EmojiRoles::image )] = QByteArrayLiteral( "image" );
    roles[static_cast<int>( EmojiRoles::order )] = QByteArrayLiteral( "order" );
    roles[static_cast<int>( EmojiRoles::custom )] = QByteArrayLiteral( "custom" );
    return roles;
}

QString EmojisModel::currentCategory() const
{
    return mCurrentCategory;
}

void EmojisModel::setCurrentCategory( const QString &currentCategory )
{
    beginResetModel();
    mCurrentCategory = currentCategory;
    endResetModel();
}