refactored EnumFlags

This commit is contained in:
fourtf 2018-08-07 07:55:31 +02:00
parent bfa75330a4
commit 381177dd24
24 changed files with 422 additions and 394 deletions

View file

@ -191,7 +191,7 @@ void Application::initPubsub()
} }
MessageBuilder msg(action); MessageBuilder msg(action);
msg->flags |= Message::PubSub; msg->flags.set(MessageFlag::PubSub);
postToThread([chan, msg = msg.release()] { postToThread([chan, msg = msg.release()] {
chan->addOrReplaceTimeout(msg); chan->addOrReplaceTimeout(msg);

View file

@ -104,21 +104,24 @@ void Channel::addOrReplaceTimeout(MessagePtr message)
break; break;
} }
if (s->flags.HasFlag(Message::Untimeout) && if (s->flags.has(MessageFlag::Untimeout) &&
s->timeoutUser == message->timeoutUser) { s->timeoutUser == message->timeoutUser) {
break; break;
} }
if (s->flags.HasFlag(Message::Timeout) && if (s->flags.has(MessageFlag::Timeout) &&
s->timeoutUser == message->timeoutUser) { s->timeoutUser == message->timeoutUser) //
if (message->flags.HasFlag(Message::PubSub) && {
!s->flags.HasFlag(Message::PubSub)) { if (message->flags.has(MessageFlag::PubSub) &&
!s->flags.has(MessageFlag::PubSub)) //
{
this->replaceMessage(s, message); this->replaceMessage(s, message);
addMessage = false; addMessage = false;
break; break;
} }
if (!message->flags.HasFlag(Message::PubSub) && if (!message->flags.has(MessageFlag::PubSub) &&
s->flags.HasFlag(Message::PubSub)) { s->flags.has(MessageFlag::PubSub)) //
{
addMessage = false; addMessage = false;
break; break;
} }
@ -142,10 +145,10 @@ void Channel::addOrReplaceTimeout(MessagePtr message)
// disable the messages from the user // disable the messages from the user
for (int i = 0; i < snapshotLength; i++) { for (int i = 0; i < snapshotLength; i++) {
auto &s = snapshot[i]; auto &s = snapshot[i];
if ((s->flags & (Message::Timeout | Message::Untimeout)) == 0 && if (s->flags.hasNone({MessageFlag::Timeout, MessageFlag::Untimeout}) &&
s->loginName == message->timeoutUser) { s->loginName == message->timeoutUser) {
// FOURTF: disabled for now // FOURTF: disabled for now
// s->flags.EnableFlag(Message::Disabled); // s->flags.EnableFlag(MessageFlag::Disabled);
} }
} }
@ -163,12 +166,12 @@ void Channel::disableAllMessages()
int snapshotLength = snapshot.getLength(); int snapshotLength = snapshot.getLength();
for (int i = 0; i < snapshotLength; i++) { for (int i = 0; i < snapshotLength; i++) {
auto &s = snapshot[i]; auto &s = snapshot[i];
if (s->flags & Message::System || s->flags & Message::Timeout) { if (s->flags.hasAny({MessageFlag::System, MessageFlag::Timeout})) {
continue; continue;
} }
// FOURTF: disabled for now // FOURTF: disabled for now
// s->flags.EnableFlag(Message::Disabled); // s->flags.EnableFlag(MessageFlag::Disabled);
} }
} }

View file

@ -15,43 +15,26 @@ public:
{ {
} }
FlagsEnum(T _value) FlagsEnum(T value)
: value(_value) : value(value)
{ {
} }
inline T operator~() const FlagsEnum(std::initializer_list<T> flags)
{ {
return (T) ~(Q)this->value; for (auto flag : flags) {
} this->set(flag);
inline T operator|(Q a) const }
{
return (T)((Q)a | (Q)this->value);
}
inline T operator&(Q a) const
{
return (T)((Q)a & (Q)this->value);
}
inline T operator^(Q a) const
{
return (T)((Q)a ^ (Q)this->value);
}
inline T &operator|=(const Q &a)
{
return (T &)((Q &)this->value |= (Q)a);
}
inline T &operator&=(const Q &a)
{
return (T &)((Q &)this->value &= (Q)a);
}
inline T &operator^=(const Q &a)
{
return (T &)((Q &)this->value ^= (Q)a);
} }
void EnableFlag(T flag) bool operator==(const FlagsEnum<T> &other)
{ {
reinterpret_cast<Q &>(this->value) |= static_cast<Q>(flag); return this->value == other.value;
}
bool operator!=(const FlagsEnum &other)
{
return this->value != other.value;
} }
void set(T flag) void set(T flag)
@ -72,11 +55,44 @@ public:
this->unset(flag); this->unset(flag);
} }
bool HasFlag(Q flag) const bool has(T flag) const
{ {
return (this->value & flag) == flag; return static_cast<Q>(this->value) & static_cast<Q>(flag);
} }
// bool hasAny(std::initializer_list<T> flags) const
//{
// for (auto flag : flags) {
// if (this->has(flag)) return true;
// }
// return false;
//}
bool hasAny(FlagsEnum flags) const
{
return static_cast<Q>(this->value) & static_cast<Q>(flags.value);
}
// bool hasAll(std::initializer_list<T> flags) const
//{
// for (auto flag : flags) {
// if (!this->has(flag)) return false;
// }
// return true;
//}
bool hasAll(FlagsEnum<T> flags) const
{
return (static_cast<Q>(this->value) & static_cast<Q>(flags.value)) &&
static_cast<Q>(flags->value);
}
bool hasNone(std::initializer_list<T> flags) const
{
return !this->hasAny(flags);
}
private:
T value; T value;
}; };

View file

@ -127,10 +127,10 @@ QString CommandController::execCommand(const QString &text, ChannelPtr channel,
b.emplace<TimestampElement>(); b.emplace<TimestampElement>();
b.emplace<TextElement>( b.emplace<TextElement>(
app->accounts->twitch.getCurrent()->getUserName(), app->accounts->twitch.getCurrent()->getUserName(),
MessageElement::Text, MessageColor::Text, MessageElementFlag::Text, MessageColor::Text,
FontStyle::ChatMediumBold); FontStyle::ChatMediumBold);
b.emplace<TextElement>("->", MessageElement::Text); b.emplace<TextElement>("->", MessageElementFlag::Text);
b.emplace<TextElement>(words[1] + ":", MessageElement::Text, b.emplace<TextElement>(words[1] + ":", MessageElementFlag::Text,
MessageColor::Text, MessageColor::Text,
FontStyle::ChatMediumBold); FontStyle::ChatMediumBold);
@ -140,8 +140,8 @@ QString CommandController::execCommand(const QString &text, ChannelPtr channel,
rest += words[i] + " "; rest += words[i] + " ";
} }
b.emplace<TextElement>(rest, MessageElement::Text); b.emplace<TextElement>(rest, MessageElementFlag::Text);
b.message().flags |= Message::DoNotTriggerNotification; b->flags.set(MessageFlag::DoNotTriggerNotification);
auto messagexD = b.release(); auto messagexD = b.release();
app->twitch.server->whispersChannel->addMessage(messagexD); app->twitch.server->whispersChannel->addMessage(messagexD);

View file

@ -21,9 +21,9 @@ Message::~Message()
SBHighlight Message::getScrollBarHighlight() const SBHighlight Message::getScrollBarHighlight() const
{ {
if (this->flags & Message::Highlighted) { if (this->flags.has(MessageFlag::Highlighted)) {
return SBHighlight(SBHighlight::Highlight); return SBHighlight(SBHighlight::Highlight);
} else if (this->flags & Message::Subscription) { } else if (this->flags.has(MessageFlag::Subscription)) {
return SBHighlight(SBHighlight::Subscription); return SBHighlight(SBHighlight::Subscription);
} }
return SBHighlight(); return SBHighlight();

View file

@ -12,27 +12,28 @@
namespace chatterino { namespace chatterino {
struct Message : boost::noncopyable { enum class MessageFlag : uint16_t {
enum MessageFlags : uint16_t { None = 0,
None = 0, System = (1 << 0),
System = (1 << 0), Timeout = (1 << 1),
Timeout = (1 << 1), Highlighted = (1 << 2),
Highlighted = (1 << 2), DoNotTriggerNotification = (1 << 3), // disable notification sound
DoNotTriggerNotification = (1 << 3), // disable notification sound Centered = (1 << 4),
Centered = (1 << 4), Disabled = (1 << 5),
Disabled = (1 << 5), DisableCompactEmotes = (1 << 6),
DisableCompactEmotes = (1 << 6), Collapsed = (1 << 7),
Collapsed = (1 << 7), DisconnectedMessage = (1 << 8),
DisconnectedMessage = (1 << 8), Untimeout = (1 << 9),
Untimeout = (1 << 9), PubSub = (1 << 10),
PubSub = (1 << 10), Subscription = (1 << 11),
Subscription = (1 << 11), };
}; using MessageFlags = FlagsEnum<MessageFlag>;
struct Message : boost::noncopyable {
Message(); Message();
~Message(); ~Message();
FlagsEnum<MessageFlags> flags; MessageFlags flags;
QTime parseTime; QTime parseTime;
QString id; QString id;
QString searchText; QString searchText;

View file

@ -25,7 +25,7 @@ MessageBuilder::MessageBuilder(const QString &text)
: MessageBuilder() : MessageBuilder()
{ {
this->emplace<TimestampElement>(); this->emplace<TimestampElement>();
this->emplace<TextElement>(text, MessageElement::Text, this->emplace<TextElement>(text, MessageElementFlag::Text,
MessageColor::System); MessageColor::System);
this->message().searchText = text; this->message().searchText = text;
} }
@ -34,10 +34,10 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text)
: MessageBuilder() : MessageBuilder()
{ {
this->emplace<TimestampElement>(); this->emplace<TimestampElement>();
this->emplace<TextElement>(text, MessageElement::Text, this->emplace<TextElement>(text, MessageElementFlag::Text,
MessageColor::System); MessageColor::System);
this->message().flags |= Message::System; this->message().flags.set(MessageFlag::System);
this->message().flags |= Message::DoNotTriggerNotification; this->message().flags.set(MessageFlag::DoNotTriggerNotification);
this->message().searchText = text; this->message().searchText = text;
} }
@ -75,17 +75,17 @@ MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &username,
text.append(" (multiple times)"); text.append(" (multiple times)");
} }
this->message().flags.EnableFlag(Message::System); this->message().flags.set(MessageFlag::System);
this->message().flags.EnableFlag(Message::Timeout); this->message().flags.set(MessageFlag::Timeout);
this->message().flags.EnableFlag(Message::DoNotTriggerNotification); this->message().flags.set(MessageFlag::DoNotTriggerNotification);
this->message().timeoutUser = username; this->message().timeoutUser = username;
} }
MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count) MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count)
{ {
this->emplace<TimestampElement>(); this->emplace<TimestampElement>();
this->message().flags.EnableFlag(Message::System); this->message().flags.set(MessageFlag::System);
this->message().flags.EnableFlag(Message::Timeout); this->message().flags.set(MessageFlag::Timeout);
this->message().timeoutUser = action.target.name; this->message().timeoutUser = action.target.name;
this->message().count = count; this->message().count = count;
@ -121,7 +121,7 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count)
} }
} }
this->emplace<TextElement>(text, MessageElement::Text, this->emplace<TextElement>(text, MessageElementFlag::Text,
MessageColor::System); MessageColor::System);
this->message().searchText = text; this->message().searchText = text;
} }
@ -129,8 +129,8 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count)
MessageBuilder::MessageBuilder(const UnbanAction &action) MessageBuilder::MessageBuilder(const UnbanAction &action)
{ {
this->emplace<TimestampElement>(); this->emplace<TimestampElement>();
this->message().flags.EnableFlag(Message::System); this->message().flags.set(MessageFlag::System);
this->message().flags.EnableFlag(Message::Untimeout); this->message().flags.set(MessageFlag::Untimeout);
this->message().timeoutUser = action.target.name; this->message().timeoutUser = action.target.name;
@ -146,7 +146,7 @@ MessageBuilder::MessageBuilder(const UnbanAction &action)
.arg(action.target.name); .arg(action.target.name);
} }
this->emplace<TextElement>(text, MessageElement::Text, this->emplace<TextElement>(text, MessageElementFlag::Text,
MessageColor::System); MessageColor::System);
this->message().searchText = text; this->message().searchText = text;
} }

