feat: dynamically track mutability of messages (#6367)
This commit is contained in:
@@ -79,6 +79,8 @@ LimitedQueueSnapshot<MessagePtr> Channel::getMessageSnapshot()
|
||||
void Channel::addMessage(MessagePtr message, MessageContext context,
|
||||
std::optional<MessageFlags> overridingFlags)
|
||||
{
|
||||
message->freeze();
|
||||
|
||||
MessagePtr deleted;
|
||||
|
||||
if (context == MessageContext::Original && this->getType() != Type::None)
|
||||
@@ -157,6 +159,11 @@ void Channel::disableAllMessages()
|
||||
|
||||
void Channel::addMessagesAtStart(const std::vector<MessagePtr> &_messages)
|
||||
{
|
||||
for (const auto &msg : _messages)
|
||||
{
|
||||
msg->freeze();
|
||||
}
|
||||
|
||||
std::vector<MessagePtr> addedMessages =
|
||||
this->messages_.pushFront(_messages);
|
||||
|
||||
@@ -172,6 +179,10 @@ void Channel::fillInMissingMessages(const std::vector<MessagePtr> &messages)
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (const auto &msg : messages)
|
||||
{
|
||||
msg->freeze();
|
||||
}
|
||||
|
||||
auto snapshot = this->getMessageSnapshot();
|
||||
if (snapshot.size() == 0)
|
||||
@@ -256,6 +267,7 @@ void Channel::fillInMissingMessages(const std::vector<MessagePtr> &messages)
|
||||
void Channel::replaceMessage(const MessagePtr &message,
|
||||
const MessagePtr &replacement)
|
||||
{
|
||||
replacement->freeze();
|
||||
int index = this->messages_.replaceItem(message, replacement);
|
||||
|
||||
if (index >= 0)
|
||||
@@ -266,6 +278,8 @@ void Channel::replaceMessage(const MessagePtr &message,
|
||||
|
||||
void Channel::replaceMessage(size_t index, const MessagePtr &replacement)
|
||||
{
|
||||
replacement->freeze();
|
||||
|
||||
MessagePtr prev;
|
||||
if (this->messages_.replaceItem(index, replacement, &prev))
|
||||
{
|
||||
@@ -276,6 +290,8 @@ void Channel::replaceMessage(size_t index, const MessagePtr &replacement)
|
||||
void Channel::replaceMessage(size_t hint, const MessagePtr &message,
|
||||
const MessagePtr &replacement)
|
||||
{
|
||||
replacement->freeze();
|
||||
|
||||
auto index = this->messages_.replaceItem(hint, message, replacement);
|
||||
if (index >= 0)
|
||||
{
|
||||
|
||||
@@ -107,6 +107,7 @@ QJsonObject Message::toJson() const
|
||||
{"count"_L1, static_cast<qint64>(this->count)},
|
||||
{"serverReceivedTime"_L1,
|
||||
this->serverReceivedTime.toString(Qt::ISODate)},
|
||||
{"frozen"_L1, this->frozen},
|
||||
};
|
||||
|
||||
QJsonArray badges;
|
||||
|
||||
@@ -86,6 +86,16 @@ struct Message {
|
||||
};
|
||||
ReplyStatus isReplyable() const;
|
||||
uint32_t count = 1;
|
||||
|
||||
/// Can this message be modified?
|
||||
///
|
||||
/// Our rendering and layout code expects messages to be mostly immutable.
|
||||
/// Thus, when this flag is set, this message may not be modified.
|
||||
/// Only flags and this member can be modified safely (from the GUI thread).
|
||||
/// This is only used for plugins right now. This value is only ever set to
|
||||
/// true.
|
||||
mutable bool frozen = false;
|
||||
|
||||
std::vector<std::unique_ptr<MessageElement>> elements;
|
||||
|
||||
ScrollbarHighlight getScrollBarHighlight() const;
|
||||
@@ -93,6 +103,11 @@ struct Message {
|
||||
std::shared_ptr<ChannelPointReward> reward = nullptr;
|
||||
|
||||
QJsonObject toJson() const;
|
||||
|
||||
void freeze() const
|
||||
{
|
||||
this->frozen = true;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace chatterino
|
||||
|
||||
Reference in New Issue
Block a user