2018-06-26 14:09:39 +02:00
|
|
|
#include "EmotePopup.hpp"
|
2017-09-16 00:05:06 +02:00
|
|
|
|
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"
|
2018-06-26 14:09:39 +02:00
|
|
|
#include "messages/MessageBuilder.hpp"
|
|
|
|
#include "providers/twitch/TwitchChannel.hpp"
|
|
|
|
#include "widgets/Notebook.hpp"
|
2017-09-16 00:05:06 +02:00
|
|
|
|
2018-04-27 22:11:19 +02:00
|
|
|
#include <QHBoxLayout>
|
2018-05-23 13:54:42 +02:00
|
|
|
#include <QShortcut>
|
2018-04-27 22:11:19 +02:00
|
|
|
#include <QTabWidget>
|
|
|
|
|
2017-09-15 17:23:49 +02:00
|
|
|
namespace chatterino {
|
2018-08-11 14:20:53 +02:00
|
|
|
namespace {
|
|
|
|
auto makeTitleMessage(const QString &title)
|
|
|
|
{
|
|
|
|
MessageBuilder builder;
|
|
|
|
builder.emplace<TextElement>(title, MessageElementFlag::Text);
|
|
|
|
builder->flags.set(MessageFlag::Centered);
|
|
|
|
return builder.release();
|
|
|
|
}
|
|
|
|
auto makeEmoteMessage(const EmoteMap &map)
|
|
|
|
{
|
|
|
|
MessageBuilder builder;
|
|
|
|
builder->flags.set(MessageFlag::Centered);
|
|
|
|
builder->flags.set(MessageFlag::DisableCompactEmotes);
|
2017-09-15 17:23:49 +02:00
|
|
|
|
2018-08-11 14:20:53 +02:00
|
|
|
for (const auto &emote : map) {
|
|
|
|
builder
|
|
|
|
.emplace<EmoteElement>(emote.second, MessageElementFlag::AlwaysShow)
|
|
|
|
->setLink(Link(Link::InsertText, emote.first.string));
|
|
|
|
}
|
|
|
|
|
|
|
|
return builder.release();
|
|
|
|
}
|
|
|
|
void addEmoteSets(std::vector<std::shared_ptr<TwitchAccount::EmoteSet>> sets,
|
|
|
|
Channel &globalChannel, Channel &subChannel)
|
2017-09-15 17:23:49 +02:00
|
|
|
{
|
2018-08-11 14:20:53 +02:00
|
|
|
for (const auto &set : sets) {
|
|
|
|
auto &channel = set->key == "0" ? globalChannel : subChannel;
|
2017-09-16 00:05:06 +02:00
|
|
|
|
2018-08-11 14:20:53 +02:00
|
|
|
// TITLE
|
|
|
|
auto text =
|
|
|
|
set->key == "0" || set->text.isEmpty() ? "Twitch" : set->text;
|
|
|
|
channel.addMessage(makeTitleMessage(text));
|
2018-01-27 21:13:22 +01:00
|
|
|
|
2018-08-11 14:20:53 +02:00
|
|
|
// EMOTES
|
|
|
|
MessageBuilder builder;
|
|
|
|
builder->flags.set(MessageFlag::Centered);
|
|
|
|
builder->flags.set(MessageFlag::DisableCompactEmotes);
|
|
|
|
|
|
|
|
for (const auto &emote : set->emotes) {
|
|
|
|
builder
|
|
|
|
.emplace<EmoteElement>(
|
|
|
|
getApp()->emotes->twitch.getOrCreateEmote(emote.id,
|
|
|
|
emote.name),
|
|
|
|
MessageElementFlag::AlwaysShow)
|
|
|
|
->setLink(Link(Link::InsertText, emote.name.string));
|
|
|
|
}
|
2017-12-28 00:48:21 +01:00
|
|
|
|
2018-08-11 14:20:53 +02:00
|
|
|
channel.addMessage(builder.release());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
EmotePopup::EmotePopup()
|
|
|
|
: BaseWindow(nullptr, BaseWindow::EnableCustomFrame)
|
|
|
|
{
|
|
|
|
auto layout = new QVBoxLayout(this);
|
2018-04-18 17:51:53 +02:00
|
|
|
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);
|
2018-04-18 17:51:53 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2018-01-24 13:15:41 +01: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");
|
2017-09-16 00:05:06 +02:00
|
|
|
|
2018-08-11 14:20:53 +02:00
|
|
|
this->setWindowTitle("Emotes from " + _channel->getName());
|
2017-09-16 00:05:06 +02:00
|
|
|
|
2018-08-11 14:20:53 +02:00
|
|
|
auto twitchChannel = dynamic_cast<TwitchChannel *>(_channel.get());
|
|
|
|
if (twitchChannel == nullptr) return;
|
2017-09-16 00:05:06 +02:00
|
|
|
|
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));
|
2017-09-16 00:05:06 +02:00
|
|
|
};
|
|
|
|
|
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, *getApp()->emotes->bttv.global(), "BetterTTV");
|
|
|
|
addEmotes(*globalChannel, *getApp()->emotes->ffz.global(), "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);
|
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
|
2018-06-28 19:38:57 +02:00
|
|
|
MessageBuilder builder;
|
2018-08-07 07:55:31 +02:00
|
|
|
builder->flags.set(MessageFlag::Centered);
|
|
|
|
builder->flags.set(MessageFlag::DisableCompactEmotes);
|
2018-01-11 20:16:25 +01:00
|
|
|
|
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-01-11 20:16:25 +01:00
|
|
|
});
|
2018-08-07 01:35:24 +02:00
|
|
|
emojiChannel->addMessage(builder.release());
|
2017-09-16 16:20:10 +02:00
|
|
|
|
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
|
|
|
|
2017-09-23 18:37:51 +02:00
|
|
|
} // namespace chatterino
|