diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp index c36193d4b..93f1be66d 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp @@ -29,6 +29,7 @@ #include #include #include +#include class RDTreeWidgetModel : public QAbstractItemModel { @@ -205,7 +206,7 @@ public: return QVariant(); } - else if(role == Qt::ToolTipRole) + else if(role == Qt::ToolTipRole && !widget->m_instantTooltips) { return item->m_tooltip; } @@ -573,6 +574,26 @@ void RDTreeWidget::mouseMoveEvent(QMouseEvent *e) m_model->itemChanged(old, roles); m_model->itemChanged(item, roles); + if(m_instantTooltips) + { + QToolTip::hideText(); + + if(m_currentHoverItem != NULL && !m_currentHoverItem->m_tooltip.isEmpty()) + { + // the documentation says: + // + // "If text is empty the tool tip is hidden. If the text is the same as the currently shown + // tooltip, the tip will not move. You can force moving by first hiding the tip with an empty + // text, and then showing the new tip at the new position." + // + // However the actual implementation has some kind of 'fading' check, so if you hide then + // immediately show, it will try to reuse the tooltip and end up not moving it at all if the + // text hasn't changed. + QToolTip::showText(QCursor::pos(), lit(" "), this); + QToolTip::showText(QCursor::pos(), m_currentHoverItem->m_tooltip, this); + } + } + emit mouseMove(e); QTreeView::mouseMoveEvent(e); @@ -597,6 +618,8 @@ void RDTreeWidget::leaveEvent(QEvent *e) if(m_currentHoverItem) { RDTreeWidgetItem *item = m_currentHoverItem; + if(!item->m_tooltip.isEmpty() && m_instantTooltips) + QToolTip::hideText(); m_currentHoverItem = NULL; m_model->itemChanged(item, {Qt::DecorationRole, Qt::BackgroundRole, Qt::ForegroundRole}); } diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.h b/qrenderdoc/Widgets/Extended/RDTreeWidget.h index 5ad38c50a..94b60e52d 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.h +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.h @@ -148,6 +148,8 @@ private: class RDTreeWidget : public QTreeView { Q_OBJECT + + Q_PROPERTY(bool instantTooltips READ instantTooltips WRITE setInstantTooltips) public: explicit RDTreeWidget(QWidget *parent = 0); ~RDTreeWidget(); @@ -163,6 +165,8 @@ public: void setHoverHandCursor(bool hand) { m_hoverHandCursor = hand; } void setHoverClickActivate(bool click) { m_activateOnClick = click; } void setClearSelectionOnFocusLoss(bool clear) { m_clearSelectionOnFocusLoss = clear; } + bool instantTooltips() { return m_instantTooltips; } + void setInstantTooltips(bool instant) { m_instantTooltips = instant; } RDTreeWidgetItem *invisibleRootItem() { return m_root; } void addTopLevelItem(RDTreeWidgetItem *item) { m_root->addChild(item); } RDTreeWidgetItem *topLevelItem(int index) const { return m_root->child(index); } @@ -236,6 +240,7 @@ private: RDTreeWidgetItem *m_currentHoverItem = NULL; + bool m_instantTooltips = false; int m_hoverColumn = -1; QIcon m_normalHoverIcon; QIcon m_activeHoverIcon; diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp index 6a4e485a2..7002e5ead 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp @@ -172,6 +172,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->iaLayouts->header()->setSectionResizeMode(8, QHeaderView::ResizeToContents); ui->iaLayouts->setClearSelectionOnFocusLoss(true); + ui->iaLayouts->setInstantTooltips(true); ui->iaLayouts->setHoverIconColumn(8, action, action_hover); } @@ -187,6 +188,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->iaBuffers->header()->setSectionResizeMode(5, QHeaderView::ResizeToContents); ui->iaBuffers->setClearSelectionOnFocusLoss(true); + ui->iaBuffers->setInstantTooltips(true); ui->iaBuffers->setHoverIconColumn(5, action, action_hover); } @@ -207,6 +209,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, tex->setHoverIconColumn(8, action, action_hover); tex->setClearSelectionOnFocusLoss(true); + tex->setInstantTooltips(true); } for(RDTreeWidget *samp : samplers) @@ -220,6 +223,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, samp->header()->setSectionResizeMode(4, QHeaderView::ResizeToContents); samp->setClearSelectionOnFocusLoss(true); + samp->setInstantTooltips(true); } for(RDTreeWidget *cbuffer : cbuffers) @@ -234,6 +238,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, cbuffer->setHoverIconColumn(4, action, action_hover); cbuffer->setClearSelectionOnFocusLoss(true); + cbuffer->setInstantTooltips(true); } for(RDTreeWidget *cl : classes) @@ -245,6 +250,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, cl->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); cl->setClearSelectionOnFocusLoss(true); + cl->setInstantTooltips(true); } { @@ -260,6 +266,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->viewports->header()->setSectionResizeMode(6, QHeaderView::ResizeToContents); ui->viewports->setClearSelectionOnFocusLoss(true); + ui->viewports->setInstantTooltips(true); } { @@ -272,6 +279,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->scissors->header()->setSectionResizeMode(4, QHeaderView::Stretch); ui->scissors->setClearSelectionOnFocusLoss(true); + ui->scissors->setInstantTooltips(true); } { @@ -290,6 +298,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->targetOutputs->setHoverIconColumn(8, action, action_hover); ui->targetOutputs->setClearSelectionOnFocusLoss(true); + ui->targetOutputs->setInstantTooltips(true); } { @@ -307,6 +316,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->blends->header()->setSectionResizeMode(8, QHeaderView::ResizeToContents); ui->blends->setClearSelectionOnFocusLoss(true); + ui->blends->setInstantTooltips(true); } { @@ -320,6 +330,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->stencils->header()->setSectionResizeMode(4, QHeaderView::Stretch); ui->stencils->setClearSelectionOnFocusLoss(true); + ui->stencils->setInstantTooltips(true); } { @@ -337,6 +348,7 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx, ui->csUAVs->setHoverIconColumn(8, action, action_hover); ui->csUAVs->setClearSelectionOnFocusLoss(true); + ui->csUAVs->setInstantTooltips(true); } // this is often changed just because we're changing some tab in the designer. diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index 067762570..4609c0a9b 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -201,6 +201,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, ui->iaLayouts->header()->setSectionResizeMode(8, QHeaderView::ResizeToContents); ui->iaLayouts->setClearSelectionOnFocusLoss(true); + ui->iaLayouts->setInstantTooltips(true); ui->iaLayouts->setHoverIconColumn(8, action, action_hover); } @@ -216,6 +217,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, ui->iaBuffers->header()->setSectionResizeMode(5, QHeaderView::ResizeToContents); ui->iaBuffers->setClearSelectionOnFocusLoss(true); + ui->iaBuffers->setInstantTooltips(true); ui->iaBuffers->setHoverIconColumn(5, action, action_hover); } @@ -241,6 +243,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, res->setHoverIconColumn(10, action, action_hover); res->setClearSelectionOnFocusLoss(true); + res->setInstantTooltips(true); } for(RDTreeWidget *uav : uavs) @@ -265,6 +268,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, uav->setHoverIconColumn(10, action, action_hover); uav->setClearSelectionOnFocusLoss(true); + uav->setInstantTooltips(true); } for(RDTreeWidget *samp : samplers) @@ -283,6 +287,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, samp->header()->setSectionResizeMode(6, QHeaderView::ResizeToContents); samp->setClearSelectionOnFocusLoss(true); + samp->setInstantTooltips(true); } for(RDTreeWidget *cbuffer : cbuffers) @@ -302,6 +307,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, cbuffer->setHoverIconColumn(6, action, action_hover); cbuffer->setClearSelectionOnFocusLoss(true); + cbuffer->setInstantTooltips(true); } { @@ -317,6 +323,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, ui->viewports->header()->setSectionResizeMode(6, QHeaderView::ResizeToContents); ui->viewports->setClearSelectionOnFocusLoss(true); + ui->viewports->setInstantTooltips(true); } { @@ -329,6 +336,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, ui->scissors->header()->setSectionResizeMode(4, QHeaderView::Stretch); ui->scissors->setClearSelectionOnFocusLoss(true); + ui->scissors->setInstantTooltips(true); } { @@ -347,6 +355,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, ui->targetOutputs->setHoverIconColumn(8, action, action_hover); ui->targetOutputs->setClearSelectionOnFocusLoss(true); + ui->targetOutputs->setInstantTooltips(true); } { @@ -364,6 +373,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, ui->blends->header()->setSectionResizeMode(8, QHeaderView::ResizeToContents); ui->blends->setClearSelectionOnFocusLoss(true); + ui->blends->setInstantTooltips(true); } { @@ -377,6 +387,7 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx, ui->stencils->header()->setSectionResizeMode(4, QHeaderView::Stretch); ui->stencils->setClearSelectionOnFocusLoss(true); + ui->stencils->setInstantTooltips(true); } // this is often changed just because we're changing some tab in the designer. diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index 61b5ec9f7..56d860137 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -176,6 +176,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->viAttrs->header()->setSectionResizeMode(6, QHeaderView::ResizeToContents); ui->viAttrs->setClearSelectionOnFocusLoss(true); + ui->viAttrs->setInstantTooltips(true); ui->viAttrs->setHoverIconColumn(6, action, action_hover); } @@ -192,6 +193,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->viBuffers->header()->setSectionResizeMode(6, QHeaderView::ResizeToContents); ui->viBuffers->setClearSelectionOnFocusLoss(true); + ui->viBuffers->setInstantTooltips(true); ui->viBuffers->setHoverIconColumn(6, action, action_hover); } @@ -212,6 +214,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState tex->setHoverIconColumn(8, action, action_hover); tex->setClearSelectionOnFocusLoss(true); + tex->setInstantTooltips(true); } for(RDTreeWidget *samp : samplers) @@ -225,6 +228,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState samp->header()->setSectionResizeMode(4, QHeaderView::ResizeToContents); samp->setClearSelectionOnFocusLoss(true); + samp->setInstantTooltips(true); } for(RDTreeWidget *ubo : ubos) @@ -239,6 +243,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ubo->setHoverIconColumn(4, action, action_hover); ubo->setClearSelectionOnFocusLoss(true); + ubo->setInstantTooltips(true); } for(RDTreeWidget *sub : subroutines) @@ -249,6 +254,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState sub->header()->setSectionResizeMode(1, QHeaderView::Stretch); sub->setClearSelectionOnFocusLoss(true); + sub->setInstantTooltips(true); } for(RDTreeWidget *ubo : readwrites) @@ -266,6 +272,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ubo->setHoverIconColumn(6, action, action_hover); ubo->setClearSelectionOnFocusLoss(true); + ubo->setInstantTooltips(true); } { @@ -281,6 +288,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->viewports->header()->setSectionResizeMode(6, QHeaderView::ResizeToContents); ui->viewports->setClearSelectionOnFocusLoss(true); + ui->viewports->setInstantTooltips(true); } { @@ -295,6 +303,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->scissors->header()->setSectionResizeMode(5, QHeaderView::ResizeToContents); ui->scissors->setClearSelectionOnFocusLoss(true); + ui->scissors->setInstantTooltips(true); } { @@ -312,6 +321,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->framebuffer->setHoverIconColumn(8, action, action_hover); ui->framebuffer->setClearSelectionOnFocusLoss(true); + ui->framebuffer->setInstantTooltips(true); } { @@ -329,6 +339,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->blends->header()->setSectionResizeMode(8, QHeaderView::ResizeToContents); ui->blends->setClearSelectionOnFocusLoss(true); + ui->blends->setInstantTooltips(true); } { @@ -345,6 +356,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->stencils->header()->setSectionResizeMode(7, QHeaderView::Stretch); ui->stencils->setClearSelectionOnFocusLoss(true); + ui->stencils->setInstantTooltips(true); } // this is often changed just because we're changing some tab in the designer. diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 0ef17f89b..653a93005 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -177,6 +177,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ui->viAttrs->setHoverIconColumn(6, action, action_hover); ui->viAttrs->setClearSelectionOnFocusLoss(true); + ui->viAttrs->setInstantTooltips(true); } { @@ -193,6 +194,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ui->viBuffers->setHoverIconColumn(6, action, action_hover); ui->viBuffers->setClearSelectionOnFocusLoss(true); + ui->viBuffers->setInstantTooltips(true); } for(RDTreeWidget *res : resources) @@ -211,6 +213,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, res->setHoverIconColumn(7, action, action_hover); res->setClearSelectionOnFocusLoss(true); + res->setInstantTooltips(true); } for(RDTreeWidget *ubo : ubos) @@ -228,6 +231,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ubo->setHoverIconColumn(6, action, action_hover); ubo->setClearSelectionOnFocusLoss(true); + ubo->setInstantTooltips(true); } { @@ -243,6 +247,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ui->viewports->header()->setSectionResizeMode(6, QHeaderView::ResizeToContents); ui->viewports->setClearSelectionOnFocusLoss(true); + ui->viewports->setInstantTooltips(true); } { @@ -255,6 +260,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ui->scissors->header()->setSectionResizeMode(4, QHeaderView::ResizeToContents); ui->scissors->setClearSelectionOnFocusLoss(true); + ui->scissors->setInstantTooltips(true); } { @@ -272,6 +278,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ui->framebuffer->setHoverIconColumn(8, action, action_hover); ui->framebuffer->setClearSelectionOnFocusLoss(true); + ui->framebuffer->setInstantTooltips(true); } { @@ -289,6 +296,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ui->blends->header()->setSectionResizeMode(8, QHeaderView::ResizeToContents); ui->blends->setClearSelectionOnFocusLoss(true); + ui->blends->setInstantTooltips(true); } { @@ -305,6 +313,7 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, ui->stencils->header()->setSectionResizeMode(7, QHeaderView::Stretch); ui->stencils->setClearSelectionOnFocusLoss(true); + ui->stencils->setInstantTooltips(true); } // this is often changed just because we're changing some tab in the designer.