View file

@ -11,7 +11,7 @@
namespace chatterino { namespace chatterino {
MessageElement::MessageElement(Flags flags) MessageElement::MessageElement(MessageElementFlags flags)
: flags_(flags) : flags_(flags)
{ {
DebugCount::increase("message elements"); DebugCount::increase("message elements");
@ -55,13 +55,13 @@ bool MessageElement::hasTrailingSpace() const
return this->trailingSpace; return this->trailingSpace;
} }
MessageElement::Flags MessageElement::getFlags() const MessageElementFlags MessageElement::getFlags() const
{ {
return this->flags_; return this->flags_;
} }
// IMAGE // IMAGE
ImageElement::ImageElement(ImagePtr image, MessageElement::Flags flags) ImageElement::ImageElement(ImagePtr image, MessageElementFlags flags)
: MessageElement(flags) : MessageElement(flags)
, image_(image) , image_(image)
{ {
@ -69,9 +69,9 @@ ImageElement::ImageElement(ImagePtr image, MessageElement::Flags flags)
} }
void ImageElement::addToContainer(MessageLayoutContainer &container, void ImageElement::addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) MessageElementFlags flags)
{ {
if (flags & this->getFlags()) { if (flags.hasAny(this->getFlags())) {
auto size = QSize(this->image_->width() * container.getScale(), auto size = QSize(this->image_->width() * container.getScale(),
this->image_->height() * container.getScale()); this->image_->height() * container.getScale());
@ -81,12 +81,12 @@ void ImageElement::addToContainer(MessageLayoutContainer &container,
} }
// EMOTE // EMOTE
EmoteElement::EmoteElement(const EmotePtr &emote, MessageElement::Flags flags) EmoteElement::EmoteElement(const EmotePtr &emote, MessageElementFlags flags)
: MessageElement(flags) : MessageElement(flags)
, emote_(emote) , emote_(emote)
{ {
this->textElement_.reset( this->textElement_.reset(
new TextElement(emote->getCopyString(), MessageElement::Misc)); new TextElement(emote->getCopyString(), MessageElementFlag::Misc));
this->setTooltip(emote->tooltip.string); this->setTooltip(emote->tooltip.string);
} }
@ -97,10 +97,10 @@ EmotePtr EmoteElement::getEmote() const
} }
void EmoteElement::addToContainer(MessageLayoutContainer &container, void EmoteElement::addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) MessageElementFlags flags)
{ {
if (flags & this->getFlags()) { if (flags.hasAny(this->getFlags())) {
if (flags & MessageElement::EmoteImages) { if (flags.has(MessageElementFlag::EmoteImages)) {
auto image = this->emote_->images.getImage(container.getScale()); auto image = this->emote_->images.getImage(container.getScale());
if (image->empty()) return; if (image->empty()) return;
@ -112,14 +112,14 @@ void EmoteElement::addToContainer(MessageLayoutContainer &container,
} else { } else {
if (this->textElement_) { if (this->textElement_) {
this->textElement_->addToContainer(container, this->textElement_->addToContainer(container,
MessageElement::Misc); MessageElementFlag::Misc);
} }
} }
} }
} }
// TEXT // TEXT
TextElement::TextElement(const QString &text, MessageElement::Flags flags, TextElement::TextElement(const QString &text, MessageElementFlags flags,
const MessageColor &color, FontStyle style) const MessageColor &color, FontStyle style)
: MessageElement(flags) : MessageElement(flags)
, color_(color) , color_(color)
@ -132,11 +132,11 @@ TextElement::TextElement(const QString &text, MessageElement::Flags flags,
} }
void TextElement::addToContainer(MessageLayoutContainer &container, void TextElement::addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) MessageElementFlags flags)
{ {
auto app = getApp(); auto app = getApp();
if (flags & this->getFlags()) { if (flags.hasAny(this->getFlags())) {
QFontMetrics metrics = QFontMetrics metrics =
app->fonts->getFontMetrics(this->style_, container.getScale()); app->fonts->getFontMetrics(this->style_, container.getScale());
@ -212,7 +212,7 @@ void TextElement::addToContainer(MessageLayoutContainer &container,
// TIMESTAMP // TIMESTAMP
TimestampElement::TimestampElement(QTime time) TimestampElement::TimestampElement(QTime time)
: MessageElement(MessageElement::Timestamp) : MessageElement(MessageElementFlag::Timestamp)
, time_(time) , time_(time)
, element_(this->formatTime(time)) , element_(this->formatTime(time))
{ {
@ -220,9 +220,9 @@ TimestampElement::TimestampElement(QTime time)
} }
void TimestampElement::addToContainer(MessageLayoutContainer &container, void TimestampElement::addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) MessageElementFlags flags)
{ {
if (flags & this->getFlags()) { if (flags.hasAny(this->getFlags())) {
auto app = getApp(); auto app = getApp();
if (app->settings->timestampFormat != this->format_) { if (app->settings->timestampFormat != this->format_) {
this->format_ = app->settings->timestampFormat.getValue(); this->format_ = app->settings->timestampFormat.getValue();
@ -239,20 +239,20 @@ TextElement *TimestampElement::formatTime(const QTime &time)
QString format = locale.toString(time, getApp()->settings->timestampFormat); QString format = locale.toString(time, getApp()->settings->timestampFormat);
return new TextElement(format, Flags::Timestamp, MessageColor::System, return new TextElement(format, MessageElementFlag::Timestamp,
FontStyle::ChatMedium); MessageColor::System, FontStyle::ChatMedium);
} }
// TWITCH MODERATION // TWITCH MODERATION
TwitchModerationElement::TwitchModerationElement() TwitchModerationElement::TwitchModerationElement()
: MessageElement(MessageElement::ModeratorTools) : MessageElement(MessageElementFlag::ModeratorTools)
{ {
} }
void TwitchModerationElement::addToContainer(MessageLayoutContainer &container, void TwitchModerationElement::addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) MessageElementFlags flags)
{ {
if (flags & MessageElement::ModeratorTools) { if (flags.has(MessageElementFlag::ModeratorTools)) {
QSize size(int(container.getScale() * 16), QSize size(int(container.getScale() * 16),
int(container.getScale() * 16)); int(container.getScale() * 16));

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "common/Emotemap.hpp" #include "common/Emotemap.hpp"
#include "common/FlagsEnum.hpp"
#include "messages/Emote.hpp" #include "messages/Emote.hpp"
#include "messages/Image.hpp" #include "messages/Image.hpp"
#include "messages/Link.hpp" #include "messages/Link.hpp"
@ -19,98 +20,99 @@ namespace chatterino {
class Channel; class Channel;
struct MessageLayoutContainer; struct MessageLayoutContainer;
enum class MessageElementFlag {
None = 0,
Misc = (1 << 0),
Text = (1 << 1),
Username = (1 << 2),
Timestamp = (1 << 3),
TwitchEmoteImage = (1 << 4),
TwitchEmoteText = (1 << 5),
TwitchEmote = TwitchEmoteImage | TwitchEmoteText,
BttvEmoteImage = (1 << 6),
BttvEmoteText = (1 << 7),
BttvEmote = BttvEmoteImage | BttvEmoteText,
FfzEmoteImage = (1 << 10),
FfzEmoteText = (1 << 11),
FfzEmote = FfzEmoteImage | FfzEmoteText,
EmoteImages = TwitchEmoteImage | BttvEmoteImage | FfzEmoteImage,
BitsStatic = (1 << 12),
BitsAnimated = (1 << 13),
// Slot 1: Twitch
// - Staff badge
// - Admin badge
// - Global Moderator badge
BadgeGlobalAuthority = (1 << 14),
// Slot 2: Twitch
// - Moderator badge
// - Broadcaster badge
BadgeChannelAuthority = (1 << 15),
// Slot 3: Twitch
// - Subscription badges
BadgeSubscription = (1 << 16),
// Slot 4: Twitch
// - Turbo badge
// - Prime badge
// - Bit badges
// - Game badges
BadgeVanity = (1 << 17),
// Slot 5: Chatterino
// - Chatterino developer badge
// - Chatterino donator badge
// - Chatterino top donator badge
BadgeChatterino = (1 << 18),
// Rest of slots: ffz custom badge? bttv custom badge? mywaifu (puke)
// custom badge?
Badges = BadgeGlobalAuthority | BadgeChannelAuthority | BadgeSubscription |
BadgeVanity | BadgeChatterino,
ChannelName = (1 << 19),
BitsAmount = (1 << 20),
ModeratorTools = (1 << 21),
EmojiImage = (1 << 23),
EmojiText = (1 << 24),
EmojiAll = EmojiImage | EmojiText,
AlwaysShow = (1 << 25),
// used in the ChannelView class to make the collapse buttons visible if
// needed
Collapsed = (1 << 26),
// used for dynamic bold usernames
BoldUsername = (1 << 27),
NonBoldUsername = (1 << 28),
// for links
LowercaseLink = (1 << 29),
OriginalLink = (1 << 30),
Default = Timestamp | Badges | Username | BitsStatic | FfzEmoteImage |
BttvEmoteImage | TwitchEmoteImage | BitsAmount | Text |
AlwaysShow,
};
using MessageElementFlags = FlagsEnum<MessageElementFlag>;
class MessageElement : boost::noncopyable class MessageElement : boost::noncopyable
{ {
public: public:
enum Flags : uint32_t {
None = 0,
Misc = (1 << 0),
Text = (1 << 1),
Username = (1 << 2),
Timestamp = (1 << 3),
TwitchEmoteImage = (1 << 4),
TwitchEmoteText = (1 << 5),
TwitchEmote = TwitchEmoteImage | TwitchEmoteText,
BttvEmoteImage = (1 << 6),
BttvEmoteText = (1 << 7),
BttvEmote = BttvEmoteImage | BttvEmoteText,
FfzEmoteImage = (1 << 10),
FfzEmoteText = (1 << 11),
FfzEmote = FfzEmoteImage | FfzEmoteText,
EmoteImages = TwitchEmoteImage | BttvEmoteImage | FfzEmoteImage,
BitsStatic = (1 << 12),
BitsAnimated = (1 << 13),
// Slot 1: Twitch
// - Staff badge
// - Admin badge
// - Global Moderator badge
BadgeGlobalAuthority = (1 << 14),
// Slot 2: Twitch
// - Moderator badge
// - Broadcaster badge
BadgeChannelAuthority = (1 << 15),
// Slot 3: Twitch
// - Subscription badges
BadgeSubscription = (1 << 16),
// Slot 4: Twitch
// - Turbo badge
// - Prime badge
// - Bit badges
// - Game badges
BadgeVanity = (1 << 17),
// Slot 5: Chatterino
// - Chatterino developer badge
// - Chatterino donator badge
// - Chatterino top donator badge
BadgeChatterino = (1 << 18),
// Rest of slots: ffz custom badge? bttv custom badge? mywaifu (puke)
// custom badge?
Badges = BadgeGlobalAuthority | BadgeChannelAuthority |
BadgeSubscription | BadgeVanity | BadgeChatterino,
ChannelName = (1 << 19),
BitsAmount = (1 << 20),
ModeratorTools = (1 << 21),
EmojiImage = (1 << 23),
EmojiText = (1 << 24),
EmojiAll = EmojiImage | EmojiText,
AlwaysShow = (1 << 25),
// used in the ChannelView class to make the collapse buttons visible if
// needed
Collapsed = (1 << 26),
// used for dynamic bold usernames
BoldUsername = (1 << 27),
NonBoldUsername = (1 << 28),
// for links
LowercaseLink = (1 << 29),
OriginalLink = (1 << 30),
Default = Timestamp | Badges | Username | BitsStatic | FfzEmoteImage |
BttvEmoteImage | TwitchEmoteImage | BitsAmount | Text |
AlwaysShow,
};
enum UpdateFlags : char { enum UpdateFlags : char {
Update_Text, Update_Text = 1,
Update_Emotes, Update_Emotes = 2,
Update_Images, Update_Images = 4,
Update_All = Update_Text | Update_Emotes | Update_Images Update_All = Update_Text | Update_Emotes | Update_Images
}; };
@ -122,29 +124,29 @@ public:
const QString &getTooltip() const; const QString &getTooltip() const;
const Link &getLink() const; const Link &getLink() const;
bool hasTrailingSpace() const; bool hasTrailingSpace() const;
Flags getFlags() const; MessageElementFlags getFlags() const;
virtual void addToContainer(MessageLayoutContainer &container, virtual void addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) = 0; MessageElementFlags flags) = 0;
protected: protected:
MessageElement(Flags flags); MessageElement(MessageElementFlags flags);
bool trailingSpace = true; bool trailingSpace = true;
private: private:
Link link_; Link link_;
QString tooltip_; QString tooltip_;
Flags flags_; MessageElementFlags flags_;
}; };
// contains a simple image // contains a simple image
class ImageElement : public MessageElement class ImageElement : public MessageElement
{ {
public: public:
ImageElement(ImagePtr image, MessageElement::Flags flags); ImageElement(ImagePtr image, MessageElementFlags flags);
void addToContainer(MessageLayoutContainer &container, void addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) override; MessageElementFlags flags) override;
private: private:
ImagePtr image_; ImagePtr image_;
@ -154,13 +156,13 @@ private:
class TextElement : public MessageElement class TextElement : public MessageElement
{ {
public: public:
TextElement(const QString &text, MessageElement::Flags flags, TextElement(const QString &text, MessageElementFlags flags,
const MessageColor &color = MessageColor::Text, const MessageColor &color = MessageColor::Text,
FontStyle style = FontStyle::ChatMedium); FontStyle style = FontStyle::ChatMedium);
~TextElement() override = default; ~TextElement() override = default;
void addToContainer(MessageLayoutContainer &container, void addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) override; MessageElementFlags flags) override;
private: private:
MessageColor color_; MessageColor color_;
@ -179,10 +181,10 @@ private:
class EmoteElement : public MessageElement class EmoteElement : public MessageElement
{ {
public: public:
EmoteElement(const EmotePtr &data, MessageElement::Flags flags_); EmoteElement(const EmotePtr &data, MessageElementFlags flags_);
void addToContainer(MessageLayoutContainer &container, void addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags_) override; MessageElementFlags flags_) override;
EmotePtr getEmote() const; EmotePtr getEmote() const;
private: private:
@ -198,7 +200,7 @@ public:
~TimestampElement() override = default; ~TimestampElement() override = default;
void addToContainer(MessageLayoutContainer &container, void addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) override; MessageElementFlags flags) override;
TextElement *formatTime(const QTime &time); TextElement *formatTime(const QTime &time);
@ -216,7 +218,7 @@ public:
TwitchModerationElement(); TwitchModerationElement();
void addToContainer(MessageLayoutContainer &container, void addToContainer(MessageLayoutContainer &container,
MessageElement::Flags flags) override; MessageElementFlags flags) override;
}; };
} // namespace chatterino } // namespace chatterino

View file

@ -46,7 +46,7 @@ int MessageLayout::getHeight() const
// Layout // Layout
// return true if redraw is required // return true if redraw is required
bool MessageLayout::layout(int width, float scale, MessageElement::Flags flags) bool MessageLayout::layout(int width, float scale, MessageElementFlags flags)
{ {
// BenchmarkGuard benchmark("MessageLayout::layout()"); // BenchmarkGuard benchmark("MessageLayout::layout()");
@ -62,7 +62,7 @@ bool MessageLayout::layout(int width, float scale, MessageElement::Flags flags)
// check if layout state changed // check if layout state changed
if (this->layoutState_ != app->windows->getGeneration()) { if (this->layoutState_ != app->windows->getGeneration()) {
layoutRequired = true; layoutRequired = true;
this->flags |= RequiresBufferUpdate; this->flags.set(MessageLayoutFlag::RequiresBufferUpdate);
this->layoutState_ = app->windows->getGeneration(); this->layoutState_ = app->windows->getGeneration();
} }
@ -71,8 +71,8 @@ bool MessageLayout::layout(int width, float scale, MessageElement::Flags flags)
this->currentWordFlags_ = flags; // app->settings->getWordTypeMask(); this->currentWordFlags_ = flags; // app->settings->getWordTypeMask();
// check if layout was requested manually // check if layout was requested manually
layoutRequired |= bool(this->flags & RequiresLayout); layoutRequired |= this->flags.has(MessageLayoutFlag::RequiresLayout);
this->flags &= decltype(RequiresLayout)(~RequiresLayout); this->flags.unset(MessageLayoutFlag::RequiresLayout);
// check if dpi changed // check if dpi changed
layoutRequired |= this->scale_ != scale; layoutRequired |= this->scale_ != scale;
@ -92,15 +92,15 @@ bool MessageLayout::layout(int width, float scale, MessageElement::Flags flags)
return true; return true;
} }
void MessageLayout::actuallyLayout(int width, MessageElement::Flags _flags) void MessageLayout::actuallyLayout(int width, MessageElementFlags _flags)
{ {
auto messageFlags = this->message_->flags.value; auto messageFlags = this->message_->flags;
if (this->flags & MessageLayout::Expanded || if (this->flags.has(MessageLayoutFlag::Expanded) ||
(_flags & MessageElement::ModeratorTools && (_flags.has(MessageElementFlag::ModeratorTools) &&
!(this->message_->flags & Message::MessageFlags::Disabled))) { !this->message_->flags.has(MessageFlag::Disabled))) //
messageFlags = Message::MessageFlags(messageFlags & {
~Message::MessageFlags::Collapsed); messageFlags.unset(MessageFlag::Collapsed);
} }
this->container_.begin(width, this->scale_, messageFlags); this->container_.begin(width, this->scale_, messageFlags);
@ -117,9 +117,9 @@ void MessageLayout::actuallyLayout(int width, MessageElement::Flags _flags)
this->height_ = this->container_.getHeight(); this->height_ = this->container_.getHeight();
// collapsed state // collapsed state
this->flags &= ~Flags::Collapsed; this->flags.unset(MessageLayoutFlag::Collapsed);
if (this->container_.isCollapsed()) { if (this->container_.isCollapsed()) {
this->flags |= Flags::Collapsed; this->flags.set(MessageLayoutFlag::Collapsed);
} }
} }
@ -160,7 +160,7 @@ void MessageLayout::paint(QPainter &painter, int width, int y, int messageIndex,
this->container_.paintAnimatedElements(painter, y); this->container_.paintAnimatedElements(painter, y);
// draw disabled // draw disabled
if (this->message_->flags.HasFlag(Message::Disabled)) { if (this->message_->flags.has(MessageFlag::Disabled)) {
painter.fillRect(0, y, pixmap->width(), pixmap->height(), painter.fillRect(0, y, pixmap->width(), pixmap->height(),
app->themes->messages.disabled); app->themes->messages.disabled);
} }
@ -204,12 +204,12 @@ void MessageLayout::updateBuffer(QPixmap *buffer, int /*messageIndex*/,
// draw background // draw background
QColor backgroundColor; QColor backgroundColor;
if (this->message_->flags & Message::Highlighted) { if (this->message_->flags.has(MessageFlag::Highlighted)) {
backgroundColor = app->themes->messages.backgrounds.highlighted; backgroundColor = app->themes->messages.backgrounds.highlighted;
} else if (this->message_->flags & Message::Subscription) { } else if (this->message_->flags.has(MessageFlag::Subscription)) {
backgroundColor = app->themes->messages.backgrounds.subscription; backgroundColor = app->themes->messages.backgrounds.subscription;
} else if (app->settings->alternateMessageBackground.getValue() && } else if (app->settings->alternateMessageBackground.getValue() &&
this->flags & MessageLayout::AlternateBackground) { this->flags.has(MessageLayoutFlag::AlternateBackground)) {
backgroundColor = app->themes->messages.backgrounds.alternate; backgroundColor = app->themes->messages.backgrounds.alternate;
} else { } else {
backgroundColor = app->themes->messages.backgrounds.regular; backgroundColor = app->themes->messages.backgrounds.regular;

View file

@ -14,17 +14,18 @@
namespace chatterino { namespace chatterino {
enum class MessageLayoutFlag : uint8_t {
RequiresBufferUpdate = 1 << 1,
RequiresLayout = 1 << 2,
AlternateBackground = 1 << 3,
Collapsed = 1 << 4,
Expanded = 1 << 5,
};
using MessageLayoutFlags = FlagsEnum<MessageLayoutFlag>;
class MessageLayout : boost::noncopyable class MessageLayout : boost::noncopyable
{ {
public: public:
enum Flags : uint8_t {
RequiresBufferUpdate = 1 << 1,
RequiresLayout = 1 << 2,
AlternateBackground = 1 << 3,
Collapsed = 1 << 4,
Expanded = 1 << 5,
};
MessageLayout(MessagePtr message_); MessageLayout(MessagePtr message_);
~MessageLayout(); ~MessageLayout();
@ -34,10 +35,10 @@ public:
int getHeight() const; int getHeight() const;
// Flags // Flags
FlagsEnum<Flags> flags; MessageLayoutFlags flags;
// Layout // Layout
bool layout(int width, float scale_, MessageElement::Flags flags); bool layout(int width, float scale_, MessageElementFlags flags);
// Painting // Painting
void paint(QPainter &painter, int width, int y, int messageIndex, void paint(QPainter &painter, int width, int y, int messageIndex,
@ -70,12 +71,12 @@ private:
float scale_ = -1; float scale_ = -1;
unsigned int bufferUpdatedCount_ = 0; unsigned int bufferUpdatedCount_ = 0;
MessageElement::Flags currentWordFlags_ = MessageElement::None; MessageElementFlags currentWordFlags_;
int collapsedHeight_ = 32; int collapsedHeight_ = 32;
// methods // methods
void actuallyLayout(int width, MessageElement::Flags flags); void actuallyLayout(int width, MessageElementFlags flags);
void updateBuffer(QPixmap *pixmap, int messageIndex, Selection &selection); void updateBuffer(QPixmap *pixmap, int messageIndex, Selection &selection);
}; };

View file

@ -30,8 +30,7 @@ float MessageLayoutContainer::getScale() const
} }
// methods // methods
void MessageLayoutContainer::begin(int width, float scale, void MessageLayoutContainer::begin(int width, float scale, MessageFlags flags)
Message::MessageFlags flags)
{ {
this->clear(); this->clear();
this->width_ = width; this->width_ = width;
@ -97,8 +96,8 @@ void MessageLayoutContainer::_addElement(MessageLayoutElement *element,
// compact emote offset // compact emote offset
bool isCompactEmote = bool isCompactEmote =
!(this->flags_ & Message::DisableCompactEmotes) && !this->flags_.has(MessageFlag::DisableCompactEmotes) &&
element->getCreator().getFlags() & MessageElement::EmoteImages; element->getCreator().getFlags().has(MessageElementFlag::EmoteImages);
if (isCompactEmote) { if (isCompactEmote) {
newLineHeight -= COMPACT_EMOTES_OFFSET * this->scale_; newLineHeight -= COMPACT_EMOTES_OFFSET * this->scale_;
@ -126,7 +125,7 @@ void MessageLayoutContainer::breakLine()
{ {
int xOffset = 0; int xOffset = 0;
if (this->flags_ & Message::Centered && this->elements_.size() > 0) { if (this->flags_.has(MessageFlag::Centered) && this->elements_.size() > 0) {
xOffset = (width_ - this->elements_.at(this->elements_.size() - 1) xOffset = (width_ - this->elements_.at(this->elements_.size() - 1)
->getRect() ->getRect()
.right()) / .right()) /
@ -137,15 +136,17 @@ void MessageLayoutContainer::breakLine()
MessageLayoutElement *element = this->elements_.at(i).get(); MessageLayoutElement *element = this->elements_.at(i).get();
bool isCompactEmote = bool isCompactEmote =
!(this->flags_ & Message::DisableCompactEmotes) && !this->flags_.has(MessageFlag::DisableCompactEmotes) &&
element->getCreator().getFlags() & MessageElement::EmoteImages; element->getCreator().getFlags().has(
MessageElementFlag::EmoteImages);
int yExtra = 0; int yExtra = 0;
if (isCompactEmote) { if (isCompactEmote) {
yExtra = (COMPACT_EMOTES_OFFSET / 2) * this->scale_; yExtra = (COMPACT_EMOTES_OFFSET / 2) * this->scale_;
} }
// if (element->getCreator().getFlags() & MessageElement::Badges) // if (element->getCreator().getFlags() &
// MessageElementFlag::Badges)
// { // {
if (element->getRect().height() < this->textLineHeight_) { if (element->getRect().height() < this->textLineHeight_) {
yExtra -= (this->textLineHeight_ - element->getRect().height()) / 2; yExtra -= (this->textLineHeight_ - element->getRect().height()) / 2;
@ -199,7 +200,7 @@ bool MessageLayoutContainer::fitsInLine(int _width)
void MessageLayoutContainer::end() void MessageLayoutContainer::end()
{ {
if (!this->canAddElements()) { if (!this->canAddElements()) {
static TextElement dotdotdot("...", MessageElement::Collapsed, static TextElement dotdotdot("...", MessageElementFlag::Collapsed,
MessageColor::Link); MessageColor::Link);
static QString dotdotdotText("..."); static QString dotdotdotText("...");
@ -230,7 +231,7 @@ void MessageLayoutContainer::end()
bool MessageLayoutContainer::canCollapse() bool MessageLayoutContainer::canCollapse()
{ {
return getApp()->settings->collpseMessagesMinLines.getValue() > 0 && return getApp()->settings->collpseMessagesMinLines.getValue() > 0 &&
this->flags_ & Message::MessageFlags::Collapsed; this->flags_.has(MessageFlag::Collapsed);
} }
bool MessageLayoutContainer::isCollapsed() bool MessageLayoutContainer::isCollapsed()

View file

@ -51,7 +51,7 @@ struct MessageLayoutContainer {
float getScale() const; float getScale() const;
// methods // methods
void begin(int width_, float scale_, Message::MessageFlags flags_); void begin(int width_, float scale_, MessageFlags flags_);
void end(); void end();
void clear(); void clear();
@ -92,7 +92,7 @@ private:
// variables // variables
float scale_ = 1.f; float scale_ = 1.f;
int width_ = 0; int width_ = 0;
Message::MessageFlags flags_ = Message::MessageFlags::None; MessageFlags flags_ = MessageFlag::None;
int line_ = 0; int line_ = 0;
int height_ = 0; int height_ = 0;
int currentX_ = 0; int currentX_ = 0;

View file

@ -202,8 +202,8 @@ void AbstractIrcServer::onConnected()
LimitedQueueSnapshot<MessagePtr> snapshot = chan->getMessageSnapshot(); LimitedQueueSnapshot<MessagePtr> snapshot = chan->getMessageSnapshot();
bool replaceMessage = snapshot.getLength() > 0 && bool replaceMessage = snapshot.getLength() > 0 &&
snapshot[snapshot.getLength() - 1]->flags & snapshot[snapshot.getLength() - 1]->flags.has(
Message::DisconnectedMessage; MessageFlag::DisconnectedMessage);
if (replaceMessage) { if (replaceMessage) {
chan->replaceMessage(snapshot[snapshot.getLength() - 1], chan->replaceMessage(snapshot[snapshot.getLength() - 1],
@ -220,7 +220,7 @@ void AbstractIrcServer::onDisconnected()
std::lock_guard<std::mutex> lock(this->channelMutex); std::lock_guard<std::mutex> lock(this->channelMutex);
MessageBuilder b(systemMessage, "disconnected from chat"); MessageBuilder b(systemMessage, "disconnected from chat");
b->flags |= Message::DisconnectedMessage; b->flags.set(MessageFlag::DisconnectedMessage);
auto disconnected = b.release(); auto disconnected = b.release();
for (std::weak_ptr<Channel> &weak : this->channels.values()) { for (std::weak_ptr<Channel> &weak : this->channels.values()) {

View file

@ -61,11 +61,11 @@ void IrcMessageHandler::addMessage(Communi::IrcMessage *_message,
if (isSub || !builder.isIgnored()) { if (isSub || !builder.isIgnored()) {
if (isSub) { if (isSub) {
builder->flags |= Message::Subscription; builder->flags.set(MessageFlag::Subscription);
builder->flags &= ~Message::Highlighted; builder->flags.unset(MessageFlag::Highlighted);
} }
auto highlighted = bool(builder->flags & Message::Highlighted); auto highlighted = builder->flags.has(MessageFlag::Highlighted);
auto msg = builder.build(); auto msg = builder.build();
if (!isSub) { if (!isSub) {
@ -224,14 +224,12 @@ void IrcMessageHandler::handleWhisperMessage(Communi::IrcMessage *message)
MessagePtr _message = builder.build(); MessagePtr _message = builder.build();
if (_message->flags & Message::Highlighted) { if (_message->flags.has(MessageFlag::Highlighted)) {
app->twitch.server->mentionsChannel->addMessage(_message); app->twitch.server->mentionsChannel->addMessage(_message);
} }
c->addMessage(_message); c->addMessage(_message);
// _message->flags |= Message::DoNotTriggerNotification;
if (app->settings->inlineWhispers) { if (app->settings->inlineWhispers) {
app->twitch.server->forEachChannel([_message](ChannelPtr channel) { app->twitch.server->forEachChannel([_message](ChannelPtr channel) {
channel->addMessage(_message); // channel->addMessage(_message); //
@ -269,7 +267,7 @@ void IrcMessageHandler::handleUserNoticeMessage(Communi::IrcMessage *message,
auto b = MessageBuilder(systemMessage, auto b = MessageBuilder(systemMessage,
parseTagString(it.value().toString())); parseTagString(it.value().toString()));
b->flags |= Message::Subscription; b->flags.set(MessageFlag::Subscription);
auto newMessage = b.release(); auto newMessage = b.release();
QString channelName; QString channelName;

View file

@ -185,7 +185,7 @@ void TwitchChannel::addJoinedUser(const QString &user)
MessageBuilder builder(systemMessage, MessageBuilder builder(systemMessage,
"Users joined: " + joinedUsers->join(", ")); "Users joined: " + joinedUsers->join(", "));
builder->flags |= Message::Collapsed; builder->flags.set(MessageFlag::Collapsed);
joinedUsers->clear(); joinedUsers->clear();
this->addMessage(builder.release()); this->addMessage(builder.release());
this->joinedUsersMergeQueued_ = false; this->joinedUsersMergeQueued_ = false;
@ -213,7 +213,7 @@ void TwitchChannel::addPartedUser(const QString &user)
MessageBuilder builder(systemMessage, MessageBuilder builder(systemMessage,
"Users parted: " + partedUsers->join(", ")); "Users parted: " + partedUsers->join(", "));
builder->flags |= Message::Collapsed; builder->flags.set(MessageFlag::Collapsed);
this->addMessage(builder.release()); this->addMessage(builder.release());
partedUsers->clear(); partedUsers->clear();

View file

@ -93,12 +93,12 @@ MessagePtr TwitchMessageBuilder::build()
//#ifdef XD //#ifdef XD
// if (this->originalMessage.length() > 100) { // if (this->originalMessage.length() > 100) {
// this->message->flags |= Message::Collapsed; // this->message->flags.has(MessageFlag::Collapsed);
// this->emplace<EmoteElement>(getApp()->resources->badgeCollapsed, // this->emplace<EmoteElement>(getApp()->resources->badgeCollapsed,
// MessageElement::Collapsed); // MessageElementFlag::Collapsed);
// } // }
//#endif //#endif
this->message().flags |= Message::Collapsed; this->message().flags.has(MessageFlag::Collapsed);
// PARSING // PARSING
this->parseMessageID(); this->parseMessageID();
@ -193,7 +193,7 @@ void TwitchMessageBuilder::addWords(
currentTwitchEmote->first == i) { currentTwitchEmote->first == i) {
auto emoteImage = currentTwitchEmote->second; auto emoteImage = currentTwitchEmote->second;
this->emplace<EmoteElement>(emoteImage, this->emplace<EmoteElement>(emoteImage,
MessageElement::TwitchEmote); MessageElementFlag::TwitchEmote);
i += word.length() + 1; i += word.length() + 1;
currentTwitchEmote++; currentTwitchEmote++;
@ -225,7 +225,7 @@ void TwitchMessageBuilder::addWords(
void TwitchMessageBuilder::addTextOrEmoji(EmotePtr emote) void TwitchMessageBuilder::addTextOrEmoji(EmotePtr emote)
{ {
this->emplace<EmoteElement>(emote, EmoteElement::EmojiAll); this->emplace<EmoteElement>(emote, MessageElementFlag::EmojiAll);
} }
void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) void TwitchMessageBuilder::addTextOrEmoji(const QString &string_)
@ -255,12 +255,13 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_)
if (linkString.isEmpty()) { if (linkString.isEmpty()) {
if (string.startsWith('@')) { if (string.startsWith('@')) {
this->emplace<TextElement>(string, TextElement::BoldUsername, this->emplace<TextElement>(string, MessageElementFlag::BoldUsername,
textColor, FontStyle::ChatMediumBold); textColor, FontStyle::ChatMediumBold);
this->emplace<TextElement>(string, TextElement::NonBoldUsername, this->emplace<TextElement>(
textColor); string, MessageElementFlag::NonBoldUsername, textColor);
} else { } else {
this->emplace<TextElement>(string, TextElement::Text, textColor); this->emplace<TextElement>(string, MessageElementFlag::Text,
textColor);
} }
} else { } else {
static QRegularExpression domainRegex( static QRegularExpression domainRegex(
@ -280,9 +281,10 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_)
textColor = MessageColor(MessageColor::Link); textColor = MessageColor(MessageColor::Link);
this->emplace<TextElement>(lowercaseLinkString, this->emplace<TextElement>(lowercaseLinkString,
TextElement::LowercaseLink, textColor) MessageElementFlag::LowercaseLink, textColor)
->setLink(link); ->setLink(link);
this->emplace<TextElement>(string, TextElement::OriginalLink, textColor) this->emplace<TextElement>(string, MessageElementFlag::OriginalLink,
textColor)
->setLink(link); ->setLink(link);
} }
@ -306,15 +308,17 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_)
// textColor = MessageColor(MessageColor::Link); // textColor = MessageColor(MessageColor::Link);
//} //}
// if (string.startsWith('@')) { // if (string.startsWith('@')) {
// this->emplace<TextElement>(string, TextElement::BoldUsername, // this->emplace<TextElement>(string, MessageElementFlag::BoldUsername,
// textColor, // textColor,
// FontStyle::ChatMediumBold) // // FontStyle::ChatMediumBold) //
// ->setLink(link); // ->setLink(link);
// this->emplace<TextElement>(string, TextElement::NonBoldUsername, // this->emplace<TextElement>(string,
// MessageElementFlag::NonBoldUsername,
// textColor) // // textColor) //
// ->setLink(link); // ->setLink(link);
//} else { //} else {
// this->emplace<TextElement>(string, TextElement::Text, textColor) // // this->emplace<TextElement>(string, MessageElementFlag::Text,
// textColor) //
// ->setLink(link); // ->setLink(link);
//} //}
} }
@ -350,7 +354,7 @@ void TwitchMessageBuilder::appendChannelName()
QString channelName("#" + this->channel->getName()); QString channelName("#" + this->channel->getName());
Link link(Link::Url, this->channel->getName() + "\n" + this->messageID); Link link(Link::Url, this->channel->getName() + "\n" + this->messageID);
this->emplace<TextElement>(channelName, MessageElement::ChannelName, this->emplace<TextElement>(channelName, MessageElementFlag::ChannelName,
MessageColor::System) // MessageColor::System) //
->setLink(link); ->setLink(link);
} }
@ -443,7 +447,7 @@ void TwitchMessageBuilder::appendUsername()
// IrcManager::getInstance().getUser().getUserName(); // IrcManager::getInstance().getUser().getUserName();
} else if (this->args.isReceivedWhisper) { } else if (this->args.isReceivedWhisper) {
// Sender username // Sender username
this->emplace<TextElement>(usernameText, MessageElement::Text, this->emplace<TextElement>(usernameText, MessageElementFlag::Text,
this->usernameColor_, this->usernameColor_,
FontStyle::ChatMediumBold) FontStyle::ChatMediumBold)
->setLink({Link::UserInfo, this->userName}); ->setLink({Link::UserInfo, this->userName});
@ -451,7 +455,7 @@ void TwitchMessageBuilder::appendUsername()
auto currentUser = app->accounts->twitch.getCurrent(); auto currentUser = app->accounts->twitch.getCurrent();
// Separator // Separator
this->emplace<TextElement>("->", MessageElement::Text, this->emplace<TextElement>("->", MessageElementFlag::Text,
app->themes->messages.textColors.system, app->themes->messages.textColors.system,
FontStyle::ChatMedium); FontStyle::ChatMedium);
@ -462,14 +466,14 @@ void TwitchMessageBuilder::appendUsername()
// Your own username // Your own username
this->emplace<TextElement>(currentUser->getUserName() + ":", this->emplace<TextElement>(currentUser->getUserName() + ":",
MessageElement::Text, selfColor, MessageElementFlag::Text, selfColor,
FontStyle::ChatMediumBold); FontStyle::ChatMediumBold);
} else { } else {
if (!this->action_) { if (!this->action_) {
usernameText += ":"; usernameText += ":";
} }
this->emplace<TextElement>(usernameText, MessageElement::Text, this->emplace<TextElement>(usernameText, MessageElementFlag::Text,
this->usernameColor_, this->usernameColor_,
FontStyle::ChatMediumBold) FontStyle::ChatMediumBold)
->setLink({Link::UserInfo, this->userName}); ->setLink({Link::UserInfo, this->userName});
@ -573,7 +577,7 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg)
} }
} }
this->message().flags.set(Message::Highlighted, doHighlight); this->message().flags.set(MessageFlag::Highlighted, doHighlight);
if (!isPastMsg) { if (!isPastMsg) {
if (playSound && if (playSound &&
@ -633,19 +637,19 @@ void TwitchMessageBuilder::appendTwitchEmote(
Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name) Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name)
{ {
auto flags = MessageElement::Flags::None; auto flags = MessageElementFlags();
auto emote = boost::optional<EmotePtr>{}; auto emote = boost::optional<EmotePtr>{};
if ((emote = getApp()->emotes->bttv.getGlobalEmote(name))) { if ((emote = getApp()->emotes->bttv.getGlobalEmote(name))) {
flags = MessageElement::BttvEmote; flags = MessageElementFlag::BttvEmote;
} else if (twitchChannel && } else if (twitchChannel &&
(emote = this->twitchChannel->getBttvEmote(name))) { (emote = this->twitchChannel->getBttvEmote(name))) {
flags = MessageElement::BttvEmote; flags = MessageElementFlag::BttvEmote;
} else if ((emote = getApp()->emotes->ffz.getGlobalEmote(name))) { } else if ((emote = getApp()->emotes->ffz.getGlobalEmote(name))) {
flags = MessageElement::FfzEmote; flags = MessageElementFlag::FfzEmote;
} else if (twitchChannel && } else if (twitchChannel &&
(emote = this->twitchChannel->getFfzEmote(name))) { (emote = this->twitchChannel->getFfzEmote(name))) {
flags = MessageElement::FfzEmote; flags = MessageElementFlag::FfzEmote;
} }
if (emote) { if (emote) {
@ -691,8 +695,8 @@ void TwitchMessageBuilder::appendTwitchBadges()
if (twitchChannel) if (twitchChannel)
if (const auto &badge = this->twitchChannel->getTwitchBadge( if (const auto &badge = this->twitchChannel->getTwitchBadge(
"bits", cheerAmount)) { "bits", cheerAmount)) {
this->emplace<EmoteElement>(badge.get(), this->emplace<EmoteElement>(
MessageElement::BadgeVanity) badge.get(), MessageElementFlag::BadgeVanity)
->setTooltip(tooltip); ->setTooltip(tooltip);
continue; continue;
} }
@ -705,7 +709,7 @@ void TwitchMessageBuilder::appendTwitchBadges()
// const auto &badge = // const auto &badge =
// app->resources->badgeSets.at("bits").versions.at(cheerAmount); // app->resources->badgeSets.at("bits").versions.at(cheerAmount);
// this->emplace<ImageElement>(badge.badgeImage1x, // this->emplace<ImageElement>(badge.badgeImage1x,
// MessageElement::BadgeVanity) // MessageElementFlag::BadgeVanity)
// ->setTooltip(tooltip); // ->setTooltip(tooltip);
//} catch (const std::out_of_range &) { //} catch (const std::out_of_range &) {
// Log("No default bit badge for version {} found", cheerAmount); // Log("No default bit badge for version {} found", cheerAmount);
@ -714,39 +718,41 @@ void TwitchMessageBuilder::appendTwitchBadges()
} else if (badge == "staff/1") { } else if (badge == "staff/1") {
this->emplace<ImageElement>( this->emplace<ImageElement>(
Image::fromNonOwningPixmap(&app->resources->twitch.staff), Image::fromNonOwningPixmap(&app->resources->twitch.staff),
MessageElement::BadgeGlobalAuthority) MessageElementFlag::BadgeGlobalAuthority)
->setTooltip("Twitch Staff"); ->setTooltip("Twitch Staff");
} else if (badge == "admin/1") { } else if (badge == "admin/1") {
this->emplace<ImageElement>( this->emplace<ImageElement>(
Image::fromNonOwningPixmap(&app->resources->twitch.admin), Image::fromNonOwningPixmap(&app->resources->twitch.admin),
MessageElement::BadgeGlobalAuthority) MessageElementFlag::BadgeGlobalAuthority)
->setTooltip("Twitch Admin"); ->setTooltip("Twitch Admin");
} else if (badge == "global_mod/1") { } else if (badge == "global_mod/1") {
this->emplace<ImageElement>(Image::fromNonOwningPixmap( this->emplace<ImageElement>(
&app->resources->twitch.globalmod), Image::fromNonOwningPixmap(
MessageElement::BadgeGlobalAuthority) &app->resources->twitch.globalmod),
MessageElementFlag::BadgeGlobalAuthority)
->setTooltip("Twitch Global Moderator"); ->setTooltip("Twitch Global Moderator");
} else if (badge == "moderator/1") { } else if (badge == "moderator/1") {
// TODO: Implement custom FFZ moderator badge // TODO: Implement custom FFZ moderator badge
this->emplace<ImageElement>(Image::fromNonOwningPixmap( this->emplace<ImageElement>(
&app->resources->twitch.moderator), Image::fromNonOwningPixmap(
MessageElement::BadgeChannelAuthority) &app->resources->twitch.moderator),
MessageElementFlag::BadgeChannelAuthority)
->setTooltip("Twitch Channel Moderator"); ->setTooltip("Twitch Channel Moderator");
} else if (badge == "turbo/1") { } else if (badge == "turbo/1") {
this->emplace<ImageElement>( this->emplace<ImageElement>(
Image::fromNonOwningPixmap(&app->resources->twitch.turbo), Image::fromNonOwningPixmap(&app->resources->twitch.turbo),
MessageElement::BadgeGlobalAuthority) MessageElementFlag::BadgeGlobalAuthority)
->setTooltip("Twitch Turbo Subscriber"); ->setTooltip("Twitch Turbo Subscriber");
} else if (badge == "broadcaster/1") { } else if (badge == "broadcaster/1") {
this->emplace<ImageElement>( this->emplace<ImageElement>(
Image::fromNonOwningPixmap( Image::fromNonOwningPixmap(
&app->resources->twitch.broadcaster), &app->resources->twitch.broadcaster),
MessageElement::BadgeChannelAuthority) MessageElementFlag::BadgeChannelAuthority)
->setTooltip("Twitch Broadcaster"); ->setTooltip("Twitch Broadcaster");
} else if (badge == "premium/1") { } else if (badge == "premium/1") {
this->emplace<ImageElement>( this->emplace<ImageElement>(
Image::fromNonOwningPixmap(&app->resources->twitch.prime), Image::fromNonOwningPixmap(&app->resources->twitch.prime),
MessageElement::BadgeVanity) MessageElementFlag::BadgeVanity)
->setTooltip("Twitch Prime Subscriber"); ->setTooltip("Twitch Prime Subscriber");
} else if (badge.startsWith("partner/")) { } else if (badge.startsWith("partner/")) {
int index = badge.midRef(8).toInt(); int index = badge.midRef(8).toInt();
@ -755,7 +761,7 @@ void TwitchMessageBuilder::appendTwitchBadges()
this->emplace<ImageElement>( this->emplace<ImageElement>(
Image::fromNonOwningPixmap( Image::fromNonOwningPixmap(
&app->resources->twitch.verified), &app->resources->twitch.verified),
MessageElement::BadgeVanity) MessageElementFlag::BadgeVanity)
->setTooltip("Twitch Verified"); ->setTooltip("Twitch Verified");
} break; } break;
default: { default: {
@ -776,7 +782,7 @@ void TwitchMessageBuilder::appendTwitchBadges()
// if (badgeSetIt == channelResources.badgeSets.end()) { // if (badgeSetIt == channelResources.badgeSets.end()) {
// // Fall back to default badge // // Fall back to default badge
// this->emplace<ImageElement>(app->resources->badgeSubscriber, // this->emplace<ImageElement>(app->resources->badgeSubscriber,
// MessageElement::BadgeSubscription) // MessageElementFlag::BadgeSubscription)
// ->setTooltip("Twitch Subscriber"); // ->setTooltip("Twitch Subscriber");
// continue; // continue;
//} //}
@ -790,7 +796,7 @@ void TwitchMessageBuilder::appendTwitchBadges()
// if (badgeVersionIt == badgeSet.versions.end()) { // if (badgeVersionIt == badgeSet.versions.end()) {
// // Fall back to default badge // // Fall back to default badge
// this->emplace<ImageElement>(app->resources->badgeSubscriber, // this->emplace<ImageElement>(app->resources->badgeSubscriber,
// MessageElement::BadgeSubscription) // MessageElementFlag::BadgeSubscription)
// ->setTooltip("Twitch Subscriber"); // ->setTooltip("Twitch Subscriber");
// continue; // continue;
//} //}
@ -798,7 +804,7 @@ void TwitchMessageBuilder::appendTwitchBadges()
// auto &badgeVersion = badgeVersionIt->second; // auto &badgeVersion = badgeVersionIt->second;
// this->emplace<ImageElement>(badgeVersion.badgeImage1x, // this->emplace<ImageElement>(badgeVersion.badgeImage1x,
// MessageElement::BadgeSubscription) // MessageElementFlag::BadgeSubscription)
// ->setTooltip("Twitch " + // ->setTooltip("Twitch " +
// QString::fromStdString(badgeVersion.title)); // QString::fromStdString(badgeVersion.title));
} else { } else {
@ -814,8 +820,8 @@ void TwitchMessageBuilder::appendTwitchBadges()
// " << parts; continue; // " << parts; continue;
//} //}
// MessageElement::Flags badgeType = // MessageElementFlags badgeType =
// MessageElement::Flags::BadgeVanity; // MessageElementFlag::BadgeVanity;
// std::string badgeSetKey = parts[0].toStdString(); // std::string badgeSetKey = parts[0].toStdString();
// std::string versionKey = parts[1].toStdString(); // std::string versionKey = parts[1].toStdString();
@ -857,7 +863,7 @@ void TwitchMessageBuilder::appendChatterinoBadges()
// const auto badge = it->second; // const auto badge = it->second;
// this->emplace<ImageElement>(badge->image, // this->emplace<ImageElement>(badge->image,
// MessageElement::BadgeChatterino) // MessageElementFlag::BadgeChatterino)
// ->setTooltip(QString::fromStdString(badge->tooltip)); // ->setTooltip(QString::fromStdString(badge->tooltip));
} }
@ -903,8 +909,9 @@ Outcome TwitchMessageBuilder::tryParseCheermote(const QString &string)
// const auto &cheermote = *savedIt; // const auto &cheermote = *savedIt;
// this->emplace<EmoteElement>(cheermote.animatedEmote, // this->emplace<EmoteElement>(cheermote.animatedEmote,
// EmoteElement::BitsAnimated); this->emplace<TextElement>(amount, // MessageElementFlag::BitsAnimated);
// EmoteElement::Text, cheermote.color); // this->emplace<TextElement>(amount, MessageElementFlag::Text,
// cheermote.color);
// return Success; // return Success;
// } // }

View file

@ -74,53 +74,54 @@ WindowManager::WindowManager()
}; };
} }
MessageElement::Flags WindowManager::getWordFlags() MessageElementFlags WindowManager::getWordFlags()
{ {
return this->wordFlags_; return this->wordFlags_;
} }
void WindowManager::updateWordTypeMask() void WindowManager::updateWordTypeMask()
{ {
using MEF = MessageElement::Flags; using MEF = MessageElementFlag;
auto settings = getSettings(); auto settings = getSettings();
// text // text
auto flags = MEF::Text | MEF::Text; auto flags = MessageElementFlags(MEF::Text);
// timestamp // timestamp
if (settings->showTimestamps) { if (settings->showTimestamps) {
flags |= MEF::Timestamp; flags.set(MEF::Timestamp);
} }
// emotes // emotes
flags |= settings->enableTwitchEmotes ? MEF::TwitchEmoteImage flags.set(settings->enableTwitchEmotes ? MEF::TwitchEmoteImage
: MEF::TwitchEmoteText; : MEF::TwitchEmoteText);
flags |= settings->enableFfzEmotes ? MEF::FfzEmoteImage : MEF::FfzEmoteText; flags.set(settings->enableFfzEmotes ? MEF::FfzEmoteImage
flags |= : MEF::FfzEmoteText);
settings->enableBttvEmotes ? MEF::BttvEmoteImage : MEF::BttvEmoteText; flags.set(settings->enableBttvEmotes ? MEF::BttvEmoteImage
flags |= settings->enableEmojis ? MEF::EmojiImage : MEF::EmojiText; : MEF::BttvEmoteText);
flags.set(settings->enableEmojis ? MEF::EmojiImage : MEF::EmojiText);
// bits // bits
flags |= MEF::BitsAmount; flags.set(MEF::BitsAmount);
flags |= flags.set(settings->enableGifAnimations ? MEF::BitsAnimated
settings->enableGifAnimations ? MEF::BitsAnimated : MEF::BitsStatic; : MEF::BitsStatic);
// badges // badges
flags |= settings->showBadges ? MEF::Badges : MEF::None; flags.set(settings->showBadges ? MEF::Badges : MEF::None);
// username // username
flags |= MEF::Username; flags.set(MEF::Username);
// misc // misc
flags |= MEF::AlwaysShow; flags.set(MEF::AlwaysShow);
flags |= MEF::Collapsed; flags.set(MEF::Collapsed);
flags |= flags.set(settings->enableUsernameBold ? MEF::BoldUsername
settings->enableUsernameBold ? MEF::BoldUsername : MEF::NonBoldUsername; : MEF::NonBoldUsername);
flags |= flags.set(settings->enableLowercaseLink ? MEF::LowercaseLink
settings->enableLowercaseLink ? MEF::LowercaseLink : MEF::OriginalLink; : MEF::OriginalLink);
// update flags // update flags
MessageElement::Flags newFlags = static_cast<MessageElement::Flags>(flags); MessageElementFlags newFlags = static_cast<MessageElementFlags>(flags);
if (newFlags != this->wordFlags_) { if (newFlags != this->wordFlags_) {
this->wordFlags_ = newFlags; this->wordFlags_ = newFlags;

View file

@ -46,7 +46,7 @@ public:
int getGeneration() const; int getGeneration() const;
void incGeneration(); void incGeneration();
MessageElement::Flags getWordFlags(); MessageElementFlags getWordFlags();
void updateWordTypeMask(); void updateWordTypeMask();
pajlada::Signals::NoArgSignal repaintGifs; pajlada::Signals::NoArgSignal repaintGifs;
@ -66,7 +66,7 @@ private:
Window *mainWindow_ = nullptr; Window *mainWindow_ = nullptr;
Window *selectedWindow_ = nullptr; Window *selectedWindow_ = nullptr;
MessageElement::Flags wordFlags_ = MessageElement::Default; MessageElementFlags wordFlags_ = MessageElementFlag::Default;
pajlada::Settings::SettingListener wordFlagsListener_; pajlada::Settings::SettingListener wordFlagsListener_;
}; };

View file

@ -18,12 +18,12 @@ EmotePopup::EmotePopup()
this->viewEmotes_ = new ChannelView(); this->viewEmotes_ = new ChannelView();
this->viewEmojis_ = new ChannelView(); this->viewEmojis_ = new ChannelView();
this->viewEmotes_->setOverrideFlags(MessageElement::Flags( this->viewEmotes_->setOverrideFlags(MessageElementFlags{
MessageElement::Default | MessageElement::AlwaysShow | MessageElementFlag::Default, MessageElementFlag::AlwaysShow,
MessageElement::EmoteImages)); MessageElementFlag::EmoteImages});
this->viewEmojis_->setOverrideFlags(MessageElement::Flags( this->viewEmojis_->setOverrideFlags(MessageElementFlags{
MessageElement::Default | MessageElement::AlwaysShow | MessageElementFlag::Default, MessageElementFlag::AlwaysShow,
MessageElement::EmoteImages)); MessageElementFlag::EmoteImages});
this->viewEmotes_->setEnableScrollingToBottom(false); this->viewEmotes_->setEnableScrollingToBottom(false);
this->viewEmojis_->setEnableScrollingToBottom(false); this->viewEmojis_->setEnableScrollingToBottom(false);
@ -63,20 +63,20 @@ void EmotePopup::loadChannel(ChannelPtr _channel)
// TITLE // TITLE
MessageBuilder builder1; MessageBuilder builder1;
builder1.emplace<TextElement>(title, MessageElement::Text); builder1.emplace<TextElement>(title, MessageElementFlag::Text);
builder1->flags |= Message::Centered; builder1->flags.set(MessageFlag::Centered);
emoteChannel->addMessage(builder1.release()); emoteChannel->addMessage(builder1.release());
// EMOTES // EMOTES
MessageBuilder builder2; MessageBuilder builder2;
builder2->flags |= Message::Centered; builder2->flags.set(MessageFlag::Centered);
builder2->flags |= Message::DisableCompactEmotes; builder2->flags.set(MessageFlag::DisableCompactEmotes);
for (auto emote : map) { for (auto emote : map) {
builder2 builder2
.emplace<EmoteElement>(emote.second, .emplace<EmoteElement>(emote.second,
MessageElement::Flags::AlwaysShow) MessageElementFlag::AlwaysShow)
->setLink(Link(Link::InsertText, emote.first.string)); ->setLink(Link(Link::InsertText, emote.first.string));
} }
@ -103,21 +103,21 @@ void EmotePopup::loadChannel(ChannelPtr _channel)
setText = set->text; setText = set->text;
} }
builder1.emplace<TextElement>(setText, MessageElement::Text); builder1.emplace<TextElement>(setText, MessageElementFlag::Text);
builder1->flags |= Message::Centered; builder1->flags.set(MessageFlag::Centered);
emoteChannel->addMessage(builder1.release()); emoteChannel->addMessage(builder1.release());
// EMOTES // EMOTES
MessageBuilder builder2; MessageBuilder builder2;
builder2->flags |= Message::Centered; builder2->flags.set(MessageFlag::Centered);
builder2->flags |= Message::DisableCompactEmotes; builder2->flags.set(MessageFlag::DisableCompactEmotes);
for (const auto &emote : set->emotes) { for (const auto &emote : set->emotes) {
builder2 builder2
.emplace<EmoteElement>( .emplace<EmoteElement>(
app->emotes->twitch.getOrCreateEmote(emote.id, emote.name), app->emotes->twitch.getOrCreateEmote(emote.id, emote.name),
MessageElement::Flags::AlwaysShow) MessageElementFlag::AlwaysShow)
->setLink(Link(Link::InsertText, emote.name.string)); ->setLink(Link(Link::InsertText, emote.name.string));
} }
@ -146,19 +146,18 @@ void EmotePopup::loadEmojis()
// title // title
MessageBuilder builder1; MessageBuilder builder1;
builder1.emplace<TextElement>("emojis", MessageElement::Text); builder1.emplace<TextElement>("emojis", MessageElementFlag::Text);
builder1->flags |= Message::Centered; builder1->flags.set(MessageFlag::Centered);
emojiChannel->addMessage(builder1.release()); emojiChannel->addMessage(builder1.release());
// emojis // emojis
MessageBuilder builder; MessageBuilder builder;
builder->flags |= Message::Centered; builder->flags.set(MessageFlag::Centered);
builder->flags |= Message::DisableCompactEmotes; builder->flags.set(MessageFlag::DisableCompactEmotes);
emojis.each([&builder](const auto &key, const auto &value) { emojis.each([&builder](const auto &key, const auto &value) {
builder builder
.emplace<EmoteElement>(value->emote, .emplace<EmoteElement>(value->emote, MessageElementFlag::AlwaysShow)
MessageElement::Flags::AlwaysShow)
->setLink( ->setLink(
Link(Link::Type::InsertText, ":" + value->shortCodes[0] + ":")); Link(Link::Type::InsertText, ":" + value->shortCodes[0] + ":"));
}); });

View file

@ -173,11 +173,11 @@ void LogsPopup::getOverrustleLogs()
MessageBuilder builder; MessageBuilder builder;
builder.emplace<TimestampElement>(timeStamp); builder.emplace<TimestampElement>(timeStamp);
builder.emplace<TextElement>(this->userName_, builder.emplace<TextElement>(this->userName_,
MessageElement::Username, MessageElementFlag::Username,
MessageColor::System); MessageColor::System);
builder.emplace<TextElement>( builder.emplace<TextElement>(
singleMessage.value("text").toString(), singleMessage.value("text").toString(),
MessageElement::Text, MessageColor::Text); MessageElementFlag::Text, MessageColor::Text);
messages.push_back(builder.release()); messages.push_back(builder.release());
} }
} }

View file

@ -34,7 +34,7 @@
namespace chatterino { namespace chatterino {
namespace { namespace {
void addEmoteContextMenuItems(const Emote &emote, void addEmoteContextMenuItems(const Emote &emote,
MessageElement::Flags creatorFlags, QMenu &menu) MessageElementFlags creatorFlags, QMenu &menu)
{ {
auto openAction = menu.addAction("Open"); auto openAction = menu.addAction("Open");
auto openMenu = new QMenu; auto openMenu = new QMenu;
@ -83,9 +83,9 @@ void addEmoteContextMenuItems(const Emote &emote,
}); });
}; };
if (creatorFlags & MessageElement::Flags::BttvEmote) { if (creatorFlags.has(MessageElementFlag::BttvEmote)) {
addPageLink("BTTV"); addPageLink("BTTV");
} else if (creatorFlags & MessageElement::Flags::FfzEmote) { } else if (creatorFlags.has(MessageElementFlag::FfzEmote)) {
addPageLink("FFZ"); addPageLink("FFZ");
} }
} }
@ -252,7 +252,7 @@ void ChannelView::actuallyLayoutMessages(bool causedByScrollbar)
size_t start = size_t(this->scrollBar_.getCurrentValue()); size_t start = size_t(this->scrollBar_.getCurrentValue());
int layoutWidth = this->getLayoutWidth(); int layoutWidth = this->getLayoutWidth();
MessageElement::Flags flags = this->getFlags(); MessageElementFlags flags = this->getFlags();
// layout the visible messages in the view // layout the visible messages in the view
if (messagesSnapshot.getLength() > start) { if (messagesSnapshot.getLength() > start) {
@ -387,12 +387,12 @@ bool ChannelView::getEnableScrollingToBottom() const
return this->enableScrollingToBottom_; return this->enableScrollingToBottom_;
} }
void ChannelView::setOverrideFlags(boost::optional<MessageElement::Flags> value) void ChannelView::setOverrideFlags(boost::optional<MessageElementFlags> value)
{ {
this->overrideFlags_ = value; this->overrideFlags_ = value;
} }
const boost::optional<MessageElement::Flags> &ChannelView::getOverrideFlags() const boost::optional<MessageElementFlags> &ChannelView::getOverrideFlags()
const const
{ {
return this->overrideFlags_; return this->overrideFlags_;
@ -423,7 +423,7 @@ void ChannelView::setChannel(ChannelPtr newChannel)
auto messageRef = new MessageLayout(message); auto messageRef = new MessageLayout(message);
if (this->lastMessageHasAlternateBackground_) { if (this->lastMessageHasAlternateBackground_) {
messageRef->flags |= MessageLayout::AlternateBackground; messageRef->flags.set(MessageLayoutFlag::AlternateBackground);
} }
this->lastMessageHasAlternateBackground_ = this->lastMessageHasAlternateBackground_ =
!this->lastMessageHasAlternateBackground_; !this->lastMessageHasAlternateBackground_;
@ -443,8 +443,8 @@ void ChannelView::setChannel(ChannelPtr newChannel)
// } // }
} }
if (!(message->flags & Message::DoNotTriggerNotification)) { if (!message->flags.has(MessageFlag::DoNotTriggerNotification)) {
if (message->flags & Message::Highlighted) { if (message->flags.has(MessageFlag::Highlighted)) {
this->tabHighlightRequested.invoke( this->tabHighlightRequested.invoke(
HighlightState::Highlighted); HighlightState::Highlighted);
} else { } else {
@ -521,8 +521,8 @@ void ChannelView::setChannel(ChannelPtr newChannel)
} }
const auto &message = snapshot[index]; const auto &message = snapshot[index];
if (message->flags & MessageLayout::AlternateBackground) { if (message->flags.has(MessageLayoutFlag::AlternateBackground)) {
newItem->flags |= MessageLayout::AlternateBackground; newItem->flags.set(MessageLayoutFlag::AlternateBackground);
} }
this->scrollBar_.replaceHighlight( this->scrollBar_.replaceHighlight(
@ -540,7 +540,7 @@ void ChannelView::setChannel(ChannelPtr newChannel)
auto messageRef = new MessageLayout(snapshot[i]); auto messageRef = new MessageLayout(snapshot[i]);
if (this->lastMessageHasAlternateBackground_) { if (this->lastMessageHasAlternateBackground_) {
messageRef->flags |= MessageLayout::AlternateBackground; messageRef->flags.set(MessageLayoutFlag::AlternateBackground);
} }
this->lastMessageHasAlternateBackground_ = this->lastMessageHasAlternateBackground_ =
!this->lastMessageHasAlternateBackground_; !this->lastMessageHasAlternateBackground_;
@ -613,7 +613,7 @@ void ChannelView::setSelection(const SelectionItem &start,
this->selectionChanged.invoke(); this->selectionChanged.invoke();
} }
MessageElement::Flags ChannelView::getFlags() const MessageElementFlags ChannelView::getFlags() const
{ {
auto app = getApp(); auto app = getApp();
@ -621,17 +621,16 @@ MessageElement::Flags ChannelView::getFlags() const
return this->overrideFlags_.get(); return this->overrideFlags_.get();
} }
MessageElement::Flags flags = app->windows->getWordFlags(); MessageElementFlags flags = app->windows->getWordFlags();
Split *split = dynamic_cast<Split *>(this->parentWidget()); Split *split = dynamic_cast<Split *>(this->parentWidget());
if (split != nullptr) { if (split != nullptr) {
if (split->getModerationMode()) { if (split->getModerationMode()) {
flags = flags.set(MessageElementFlag::ModeratorTools);
MessageElement::Flags(flags | MessageElement::ModeratorTools);
} }
if (this->channel_ == app->twitch.server->mentionsChannel) { if (this->channel_ == app->twitch.server->mentionsChannel) {
flags = MessageElement::Flags(flags | MessageElement::ChannelName); flags.set(MessageElementFlag::ChannelName);
} }
} }
@ -870,7 +869,7 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
} }
// message under cursor is collapsed // message under cursor is collapsed
if (layout->flags & MessageLayout::Collapsed) { if (layout->flags.has(MessageLayoutFlag::Collapsed)) {
this->setCursor(Qt::PointingHandCursor); this->setCursor(Qt::PointingHandCursor);
tooltipWidget->hide(); tooltipWidget->hide();
return; return;
@ -941,7 +940,7 @@ void ChannelView::mousePressEvent(QMouseEvent *event)
this->lastPressPosition_ = event->screenPos(); this->lastPressPosition_ = event->screenPos();
this->isMouseDown_ = true; this->isMouseDown_ = true;
if (layout->flags & MessageLayout::Collapsed) { if (layout->flags.has(MessageLayoutFlag::Collapsed)) {
return; return;
} }
@ -1010,9 +1009,9 @@ void ChannelView::mouseReleaseEvent(QMouseEvent *event)
} }
// message under cursor is collapsed // message under cursor is collapsed
if (layout->flags & MessageLayout::Collapsed) { if (layout->flags.has(MessageLayoutFlag::Collapsed)) {
layout->flags |= MessageLayout::Expanded; layout->flags.set(MessageLayoutFlag::Expanded);
layout->flags |= MessageLayout::RequiresLayout; layout->flags.set(MessageLayoutFlag::RequiresLayout);
this->layoutMessages(); this->layoutMessages();
return; return;
@ -1081,8 +1080,8 @@ void ChannelView::addContextMenuItems(
menu->clear(); menu->clear();
// Emote actions // Emote actions
if (creatorFlags & (MessageElement::Flags::EmoteImages | if (creatorFlags.hasAny({MessageElementFlag::EmoteImages,
MessageElement::Flags::EmojiImage)) { MessageElementFlag::EmojiImage})) {
const auto emoteElement = dynamic_cast<const EmoteElement *>(&creator); const auto emoteElement = dynamic_cast<const EmoteElement *>(&creator);
if (emoteElement) if (emoteElement)
addEmoteContextMenuItems(*emoteElement->getEmote(), creatorFlags, addEmoteContextMenuItems(*emoteElement->getEmote(), creatorFlags,
@ -1147,7 +1146,7 @@ void ChannelView::mouseDoubleClickEvent(QMouseEvent *event)
} }
// message under cursor is collapsed // message under cursor is collapsed
if (layout->flags & MessageLayout::Collapsed) { if (layout->flags.has(MessageLayoutFlag::Collapsed)) {
return; return;
} }

View file

@ -36,8 +36,8 @@ public:
void clearSelection(); void clearSelection();
void setEnableScrollingToBottom(bool); void setEnableScrollingToBottom(bool);
bool getEnableScrollingToBottom() const; bool getEnableScrollingToBottom() const;
void setOverrideFlags(boost::optional<MessageElement::Flags> value); void setOverrideFlags(boost::optional<MessageElementFlags> value);
const boost::optional<MessageElement::Flags> &getOverrideFlags() const; const boost::optional<MessageElementFlags> &getOverrideFlags() const;
void pause(int msecTimeout); void pause(int msecTimeout);
void updateLastReadMessage(); void updateLastReadMessage();
@ -83,7 +83,7 @@ private:
void drawMessages(QPainter &painter); void drawMessages(QPainter &painter);
void setSelection(const SelectionItem &start, const SelectionItem &end); void setSelection(const SelectionItem &start, const SelectionItem &end);
MessageElement::Flags getFlags() const; MessageElementFlags getFlags() const;
bool isPaused(); bool isPaused();
void handleMouseClick(QMouseEvent *event, void handleMouseClick(QMouseEvent *event,
@ -107,7 +107,7 @@ private:
int messagesAddedSinceSelectionPause_ = 0; int messagesAddedSinceSelectionPause_ = 0;
QTimer pauseTimeout_; QTimer pauseTimeout_;
boost::optional<MessageElement::Flags> overrideFlags_; boost::optional<MessageElementFlags> overrideFlags_;
MessageLayoutPtr lastReadMessage_; MessageLayoutPtr lastReadMessage_;
LimitedQueueSnapshot<MessageLayoutPtr> snapshot_; LimitedQueueSnapshot<MessageLayoutPtr> snapshot_;

View file

@ -322,24 +322,24 @@ ChannelPtr LookPage::createPreviewChannel()
{ {
MessageBuilder builder; MessageBuilder builder;
builder.emplace<TimestampElement>(QTime(8, 13, 42)); builder.emplace<TimestampElement>(QTime(8, 13, 42));
builder.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->twitch.moderator), MessageElement::BadgeChannelAuthority); builder.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->twitch.moderator), MessageElementFlag::BadgeChannelAuthority);
builder.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->twitch.subscriber), MessageElement::BadgeSubscription); builder.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->twitch.subscriber), MessageElementFlag::BadgeSubscription);
builder.emplace<TextElement>("username1:", MessageElement::Username, QColor("#0094FF"), FontStyle::ChatMediumBold); builder.emplace<TextElement>("username1:", MessageElementFlag::Username, QColor("#0094FF"), FontStyle::ChatMediumBold);
builder.emplace<TextElement>("This is a preview message", MessageElement::Text); builder.emplace<TextElement>("This is a preview message", MessageElementFlag::Text);
builder.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->pajaDank), MessageElement::Flags::AlwaysShow); builder.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->pajaDank), MessageElementFlag::AlwaysShow);
builder.emplace<TextElement>("@fourtf", TextElement::BoldUsername, MessageColor::Text, FontStyle::ChatMediumBold); builder.emplace<TextElement>("@fourtf", MessageElementFlag::BoldUsername, MessageColor::Text, FontStyle::ChatMediumBold);
builder.emplace<TextElement>("@fourtf", TextElement::NonBoldUsername); builder.emplace<TextElement>("@fourtf", MessageElementFlag::NonBoldUsername);
channel->addMessage(builder.release()); channel->addMessage(builder.release());
} }
{ {
MessageBuilder message; MessageBuilder message;
message.emplace<TimestampElement>(QTime(8, 15, 21)); message.emplace<TimestampElement>(QTime(8, 15, 21));
message.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->twitch.broadcaster), MessageElement::BadgeChannelAuthority); message.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->twitch.broadcaster), MessageElementFlag::BadgeChannelAuthority);
message.emplace<TextElement>("username2:", MessageElement::Username, QColor("#FF6A00"), FontStyle::ChatMediumBold); message.emplace<TextElement>("username2:", MessageElementFlag::Username, QColor("#FF6A00"), FontStyle::ChatMediumBold);
message.emplace<TextElement>("This is another one", MessageElement::Text); message.emplace<TextElement>("This is another one", MessageElementFlag::Text);
// message.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->ppHop), MessageElement::BttvEmote); // message.emplace<ImageElement>(Image::fromNonOwningPixmap(&getApp()->resources->ppHop), MessageElementFlag::BttvEmote);
message.emplace<TextElement>("www.fourtf.com", MessageElement::LowercaseLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com")); message.emplace<TextElement>("www.fourtf.com", MessageElementFlag::LowercaseLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com"));
message.emplace<TextElement>("wWw.FoUrTf.CoM", MessageElement::OriginalLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com")); message.emplace<TextElement>("wWw.FoUrTf.CoM", MessageElementFlag::OriginalLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com"));
channel->addMessage(message.release()); channel->addMessage(message.release());
} }
// clang-format on // clang-format on