6#include "emojisortfilterproxymodel.h"
8#include "emoticonunicodeutils.h"
10using namespace TextEmoticonsCore;
12class EmojiSortFilterProxyModel::EmojiProxyModelPrivate
15 EmojiProxyModelPrivate(EmojiSortFilterProxyModel *qq)
21 q->setSearchIdentifier(QString());
24 [[nodiscard]] QString emojiToneSuffix()
const
27 case EmojiModelManager::EmojiTone::All:
28 case EmojiModelManager::EmojiTone::Original:
30 case EmojiModelManager::EmojiTone::Light:
32 case EmojiModelManager::EmojiTone::MediumLight:
34 case EmojiModelManager::EmojiTone::Medium:
36 case EmojiModelManager::EmojiTone::MediumDark:
38 case EmojiModelManager::EmojiTone::Dark:
44 bool filterTone(
int source_row,
const QModelIndex &source_parent)
const
46 if (tone == EmojiModelManager::EmojiTone::Original) {
47 const QModelIndex sourceIndex = q->sourceModel()->index(source_row, 0, source_parent);
48 const QString identifier = sourceIndex.
data(EmojiModel::Identifier).
toString();
49 if (!identifier.
contains(
"_tone"_L1)) {
54 const QString suffix = emojiToneSuffix();
58 const QModelIndex sourceIndex = q->sourceModel()->index(source_row, 0, source_parent);
59 const QString identifier = sourceIndex.
data(EmojiModel::Identifier).
toString();
60 const bool diversityChildren = sourceIndex.
data(EmojiModel::DiversityChildren).
toBool();
61 if (diversityChildren) {
66 }
else if (!identifier.
contains(
"_tone"_L1)) {
74 QStringList recentEmoticons;
75 QString searchIdentifier;
76 EmojiModelManager::EmojiTone tone = EmojiModelManager::EmojiTone::All;
77 EmojiSortFilterProxyModel *
const q;
80EmojiSortFilterProxyModel::EmojiSortFilterProxyModel(
QObject *parent)
85 setFilterRole(EmojiModel::Identifier);
89EmojiSortFilterProxyModel::~EmojiSortFilterProxyModel() =
default;
91bool EmojiSortFilterProxyModel::filterAcceptsRow(
int source_row,
const QModelIndex &source_parent)
const
93 if (d->category.isEmpty()) {
96 if (!d->searchIdentifier.isEmpty()) {
97 const QModelIndex sourceIndex =
sourceModel()->index(source_row, 0, source_parent);
98 const QString identifier = sourceIndex.
data(EmojiModel::Identifier).
toString();
99 if (d->filterTone(source_row, source_parent) && identifier.
contains(d->searchIdentifier)) {
104 if (d->category == TextEmoticonsCore::EmoticonUnicodeUtils::recentIdentifier()) {
105 const QModelIndex sourceIndex =
sourceModel()->index(source_row, 0, source_parent);
106 const QString identifier = sourceIndex.
data(EmojiModel::Identifier).
toString();
107 if (d->recentEmoticons.contains(identifier)) {
111 const QModelIndex sourceIndex =
sourceModel()->index(source_row, 0, source_parent);
112 const auto category = sourceIndex.
data(EmojiModel::Category).
toString();
113 if (d->filterTone(source_row, source_parent) && d->category == category) {
120EmojiModelManager::EmojiTone EmojiSortFilterProxyModel::emojiTone()
const
125void EmojiSortFilterProxyModel::setEmojiTone(EmojiModelManager::EmojiTone tone)
127 if (d->tone != tone) {
130 Q_EMIT emojiToneChanged();
134QString EmojiSortFilterProxyModel::searchIdentifier()
const
136 return d->searchIdentifier;
139void EmojiSortFilterProxyModel::setSearchIdentifier(
const QString &newSearchIdentifier)
141 if (d->searchIdentifier != newSearchIdentifier) {
142 d->searchIdentifier = newSearchIdentifier;
147QStringList EmojiSortFilterProxyModel::recentEmoticons()
const
149 return d->recentEmoticons;
152void EmojiSortFilterProxyModel::setRecentEmoticons(
const QStringList &newRecentEmoticons)
154 if (d->recentEmoticons != newRecentEmoticons) {
155 d->recentEmoticons = newRecentEmoticons;
156 if (TextEmoticonsCore::EmoticonUnicodeUtils::recentIdentifier() == d->category) {
159 Q_EMIT recentEmoticonsChanged();
163QString EmojiSortFilterProxyModel::category()
const
168void EmojiSortFilterProxyModel::setCategory(
const QString &newCategorie)
170 if (d->category != newCategorie) {
171 d->category = newCategorie;
172 if (!d->searchIdentifier.isEmpty()) {
177 if ((TextEmoticonsCore::EmoticonUnicodeUtils::recentIdentifier() == d->category)
178 || (TextEmoticonsCore::EmoticonUnicodeUtils::customIdentifier() == d->category)) {
186bool EmojiSortFilterProxyModel::lessThan(
const QModelIndex &left,
const QModelIndex &right)
const
188 if (TextEmoticonsCore::EmoticonUnicodeUtils::recentIdentifier() == d->category) {
189 const QString leftIdentifier =
sourceModel()->data(left, EmojiModel::Identifier).toString();
190 const QString rightIdentifier =
sourceModel()->data(right, EmojiModel::Identifier).toString();
191 const int positionIdentifierLeft = d->recentEmoticons.indexOf(leftIdentifier);
192 const int positionIdentifierRight = d->recentEmoticons.indexOf(rightIdentifier);
197 return positionIdentifierLeft < positionIdentifierRight;
199 const int leftOrder =
sourceModel()->data(left, EmojiModel::Order).toInt();
200 const int rightOrder =
sourceModel()->data(right, EmojiModel::Order).toInt();
202 return leftOrder < rightOrder;
206QString EmojiSortFilterProxyModel::emojiToneSuffix()
const
208 return d->emojiToneSuffix();
211#include "moc_emojisortfilterproxymodel.cpp"
The EmojiProxyModel class.
QVariant data(int role) const const
virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
bool toBool() const const
QString toString() const const