mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
refactored EnumFlags
This commit is contained in:
parent
bfa75330a4
commit
381177dd24
24 changed files with 422 additions and 394 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
// }
|
// }
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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] + ":"));
|
||||||
});
|
});
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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_;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue