From f65d93cd68bf0666bbda8b1fc69e2fb4ea94365d Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 21 Nov 2017 16:57:28 +0000 Subject: [PATCH] Add support for RichResourceText in RDLabel --- qrenderdoc/Widgets/Extended/RDLabel.cpp | 99 +++++++++++++++++++++++-- qrenderdoc/Widgets/Extended/RDLabel.h | 10 +++ 2 files changed, 102 insertions(+), 7 deletions(-) diff --git a/qrenderdoc/Widgets/Extended/RDLabel.cpp b/qrenderdoc/Widgets/Extended/RDLabel.cpp index 046ad3aa5..ced88fc18 100644 --- a/qrenderdoc/Widgets/Extended/RDLabel.cpp +++ b/qrenderdoc/Widgets/Extended/RDLabel.cpp @@ -24,6 +24,8 @@ #include "RDLabel.h" #include +#include +#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); + } +} diff --git a/qrenderdoc/Widgets/Extended/RDLabel.h b/qrenderdoc/Widgets/Extended/RDLabel.h index 47119e3e8..df931df55 100644 --- a/qrenderdoc/Widgets/Extended/RDLabel.h +++ b/qrenderdoc/Widgets/Extended/RDLabel.h @@ -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; };