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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user