refactored EnumFlags
This commit is contained in:
@@ -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();
|
||||
|
||||
+18
-17
@@ -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<MessageFlag>;
|
||||
|
||||
struct Message : boost::noncopyable {
|
||||
Message();
|
||||
~Message();
|
||||
|
||||
FlagsEnum<MessageFlags> flags;
|
||||
MessageFlags flags;
|
||||
QTime parseTime;
|
||||
QString id;
|
||||
QString searchText;
|
||||
|
||||
@@ -25,7 +25,7 @@ MessageBuilder::MessageBuilder(const QString &text)
|
||||
: MessageBuilder()
|
||||
{
|
||||
this->emplace<TimestampElement>();
|
||||
this->emplace<TextElement>(text, MessageElement::Text,
|
||||
this->emplace<TextElement>(text, MessageElementFlag::Text,
|
||||
MessageColor::System);
|
||||
this->message().searchText = text;
|
||||
}
|
||||
@@ -34,10 +34,10 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text)
|
||||
: MessageBuilder()
|
||||
{
|
||||
this->emplace<TimestampElement>();
|
||||
this->emplace<TextElement>(text, MessageElement::Text,
|
||||
this->emplace<TextElement>(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<TimestampElement>();
|
||||
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<TextElement>(text, MessageElement::Text,
|
||||
this->emplace<TextElement>(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<TimestampElement>();
|
||||
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<TextElement>(text, MessageElement::Text,
|
||||
this->emplace<TextElement>(text, MessageElementFlag::Text,
|
||||
MessageColor::System);
|
||||
this->message().searchText = text;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
+102
-100
@@ -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<MessageElementFlag>;
|
||||
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<MessageLayoutFlag>;
|
||||
|
||||
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> 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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user