refactor: Turn link-info into its own element and class (#5178)

This commit is contained in:
nerix
2024-02-18 13:34:00 +01:00
committed by GitHub
parent 42e4559910
commit e130c48f76
22 changed files with 752 additions and 314 deletions
+42 -23
View File
@@ -4,6 +4,7 @@
#include "messages/ImageSet.hpp"
#include "messages/Link.hpp"
#include "messages/MessageColor.hpp"
#include "providers/links/LinkInfo.hpp"
#include "singletons/Fonts.hpp"
#include <pajlada/signals/signalholder.hpp>
@@ -136,10 +137,9 @@ enum class MessageElementFlag : int64_t {
BoldUsername = (1LL << 27),
NonBoldUsername = (1LL << 28),
// for links
LowercaseLink = (1LL << 29),
OriginalLink = (1LL << 30),
// used to check if links should be lowercased
LowercaseLinks = (1LL << 29),
// Unused = (1LL << 30)
// Unused: (1LL << 31)
// for elements of the message reply
@@ -166,9 +166,6 @@ public:
Update_Images = 4,
Update_All = Update_Text | Update_Emotes | Update_Images
};
enum ThumbnailType : char {
Link_Thumbnail = 1,
};
virtual ~MessageElement();
@@ -181,25 +178,18 @@ public:
MessageElement *setLink(const Link &link);
MessageElement *setText(const QString &text);
MessageElement *setTooltip(const QString &tooltip);
MessageElement *setThumbnailType(const ThumbnailType type);
MessageElement *setThumbnail(const ImagePtr &thumbnail);
MessageElement *setTrailingSpace(bool value);
const QString &getTooltip() const;
const ImagePtr &getThumbnail() const;
const ThumbnailType &getThumbnailType() const;
const Link &getLink() const;
virtual Link getLink() const;
bool hasTrailingSpace() const;
MessageElementFlags getFlags() const;
void addFlags(MessageElementFlags flags);
MessageElement *updateLink();
virtual void addToContainer(MessageLayoutContainer &container,
MessageElementFlags flags) = 0;
pajlada::Signals::NoArgSignal linkChanged;
protected:
MessageElement(MessageElementFlags flags);
bool trailingSpace = true;
@@ -208,8 +198,6 @@ private:
QString text_;
Link link_;
QString tooltip_;
ImagePtr thumbnail_;
ThumbnailType thumbnailType_{};
MessageElementFlags flags_;
};
@@ -269,15 +257,12 @@ public:
void addToContainer(MessageLayoutContainer &container,
MessageElementFlags flags) override;
protected:
QStringList words_;
private:
MessageColor color_;
FontStyle style_;
struct Word {
QString text;
int width = -1;
};
std::vector<Word> words_;
};
// contains a text that will be truncated to one line
@@ -303,6 +288,40 @@ private:
std::vector<Word> words_;
};
class LinkElement : public TextElement
{
public:
struct Parsed {
QString lowercase;
QString original;
};
LinkElement(const Parsed &parsed, MessageElementFlags flags,
const MessageColor &color = MessageColor::Text,
FontStyle style = FontStyle::ChatMedium);
~LinkElement() override = default;
LinkElement(const LinkElement &) = delete;
LinkElement(LinkElement &&) = delete;
LinkElement &operator=(const LinkElement &) = delete;
LinkElement &operator=(LinkElement &&) = delete;
void addToContainer(MessageLayoutContainer &container,
MessageElementFlags flags) override;
Link getLink() const override;
[[nodiscard]] LinkInfo *linkInfo()
{
return &this->linkInfo_;
}
private:
LinkInfo linkInfo_;
// these are implicitly shared
QStringList lowercase_;
QStringList original_;
};
// contains emote data and will pick the emote based on :
// a) are images for the emote type enabled
// b) which size it wants