mirror-chatterino2/src/widgets/dialogs/EmotePopup.cpp

210 lines
6.8 KiB
C++
Raw Normal View History

2018-06-26 14:09:39 +02:00
#include "EmotePopup.hpp"
2018-06-26 14:09:39 +02:00
#include "Application.hpp"
#include "controllers/accounts/AccountController.hpp"
2018-08-11 14:20:53 +02:00
#include "debug/Benchmark.hpp"
#include "messages/Message.hpp"
2018-06-26 14:09:39 +02:00
#include "messages/MessageBuilder.hpp"
#include "providers/twitch/TwitchChannel.hpp"
#include "singletons/Emotes.hpp"
2018-06-26 14:09:39 +02:00
#include "widgets/Notebook.hpp"
#include "widgets/helper/ChannelView.hpp"
#include <QHBoxLayout>
2018-05-23 13:54:42 +02:00
#include <QShortcut>
#include <QTabWidget>
2017-09-15 17:23:49 +02:00
namespace chatterino {
2018-08-11 14:20:53 +02:00
namespace {
2018-08-15 22:46:20 +02:00
auto makeTitleMessage(const QString &title)
{
MessageBuilder builder;
builder.emplace<TextElement>(title, MessageElementFlag::Text);
builder->flags.set(MessageFlag::Centered);
return builder.release();
2018-08-11 14:20:53 +02:00
}
2018-08-15 22:46:20 +02:00
auto makeEmoteMessage(const EmoteMap &map)
{
2018-08-11 14:20:53 +02:00
MessageBuilder builder;
builder->flags.set(MessageFlag::Centered);
builder->flags.set(MessageFlag::DisableCompactEmotes);
2018-10-21 13:43:02 +02:00
if (!map.empty())
{
for (const auto &emote : map)
{
builder
.emplace<EmoteElement>(emote.second,
MessageElementFlag::AlwaysShow)
->setLink(Link(Link::InsertText, emote.first.string));
}
2018-10-21 13:43:02 +02:00
}
else
{
builder.emplace<TextElement>("no emotes available",
MessageElementFlag::Text,
MessageColor::System);
2018-08-11 14:20:53 +02:00
}
2018-08-15 22:46:20 +02:00
return builder.release();
}
void addEmoteSets(
std::vector<std::shared_ptr<TwitchAccount::EmoteSet>> sets,
Channel &globalChannel, Channel &subChannel)
{
QMap<QString, QPair<bool, std::vector<MessagePtr>>> mapOfSets;
2018-08-15 22:46:20 +02:00
2018-10-21 13:43:02 +02:00
for (const auto &set : sets)
{
2018-08-15 22:46:20 +02:00
// TITLE
auto channelName = set->channelName;
2018-08-15 22:46:20 +02:00
auto text =
set->key == "0" || set->text.isEmpty() ? "Twitch" : set->text;
// EMOTES
MessageBuilder builder;
builder->flags.set(MessageFlag::Centered);
builder->flags.set(MessageFlag::DisableCompactEmotes);
// If value of map is empty, create init pair and add title.
2018-10-21 13:43:02 +02:00
if (mapOfSets.find(channelName) == mapOfSets.end())
{
std::vector<MessagePtr> b;
b.push_back(makeTitleMessage(text));
mapOfSets[channelName] = qMakePair(set->key == "0", b);
}
2018-10-21 13:43:02 +02:00
for (const auto &emote : set->emotes)
{
2018-08-15 22:46:20 +02:00
builder
.emplace<EmoteElement>(
getApp()->emotes->twitch.getOrCreateEmote(emote.id,
emote.name),
MessageElementFlag::AlwaysShow)
->setLink(Link(Link::InsertText, emote.name.string));
}
mapOfSets[channelName].second.push_back(builder.release());
}
// Output to channel all created messages,
// That contain title or emotes.
2018-10-21 13:43:02 +02:00
foreach (auto pair, mapOfSets)
{
auto &channel = pair.first ? globalChannel : subChannel;
2018-10-21 13:43:02 +02:00
for (auto message : pair.second)
{
channel.addMessage(message);
}
2018-08-15 22:46:20 +02:00
}
2018-08-11 14:20:53 +02:00
}
} // namespace
EmotePopup::EmotePopup()
: BaseWindow(nullptr, BaseWindow::EnableCustomFrame)
{
auto layout = new QVBoxLayout(this);
this->getLayoutContainer()->setLayout(layout);
2017-12-19 03:18:00 +01:00
2018-08-11 14:20:53 +02:00
auto notebook = new Notebook(this);
layout->addWidget(notebook);
layout->setMargin(0);
2018-08-11 17:15:17 +02:00
auto clicked = [this](const Link &link) { this->linkClicked.invoke(link); };
2018-08-11 14:20:53 +02:00
auto makeView = [&](QString tabTitle) {
auto view = new ChannelView();
view->setOverrideFlags(MessageElementFlags{
MessageElementFlag::Default, MessageElementFlag::AlwaysShow,
MessageElementFlag::EmoteImages});
view->setEnableScrollingToBottom(false);
notebook->addPage(view, tabTitle);
2018-08-11 17:15:17 +02:00
view->linkClicked.connect(clicked);
2018-08-11 14:20:53 +02:00
return view;
};
this->subEmotesView_ = makeView("Subs");
this->channelEmotesView_ = makeView("Channel");
this->globalEmotesView_ = makeView("Global");
this->viewEmojis_ = makeView("Emojis");
2017-12-19 03:18:00 +01:00
this->loadEmojis();
2017-09-15 17:23:49 +02:00
}
void EmotePopup::loadChannel(ChannelPtr _channel)
2017-09-15 17:23:49 +02:00
{
2018-08-11 14:20:53 +02:00
BenchmarkGuard guard("loadChannel");
2018-09-04 21:39:54 +02:00
this->setWindowTitle("Emotes in #" + _channel->getName());
2018-08-11 14:20:53 +02:00
auto twitchChannel = dynamic_cast<TwitchChannel *>(_channel.get());
2018-10-21 13:43:02 +02:00
if (twitchChannel == nullptr)
return;
2018-08-11 14:20:53 +02:00
auto addEmotes = [&](Channel &channel, const EmoteMap &map,
const QString &title) {
channel.addMessage(makeTitleMessage(title));
channel.addMessage(makeEmoteMessage(map));
};
2018-08-11 14:20:53 +02:00
auto subChannel = std::make_shared<Channel>("", Channel::Type::None);
auto globalChannel = std::make_shared<Channel>("", Channel::Type::None);
auto channelChannel = std::make_shared<Channel>("", Channel::Type::None);
2017-12-17 02:18:13 +01:00
2018-08-11 14:20:53 +02:00
// twitch
addEmoteSets(
getApp()->accounts->twitch.getCurrent()->accessEmotes()->emoteSets,
*globalChannel, *subChannel);
2018-05-31 16:20:46 +02:00
2018-08-11 14:20:53 +02:00
// global
addEmotes(*globalChannel, *twitchChannel->globalBttv().emotes(),
"BetterTTV");
addEmotes(*globalChannel, *twitchChannel->globalFfz().emotes(),
"FrankerFaceZ");
2018-05-31 16:20:46 +02:00
2018-08-11 14:20:53 +02:00
// channel
2018-08-11 17:15:17 +02:00
addEmotes(*channelChannel, *twitchChannel->bttvEmotes(), "BetterTTV");
addEmotes(*channelChannel, *twitchChannel->ffzEmotes(), "FrankerFaceZ");
2018-05-31 16:20:46 +02:00
2018-08-11 14:20:53 +02:00
this->globalEmotesView_->setChannel(globalChannel);
this->subEmotesView_->setChannel(subChannel);
this->channelEmotesView_->setChannel(channelChannel);
2018-11-03 21:26:57 +01:00
if (subChannel->getMessageSnapshot().size() == 0)
2018-10-21 13:43:02 +02:00
{
MessageBuilder builder;
builder->flags.set(MessageFlag::Centered);
builder->flags.set(MessageFlag::DisableCompactEmotes);
builder.emplace<TextElement>("no subscription emotes available",
MessageElementFlag::Text,
MessageColor::System);
subChannel->addMessage(builder.release());
}
2017-12-19 03:18:00 +01:00
}
void EmotePopup::loadEmojis()
{
2018-06-05 18:53:49 +02:00
auto &emojis = getApp()->emotes->emojis.emojis;
2017-12-19 03:18:00 +01:00
2018-07-06 17:30:12 +02:00
ChannelPtr emojiChannel(new Channel("", Channel::Type::None));
2017-12-19 03:18:00 +01:00
// emojis
MessageBuilder builder;
2018-08-07 07:55:31 +02:00
builder->flags.set(MessageFlag::Centered);
builder->flags.set(MessageFlag::DisableCompactEmotes);
2018-08-02 14:23:27 +02:00
emojis.each([&builder](const auto &key, const auto &value) {
2018-08-07 01:35:24 +02:00
builder
2018-08-07 07:55:31 +02:00
.emplace<EmoteElement>(value->emote, MessageElementFlag::AlwaysShow)
2018-08-07 01:35:24 +02:00
->setLink(
Link(Link::Type::InsertText, ":" + value->shortCodes[0] + ":"));
});
2018-08-07 01:35:24 +02:00
emojiChannel->addMessage(builder.release());
2018-07-06 19:23:47 +02:00
this->viewEmojis_->setChannel(emojiChannel);
2017-09-15 17:23:49 +02:00
}
2017-12-17 02:10:35 +01:00
} // namespace chatterino