diff --git a/qrenderdoc/Code/Resources.h b/qrenderdoc/Code/Resources.h index d6581e52d..de4ea9cc2 100644 --- a/qrenderdoc/Code/Resources.h +++ b/qrenderdoc/Code/Resources.h @@ -57,6 +57,7 @@ RESOURCE_DEF(del, "del.png") \ RESOURCE_DEF(disconnect, "disconnect.png") \ RESOURCE_DEF(find, "find.png") \ + RESOURCE_DEF(filter, "filter.png") \ RESOURCE_DEF(arrow_out, "arrow_out.png") \ RESOURCE_DEF(flag_green, "flag_green.png") \ RESOURCE_DEF(flip_y, "flip_y.png") \ diff --git a/qrenderdoc/Resources/filter.png b/qrenderdoc/Resources/filter.png new file mode 100644 index 000000000..227e8436c Binary files /dev/null and b/qrenderdoc/Resources/filter.png differ diff --git a/qrenderdoc/Resources/filter@2x.png b/qrenderdoc/Resources/filter@2x.png new file mode 100644 index 000000000..dc486c440 Binary files /dev/null and b/qrenderdoc/Resources/filter@2x.png differ diff --git a/qrenderdoc/Resources/resources.qrc b/qrenderdoc/Resources/resources.qrc index 2db980e03..6f25bef4e 100644 --- a/qrenderdoc/Resources/resources.qrc +++ b/qrenderdoc/Resources/resources.qrc @@ -71,6 +71,8 @@ del@2x.png disconnect.png disconnect@2x.png + filter.png + filter@2x.png find.png find@2x.png flag_green.png diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index 8155a2d46..0f1e5d8c5 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -863,6 +863,7 @@ private: struct EventFilterModel : public QSortFilterProxyModel { EventFilterModel(ICaptureContext &ctx) : m_Ctx(ctx) {} + void ParseExpression(QString expr) { qInfo() << expr; } protected: virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override { @@ -979,13 +980,20 @@ EventBrowser::EventBrowser(ICaptureContext &ctx, QWidget *parent) m_FindHighlight->setSingleShot(true); connect(m_FindHighlight, &QTimer::timeout, this, &EventBrowser::findHighlight_timeout); + m_FilterTimeout = new QTimer(this); + m_FilterTimeout->setInterval(1200); + m_FilterTimeout->setSingleShot(true); + connect(m_FilterTimeout, &QTimer::timeout, this, &EventBrowser::filter_apply); + QObject::connect(ui->closeFind, &QToolButton::clicked, this, &EventBrowser::on_HideFindJump); QObject::connect(ui->closeJump, &QToolButton::clicked, this, &EventBrowser::on_HideFindJump); + QObject::connect(ui->closeFilter, &QToolButton::clicked, [this]() { ui->filterStrip->hide(); }); QObject::connect(ui->events, &RDTreeView::keyPress, this, &EventBrowser::events_keyPress); QObject::connect(ui->events->selectionModel(), &QItemSelectionModel::currentChanged, this, &EventBrowser::events_currentChanged); ui->jumpStrip->hide(); ui->findStrip->hide(); + ui->filterStrip->hide(); ui->bookmarkStrip->hide(); m_BookmarkStripLayout = new FlowLayout(ui->bookmarkStrip, 0, 3, 3); @@ -1051,6 +1059,7 @@ EventBrowser::EventBrowser(ICaptureContext &ctx, QWidget *parent) } OnCaptureClosed(); + filter_apply(); m_redPalette = palette(); m_redPalette.setColor(QPalette::Base, Qt::red); @@ -1102,6 +1111,7 @@ void EventBrowser::OnCaptureLoaded() repopulateBookmarks(); ui->find->setEnabled(true); + ui->filter->setEnabled(true); ui->gotoEID->setEnabled(true); ui->timeDraws->setEnabled(true); ui->bookmark->setEnabled(true); @@ -1123,6 +1133,7 @@ void EventBrowser::OnCaptureClosed() setPersistData(p); ui->find->setEnabled(false); + ui->filter->setEnabled(false); ui->gotoEID->setEnabled(false); ui->timeDraws->setEnabled(false); ui->bookmark->setEnabled(false); @@ -1147,6 +1158,12 @@ void EventBrowser::on_find_clicked() ui->findEvent->setFocus(); } +void EventBrowser::on_filter_clicked() +{ + ui->filterStrip->show(); + ui->filterExpression->setFocus(); +} + void EventBrowser::on_gotoEID_clicked() { ui->jumpStrip->show(); @@ -1190,6 +1207,9 @@ void EventBrowser::events_currentChanged(const QModelIndex ¤t, const QMode uint32_t selectedEID = GetSelectedEID(current); uint32_t effectiveEID = GetEffectiveEID(current); + if(selectedEID == m_Ctx.CurSelectedEvent() && effectiveEID == m_Ctx.CurEvent()) + return; + m_Ctx.SetEventID({this}, selectedEID, effectiveEID); m_Model->RefreshCache(); @@ -1239,6 +1259,19 @@ void EventBrowser::findHighlight_timeout() updateFindResultsAvailable(); } +void EventBrowser::filter_apply() +{ + // unselect everything while applying the filter, to avoid updating the source model while the + // filter is processing if the current event is no longer selected + uint32_t curSelEvent = m_Ctx.CurSelectedEvent(); + ui->events->clearSelection(); + ui->events->setCurrentIndex(QModelIndex()); + + m_FilterModel->ParseExpression(ui->filterExpression->text()); + + ui->events->setCurrentIndex(m_FilterModel->mapFromSource(m_Model->GetIndexForEID(curSelEvent))); +} + void EventBrowser::on_findEvent_textEdited(const QString &arg1) { if(arg1.isEmpty()) @@ -1254,6 +1287,29 @@ void EventBrowser::on_findEvent_textEdited(const QString &arg1) } } +void EventBrowser::on_filterExpression_returnPressed() +{ + // stop the timer, we'll manually fire it instantly + if(m_FilterTimeout->isActive()) + m_FilterTimeout->stop(); + + filter_apply(); +} + +void EventBrowser::on_filterExpression_textEdited(const QString &text) +{ + if(text.isEmpty()) + { + m_FilterTimeout->stop(); + + filter_apply(); + } + else + { + m_FilterTimeout->start(); // restart + } +} + void EventBrowser::on_findEvent_returnPressed() { // stop the timer, we'll manually fire it instantly @@ -1552,6 +1608,11 @@ void EventBrowser::events_keyPress(QKeyEvent *event) on_gotoEID_clicked(); event->accept(); } + else if(event->key() == Qt::Key_L) + { + on_filter_clicked(); + event->accept(); + } else if(event->key() == Qt::Key_B) { on_bookmark_clicked(); diff --git a/qrenderdoc/Windows/EventBrowser.h b/qrenderdoc/Windows/EventBrowser.h index b783c7e2c..12801049a 100644 --- a/qrenderdoc/Windows/EventBrowser.h +++ b/qrenderdoc/Windows/EventBrowser.h @@ -73,6 +73,7 @@ public: private slots: // automatic slots void on_find_clicked(); + void on_filter_clicked(); void on_gotoEID_clicked(); void on_timeDraws_clicked(); void on_bookmark_clicked(); @@ -81,6 +82,8 @@ private slots: void on_findEvent_returnPressed(); void on_findEvent_keyPress(QKeyEvent *event); void on_findEvent_textEdited(const QString &arg1); + void on_filterExpression_returnPressed(); + void on_filterExpression_textEdited(const QString &text); void on_findNext_clicked(); void on_findPrev_clicked(); void on_stepNext_clicked(); @@ -90,6 +93,7 @@ private slots: // manual slots void findHighlight_timeout(); + void filter_apply(); void events_keyPress(QKeyEvent *event); void events_contextMenu(const QPoint &pos); void events_currentChanged(const QModelIndex ¤t, const QModelIndex &previous); @@ -125,7 +129,7 @@ private: TimeUnit m_TimeUnit = TimeUnit::Count; - QTimer *m_FindHighlight; + QTimer *m_FindHighlight, *m_FilterTimeout; FlowLayout *m_BookmarkStripLayout; QSpacerItem *m_BookmarkSpacer; diff --git a/qrenderdoc/Windows/EventBrowser.ui b/qrenderdoc/Windows/EventBrowser.ui index b1d1f378f..fdc7d7c82 100644 --- a/qrenderdoc/Windows/EventBrowser.ui +++ b/qrenderdoc/Windows/EventBrowser.ui @@ -112,6 +112,20 @@ + + + + Show event filter + + + + :/filter.png:/filter.png + + + true + + + @@ -398,6 +412,76 @@ + + + + + 3 + + + 6 + + + 0 + + + 6 + + + 0 + + + + + + + + :/filter.png + + + + + + + Filter + + + Qt::PlainText + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 0 + + + + + + + + 0 + 20 + + + + + + + + + + + + :/cross.png:/cross.png + + + true + + + + +