mirror-chatterino2/src/common/CompletionModel.hpp

70 lines
1.6 KiB
C++
Raw Normal View History

2017-12-31 00:50:07 +01:00
#pragma once
2018-06-26 15:33:51 +02:00
#include "common/Common.hpp"
2017-12-31 00:50:07 +01:00
#include <QAbstractListModel>
2018-03-30 13:50:43 +02:00
#include <chrono>
#include <mutex>
#include <set>
2017-12-31 00:50:07 +01:00
namespace chatterino {
2017-12-31 00:50:07 +01:00
class CompletionModel : public QAbstractListModel
{
struct TaggedString {
enum Type {
Username,
2017-12-31 00:50:07 +01:00
2018-07-06 17:42:00 +02:00
// emotes
EmoteStart,
FFZGlobalEmote,
FFZChannelEmote,
BTTVGlobalEmote,
BTTVChannelEmote,
TwitchGlobalEmote,
TwitchSubscriberEmote,
Emoji,
2018-07-06 17:42:00 +02:00
EmoteEnd,
// end emotes
2018-06-24 11:24:21 +02:00
Command,
2018-03-30 13:50:43 +02:00
};
2018-07-06 17:42:00 +02:00
TaggedString(const QString &_str, Type _type);
2018-03-30 13:50:43 +02:00
2018-07-06 17:42:00 +02:00
bool isExpired(const std::chrono::steady_clock::time_point &now) const;
bool isEmote() const;
bool operator<(const TaggedString &that) const;
2018-03-30 13:50:43 +02:00
2018-07-06 17:42:00 +02:00
QString str;
2018-03-30 13:50:43 +02:00
// Type will help decide the lifetime of the tagged strings
Type type;
mutable std::chrono::steady_clock::time_point timeAdded;
};
public:
CompletionModel(const QString &_channelName);
2018-07-06 17:42:00 +02:00
virtual int columnCount(const QModelIndex &) const override;
virtual QVariant data(const QModelIndex &index, int) const override;
virtual int rowCount(const QModelIndex &) const override;
void refresh();
void addString(const QString &str, TaggedString::Type type);
void addUser(const QString &str);
2018-07-06 17:42:00 +02:00
void clearExpiredStrings();
2018-03-30 13:50:43 +02:00
private:
2018-07-06 17:42:00 +02:00
TaggedString createUser(const QString &str);
2018-07-06 17:42:00 +02:00
mutable std::mutex emotesMutex_;
std::set<TaggedString> emotes_;
2017-12-31 00:50:07 +01:00
2018-07-06 17:42:00 +02:00
QString channelName_;
2017-12-31 00:50:07 +01:00
};
} // namespace chatterino