Add support for RichResourceText in RDLabel

This commit is contained in:
baldurk
2017-11-21 16:57:28 +00:00
parent a13902fe2f
commit f65d93cd68
2 changed files with 102 additions and 7 deletions
+92 -7
View File
@@ -24,6 +24,8 @@
#include "RDLabel.h"
#include <QMouseEvent>
#include <QPainter>
#include "Code/QRDUtils.h"
RDLabel::RDLabel(QWidget *parent) : QLabel(parent)
{
@@ -33,26 +35,58 @@ RDLabel::~RDLabel()
{
}
QSize RDLabel::sizeHint() const
void RDLabel::modifySizeHint(QSize &sz) const
{
QSize sz = QLabel::sizeHint();
if(m_preserveRatio)
sz.setWidth(sz.width() - contentsMargins().left() - contentsMargins().right());
if(m_variant.isValid())
sz.setWidth(qMax(RichResourceTextWidthHint(this, m_variant) + contentsMargins().left() +
contentsMargins().right() + margin() * 2,
sz.width()));
}
QSize RDLabel::sizeHint() const
{
QSize sz = QLabel::sizeHint();
modifySizeHint(sz);
return sz;
}
QSize RDLabel::minimumSizeHint() const
{
QSize sz = QLabel::minimumSizeHint();
if(m_preserveRatio)
sz.setWidth(sz.width() - contentsMargins().left() - contentsMargins().right());
modifySizeHint(sz);
return sz;
}
void RDLabel::setText(const QString &text)
{
m_variant = text;
RichResourceTextInitialise(m_variant);
if(RichResourceTextCheck(m_variant))
{
setMouseTracking(true);
m_hover = false;
QLabel::setText(QString());
updateGeometry();
repaint();
}
else
{
m_variant = QVariant();
QLabel::setText(text);
}
}
QString RDLabel::text() const
{
if(m_variant.isValid())
return m_variant.toString();
return QLabel::text();
}
void RDLabel::mousePressEvent(QMouseEvent *event)
{
emit(clicked(event));
@@ -60,10 +94,36 @@ void RDLabel::mousePressEvent(QMouseEvent *event)
QLabel::mousePressEvent(event);
}
void RDLabel::mouseReleaseEvent(QMouseEvent *event)
{
if(m_variant.isValid())
{
RichResourceTextMouseEvent(this, m_variant, rect(), event);
return;
}
QLabel::mouseReleaseEvent(event);
}
void RDLabel::mouseMoveEvent(QMouseEvent *event)
{
emit(mouseMoved(event));
if(m_variant.isValid())
{
bool hover = RichResourceTextMouseEvent(this, m_variant, rect(), event);
if(hover)
setCursor(QCursor(Qt::PointingHandCursor));
else
unsetCursor();
if(m_hover != hover)
update();
m_hover = hover;
return;
}
QLabel::mouseMoveEvent(event);
}
@@ -78,6 +138,13 @@ void RDLabel::leaveEvent(QEvent *event)
{
emit(leave());
if(m_variant.isValid())
{
unsetCursor();
repaint();
m_hover = false;
}
QLabel::leaveEvent(event);
}
@@ -119,3 +186,21 @@ void RDLabel::changeEvent(QEvent *event)
QLabel::changeEvent(event);
}
void RDLabel::paintEvent(QPaintEvent *event)
{
QLabel::paintEvent(event);
if(m_variant.isValid())
{
QPainter painter(this);
QPoint pos = mapFromGlobal(QCursor::pos());
QRect r = rect();
r.setLeft(r.left() + contentsMargins().left() + margin());
r.setRight(r.right() - contentsMargins().right() - margin());
RichResourceTextPaint(this, &painter, r, font(), palette(), r.contains(pos), pos, m_variant);
}
}
+10
View File
@@ -36,6 +36,9 @@ public:
QSize sizeHint() const override;
QSize minimumSizeHint() const override;
void setText(const QString &text);
QString text() const;
void setPreserveAspectRatio(bool preserve) { m_preserveRatio = preserve; }
bool preserveAspectRatio() { return m_preserveRatio; }
signals:
@@ -49,11 +52,18 @@ public slots:
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseDoubleClickEvent(QMouseEvent *event) override;
void leaveEvent(QEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void changeEvent(QEvent *event) override;
void paintEvent(QPaintEvent *event) override;
void modifySizeHint(QSize &sz) const;
bool m_preserveRatio = false;
bool m_hover = false;
QVariant m_variant;
};