diff --git a/src/Application.cpp b/src/Application.cpp index 963951107..c912597c8 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -191,7 +191,7 @@ void Application::initPubsub() } MessageBuilder msg(action); - msg->flags |= Message::PubSub; + msg->flags.set(MessageFlag::PubSub); postToThread([chan, msg = msg.release()] { chan->addOrReplaceTimeout(msg); diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index ab5ad07e5..6511d6a2e 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -104,21 +104,24 @@ void Channel::addOrReplaceTimeout(MessagePtr message) break; } - if (s->flags.HasFlag(Message::Untimeout) && + if (s->flags.has(MessageFlag::Untimeout) && s->timeoutUser == message->timeoutUser) { break; } - if (s->flags.HasFlag(Message::Timeout) && - s->timeoutUser == message->timeoutUser) { - if (message->flags.HasFlag(Message::PubSub) && - !s->flags.HasFlag(Message::PubSub)) { + if (s->flags.has(MessageFlag::Timeout) && + s->timeoutUser == message->timeoutUser) // + { + if (message->flags.has(MessageFlag::PubSub) && + !s->flags.has(MessageFlag::PubSub)) // + { this->replaceMessage(s, message); addMessage = false; break; } - if (!message->flags.HasFlag(Message::PubSub) && - s->flags.HasFlag(Message::PubSub)) { + if (!message->flags.has(MessageFlag::PubSub) && + s->flags.has(MessageFlag::PubSub)) // + { addMessage = false; break; } @@ -142,10 +145,10 @@ void Channel::addOrReplaceTimeout(MessagePtr message) // disable the messages from the user for (int i = 0; i < snapshotLength; 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) { // 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(); for (int i = 0; i < snapshotLength; i++) { auto &s = snapshot[i]; - if (s->flags & Message::System || s->flags & Message::Timeout) { + if (s->flags.hasAny({MessageFlag::System, MessageFlag::Timeout})) { continue; } // FOURTF: disabled for now - // s->flags.EnableFlag(Message::Disabled); + // s->flags.EnableFlag(MessageFlag::Disabled); } } diff --git a/src/common/FlagsEnum.hpp b/src/common/FlagsEnum.hpp index bb4e3d57d..000c3da70 100644 --- a/src/common/FlagsEnum.hpp +++ b/src/common/FlagsEnum.hpp @@ -15,43 +15,26 @@ public: { } - FlagsEnum(T _value) - : value(_value) + FlagsEnum(T value) + : value(value) { } - inline T operator~() const + FlagsEnum(std::initializer_list flags) { - return (T) ~(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^(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); + for (auto flag : flags) { + this->set(flag); + } } - void EnableFlag(T flag) + bool operator==(const FlagsEnum &other) { - reinterpret_cast(this->value) |= static_cast(flag); + return this->value == other.value; + } + + bool operator!=(const FlagsEnum &other) + { + return this->value != other.value; } void set(T flag) @@ -72,11 +55,44 @@ public: this->unset(flag); } - bool HasFlag(Q flag) const + bool has(T flag) const { - return (this->value & flag) == flag; + return static_cast(this->value) & static_cast(flag); } + // bool hasAny(std::initializer_list flags) const + //{ + // for (auto flag : flags) { + // if (this->has(flag)) return true; + // } + // return false; + //} + + bool hasAny(FlagsEnum flags) const + { + return static_cast(this->value) & static_cast(flags.value); + } + + // bool hasAll(std::initializer_list flags) const + //{ + // for (auto flag : flags) { + // if (!this->has(flag)) return false; + // } + // return true; + //} + + bool hasAll(FlagsEnum flags) const + { + return (static_cast(this->value) & static_cast(flags.value)) && + static_cast(flags->value); + } + + bool hasNone(std::initializer_list flags) const + { + return !this->hasAny(flags); + } + +private: T value; }; diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index 25c75429d..111c06786 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -127,10 +127,10 @@ QString CommandController::execCommand(const QString &text, ChannelPtr channel, b.emplace(); b.emplace( app->accounts->twitch.getCurrent()->getUserName(), - MessageElement::Text, MessageColor::Text, + MessageElementFlag::Text, MessageColor::Text, FontStyle::ChatMediumBold); - b.emplace("->", MessageElement::Text); - b.emplace(words[1] + ":", MessageElement::Text, + b.emplace("->", MessageElementFlag::Text); + b.emplace(words[1] + ":", MessageElementFlag::Text, MessageColor::Text, FontStyle::ChatMediumBold); @@ -140,8 +140,8 @@ QString CommandController::execCommand(const QString &text, ChannelPtr channel, rest += words[i] + " "; } - b.emplace(rest, MessageElement::Text); - b.message().flags |= Message::DoNotTriggerNotification; + b.emplace(rest, MessageElementFlag::Text); + b->flags.set(MessageFlag::DoNotTriggerNotification); auto messagexD = b.release(); app->twitch.server->whispersChannel->addMessage(messagexD); diff --git a/src/messages/Message.cpp b/src/messages/Message.cpp index 7bb771b23..8fa860353 100644 --- a/src/messages/Message.cpp +++ b/src/messages/Message.cpp @@ -21,9 +21,9 @@ Message::~Message() SBHighlight Message::getScrollBarHighlight() const { - if (this->flags & Message::Highlighted) { + if (this->flags.has(MessageFlag::Highlighted)) { return SBHighlight(SBHighlight::Highlight); - } else if (this->flags & Message::Subscription) { + } else if (this->flags.has(MessageFlag::Subscription)) { return SBHighlight(SBHighlight::Subscription); } return SBHighlight(); diff --git a/src/messages/Message.hpp b/src/messages/Message.hpp index ba42c9e84..76039ec41 100644 --- a/src/messages/Message.hpp +++ b/src/messages/Message.hpp @@ -12,27 +12,28 @@ namespace chatterino { -struct Message : boost::noncopyable { - enum MessageFlags : uint16_t { - None = 0, - System = (1 << 0), - Timeout = (1 << 1), - Highlighted = (1 << 2), - DoNotTriggerNotification = (1 << 3), // disable notification sound - Centered = (1 << 4), - Disabled = (1 << 5), - DisableCompactEmotes = (1 << 6), - Collapsed = (1 << 7), - DisconnectedMessage = (1 << 8), - Untimeout = (1 << 9), - PubSub = (1 << 10), - Subscription = (1 << 11), - }; +enum class MessageFlag : uint16_t { + None = 0, + System = (1 << 0), + Timeout = (1 << 1), + Highlighted = (1 << 2), + DoNotTriggerNotification = (1 << 3), // disable notification sound + Centered = (1 << 4), + Disabled = (1 << 5), + DisableCompactEmotes = (1 << 6), + Collapsed = (1 << 7), + DisconnectedMessage = (1 << 8), + Untimeout = (1 << 9), + PubSub = (1 << 10), + Subscription = (1 << 11), +}; +using MessageFlags = FlagsEnum; +struct Message : boost::noncopyable { Message(); ~Message(); - FlagsEnum flags; + MessageFlags flags; QTime parseTime; QString id; QString searchText; diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index d86e547d1..42c537c67 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -25,7 +25,7 @@ MessageBuilder::MessageBuilder(const QString &text) : MessageBuilder() { this->emplace(); - this->emplace(text, MessageElement::Text, + this->emplace(text, MessageElementFlag::Text, MessageColor::System); this->message().searchText = text; } @@ -34,10 +34,10 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text) : MessageBuilder() { this->emplace(); - this->emplace(text, MessageElement::Text, + this->emplace(text, MessageElementFlag::Text, MessageColor::System); - this->message().flags |= Message::System; - this->message().flags |= Message::DoNotTriggerNotification; + this->message().flags.set(MessageFlag::System); + this->message().flags.set(MessageFlag::DoNotTriggerNotification); this->message().searchText = text; } @@ -75,17 +75,17 @@ MessageBuilder::MessageBuilder(TimeoutMessageTag, const QString &username, text.append(" (multiple times)"); } - this->message().flags.EnableFlag(Message::System); - this->message().flags.EnableFlag(Message::Timeout); - this->message().flags.EnableFlag(Message::DoNotTriggerNotification); + this->message().flags.set(MessageFlag::System); + this->message().flags.set(MessageFlag::Timeout); + this->message().flags.set(MessageFlag::DoNotTriggerNotification); this->message().timeoutUser = username; } MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count) { this->emplace(); - this->message().flags.EnableFlag(Message::System); - this->message().flags.EnableFlag(Message::Timeout); + this->message().flags.set(MessageFlag::System); + this->message().flags.set(MessageFlag::Timeout); this->message().timeoutUser = action.target.name; this->message().count = count; @@ -121,7 +121,7 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count) } } - this->emplace(text, MessageElement::Text, + this->emplace(text, MessageElementFlag::Text, MessageColor::System); this->message().searchText = text; } @@ -129,8 +129,8 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count) MessageBuilder::MessageBuilder(const UnbanAction &action) { this->emplace(); - this->message().flags.EnableFlag(Message::System); - this->message().flags.EnableFlag(Message::Untimeout); + this->message().flags.set(MessageFlag::System); + this->message().flags.set(MessageFlag::Untimeout); this->message().timeoutUser = action.target.name; @@ -146,7 +146,7 @@ MessageBuilder::MessageBuilder(const UnbanAction &action) .arg(action.target.name); } - this->emplace(text, MessageElement::Text, + this->emplace(text, MessageElementFlag::Text, MessageColor::System); this->message().searchText = text; } diff --git a/src/messages/MessageElement.cpp b/src/messages/MessageElement.cpp index e5e5cd735..bca2c3072 100644 --- a/src/messages/MessageElement.cpp +++ b/src/messages/MessageElement.cpp @@ -11,7 +11,7 @@ namespace chatterino { -MessageElement::MessageElement(Flags flags) +MessageElement::MessageElement(MessageElementFlags flags) : flags_(flags) { DebugCount::increase("message elements"); @@ -55,13 +55,13 @@ bool MessageElement::hasTrailingSpace() const return this->trailingSpace; } -MessageElement::Flags MessageElement::getFlags() const +MessageElementFlags MessageElement::getFlags() const { return this->flags_; } // IMAGE -ImageElement::ImageElement(ImagePtr image, MessageElement::Flags flags) +ImageElement::ImageElement(ImagePtr image, MessageElementFlags flags) : MessageElement(flags) , image_(image) { @@ -69,9 +69,9 @@ ImageElement::ImageElement(ImagePtr image, MessageElement::Flags flags) } 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(), this->image_->height() * container.getScale()); @@ -81,12 +81,12 @@ void ImageElement::addToContainer(MessageLayoutContainer &container, } // EMOTE -EmoteElement::EmoteElement(const EmotePtr &emote, MessageElement::Flags flags) +EmoteElement::EmoteElement(const EmotePtr &emote, MessageElementFlags flags) : MessageElement(flags) , emote_(emote) { this->textElement_.reset( - new TextElement(emote->getCopyString(), MessageElement::Misc)); + new TextElement(emote->getCopyString(), MessageElementFlag::Misc)); this->setTooltip(emote->tooltip.string); } @@ -97,10 +97,10 @@ EmotePtr EmoteElement::getEmote() const } void EmoteElement::addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) + MessageElementFlags flags) { - if (flags & this->getFlags()) { - if (flags & MessageElement::EmoteImages) { + if (flags.hasAny(this->getFlags())) { + if (flags.has(MessageElementFlag::EmoteImages)) { auto image = this->emote_->images.getImage(container.getScale()); if (image->empty()) return; @@ -112,14 +112,14 @@ void EmoteElement::addToContainer(MessageLayoutContainer &container, } else { if (this->textElement_) { this->textElement_->addToContainer(container, - MessageElement::Misc); + MessageElementFlag::Misc); } } } } // TEXT -TextElement::TextElement(const QString &text, MessageElement::Flags flags, +TextElement::TextElement(const QString &text, MessageElementFlags flags, const MessageColor &color, FontStyle style) : MessageElement(flags) , color_(color) @@ -132,11 +132,11 @@ TextElement::TextElement(const QString &text, MessageElement::Flags flags, } void TextElement::addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) + MessageElementFlags flags) { auto app = getApp(); - if (flags & this->getFlags()) { + if (flags.hasAny(this->getFlags())) { QFontMetrics metrics = app->fonts->getFontMetrics(this->style_, container.getScale()); @@ -212,7 +212,7 @@ void TextElement::addToContainer(MessageLayoutContainer &container, // TIMESTAMP TimestampElement::TimestampElement(QTime time) - : MessageElement(MessageElement::Timestamp) + : MessageElement(MessageElementFlag::Timestamp) , time_(time) , element_(this->formatTime(time)) { @@ -220,9 +220,9 @@ TimestampElement::TimestampElement(QTime time) } void TimestampElement::addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) + MessageElementFlags flags) { - if (flags & this->getFlags()) { + if (flags.hasAny(this->getFlags())) { auto app = getApp(); if (app->settings->timestampFormat != this->format_) { this->format_ = app->settings->timestampFormat.getValue(); @@ -239,20 +239,20 @@ TextElement *TimestampElement::formatTime(const QTime &time) QString format = locale.toString(time, getApp()->settings->timestampFormat); - return new TextElement(format, Flags::Timestamp, MessageColor::System, - FontStyle::ChatMedium); + return new TextElement(format, MessageElementFlag::Timestamp, + MessageColor::System, FontStyle::ChatMedium); } // TWITCH MODERATION TwitchModerationElement::TwitchModerationElement() - : MessageElement(MessageElement::ModeratorTools) + : MessageElement(MessageElementFlag::ModeratorTools) { } 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), int(container.getScale() * 16)); diff --git a/src/messages/MessageElement.hpp b/src/messages/MessageElement.hpp index cb7ffeebd..82edadd85 100644 --- a/src/messages/MessageElement.hpp +++ b/src/messages/MessageElement.hpp @@ -1,6 +1,7 @@ #pragma once #include "common/Emotemap.hpp" +#include "common/FlagsEnum.hpp" #include "messages/Emote.hpp" #include "messages/Image.hpp" #include "messages/Link.hpp" @@ -19,98 +20,99 @@ namespace chatterino { class Channel; 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; + class MessageElement : boost::noncopyable { 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 { - Update_Text, - Update_Emotes, - Update_Images, + Update_Text = 1, + Update_Emotes = 2, + Update_Images = 4, Update_All = Update_Text | Update_Emotes | Update_Images }; @@ -122,29 +124,29 @@ public: const QString &getTooltip() const; const Link &getLink() const; bool hasTrailingSpace() const; - Flags getFlags() const; + MessageElementFlags getFlags() const; virtual void addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) = 0; + MessageElementFlags flags) = 0; protected: - MessageElement(Flags flags); + MessageElement(MessageElementFlags flags); bool trailingSpace = true; private: Link link_; QString tooltip_; - Flags flags_; + MessageElementFlags flags_; }; // contains a simple image class ImageElement : public MessageElement { public: - ImageElement(ImagePtr image, MessageElement::Flags flags); + ImageElement(ImagePtr image, MessageElementFlags flags); void addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) override; + MessageElementFlags flags) override; private: ImagePtr image_; @@ -154,13 +156,13 @@ private: class TextElement : public MessageElement { public: - TextElement(const QString &text, MessageElement::Flags flags, + TextElement(const QString &text, MessageElementFlags flags, const MessageColor &color = MessageColor::Text, FontStyle style = FontStyle::ChatMedium); ~TextElement() override = default; void addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) override; + MessageElementFlags flags) override; private: MessageColor color_; @@ -179,10 +181,10 @@ private: class EmoteElement : public MessageElement { public: - EmoteElement(const EmotePtr &data, MessageElement::Flags flags_); + EmoteElement(const EmotePtr &data, MessageElementFlags flags_); void addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags_) override; + MessageElementFlags flags_) override; EmotePtr getEmote() const; private: @@ -198,7 +200,7 @@ public: ~TimestampElement() override = default; void addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) override; + MessageElementFlags flags) override; TextElement *formatTime(const QTime &time); @@ -216,7 +218,7 @@ public: TwitchModerationElement(); void addToContainer(MessageLayoutContainer &container, - MessageElement::Flags flags) override; + MessageElementFlags flags) override; }; } // namespace chatterino diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index 3f898f0db..9847c1950 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -46,7 +46,7 @@ int MessageLayout::getHeight() const // Layout // 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()"); @@ -62,7 +62,7 @@ bool MessageLayout::layout(int width, float scale, MessageElement::Flags flags) // check if layout state changed if (this->layoutState_ != app->windows->getGeneration()) { layoutRequired = true; - this->flags |= RequiresBufferUpdate; + this->flags.set(MessageLayoutFlag::RequiresBufferUpdate); 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(); // check if layout was requested manually - layoutRequired |= bool(this->flags & RequiresLayout); - this->flags &= decltype(RequiresLayout)(~RequiresLayout); + layoutRequired |= this->flags.has(MessageLayoutFlag::RequiresLayout); + this->flags.unset(MessageLayoutFlag::RequiresLayout); // check if dpi changed layoutRequired |= this->scale_ != scale; @@ -92,15 +92,15 @@ bool MessageLayout::layout(int width, float scale, MessageElement::Flags flags) 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 || - (_flags & MessageElement::ModeratorTools && - !(this->message_->flags & Message::MessageFlags::Disabled))) { - messageFlags = Message::MessageFlags(messageFlags & - ~Message::MessageFlags::Collapsed); + if (this->flags.has(MessageLayoutFlag::Expanded) || + (_flags.has(MessageElementFlag::ModeratorTools) && + !this->message_->flags.has(MessageFlag::Disabled))) // + { + messageFlags.unset(MessageFlag::Collapsed); } this->container_.begin(width, this->scale_, messageFlags); @@ -117,9 +117,9 @@ void MessageLayout::actuallyLayout(int width, MessageElement::Flags _flags) this->height_ = this->container_.getHeight(); // collapsed state - this->flags &= ~Flags::Collapsed; + this->flags.unset(MessageLayoutFlag::Collapsed); 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); // draw disabled - if (this->message_->flags.HasFlag(Message::Disabled)) { + if (this->message_->flags.has(MessageFlag::Disabled)) { painter.fillRect(0, y, pixmap->width(), pixmap->height(), app->themes->messages.disabled); } @@ -204,12 +204,12 @@ void MessageLayout::updateBuffer(QPixmap *buffer, int /*messageIndex*/, // draw background QColor backgroundColor; - if (this->message_->flags & Message::Highlighted) { + if (this->message_->flags.has(MessageFlag::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; } else if (app->settings->alternateMessageBackground.getValue() && - this->flags & MessageLayout::AlternateBackground) { + this->flags.has(MessageLayoutFlag::AlternateBackground)) { backgroundColor = app->themes->messages.backgrounds.alternate; } else { backgroundColor = app->themes->messages.backgrounds.regular; diff --git a/src/messages/layouts/MessageLayout.hpp b/src/messages/layouts/MessageLayout.hpp index 662bf1d2a..629da9685 100644 --- a/src/messages/layouts/MessageLayout.hpp +++ b/src/messages/layouts/MessageLayout.hpp @@ -14,17 +14,18 @@ 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; + class MessageLayout : boost::noncopyable { public: - enum Flags : uint8_t { - RequiresBufferUpdate = 1 << 1, - RequiresLayout = 1 << 2, - AlternateBackground = 1 << 3, - Collapsed = 1 << 4, - Expanded = 1 << 5, - }; - MessageLayout(MessagePtr message_); ~MessageLayout(); @@ -34,10 +35,10 @@ public: int getHeight() const; // Flags - FlagsEnum flags; + MessageLayoutFlags flags; // Layout - bool layout(int width, float scale_, MessageElement::Flags flags); + bool layout(int width, float scale_, MessageElementFlags flags); // Painting void paint(QPainter &painter, int width, int y, int messageIndex, @@ -70,12 +71,12 @@ private: float scale_ = -1; unsigned int bufferUpdatedCount_ = 0; - MessageElement::Flags currentWordFlags_ = MessageElement::None; + MessageElementFlags currentWordFlags_; int collapsedHeight_ = 32; // methods - void actuallyLayout(int width, MessageElement::Flags flags); + void actuallyLayout(int width, MessageElementFlags flags); void updateBuffer(QPixmap *pixmap, int messageIndex, Selection &selection); }; diff --git a/src/messages/layouts/MessageLayoutContainer.cpp b/src/messages/layouts/MessageLayoutContainer.cpp index 8f9fead59..5e6350433 100644 --- a/src/messages/layouts/MessageLayoutContainer.cpp +++ b/src/messages/layouts/MessageLayoutContainer.cpp @@ -30,8 +30,7 @@ float MessageLayoutContainer::getScale() const } // methods -void MessageLayoutContainer::begin(int width, float scale, - Message::MessageFlags flags) +void MessageLayoutContainer::begin(int width, float scale, MessageFlags flags) { this->clear(); this->width_ = width; @@ -97,8 +96,8 @@ void MessageLayoutContainer::_addElement(MessageLayoutElement *element, // compact emote offset bool isCompactEmote = - !(this->flags_ & Message::DisableCompactEmotes) && - element->getCreator().getFlags() & MessageElement::EmoteImages; + !this->flags_.has(MessageFlag::DisableCompactEmotes) && + element->getCreator().getFlags().has(MessageElementFlag::EmoteImages); if (isCompactEmote) { newLineHeight -= COMPACT_EMOTES_OFFSET * this->scale_; @@ -126,7 +125,7 @@ void MessageLayoutContainer::breakLine() { 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) ->getRect() .right()) / @@ -137,15 +136,17 @@ void MessageLayoutContainer::breakLine() MessageLayoutElement *element = this->elements_.at(i).get(); bool isCompactEmote = - !(this->flags_ & Message::DisableCompactEmotes) && - element->getCreator().getFlags() & MessageElement::EmoteImages; + !this->flags_.has(MessageFlag::DisableCompactEmotes) && + element->getCreator().getFlags().has( + MessageElementFlag::EmoteImages); int yExtra = 0; if (isCompactEmote) { 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_) { yExtra -= (this->textLineHeight_ - element->getRect().height()) / 2; @@ -199,7 +200,7 @@ bool MessageLayoutContainer::fitsInLine(int _width) void MessageLayoutContainer::end() { if (!this->canAddElements()) { - static TextElement dotdotdot("...", MessageElement::Collapsed, + static TextElement dotdotdot("...", MessageElementFlag::Collapsed, MessageColor::Link); static QString dotdotdotText("..."); @@ -230,7 +231,7 @@ void MessageLayoutContainer::end() bool MessageLayoutContainer::canCollapse() { return getApp()->settings->collpseMessagesMinLines.getValue() > 0 && - this->flags_ & Message::MessageFlags::Collapsed; + this->flags_.has(MessageFlag::Collapsed); } bool MessageLayoutContainer::isCollapsed() diff --git a/src/messages/layouts/MessageLayoutContainer.hpp b/src/messages/layouts/MessageLayoutContainer.hpp index 3b20e8191..f52f181e6 100644 --- a/src/messages/layouts/MessageLayoutContainer.hpp +++ b/src/messages/layouts/MessageLayoutContainer.hpp @@ -51,7 +51,7 @@ struct MessageLayoutContainer { float getScale() const; // methods - void begin(int width_, float scale_, Message::MessageFlags flags_); + void begin(int width_, float scale_, MessageFlags flags_); void end(); void clear(); @@ -92,7 +92,7 @@ private: // variables float scale_ = 1.f; int width_ = 0; - Message::MessageFlags flags_ = Message::MessageFlags::None; + MessageFlags flags_ = MessageFlag::None; int line_ = 0; int height_ = 0; int currentX_ = 0; diff --git a/src/providers/irc/AbstractIrcServer.cpp b/src/providers/irc/AbstractIrcServer.cpp index fc51f6745..23bf47d26 100644 --- a/src/providers/irc/AbstractIrcServer.cpp +++ b/src/providers/irc/AbstractIrcServer.cpp @@ -202,8 +202,8 @@ void AbstractIrcServer::onConnected() LimitedQueueSnapshot snapshot = chan->getMessageSnapshot(); bool replaceMessage = snapshot.getLength() > 0 && - snapshot[snapshot.getLength() - 1]->flags & - Message::DisconnectedMessage; + snapshot[snapshot.getLength() - 1]->flags.has( + MessageFlag::DisconnectedMessage); if (replaceMessage) { chan->replaceMessage(snapshot[snapshot.getLength() - 1], @@ -220,7 +220,7 @@ void AbstractIrcServer::onDisconnected() std::lock_guard lock(this->channelMutex); MessageBuilder b(systemMessage, "disconnected from chat"); - b->flags |= Message::DisconnectedMessage; + b->flags.set(MessageFlag::DisconnectedMessage); auto disconnected = b.release(); for (std::weak_ptr &weak : this->channels.values()) { diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 512e6b066..5d628e311 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -61,11 +61,11 @@ void IrcMessageHandler::addMessage(Communi::IrcMessage *_message, if (isSub || !builder.isIgnored()) { if (isSub) { - builder->flags |= Message::Subscription; - builder->flags &= ~Message::Highlighted; + builder->flags.set(MessageFlag::Subscription); + builder->flags.unset(MessageFlag::Highlighted); } - auto highlighted = bool(builder->flags & Message::Highlighted); + auto highlighted = builder->flags.has(MessageFlag::Highlighted); auto msg = builder.build(); if (!isSub) { @@ -224,14 +224,12 @@ void IrcMessageHandler::handleWhisperMessage(Communi::IrcMessage *message) MessagePtr _message = builder.build(); - if (_message->flags & Message::Highlighted) { + if (_message->flags.has(MessageFlag::Highlighted)) { app->twitch.server->mentionsChannel->addMessage(_message); } c->addMessage(_message); - // _message->flags |= Message::DoNotTriggerNotification; - if (app->settings->inlineWhispers) { app->twitch.server->forEachChannel([_message](ChannelPtr channel) { channel->addMessage(_message); // @@ -269,7 +267,7 @@ void IrcMessageHandler::handleUserNoticeMessage(Communi::IrcMessage *message, auto b = MessageBuilder(systemMessage, parseTagString(it.value().toString())); - b->flags |= Message::Subscription; + b->flags.set(MessageFlag::Subscription); auto newMessage = b.release(); QString channelName; diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 6a0289422..7753f2668 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -185,7 +185,7 @@ void TwitchChannel::addJoinedUser(const QString &user) MessageBuilder builder(systemMessage, "Users joined: " + joinedUsers->join(", ")); - builder->flags |= Message::Collapsed; + builder->flags.set(MessageFlag::Collapsed); joinedUsers->clear(); this->addMessage(builder.release()); this->joinedUsersMergeQueued_ = false; @@ -213,7 +213,7 @@ void TwitchChannel::addPartedUser(const QString &user) MessageBuilder builder(systemMessage, "Users parted: " + partedUsers->join(", ")); - builder->flags |= Message::Collapsed; + builder->flags.set(MessageFlag::Collapsed); this->addMessage(builder.release()); partedUsers->clear(); diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 9e7e6d2de..9d7642a10 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -93,12 +93,12 @@ MessagePtr TwitchMessageBuilder::build() //#ifdef XD // if (this->originalMessage.length() > 100) { - // this->message->flags |= Message::Collapsed; + // this->message->flags.has(MessageFlag::Collapsed); // this->emplace(getApp()->resources->badgeCollapsed, - // MessageElement::Collapsed); + // MessageElementFlag::Collapsed); // } //#endif - this->message().flags |= Message::Collapsed; + this->message().flags.has(MessageFlag::Collapsed); // PARSING this->parseMessageID(); @@ -193,7 +193,7 @@ void TwitchMessageBuilder::addWords( currentTwitchEmote->first == i) { auto emoteImage = currentTwitchEmote->second; this->emplace(emoteImage, - MessageElement::TwitchEmote); + MessageElementFlag::TwitchEmote); i += word.length() + 1; currentTwitchEmote++; @@ -225,7 +225,7 @@ void TwitchMessageBuilder::addWords( void TwitchMessageBuilder::addTextOrEmoji(EmotePtr emote) { - this->emplace(emote, EmoteElement::EmojiAll); + this->emplace(emote, MessageElementFlag::EmojiAll); } void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) @@ -255,12 +255,13 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) if (linkString.isEmpty()) { if (string.startsWith('@')) { - this->emplace(string, TextElement::BoldUsername, + this->emplace(string, MessageElementFlag::BoldUsername, textColor, FontStyle::ChatMediumBold); - this->emplace(string, TextElement::NonBoldUsername, - textColor); + this->emplace( + string, MessageElementFlag::NonBoldUsername, textColor); } else { - this->emplace(string, TextElement::Text, textColor); + this->emplace(string, MessageElementFlag::Text, + textColor); } } else { static QRegularExpression domainRegex( @@ -280,9 +281,10 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) textColor = MessageColor(MessageColor::Link); this->emplace(lowercaseLinkString, - TextElement::LowercaseLink, textColor) + MessageElementFlag::LowercaseLink, textColor) ->setLink(link); - this->emplace(string, TextElement::OriginalLink, textColor) + this->emplace(string, MessageElementFlag::OriginalLink, + textColor) ->setLink(link); } @@ -306,15 +308,17 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) // textColor = MessageColor(MessageColor::Link); //} // if (string.startsWith('@')) { - // this->emplace(string, TextElement::BoldUsername, + // this->emplace(string, MessageElementFlag::BoldUsername, // textColor, // FontStyle::ChatMediumBold) // // ->setLink(link); - // this->emplace(string, TextElement::NonBoldUsername, + // this->emplace(string, + // MessageElementFlag::NonBoldUsername, // textColor) // // ->setLink(link); //} else { - // this->emplace(string, TextElement::Text, textColor) // + // this->emplace(string, MessageElementFlag::Text, + // textColor) // // ->setLink(link); //} } @@ -350,7 +354,7 @@ void TwitchMessageBuilder::appendChannelName() QString channelName("#" + this->channel->getName()); Link link(Link::Url, this->channel->getName() + "\n" + this->messageID); - this->emplace(channelName, MessageElement::ChannelName, + this->emplace(channelName, MessageElementFlag::ChannelName, MessageColor::System) // ->setLink(link); } @@ -443,7 +447,7 @@ void TwitchMessageBuilder::appendUsername() // IrcManager::getInstance().getUser().getUserName(); } else if (this->args.isReceivedWhisper) { // Sender username - this->emplace(usernameText, MessageElement::Text, + this->emplace(usernameText, MessageElementFlag::Text, this->usernameColor_, FontStyle::ChatMediumBold) ->setLink({Link::UserInfo, this->userName}); @@ -451,7 +455,7 @@ void TwitchMessageBuilder::appendUsername() auto currentUser = app->accounts->twitch.getCurrent(); // Separator - this->emplace("->", MessageElement::Text, + this->emplace("->", MessageElementFlag::Text, app->themes->messages.textColors.system, FontStyle::ChatMedium); @@ -462,14 +466,14 @@ void TwitchMessageBuilder::appendUsername() // Your own username this->emplace(currentUser->getUserName() + ":", - MessageElement::Text, selfColor, + MessageElementFlag::Text, selfColor, FontStyle::ChatMediumBold); } else { if (!this->action_) { usernameText += ":"; } - this->emplace(usernameText, MessageElement::Text, + this->emplace(usernameText, MessageElementFlag::Text, this->usernameColor_, FontStyle::ChatMediumBold) ->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 (playSound && @@ -633,19 +637,19 @@ void TwitchMessageBuilder::appendTwitchEmote( Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name) { - auto flags = MessageElement::Flags::None; + auto flags = MessageElementFlags(); auto emote = boost::optional{}; if ((emote = getApp()->emotes->bttv.getGlobalEmote(name))) { - flags = MessageElement::BttvEmote; + flags = MessageElementFlag::BttvEmote; } else if (twitchChannel && (emote = this->twitchChannel->getBttvEmote(name))) { - flags = MessageElement::BttvEmote; + flags = MessageElementFlag::BttvEmote; } else if ((emote = getApp()->emotes->ffz.getGlobalEmote(name))) { - flags = MessageElement::FfzEmote; + flags = MessageElementFlag::FfzEmote; } else if (twitchChannel && (emote = this->twitchChannel->getFfzEmote(name))) { - flags = MessageElement::FfzEmote; + flags = MessageElementFlag::FfzEmote; } if (emote) { @@ -691,8 +695,8 @@ void TwitchMessageBuilder::appendTwitchBadges() if (twitchChannel) if (const auto &badge = this->twitchChannel->getTwitchBadge( "bits", cheerAmount)) { - this->emplace(badge.get(), - MessageElement::BadgeVanity) + this->emplace( + badge.get(), MessageElementFlag::BadgeVanity) ->setTooltip(tooltip); continue; } @@ -705,7 +709,7 @@ void TwitchMessageBuilder::appendTwitchBadges() // const auto &badge = // app->resources->badgeSets.at("bits").versions.at(cheerAmount); // this->emplace(badge.badgeImage1x, - // MessageElement::BadgeVanity) + // MessageElementFlag::BadgeVanity) // ->setTooltip(tooltip); //} catch (const std::out_of_range &) { // Log("No default bit badge for version {} found", cheerAmount); @@ -714,39 +718,41 @@ void TwitchMessageBuilder::appendTwitchBadges() } else if (badge == "staff/1") { this->emplace( Image::fromNonOwningPixmap(&app->resources->twitch.staff), - MessageElement::BadgeGlobalAuthority) + MessageElementFlag::BadgeGlobalAuthority) ->setTooltip("Twitch Staff"); } else if (badge == "admin/1") { this->emplace( Image::fromNonOwningPixmap(&app->resources->twitch.admin), - MessageElement::BadgeGlobalAuthority) + MessageElementFlag::BadgeGlobalAuthority) ->setTooltip("Twitch Admin"); } else if (badge == "global_mod/1") { - this->emplace(Image::fromNonOwningPixmap( - &app->resources->twitch.globalmod), - MessageElement::BadgeGlobalAuthority) + this->emplace( + Image::fromNonOwningPixmap( + &app->resources->twitch.globalmod), + MessageElementFlag::BadgeGlobalAuthority) ->setTooltip("Twitch Global Moderator"); } else if (badge == "moderator/1") { // TODO: Implement custom FFZ moderator badge - this->emplace(Image::fromNonOwningPixmap( - &app->resources->twitch.moderator), - MessageElement::BadgeChannelAuthority) + this->emplace( + Image::fromNonOwningPixmap( + &app->resources->twitch.moderator), + MessageElementFlag::BadgeChannelAuthority) ->setTooltip("Twitch Channel Moderator"); } else if (badge == "turbo/1") { this->emplace( Image::fromNonOwningPixmap(&app->resources->twitch.turbo), - MessageElement::BadgeGlobalAuthority) + MessageElementFlag::BadgeGlobalAuthority) ->setTooltip("Twitch Turbo Subscriber"); } else if (badge == "broadcaster/1") { this->emplace( Image::fromNonOwningPixmap( &app->resources->twitch.broadcaster), - MessageElement::BadgeChannelAuthority) + MessageElementFlag::BadgeChannelAuthority) ->setTooltip("Twitch Broadcaster"); } else if (badge == "premium/1") { this->emplace( Image::fromNonOwningPixmap(&app->resources->twitch.prime), - MessageElement::BadgeVanity) + MessageElementFlag::BadgeVanity) ->setTooltip("Twitch Prime Subscriber"); } else if (badge.startsWith("partner/")) { int index = badge.midRef(8).toInt(); @@ -755,7 +761,7 @@ void TwitchMessageBuilder::appendTwitchBadges() this->emplace( Image::fromNonOwningPixmap( &app->resources->twitch.verified), - MessageElement::BadgeVanity) + MessageElementFlag::BadgeVanity) ->setTooltip("Twitch Verified"); } break; default: { @@ -776,7 +782,7 @@ void TwitchMessageBuilder::appendTwitchBadges() // if (badgeSetIt == channelResources.badgeSets.end()) { // // Fall back to default badge // this->emplace(app->resources->badgeSubscriber, - // MessageElement::BadgeSubscription) + // MessageElementFlag::BadgeSubscription) // ->setTooltip("Twitch Subscriber"); // continue; //} @@ -790,7 +796,7 @@ void TwitchMessageBuilder::appendTwitchBadges() // if (badgeVersionIt == badgeSet.versions.end()) { // // Fall back to default badge // this->emplace(app->resources->badgeSubscriber, - // MessageElement::BadgeSubscription) + // MessageElementFlag::BadgeSubscription) // ->setTooltip("Twitch Subscriber"); // continue; //} @@ -798,7 +804,7 @@ void TwitchMessageBuilder::appendTwitchBadges() // auto &badgeVersion = badgeVersionIt->second; // this->emplace(badgeVersion.badgeImage1x, - // MessageElement::BadgeSubscription) + // MessageElementFlag::BadgeSubscription) // ->setTooltip("Twitch " + // QString::fromStdString(badgeVersion.title)); } else { @@ -814,8 +820,8 @@ void TwitchMessageBuilder::appendTwitchBadges() // " << parts; continue; //} - // MessageElement::Flags badgeType = - // MessageElement::Flags::BadgeVanity; + // MessageElementFlags badgeType = + // MessageElementFlag::BadgeVanity; // std::string badgeSetKey = parts[0].toStdString(); // std::string versionKey = parts[1].toStdString(); @@ -857,7 +863,7 @@ void TwitchMessageBuilder::appendChatterinoBadges() // const auto badge = it->second; // this->emplace(badge->image, - // MessageElement::BadgeChatterino) + // MessageElementFlag::BadgeChatterino) // ->setTooltip(QString::fromStdString(badge->tooltip)); } @@ -903,8 +909,9 @@ Outcome TwitchMessageBuilder::tryParseCheermote(const QString &string) // const auto &cheermote = *savedIt; // this->emplace(cheermote.animatedEmote, - // EmoteElement::BitsAnimated); this->emplace(amount, - // EmoteElement::Text, cheermote.color); + // MessageElementFlag::BitsAnimated); + // this->emplace(amount, MessageElementFlag::Text, + // cheermote.color); // return Success; // } diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index 9f853b20c..23b8c4e1b 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -74,53 +74,54 @@ WindowManager::WindowManager() }; } -MessageElement::Flags WindowManager::getWordFlags() +MessageElementFlags WindowManager::getWordFlags() { return this->wordFlags_; } void WindowManager::updateWordTypeMask() { - using MEF = MessageElement::Flags; + using MEF = MessageElementFlag; auto settings = getSettings(); // text - auto flags = MEF::Text | MEF::Text; + auto flags = MessageElementFlags(MEF::Text); // timestamp if (settings->showTimestamps) { - flags |= MEF::Timestamp; + flags.set(MEF::Timestamp); } // emotes - flags |= settings->enableTwitchEmotes ? MEF::TwitchEmoteImage - : MEF::TwitchEmoteText; - flags |= settings->enableFfzEmotes ? MEF::FfzEmoteImage : MEF::FfzEmoteText; - flags |= - settings->enableBttvEmotes ? MEF::BttvEmoteImage : MEF::BttvEmoteText; - flags |= settings->enableEmojis ? MEF::EmojiImage : MEF::EmojiText; + flags.set(settings->enableTwitchEmotes ? MEF::TwitchEmoteImage + : MEF::TwitchEmoteText); + flags.set(settings->enableFfzEmotes ? MEF::FfzEmoteImage + : MEF::FfzEmoteText); + flags.set(settings->enableBttvEmotes ? MEF::BttvEmoteImage + : MEF::BttvEmoteText); + flags.set(settings->enableEmojis ? MEF::EmojiImage : MEF::EmojiText); // bits - flags |= MEF::BitsAmount; - flags |= - settings->enableGifAnimations ? MEF::BitsAnimated : MEF::BitsStatic; + flags.set(MEF::BitsAmount); + flags.set(settings->enableGifAnimations ? MEF::BitsAnimated + : MEF::BitsStatic); // badges - flags |= settings->showBadges ? MEF::Badges : MEF::None; + flags.set(settings->showBadges ? MEF::Badges : MEF::None); // username - flags |= MEF::Username; + flags.set(MEF::Username); // misc - flags |= MEF::AlwaysShow; - flags |= MEF::Collapsed; - flags |= - settings->enableUsernameBold ? MEF::BoldUsername : MEF::NonBoldUsername; - flags |= - settings->enableLowercaseLink ? MEF::LowercaseLink : MEF::OriginalLink; + flags.set(MEF::AlwaysShow); + flags.set(MEF::Collapsed); + flags.set(settings->enableUsernameBold ? MEF::BoldUsername + : MEF::NonBoldUsername); + flags.set(settings->enableLowercaseLink ? MEF::LowercaseLink + : MEF::OriginalLink); // update flags - MessageElement::Flags newFlags = static_cast(flags); + MessageElementFlags newFlags = static_cast(flags); if (newFlags != this->wordFlags_) { this->wordFlags_ = newFlags; diff --git a/src/singletons/WindowManager.hpp b/src/singletons/WindowManager.hpp index 68a0dc7d5..eef2be2f1 100644 --- a/src/singletons/WindowManager.hpp +++ b/src/singletons/WindowManager.hpp @@ -46,7 +46,7 @@ public: int getGeneration() const; void incGeneration(); - MessageElement::Flags getWordFlags(); + MessageElementFlags getWordFlags(); void updateWordTypeMask(); pajlada::Signals::NoArgSignal repaintGifs; @@ -66,7 +66,7 @@ private: Window *mainWindow_ = nullptr; Window *selectedWindow_ = nullptr; - MessageElement::Flags wordFlags_ = MessageElement::Default; + MessageElementFlags wordFlags_ = MessageElementFlag::Default; pajlada::Settings::SettingListener wordFlagsListener_; }; diff --git a/src/widgets/dialogs/EmotePopup.cpp b/src/widgets/dialogs/EmotePopup.cpp index fda65a879..3f8c6ac1d 100644 --- a/src/widgets/dialogs/EmotePopup.cpp +++ b/src/widgets/dialogs/EmotePopup.cpp @@ -18,12 +18,12 @@ EmotePopup::EmotePopup() this->viewEmotes_ = new ChannelView(); this->viewEmojis_ = new ChannelView(); - this->viewEmotes_->setOverrideFlags(MessageElement::Flags( - MessageElement::Default | MessageElement::AlwaysShow | - MessageElement::EmoteImages)); - this->viewEmojis_->setOverrideFlags(MessageElement::Flags( - MessageElement::Default | MessageElement::AlwaysShow | - MessageElement::EmoteImages)); + this->viewEmotes_->setOverrideFlags(MessageElementFlags{ + MessageElementFlag::Default, MessageElementFlag::AlwaysShow, + MessageElementFlag::EmoteImages}); + this->viewEmojis_->setOverrideFlags(MessageElementFlags{ + MessageElementFlag::Default, MessageElementFlag::AlwaysShow, + MessageElementFlag::EmoteImages}); this->viewEmotes_->setEnableScrollingToBottom(false); this->viewEmojis_->setEnableScrollingToBottom(false); @@ -63,20 +63,20 @@ void EmotePopup::loadChannel(ChannelPtr _channel) // TITLE MessageBuilder builder1; - builder1.emplace(title, MessageElement::Text); + builder1.emplace(title, MessageElementFlag::Text); - builder1->flags |= Message::Centered; + builder1->flags.set(MessageFlag::Centered); emoteChannel->addMessage(builder1.release()); // EMOTES MessageBuilder builder2; - builder2->flags |= Message::Centered; - builder2->flags |= Message::DisableCompactEmotes; + builder2->flags.set(MessageFlag::Centered); + builder2->flags.set(MessageFlag::DisableCompactEmotes); for (auto emote : map) { builder2 .emplace(emote.second, - MessageElement::Flags::AlwaysShow) + MessageElementFlag::AlwaysShow) ->setLink(Link(Link::InsertText, emote.first.string)); } @@ -103,21 +103,21 @@ void EmotePopup::loadChannel(ChannelPtr _channel) setText = set->text; } - builder1.emplace(setText, MessageElement::Text); + builder1.emplace(setText, MessageElementFlag::Text); - builder1->flags |= Message::Centered; + builder1->flags.set(MessageFlag::Centered); emoteChannel->addMessage(builder1.release()); // EMOTES MessageBuilder builder2; - builder2->flags |= Message::Centered; - builder2->flags |= Message::DisableCompactEmotes; + builder2->flags.set(MessageFlag::Centered); + builder2->flags.set(MessageFlag::DisableCompactEmotes); for (const auto &emote : set->emotes) { builder2 .emplace( app->emotes->twitch.getOrCreateEmote(emote.id, emote.name), - MessageElement::Flags::AlwaysShow) + MessageElementFlag::AlwaysShow) ->setLink(Link(Link::InsertText, emote.name.string)); } @@ -146,19 +146,18 @@ void EmotePopup::loadEmojis() // title MessageBuilder builder1; - builder1.emplace("emojis", MessageElement::Text); - builder1->flags |= Message::Centered; + builder1.emplace("emojis", MessageElementFlag::Text); + builder1->flags.set(MessageFlag::Centered); emojiChannel->addMessage(builder1.release()); // emojis MessageBuilder builder; - builder->flags |= Message::Centered; - builder->flags |= Message::DisableCompactEmotes; + builder->flags.set(MessageFlag::Centered); + builder->flags.set(MessageFlag::DisableCompactEmotes); emojis.each([&builder](const auto &key, const auto &value) { builder - .emplace(value->emote, - MessageElement::Flags::AlwaysShow) + .emplace(value->emote, MessageElementFlag::AlwaysShow) ->setLink( Link(Link::Type::InsertText, ":" + value->shortCodes[0] + ":")); }); diff --git a/src/widgets/dialogs/LogsPopup.cpp b/src/widgets/dialogs/LogsPopup.cpp index 5171cc756..833bbbba0 100644 --- a/src/widgets/dialogs/LogsPopup.cpp +++ b/src/widgets/dialogs/LogsPopup.cpp @@ -173,11 +173,11 @@ void LogsPopup::getOverrustleLogs() MessageBuilder builder; builder.emplace(timeStamp); builder.emplace(this->userName_, - MessageElement::Username, + MessageElementFlag::Username, MessageColor::System); builder.emplace( singleMessage.value("text").toString(), - MessageElement::Text, MessageColor::Text); + MessageElementFlag::Text, MessageColor::Text); messages.push_back(builder.release()); } } diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index b2f6e9a84..2dbf4d339 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -34,7 +34,7 @@ namespace chatterino { namespace { void addEmoteContextMenuItems(const Emote &emote, - MessageElement::Flags creatorFlags, QMenu &menu) + MessageElementFlags creatorFlags, QMenu &menu) { auto openAction = menu.addAction("Open"); 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"); - } else if (creatorFlags & MessageElement::Flags::FfzEmote) { + } else if (creatorFlags.has(MessageElementFlag::FfzEmote)) { addPageLink("FFZ"); } } @@ -252,7 +252,7 @@ void ChannelView::actuallyLayoutMessages(bool causedByScrollbar) size_t start = size_t(this->scrollBar_.getCurrentValue()); int layoutWidth = this->getLayoutWidth(); - MessageElement::Flags flags = this->getFlags(); + MessageElementFlags flags = this->getFlags(); // layout the visible messages in the view if (messagesSnapshot.getLength() > start) { @@ -387,12 +387,12 @@ bool ChannelView::getEnableScrollingToBottom() const return this->enableScrollingToBottom_; } -void ChannelView::setOverrideFlags(boost::optional value) +void ChannelView::setOverrideFlags(boost::optional value) { this->overrideFlags_ = value; } -const boost::optional &ChannelView::getOverrideFlags() +const boost::optional &ChannelView::getOverrideFlags() const { return this->overrideFlags_; @@ -423,7 +423,7 @@ void ChannelView::setChannel(ChannelPtr newChannel) auto messageRef = new MessageLayout(message); if (this->lastMessageHasAlternateBackground_) { - messageRef->flags |= MessageLayout::AlternateBackground; + messageRef->flags.set(MessageLayoutFlag::AlternateBackground); } this->lastMessageHasAlternateBackground_ = !this->lastMessageHasAlternateBackground_; @@ -443,8 +443,8 @@ void ChannelView::setChannel(ChannelPtr newChannel) // } } - if (!(message->flags & Message::DoNotTriggerNotification)) { - if (message->flags & Message::Highlighted) { + if (!message->flags.has(MessageFlag::DoNotTriggerNotification)) { + if (message->flags.has(MessageFlag::Highlighted)) { this->tabHighlightRequested.invoke( HighlightState::Highlighted); } else { @@ -521,8 +521,8 @@ void ChannelView::setChannel(ChannelPtr newChannel) } const auto &message = snapshot[index]; - if (message->flags & MessageLayout::AlternateBackground) { - newItem->flags |= MessageLayout::AlternateBackground; + if (message->flags.has(MessageLayoutFlag::AlternateBackground)) { + newItem->flags.set(MessageLayoutFlag::AlternateBackground); } this->scrollBar_.replaceHighlight( @@ -540,7 +540,7 @@ void ChannelView::setChannel(ChannelPtr newChannel) auto messageRef = new MessageLayout(snapshot[i]); if (this->lastMessageHasAlternateBackground_) { - messageRef->flags |= MessageLayout::AlternateBackground; + messageRef->flags.set(MessageLayoutFlag::AlternateBackground); } this->lastMessageHasAlternateBackground_ = !this->lastMessageHasAlternateBackground_; @@ -613,7 +613,7 @@ void ChannelView::setSelection(const SelectionItem &start, this->selectionChanged.invoke(); } -MessageElement::Flags ChannelView::getFlags() const +MessageElementFlags ChannelView::getFlags() const { auto app = getApp(); @@ -621,17 +621,16 @@ MessageElement::Flags ChannelView::getFlags() const return this->overrideFlags_.get(); } - MessageElement::Flags flags = app->windows->getWordFlags(); + MessageElementFlags flags = app->windows->getWordFlags(); Split *split = dynamic_cast(this->parentWidget()); if (split != nullptr) { if (split->getModerationMode()) { - flags = - MessageElement::Flags(flags | MessageElement::ModeratorTools); + flags.set(MessageElementFlag::ModeratorTools); } 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 - if (layout->flags & MessageLayout::Collapsed) { + if (layout->flags.has(MessageLayoutFlag::Collapsed)) { this->setCursor(Qt::PointingHandCursor); tooltipWidget->hide(); return; @@ -941,7 +940,7 @@ void ChannelView::mousePressEvent(QMouseEvent *event) this->lastPressPosition_ = event->screenPos(); this->isMouseDown_ = true; - if (layout->flags & MessageLayout::Collapsed) { + if (layout->flags.has(MessageLayoutFlag::Collapsed)) { return; } @@ -1010,9 +1009,9 @@ void ChannelView::mouseReleaseEvent(QMouseEvent *event) } // message under cursor is collapsed - if (layout->flags & MessageLayout::Collapsed) { - layout->flags |= MessageLayout::Expanded; - layout->flags |= MessageLayout::RequiresLayout; + if (layout->flags.has(MessageLayoutFlag::Collapsed)) { + layout->flags.set(MessageLayoutFlag::Expanded); + layout->flags.set(MessageLayoutFlag::RequiresLayout); this->layoutMessages(); return; @@ -1081,8 +1080,8 @@ void ChannelView::addContextMenuItems( menu->clear(); // Emote actions - if (creatorFlags & (MessageElement::Flags::EmoteImages | - MessageElement::Flags::EmojiImage)) { + if (creatorFlags.hasAny({MessageElementFlag::EmoteImages, + MessageElementFlag::EmojiImage})) { const auto emoteElement = dynamic_cast(&creator); if (emoteElement) addEmoteContextMenuItems(*emoteElement->getEmote(), creatorFlags, @@ -1147,7 +1146,7 @@ void ChannelView::mouseDoubleClickEvent(QMouseEvent *event) } // message under cursor is collapsed - if (layout->flags & MessageLayout::Collapsed) { + if (layout->flags.has(MessageLayoutFlag::Collapsed)) { return; } diff --git a/src/widgets/helper/ChannelView.hpp b/src/widgets/helper/ChannelView.hpp index a05631d2e..974bb3c0c 100644 --- a/src/widgets/helper/ChannelView.hpp +++ b/src/widgets/helper/ChannelView.hpp @@ -36,8 +36,8 @@ public: void clearSelection(); void setEnableScrollingToBottom(bool); bool getEnableScrollingToBottom() const; - void setOverrideFlags(boost::optional value); - const boost::optional &getOverrideFlags() const; + void setOverrideFlags(boost::optional value); + const boost::optional &getOverrideFlags() const; void pause(int msecTimeout); void updateLastReadMessage(); @@ -83,7 +83,7 @@ private: void drawMessages(QPainter &painter); void setSelection(const SelectionItem &start, const SelectionItem &end); - MessageElement::Flags getFlags() const; + MessageElementFlags getFlags() const; bool isPaused(); void handleMouseClick(QMouseEvent *event, @@ -107,7 +107,7 @@ private: int messagesAddedSinceSelectionPause_ = 0; QTimer pauseTimeout_; - boost::optional overrideFlags_; + boost::optional overrideFlags_; MessageLayoutPtr lastReadMessage_; LimitedQueueSnapshot snapshot_; diff --git a/src/widgets/settingspages/LookPage.cpp b/src/widgets/settingspages/LookPage.cpp index 80ce2ebb8..0e1eda885 100644 --- a/src/widgets/settingspages/LookPage.cpp +++ b/src/widgets/settingspages/LookPage.cpp @@ -322,24 +322,24 @@ ChannelPtr LookPage::createPreviewChannel() { MessageBuilder builder; builder.emplace(QTime(8, 13, 42)); - builder.emplace(Image::fromNonOwningPixmap(&getApp()->resources->twitch.moderator), MessageElement::BadgeChannelAuthority); - builder.emplace(Image::fromNonOwningPixmap(&getApp()->resources->twitch.subscriber), MessageElement::BadgeSubscription); - builder.emplace("username1:", MessageElement::Username, QColor("#0094FF"), FontStyle::ChatMediumBold); - builder.emplace("This is a preview message", MessageElement::Text); - builder.emplace(Image::fromNonOwningPixmap(&getApp()->resources->pajaDank), MessageElement::Flags::AlwaysShow); - builder.emplace("@fourtf", TextElement::BoldUsername, MessageColor::Text, FontStyle::ChatMediumBold); - builder.emplace("@fourtf", TextElement::NonBoldUsername); + builder.emplace(Image::fromNonOwningPixmap(&getApp()->resources->twitch.moderator), MessageElementFlag::BadgeChannelAuthority); + builder.emplace(Image::fromNonOwningPixmap(&getApp()->resources->twitch.subscriber), MessageElementFlag::BadgeSubscription); + builder.emplace("username1:", MessageElementFlag::Username, QColor("#0094FF"), FontStyle::ChatMediumBold); + builder.emplace("This is a preview message", MessageElementFlag::Text); + builder.emplace(Image::fromNonOwningPixmap(&getApp()->resources->pajaDank), MessageElementFlag::AlwaysShow); + builder.emplace("@fourtf", MessageElementFlag::BoldUsername, MessageColor::Text, FontStyle::ChatMediumBold); + builder.emplace("@fourtf", MessageElementFlag::NonBoldUsername); channel->addMessage(builder.release()); } { MessageBuilder message; message.emplace(QTime(8, 15, 21)); - message.emplace(Image::fromNonOwningPixmap(&getApp()->resources->twitch.broadcaster), MessageElement::BadgeChannelAuthority); - message.emplace("username2:", MessageElement::Username, QColor("#FF6A00"), FontStyle::ChatMediumBold); - message.emplace("This is another one", MessageElement::Text); - // message.emplace(Image::fromNonOwningPixmap(&getApp()->resources->ppHop), MessageElement::BttvEmote); - message.emplace("www.fourtf.com", MessageElement::LowercaseLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com")); - message.emplace("wWw.FoUrTf.CoM", MessageElement::OriginalLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com")); + message.emplace(Image::fromNonOwningPixmap(&getApp()->resources->twitch.broadcaster), MessageElementFlag::BadgeChannelAuthority); + message.emplace("username2:", MessageElementFlag::Username, QColor("#FF6A00"), FontStyle::ChatMediumBold); + message.emplace("This is another one", MessageElementFlag::Text); + // message.emplace(Image::fromNonOwningPixmap(&getApp()->resources->ppHop), MessageElementFlag::BttvEmote); + message.emplace("www.fourtf.com", MessageElementFlag::LowercaseLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com")); + message.emplace("wWw.FoUrTf.CoM", MessageElementFlag::OriginalLink, MessageColor::Link)->setLink(Link(Link::Url, "https://www.fourtf.com")); channel->addMessage(message.release()); } // clang-format on