diff --git a/src/models/emojimodel.cpp b/src/models/emojimodel.cpp index 15d60f598..b46ce9d85 100644 --- a/src/models/emojimodel.cpp +++ b/src/models/emojimodel.cpp @@ -14,6 +14,8 @@ EmojiModel::EmojiModel(QObject *parent) : QAbstractListModel(parent) + , m_config(KSharedConfig::openStateConfig()) + , m_configGroup(KConfigGroup(m_config, QStringLiteral("Editor"))) { if (_emojis.isEmpty()) { #include "emojis.h" @@ -61,9 +63,9 @@ QHash EmojiModel::roleNames() const return {{ShortNameRole, "shortName"}, {UnicodeRole, "unicode"}}; } -QVariantList EmojiModel::history() const +QStringList EmojiModel::lastUsedEmojis() const { - return m_settings.value(QStringLiteral("Editor/emojis"), QVariantList()).toList(); + return m_configGroup.readEntry(QStringLiteral("lastUsedEmojis"), QStringList()); } QVariantList EmojiModel::filterModel(const QString &filter, bool limit) @@ -93,19 +95,21 @@ QVariantList EmojiModel::filterModelNoCustom(const QString &filter, bool limit) void EmojiModel::emojiUsed(const QVariant &modelData) { - QVariantList list = history(); + auto list = lastUsedEmojis(); + const auto emoji = modelData.value(); auto it = list.begin(); while (it != list.end()) { - if ((*it).value().unicode == modelData.value().unicode) { + if (*it == emoji.shortName) { it = list.erase(it); } else { it++; } } - list.push_front(modelData); - m_settings.setValue(QStringLiteral("Editor/emojis"), list); + list.push_front(emoji.shortName); + + m_configGroup.writeEntry(QStringLiteral("lastUsedEmojis"), list); Q_EMIT historyChanged(); } @@ -113,11 +117,11 @@ void EmojiModel::emojiUsed(const QVariant &modelData) QVariantList EmojiModel::emojis(Category category) const { if (category == History) { - return history(); + return emojiHistory(); } if (category == HistoryNoCustom) { QVariantList list; - for (const auto &e : history()) { + for (const auto &e : emojiHistory()) { auto emoji = qvariant_cast(e); if (!emoji.isCustom) { list.append(e); @@ -217,4 +221,19 @@ QVariantList EmojiModel::categoriesWithCustom() const return cats; } +QVariantList EmojiModel::emojiHistory() const +{ + QVariantList list; + for (const auto &historicEmoji : lastUsedEmojis()) { + for (const auto &emojiCategory : _emojis) { + for (const auto &emoji : emojiCategory) { + if (qvariant_cast(emoji).shortName == historicEmoji) { + list.append(emoji); + } + } + } + } + return list; +} + #include "moc_emojimodel.cpp" diff --git a/src/models/emojimodel.h b/src/models/emojimodel.h index 4403d9033..0249e1a40 100644 --- a/src/models/emojimodel.h +++ b/src/models/emojimodel.h @@ -3,10 +3,11 @@ #pragma once +#include +#include #include #include #include -#include struct Emoji { Emoji(QString unicode, QString shortname, bool isCustom = false) @@ -63,11 +64,6 @@ class EmojiModel : public QAbstractListModel QML_ELEMENT QML_SINGLETON - /** - * @brief Return a list of recently used emojis. - */ - Q_PROPERTY(QVariantList history READ history NOTIFY historyChanged) - /** * @brief Return a list of emoji categories. * @@ -177,7 +173,11 @@ public: */ Q_INVOKABLE QVariantList tones(const QString &baseEmoji) const; - Q_INVOKABLE QVariantList history() const; + /** + * @brief Return a list of the last used emoji shortnames + */ + QStringList lastUsedEmojis() const; + QVariantList categories() const; QVariantList categoriesWithCustom() const; @@ -190,7 +190,10 @@ public Q_SLOTS: private: static QHash _emojis; - // TODO: Port away from QSettings - QSettings m_settings; + /// Returns QVariants containing the last used Emojis + QVariantList emojiHistory() const; + + KSharedConfig::Ptr m_config; + KConfigGroup m_configGroup; EmojiModel(QObject *parent = nullptr); };