From 9610919c16fd68da481ee005e176d713f6839697 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 2 Dec 2020 14:08:27 +0000 Subject: [PATCH] Fix copy-paste of rich resource text * We need to cache to the QString text on demand, which requires a context potentially sooner than paint/etc time. --- qrenderdoc/Code/QRDUtils.cpp | 12 ++++++++---- qrenderdoc/Code/QRDUtils.h | 2 +- qrenderdoc/Widgets/Extended/RDLabel.cpp | 2 +- qrenderdoc/Windows/BufferViewer.cpp | 2 +- qrenderdoc/Windows/DebugMessageView.cpp | 2 +- qrenderdoc/Windows/EventBrowser.cpp | 2 +- qrenderdoc/Windows/LogView.cpp | 2 +- qrenderdoc/Windows/ShaderViewer.cpp | 2 +- 8 files changed, 15 insertions(+), 11 deletions(-) diff --git a/qrenderdoc/Code/QRDUtils.cpp b/qrenderdoc/Code/QRDUtils.cpp index faecf2041..1cde5fc01 100644 --- a/qrenderdoc/Code/QRDUtils.cpp +++ b/qrenderdoc/Code/QRDUtils.cpp @@ -222,7 +222,7 @@ struct RichResourceText int i = 0; - bool highdpi = widget->devicePixelRatioF() > 1.0; + bool highdpi = widget && widget->devicePixelRatioF() > 1.0; QVector fragmentIndexFromBlockIndex; @@ -265,7 +265,8 @@ struct RichResourceText doc.setDocumentMargin(0); doc.setHtml(html); - doc.setDefaultFont(widget->font()); + if(widget) + doc.setDefaultFont(widget->font()); if(doc.blockCount() != fragmentIndexFromBlockIndex.count()) { @@ -328,6 +329,7 @@ Q_DECLARE_METATYPE(GPUAddressPtr); QString ResIdTextToString(RichResourceTextPtr ptr) { + ptr->cacheDocument(NULL); return ptr->text; } @@ -351,7 +353,7 @@ void RegisterMetatypeConversions() QMetaType::registerConverter(&GPUAddressToString); } -void RichResourceTextInitialise(QVariant &var) +void RichResourceTextInitialise(QVariant &var, ICaptureContext *ctx) { // we only upconvert from strings, any other type with a string representation is not expected to // contain ResourceIds. In particular if the variant is already a ResourceId we can return. @@ -414,6 +416,8 @@ void RichResourceTextInitialise(QVariant &var) RichResourceTextPtr linkedText(new RichResourceText); + linkedText->ctxptr = ctx; + while(match.hasMatch()) { qulonglong idnum = match.captured(2).toULongLong(); @@ -846,7 +850,7 @@ bool RichResourceTextMouseEvent(const QWidget *owner, const QVariant &var, QRect QString RichResourceTextFormat(ICaptureContext &ctx, QVariant var) { - RichResourceTextInitialise(var); + RichResourceTextInitialise(var, &ctx); if(var.userType() == qMetaTypeId()) return GetTruncatedResourceName(ctx, var.value()); diff --git a/qrenderdoc/Code/QRDUtils.h b/qrenderdoc/Code/QRDUtils.h index e7850a9f8..31e8504f9 100644 --- a/qrenderdoc/Code/QRDUtils.h +++ b/qrenderdoc/Code/QRDUtils.h @@ -187,7 +187,7 @@ struct GPUAddress // NOTE: It is not possible to move a RichResourceText instance from one ICaptureContext to another // as the pointer is cached internally. Instead you should delete the old and re-initialise from // scratch. -void RichResourceTextInitialise(QVariant &var); +void RichResourceTextInitialise(QVariant &var, ICaptureContext *ctx = NULL); // Checks if a variant is rich resource text and should be treated specially // Particularly meaning we need mouse tracking on the widget to handle the on-hover highlighting diff --git a/qrenderdoc/Widgets/Extended/RDLabel.cpp b/qrenderdoc/Widgets/Extended/RDLabel.cpp index b25a19ba7..0113be9ef 100644 --- a/qrenderdoc/Widgets/Extended/RDLabel.cpp +++ b/qrenderdoc/Widgets/Extended/RDLabel.cpp @@ -65,7 +65,7 @@ QSize RDLabel::minimumSizeHint() const void RDLabel::setText(const QString &text) { m_variant = text; - RichResourceTextInitialise(m_variant); + RichResourceTextInitialise(m_variant, getCaptureContext(this)); if(RichResourceTextCheck(m_variant)) { setMouseTracking(true); diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index c21529733..7939d4190 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -1092,7 +1092,7 @@ public: v = ToQStr(ptr); } - RichResourceTextInitialise(v); + RichResourceTextInitialise(v, getCaptureContext(view)); if(RichResourceTextCheck(v)) return v; diff --git a/qrenderdoc/Windows/DebugMessageView.cpp b/qrenderdoc/Windows/DebugMessageView.cpp index f48720975..5bad5f5d8 100644 --- a/qrenderdoc/Windows/DebugMessageView.cpp +++ b/qrenderdoc/Windows/DebugMessageView.cpp @@ -109,7 +109,7 @@ public: case 5: { QVariant desc = msg.description; - RichResourceTextInitialise(desc); + RichResourceTextInitialise(desc, &m_Ctx); return desc; } default: break; diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index 7fd5ecb0b..76afa48b3 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -359,7 +359,7 @@ QPair EventBrowser::AddDrawcalls(RDTreeWidgetItem *parent, QVariant name = QString(d.name); - RichResourceTextInitialise(name); + RichResourceTextInitialise(name, &m_Ctx); RDTreeWidgetItem *child = new RDTreeWidgetItem( {name, QString::number(d.eventId), QString::number(d.drawcallId), lit("---")}); diff --git a/qrenderdoc/Windows/LogView.cpp b/qrenderdoc/Windows/LogView.cpp index 622cc2c75..292ec63ed 100644 --- a/qrenderdoc/Windows/LogView.cpp +++ b/qrenderdoc/Windows/LogView.cpp @@ -121,7 +121,7 @@ public: case Column_Message: { QVariant desc = msg.Message; - RichResourceTextInitialise(desc); + RichResourceTextInitialise(desc, &m_Viewer->m_Ctx); return desc; } default: break; diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index 53f52b1b9..3b13e05ea 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -986,7 +986,7 @@ ShaderViewer *ShaderViewer::LoadEditor(ICaptureContext &ctx, QVariantMap data, { QVariant v = data[lit("id")]; - RichResourceTextInitialise(v); + RichResourceTextInitialise(v, &ctx); id = v.value(); } ShaderStage stage = (ShaderStage)data[lit("stage")].toUInt();