From 03ddc61779c633645579e1e914d234dc50fc2285 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 15 Oct 2019 15:05:38 +0100 Subject: [PATCH] Support rich resource text in buffer viewer --- qrenderdoc/Windows/BufferViewer.cpp | 64 +++++++++++++++++++++++++---- qrenderdoc/Windows/BufferViewer.h | 3 ++ 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index 756a7ea4c..ab96e33fe 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -849,23 +849,42 @@ public: if(comp < list.count()) { - QString ret; - uint32_t rowdim = el.matrixdim; uint32_t coldim = el.format.compCount; - for(uint32_t r = 0; r < rowdim; r++) + if(rowdim == 1) { - if(r > 0) - ret += lit("\n"); + QVariant v; if(el.rowmajor) - ret += interpretVariant(list[comp + r * coldim], el); + v = list[comp]; else - ret += interpretVariant(list[r + comp * rowdim], el); - } + v = list[comp * rowdim]; - return ret; + RichResourceTextInitialise(v); + + if(RichResourceTextCheck(v)) + return v; + + return interpretVariant(v, el); + } + else + { + QString ret; + + for(uint32_t r = 0; r < rowdim; r++) + { + if(r > 0) + ret += lit("\n"); + + if(el.rowmajor) + ret += interpretVariant(list[comp + r * coldim], el); + else + ret += interpretVariant(list[r + comp * rowdim], el); + } + + return ret; + } } } @@ -1797,6 +1816,13 @@ void BufferViewer::SetupRawView() ui->vsinData->setPinnedColumns(1); ui->vsinData->setColumnGroupRole(columnGroupRole); + m_delegate = new RichTextViewDelegate(ui->vsinData); + ui->vsinData->setItemDelegate(m_delegate); + + ui->vsinData->viewport()->installEventFilter(this); + + ui->vsinData->setMouseTracking(true); + ui->formatSpecifier->setWindowTitle(tr("Buffer Format")); ui->dockarea->addToolWindow(ui->formatSpecifier, ToolWindowManager::AreaReference( ToolWindowManager::BottomOf, @@ -2917,6 +2943,26 @@ void BufferViewer::ViewTexture(uint32_t arrayIdx, uint32_t mip, ResourceId id, c processFormat(format); } +bool BufferViewer::eventFilter(QObject *watched, QEvent *event) +{ + if(!m_MeshView && watched == ui->vsinData->viewport() && event->type() == QEvent::MouseMove) + { + bool ret = QObject::eventFilter(watched, event); + + QMouseEvent *mouseEvent = (QMouseEvent *)event; + + if(m_delegate->linkHover(mouseEvent, font(), + ui->vsinData->indexAt(mouseEvent->localPos().toPoint()))) + ui->vsinData->setCursor(QCursor(Qt::PointingHandCursor)); + else + ui->vsinData->unsetCursor(); + + return ret; + } + + return QObject::eventFilter(watched, event); +} + void BufferViewer::updateWindowTitle() { if(!m_MeshView) diff --git a/qrenderdoc/Windows/BufferViewer.h b/qrenderdoc/Windows/BufferViewer.h index 70723db44..838596a30 100644 --- a/qrenderdoc/Windows/BufferViewer.h +++ b/qrenderdoc/Windows/BufferViewer.h @@ -138,6 +138,7 @@ protected: void changeEvent(QEvent *event) override; private: + bool eventFilter(QObject *watched, QEvent *event) override; Ui::BufferViewer *ui; ICaptureContext &m_Ctx; @@ -198,6 +199,8 @@ private: int m_DataColWidth; int m_DataRowHeight; + RichTextViewDelegate *m_delegate = NULL; + QMenu *m_HeaderMenu = NULL; QAction *m_ResetColumnSel = NULL;