Allow each layered image to retain its own flags (#4460)

This fixes an issue where context-menu items for zero-width emotes displayed the wrong provider.
This commit is contained in:
nerix
2023-03-19 11:26:30 +01:00
committed by GitHub
parent 0acbc0d2c3
commit a777a227d4
6 changed files with 58 additions and 29 deletions
+23 -16
View File
@@ -110,6 +110,11 @@ MessageElementFlags MessageElement::getFlags() const
return this->flags_;
}
void MessageElement::addFlags(MessageElementFlags flags)
{
this->flags_.set(flags);
}
MessageElement *MessageElement::updateLink()
{
this->linkChanged.invoke();
@@ -234,9 +239,9 @@ MessageLayoutElement *EmoteElement::makeImageLayoutElement(
return new ImageLayoutElement(*this, image, size);
}
LayeredEmoteElement::LayeredEmoteElement(std::vector<EmotePtr> &&emotes,
MessageElementFlags flags,
const MessageColor &textElementColor)
LayeredEmoteElement::LayeredEmoteElement(
std::vector<LayeredEmoteElement::Emote> &&emotes, MessageElementFlags flags,
const MessageColor &textElementColor)
: MessageElement(flags)
, emotes_(std::move(emotes))
, textElementColor_(textElementColor)
@@ -244,7 +249,7 @@ LayeredEmoteElement::LayeredEmoteElement(std::vector<EmotePtr> &&emotes,
this->updateTooltips();
}
void LayeredEmoteElement::addEmoteLayer(const EmotePtr &emote)
void LayeredEmoteElement::addEmoteLayer(const LayeredEmoteElement::Emote &emote)
{
this->emotes_.push_back(emote);
this->updateTooltips();
@@ -295,9 +300,9 @@ std::vector<ImagePtr> LayeredEmoteElement::getLoadedImages(float scale)
std::vector<ImagePtr> res;
res.reserve(this->emotes_.size());
for (auto emote : this->emotes_)
for (const auto &emote : this->emotes_)
{
auto image = emote->images.getImageOrLoaded(scale);
auto image = emote.ptr->images.getImageOrLoaded(scale);
if (image->isEmpty())
{
continue;
@@ -327,9 +332,9 @@ void LayeredEmoteElement::updateTooltips()
std::vector<QString> result;
result.reserve(this->emotes_.size());
for (auto &emote : this->emotes_)
for (const auto &emote : this->emotes_)
{
result.push_back(emote->tooltip.string);
result.push_back(emote.ptr->tooltip.string);
}
this->emoteTooltips_ = std::move(result);
@@ -349,8 +354,8 @@ QString LayeredEmoteElement::getCleanCopyString() const
{
result += " ";
}
result +=
TwitchEmotes::cleanUpEmoteCode(this->emotes_[i]->getCopyString());
result += TwitchEmotes::cleanUpEmoteCode(
this->emotes_[i].ptr->getCopyString());
}
return result;
}
@@ -364,23 +369,25 @@ QString LayeredEmoteElement::getCopyString() const
{
result += " ";
}
result += this->emotes_[i]->getCopyString();
result += this->emotes_[i].ptr->getCopyString();
}
return result;
}
const std::vector<EmotePtr> &LayeredEmoteElement::getEmotes() const
const std::vector<LayeredEmoteElement::Emote> &LayeredEmoteElement::getEmotes()
const
{
return this->emotes_;
}
std::vector<EmotePtr> LayeredEmoteElement::getUniqueEmotes() const
std::vector<LayeredEmoteElement::Emote> LayeredEmoteElement::getUniqueEmotes()
const
{
// Functor for std::copy_if that keeps track of seen elements
struct NotDuplicate {
bool operator()(const EmotePtr &element)
bool operator()(const Emote &element)
{
return seen.insert(element).second;
return seen.insert(element.ptr).second;
}
private:
@@ -389,7 +396,7 @@ std::vector<EmotePtr> LayeredEmoteElement::getUniqueEmotes() const
// Get unique emotes while maintaining relative layering order
NotDuplicate dup;
std::vector<EmotePtr> unique;
std::vector<Emote> unique;
std::copy_if(this->emotes_.begin(), this->emotes_.end(),
std::back_insert_iterator(unique), dup);