refactor: Turn link-info into its own element and class (#5178)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user