From 58eb49ce5b7a04624be5ef98db1aa49b9edc2c25 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 23 Jan 2026 14:14:31 +0000 Subject: [PATCH] Expand RDTreeWidget to allow per-item go column * This lets us use the existing logic for hovering columns, to get things like the hand cursor, while still only showing it for resource entries. --- qrenderdoc/Widgets/AnnotationDisplay.cpp | 27 +++++--------------- qrenderdoc/Widgets/AnnotationDisplay.h | 4 --- qrenderdoc/Widgets/Extended/RDTreeWidget.cpp | 18 +++++++++---- qrenderdoc/Widgets/Extended/RDTreeWidget.h | 3 +++ 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/qrenderdoc/Widgets/AnnotationDisplay.cpp b/qrenderdoc/Widgets/AnnotationDisplay.cpp index 6f403fa0e..6b57388bb 100644 --- a/qrenderdoc/Widgets/AnnotationDisplay.cpp +++ b/qrenderdoc/Widgets/AnnotationDisplay.cpp @@ -33,6 +33,8 @@ #include "Code/Resources.h" #include "Extended/RDHeaderView.h" +const int HoverRole = Qt::UserRole; + AnnotationDisplay::AnnotationDisplay(ICaptureContext &ctx, bool standalone, QWidget *parent) : QFrame(parent), m_Ctx(ctx), m_Standalone(standalone) { @@ -63,11 +65,9 @@ AnnotationDisplay::AnnotationDisplay(ICaptureContext &ctx, bool standalone, QWid QObject::connect(m_Tree, &RDTreeWidget::customContextMenu, this, &AnnotationDisplay::customContextMenu); QObject::connect(m_Tree, &RDTreeWidget::itemClicked, this, &AnnotationDisplay::itemClicked); - QObject::connect(m_Tree, &RDTreeWidget::hoverItemChanged, this, - &AnnotationDisplay::hoverItemChanged); - m_Tree->viewport()->setAttribute(Qt::WA_Hover); - m_Tree->setMouseTracking(true); + m_Tree->setHoverIconColumn(2, Icons::action(), Icons::action_hover()); + m_Tree->setHoverRole(HoverRole); if(m_Standalone) m_Ctx.AddCaptureViewer(this); @@ -204,6 +204,8 @@ void AnnotationDisplay::addStructuredChildren(RDTreeWidgetItem *parent, const SD item->setTag(QVariant::fromValue(tag)); + item->setData(2, HoverRole, true); + if(m_HasGoColumn) item->setIcon(2, Icons::action()); } @@ -251,7 +253,6 @@ void AnnotationDisplay::setAnnotationObject(const SDObject *annotation) m_Annotation = annotation; m_Items.clear(); - m_HoveredItem = NULL; m_Tree->invisibleRootItem()->clear(); // Check if we have any buffer annotations to determine columns @@ -360,19 +361,3 @@ void AnnotationDisplay::itemClicked(RDTreeWidgetItem *item, int column) }); } } - -void AnnotationDisplay::hoverItemChanged(RDTreeWidgetItem *item) -{ - // Restore normal icon for previously hovered resource item with a Go button - if(m_HoveredItem) - { - m_HoveredItem->setIcon(2, Icons::action()); - } - - // Set hover icon for newly hovered resource item, if it has a valid tag - if(item && item->tag().canConvert() && m_HasGoColumn) - { - m_HoveredItem = item; - m_HoveredItem->setIcon(2, Icons::action_hover()); - } -} diff --git a/qrenderdoc/Widgets/AnnotationDisplay.h b/qrenderdoc/Widgets/AnnotationDisplay.h index 9c6381523..8f7eaa7c8 100644 --- a/qrenderdoc/Widgets/AnnotationDisplay.h +++ b/qrenderdoc/Widgets/AnnotationDisplay.h @@ -67,7 +67,6 @@ public: private slots: void customContextMenu(QModelIndex index, QMenu *menu); void itemClicked(RDTreeWidgetItem *item, int column); - void hoverItemChanged(RDTreeWidgetItem *item); protected: @@ -85,9 +84,6 @@ private: // whether the Go column is present bool m_HasGoColumn = false; - // track hovered item for icon changes - RDTreeWidgetItem *m_HoveredItem = NULL; - QMap m_Items; void addStructuredChildren(RDTreeWidgetItem *parent, const SDObject &parentObj); diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp index a7e85f4e5..7266a9f6a 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp @@ -193,7 +193,8 @@ public: } else if(role == Qt::DecorationRole) { - if(widget->m_hoverColumn == index.column()) + if(widget->m_hoverColumn == index.column() && + (widget->m_hoverRole < 0 || item->data(widget->m_hoverColumn, widget->m_hoverRole).toBool())) { if(itemForIndex(widget->m_currentHoverIndex) == item) return widget->m_activeHoverIcon; @@ -803,12 +804,19 @@ void RDTreeWidget::mouseMoveEvent(QMouseEvent *e) RDTreeWidgetItem *newHover = m_model->itemForIndex(m_currentHoverIndex); - if(m_currentHoverIndex.column() == m_hoverColumn && m_hoverHandCursor) + if(m_hoverRole < 0 || newHover->data(m_hoverColumn, m_hoverRole).toBool()) { - setCursor(QCursor(Qt::PointingHandCursor)); + if(m_currentHoverIndex.column() == m_hoverColumn && m_hoverHandCursor) + { + setCursor(QCursor(Qt::PointingHandCursor)); + } + else if(oldHoverIndex.column() == m_hoverColumn && + m_currentHoverIndex.column() != m_hoverColumn && m_hoverHandCursor) + { + unsetCursor(); + } } - else if(oldHoverIndex.column() == m_hoverColumn && - m_currentHoverIndex.column() != m_hoverColumn && m_hoverHandCursor) + else { unsetCursor(); } diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.h b/qrenderdoc/Widgets/Extended/RDTreeWidget.h index 091814f59..4a4c2acb0 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.h +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.h @@ -233,7 +233,9 @@ public: m_activeHoverIcon = hover; m_hoverHandCursor = true; m_activateOnClick = true; + m_hoverRole = -1; } + void setHoverRole(int role) { m_hoverRole = role; } void setHoverHandCursor(bool hand) { m_hoverHandCursor = hand; } void setHoverClickActivate(bool click) { m_activateOnClick = click; } void setClearSelectionOnFocusLoss(bool clear) { m_clearSelectionOnFocusLoss = clear; } @@ -327,6 +329,7 @@ private: QVector m_alignments; int m_hoverColumn = -1; + int m_hoverRole = -1; QIcon m_normalHoverIcon; QIcon m_activeHoverIcon; bool m_hoverHandCursor = false;