mirror-chatterino2/src/messages/layouts/MessageLayoutElement.hpp

188 lines
5.4 KiB
C++
Raw Normal View History

#pragma once
#include "common/FlagsEnum.hpp"
2018-06-26 14:09:39 +02:00
#include "messages/Link.hpp"
#include "messages/MessageColor.hpp"
#include "messages/MessageElement.hpp"
#include <boost/noncopyable.hpp>
#include <pajlada/signals/signalholder.hpp>
#include <QPen>
#include <QPoint>
#include <QRect>
#include <QString>
#include <climits>
#include <cstdint>
class QPainter;
namespace chatterino {
class MessageElement;
class Image;
using ImagePtr = std::shared_ptr<Image>;
enum class FontStyle : uint8_t;
class MessageLayoutElement : boost::noncopyable
{
public:
2018-07-06 19:23:47 +02:00
MessageLayoutElement(MessageElement &creator_, const QSize &size);
2018-04-06 16:37:30 +02:00
virtual ~MessageLayoutElement();
bool reversedNeutral = false;
const QRect &getRect() const;
MessageElement &getCreator() const;
void setPosition(QPoint point);
bool hasTrailingSpace() const;
int getLine() const;
void setLine(int line);
MessageLayoutElement *setTrailingSpace(bool value);
2018-07-06 19:23:47 +02:00
MessageLayoutElement *setLink(const Link &link_);
MessageLayoutElement *setText(const QString &text_);
virtual void addCopyTextToString(QString &str, uint32_t from = 0,
uint32_t to = UINT32_MAX) const = 0;
virtual int getSelectionIndexCount() const = 0;
virtual void paint(QPainter &painter) = 0;
2018-01-13 02:13:59 +01:00
virtual void paintAnimated(QPainter &painter, int yOffset) = 0;
virtual int getMouseOverIndex(const QPoint &abs) const = 0;
2018-01-16 00:26:04 +01:00
virtual int getXFromIndex(int index) = 0;
2019-05-21 19:33:12 +02:00
2018-01-17 14:14:31 +01:00
const Link &getLink() const;
const QString &getText() const;
FlagsEnum<MessageElementFlag> getFlags() const;
protected:
bool trailingSpace = true;
private:
QString text_;
2018-07-06 19:23:47 +02:00
QRect rect_;
Link link_;
MessageElement &creator_;
int line_{};
};
// IMAGE
class ImageLayoutElement : public MessageLayoutElement
{
public:
2018-08-06 21:17:03 +02:00
ImageLayoutElement(MessageElement &creator, ImagePtr image,
const QSize &size);
protected:
void addCopyTextToString(QString &str, uint32_t from = 0,
uint32_t to = UINT32_MAX) const override;
int getSelectionIndexCount() const override;
2018-04-01 16:43:30 +02:00
void paint(QPainter &painter) override;
void paintAnimated(QPainter &painter, int yOffset) override;
int getMouseOverIndex(const QPoint &abs) const override;
2018-04-01 16:43:30 +02:00
int getXFromIndex(int index) override;
2018-08-02 14:23:27 +02:00
ImagePtr image_;
};
class ImageWithBackgroundLayoutElement : public ImageLayoutElement
{
public:
ImageWithBackgroundLayoutElement(MessageElement &creator, ImagePtr image,
const QSize &size, QColor color);
protected:
void paint(QPainter &painter) override;
private:
QColor color_;
};
class ImageWithCircleBackgroundLayoutElement : public ImageLayoutElement
{
public:
ImageWithCircleBackgroundLayoutElement(MessageElement &creator,
ImagePtr image,
const QSize &imageSize, QColor color,
int padding);
protected:
void paint(QPainter &painter) override;
private:
const QColor color_;
const QSize imageSize_;
const int padding_;
};
// TEXT
class TextLayoutElement : public MessageLayoutElement
{
public:
2018-08-06 21:17:03 +02:00
TextLayoutElement(MessageElement &creator_, QString &text,
2018-11-14 17:26:08 +01:00
const QSize &size, QColor color_, FontStyle style_,
float scale_);
void listenToLinkChanges();
protected:
void addCopyTextToString(QString &str, uint32_t from = 0,
uint32_t to = UINT32_MAX) const override;
int getSelectionIndexCount() const override;
2018-04-01 16:43:30 +02:00
void paint(QPainter &painter) override;
void paintAnimated(QPainter &painter, int yOffset) override;
int getMouseOverIndex(const QPoint &abs) const override;
2018-04-01 16:43:30 +02:00
int getXFromIndex(int index) override;
2018-11-14 17:26:08 +01:00
QColor color_;
FontStyle style_;
float scale_;
pajlada::Signals::SignalHolder managedConnections_;
};
2018-01-17 14:14:31 +01:00
// TEXT ICON
// two lines of text (characters) in the size of a normal chat badge
class TextIconLayoutElement : public MessageLayoutElement
{
public:
2018-08-06 21:17:03 +02:00
TextIconLayoutElement(MessageElement &creator_, const QString &line1,
const QString &line2, float scale, const QSize &size);
2018-01-17 14:14:31 +01:00
protected:
void addCopyTextToString(QString &str, uint32_t from = 0,
uint32_t to = UINT32_MAX) const override;
int getSelectionIndexCount() const override;
2018-04-01 16:43:30 +02:00
void paint(QPainter &painter) override;
void paintAnimated(QPainter &painter, int yOffset) override;
int getMouseOverIndex(const QPoint &abs) const override;
2018-04-01 16:43:30 +02:00
int getXFromIndex(int index) override;
2018-01-17 14:14:31 +01:00
private:
float scale;
2018-01-17 14:14:31 +01:00
QString line1;
QString line2;
};
2018-04-01 16:43:30 +02:00
class ReplyCurveLayoutElement : public MessageLayoutElement
{
public:
ReplyCurveLayoutElement(MessageElement &creator, int width, float thickness,
float radius, float neededMargin);
protected:
void paint(QPainter &painter) override;
void paintAnimated(QPainter &painter, int yOffset) override;
int getMouseOverIndex(const QPoint &abs) const override;
int getXFromIndex(int index) override;
void addCopyTextToString(QString &str, uint32_t from = 0,
uint32_t to = UINT32_MAX) const override;
int getSelectionIndexCount() const override;
private:
const QPen pen_;
const float radius_;
const float neededMargin_;
};
} // namespace chatterino