From 85ceec7b44a3d82169d121decca3d437dabe8688 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Thu, 2 May 2019 14:20:04 +0800 Subject: [PATCH] Basic emoji history support. #96 --- .../Spectral/Component/Emoji/EmojiPicker.qml | 32 +++++++++++++-- src/emojimodel.cpp | 32 ++++++++------- src/emojimodel.h | 39 ++++++++++++++++++- src/main.cpp | 2 + src/messageeventmodel.h | 4 +- 5 files changed, 89 insertions(+), 20 deletions(-) diff --git a/imports/Spectral/Component/Emoji/EmojiPicker.qml b/imports/Spectral/Component/Emoji/EmojiPicker.qml index 019357f..9991eb8 100644 --- a/imports/Spectral/Component/Emoji/EmojiPicker.qml +++ b/imports/Spectral/Component/Emoji/EmojiPicker.qml @@ -9,7 +9,7 @@ import Spectral 0.1 import Spectral.Setting 0.1 ColumnLayout { - property string emojiCategory: "people" + property string emojiCategory: "history" property var textArea property var emojiModel @@ -28,6 +28,7 @@ ColumnLayout { orientation: ListView.Horizontal model: ListModel { + ListElement { label: "⌛️"; category: "history" } ListElement { label: "😏"; category: "people" } ListElement { label: "🌲"; category: "nature" } ListElement { label: "🍛"; category: "food"} @@ -85,7 +86,29 @@ ColumnLayout { clip: true - model: emojiModel.model[emojiCategory] + model: { + switch (emojiCategory) { + case "history": + return emojiModel.history + case "people": + return emojiModel.people + case "nature": + return emojiModel.nature + case "food": + return emojiModel.food + case "activity": + return emojiModel.activity + case "travel": + return emojiModel.travel + case "objects": + return emojiModel.objects + case "symbols": + return emojiModel.symbols + case "flags": + return emojiModel.flags + } + return null + } delegate: ItemDelegate { width: 48 @@ -99,7 +122,10 @@ ColumnLayout { text: modelData.unicode } - onClicked: textArea.insert(textArea.cursorPosition, modelData.unicode) + onClicked: { + textArea.insert(textArea.cursorPosition, modelData.unicode) + emojiModel.emojiUsed(modelData) + } } ScrollBar.vertical: ScrollBar {} diff --git a/src/emojimodel.cpp b/src/emojimodel.cpp index edf6787..9f0ee42 100644 --- a/src/emojimodel.cpp +++ b/src/emojimodel.cpp @@ -20,19 +20,8 @@ #include "emojimodel.h" -QVariantMap EmojiModel::getModel() { - QVariantMap map; - - map.insert("people", people); - map.insert("nature", nature); - map.insert("food", food); - map.insert("activity", activity); - map.insert("travel", travel); - map.insert("objects", objects); - map.insert("symbols", symbols); - map.insert("flags", flags); - - return map; +QVariantList EmojiModel::history() { + return m_settings->value("Editor/emojis", QVariantList()).toList(); } QVariantList EmojiModel::filterModel(const QString& filter) { @@ -90,6 +79,23 @@ QVariantList EmojiModel::filterModel(const QString& filter) { return result; } +void EmojiModel::emojiUsed(QVariant modelData) { + QVariantList list = history(); + + auto it = list.begin(); + while (it != list.end()) { + if ((*it).value().unicode == modelData.value().unicode) { + it = list.erase(it); + } else + it++; + } + + list.push_front(modelData); + m_settings->setValue("Editor/emojis", list); + + emit historyChanged(); +} + const QVariantList EmojiModel::people = { QVariant::fromValue( Emoji{QString::fromUtf8("\xf0\x9f\x98\x80"), ":grinning:"}), diff --git a/src/emojimodel.h b/src/emojimodel.h index 2f76df6..f0385f0 100644 --- a/src/emojimodel.h +++ b/src/emojimodel.h @@ -2,6 +2,7 @@ #define EMOJIMODEL_H #include +#include #include #include @@ -9,6 +10,18 @@ struct Emoji { Emoji(const QString& u, const QString& s) : unicode(u), shortname(s) {} Emoji() {} + friend QDataStream& operator<<(QDataStream& arch, const Emoji& object) { + arch << object.unicode; + arch << object.shortname; + return arch; + } + + friend QDataStream& operator>>(QDataStream& arch, Emoji& object) { + arch >> object.unicode; + arch >> object.shortname; + return arch; + } + QString unicode; QString shortname; @@ -21,11 +34,31 @@ Q_DECLARE_METATYPE(Emoji) class EmojiModel : public QObject { Q_OBJECT - Q_PROPERTY(QVariantMap model READ getModel CONSTANT) + + Q_PROPERTY(QVariantList history READ history NOTIFY historyChanged) + + Q_PROPERTY(QVariantList people MEMBER people CONSTANT) + Q_PROPERTY(QVariantList nature MEMBER nature CONSTANT) + Q_PROPERTY(QVariantList food MEMBER food CONSTANT) + Q_PROPERTY(QVariantList activity MEMBER activity CONSTANT) + Q_PROPERTY(QVariantList travel MEMBER travel CONSTANT) + Q_PROPERTY(QVariantList objects MEMBER objects CONSTANT) + Q_PROPERTY(QVariantList symbols MEMBER symbols CONSTANT) + Q_PROPERTY(QVariantList flags MEMBER flags CONSTANT) + public: - Q_INVOKABLE QVariantMap getModel(); + explicit EmojiModel(QObject* parent = nullptr) + : QObject(parent), m_settings(new QSettings()) {} + + Q_INVOKABLE QVariantList history(); Q_INVOKABLE QVariantList filterModel(const QString& filter); + signals: + void historyChanged(); + + public slots: + void emojiUsed(QVariant modelData); + private: static const QVariantList people; static const QVariantList nature; @@ -35,6 +68,8 @@ class EmojiModel : public QObject { static const QVariantList objects; static const QVariantList symbols; static const QVariantList flags; + + QSettings* m_settings; }; #endif // EMOJIMODEL_H diff --git a/src/main.cpp b/src/main.cpp index 0f57107..60727f3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -67,6 +67,8 @@ int main(int argc, char* argv[]) { qRegisterMetaType("SpectralRoom*"); qRegisterMetaType("SpectralUser*"); + qRegisterMetaTypeStreamOperators(); + QQmlApplicationEngine engine; engine.addImportPath("qrc:/imports"); diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h index a828f99..00b9c3a 100644 --- a/src/messageeventmodel.h +++ b/src/messageeventmodel.h @@ -8,7 +8,7 @@ class MessageEventModel : public QAbstractListModel { Q_OBJECT - Q_PROPERTY(SpectralRoom* room READ getRoom WRITE setRoom NOTIFY roomChanged) + Q_PROPERTY(SpectralRoom* room READ room WRITE setRoom NOTIFY roomChanged) public: enum EventRoles { @@ -40,7 +40,7 @@ class MessageEventModel : public QAbstractListModel { explicit MessageEventModel(QObject* parent = nullptr); ~MessageEventModel(); - SpectralRoom* getRoom() { return m_currentRoom; } + SpectralRoom* room() { return m_currentRoom; } void setRoom(SpectralRoom* room); int rowCount(const QModelIndex& parent = QModelIndex()) const override;