diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp index 00265b2e8..412e35c03 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp @@ -503,6 +503,33 @@ void RDTreeWidget::expandItem(RDTreeWidgetItem *item) expand(m_model->indexForItem(item, 0)); } +void RDTreeWidget::expandAllItems(RDTreeWidgetItem *item) +{ + expandItem(item); + + for(int c = 0; c < item->childCount(); c++) + { + RDTreeWidgetItem *child = item->child(c); + expandAllItems(child); + } +} + +void RDTreeWidget::collapseItem(RDTreeWidgetItem *item) +{ + collapse(m_model->indexForItem(item, 0)); +} + +void RDTreeWidget::collapseAllItems(RDTreeWidgetItem *item) +{ + collapseItem(item); + + for(int c = 0; c < item->childCount(); c++) + { + RDTreeWidgetItem *child = item->child(c); + collapseAllItems(child); + } +} + void RDTreeWidget::scrollToItem(RDTreeWidgetItem *node) { scrollTo(m_model->indexForItem(node, 0)); diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.h b/qrenderdoc/Widgets/Extended/RDTreeWidget.h index 3a3c15bf0..a66733232 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.h +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.h @@ -175,6 +175,9 @@ public: RDTreeWidgetItem *itemAt(const QPoint &p) const; RDTreeWidgetItem *itemAt(int x, int y) const { return itemAt(QPoint(x, y)); } void expandItem(RDTreeWidgetItem *item); + void expandAllItems(RDTreeWidgetItem *item); + void collapseItem(RDTreeWidgetItem *item); + void collapseAllItems(RDTreeWidgetItem *item); void scrollToItem(RDTreeWidgetItem *node); void clear(); diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index c544af312..1c0381b8c 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -24,6 +24,7 @@ #include "EventBrowser.h" #include +#include #include #include #include "3rdparty/flowlayout/FlowLayout.h" @@ -123,6 +124,10 @@ EventBrowser::EventBrowser(ICaptureContext &ctx, QWidget *parent) QObject::connect(sc, &QShortcut::activated, this, &EventBrowser::on_stepNext_clicked); } + ui->events->setContextMenuPolicy(Qt::CustomContextMenu); + QObject::connect(ui->events, &RDTreeWidget::customContextMenuRequested, this, + &EventBrowser::events_contextMenu); + OnLogfileClosed(); } @@ -642,6 +647,39 @@ void EventBrowser::events_keyPress(QKeyEvent *event) } } +void EventBrowser::events_contextMenu(const QPoint &pos) +{ + if(!m_Ctx.LogLoaded()) + return; + + RDTreeWidgetItem *item = ui->events->itemAt(pos); + + if(item) + { + QMenu contextMenu(this); + + QAction expandAll(tr("Expand All"), this); + QAction collapseAll(tr("Collapse All"), this); + + contextMenu.addAction(&expandAll); + contextMenu.addAction(&collapseAll); + + expandAll.setIcon(Icons::fit_window()); + collapseAll.setIcon(Icons::arrow_in()); + + expandAll.setEnabled(item->childCount() > 0); + collapseAll.setEnabled(item->childCount() > 0); + + QObject::connect(&expandAll, &QAction::triggered, + [this, item]() { ui->events->expandAllItems(item); }); + + QObject::connect(&collapseAll, &QAction::triggered, + [this, item]() { ui->events->collapseAllItems(item); }); + + RDDialog::show(&contextMenu, ui->events->viewport()->mapToGlobal(pos)); + } +} + void EventBrowser::clearBookmarks() { for(QToolButton *b : m_BookmarkButtons) diff --git a/qrenderdoc/Windows/EventBrowser.h b/qrenderdoc/Windows/EventBrowser.h index 124170b10..1b3213296 100644 --- a/qrenderdoc/Windows/EventBrowser.h +++ b/qrenderdoc/Windows/EventBrowser.h @@ -81,6 +81,7 @@ private slots: // manual slots void findHighlight_timeout(); void events_keyPress(QKeyEvent *event); + void events_contextMenu(const QPoint &pos); public slots: void clearBookmarks();