From 85954dabbf2868514aaf63271d1f1759042d5776 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 24 Feb 2021 16:19:30 +0000 Subject: [PATCH] Add simple stubbed UI for entering filter expressions --- qrenderdoc/Code/Resources.h | 1 + qrenderdoc/Resources/filter.png | Bin 0 -> 800 bytes qrenderdoc/Resources/filter@2x.png | Bin 0 -> 1642 bytes qrenderdoc/Resources/resources.qrc | 2 + qrenderdoc/Windows/EventBrowser.cpp | 61 ++++++++++++++++++++ qrenderdoc/Windows/EventBrowser.h | 6 +- qrenderdoc/Windows/EventBrowser.ui | 84 ++++++++++++++++++++++++++++ 7 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 qrenderdoc/Resources/filter.png create mode 100644 qrenderdoc/Resources/filter@2x.png 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 0000000000000000000000000000000000000000..227e8436ca33decf6c36bd3efc520756bb4ce98c GIT binary patch literal 800 zcmV+*1K<3KP)VHkeS{&auNEkzQW zq9q7IS_E}B{7cLNFUn@rT`}{bo9;@=ixjo4>r#lID1xA}%^aG}U`Z6@!XXY(t8LlY zIor!Hg-jw z-gC3wJ7;~XrpCI;s*0NOB0bnFL4ii;BJz-B0)|>SS!qF-74Y2c_xSJkxY`CiA@$*w zD`@Dt9`oF4_ib2@)s@>TYD&xn$jZu1kj<;3X6@EOuzU&=)AOFW(H>Xp@MK6u#q&*M z7zStVPlevxbhsGi*`wC>mNu)^M61w3(#cTM^^JHEA7|%1v%^jo6%1hus_lUy()nOI zG&9ugdhebb4=k;tK&Pd?B}5`D{67Eq%+SSM$vXlJv!jw1`7n5)@9XCUT&ve%X)S`l z!V;ziyZbsuy}ObXXq1z=7{8gnHAx#AN@qm`=(Jj`rY}FMPnQC_j|KR8Nx ee80uN0t^6@FjF1moG}Xk0000jFOf~ zTd2@L`4MnQi~VCQ-EK>}J3Bi+*K_a8mTjT1Z9;GM?A)2Td(L;x`Odj_8Rr~~F%%58 z^^-%}I8*Crx(14}hI1BU3ag=|cOFcB{NeFF#`p+0k282zJli^CeDV58dNV}}3jiov zKl=4$greWY%EFb^u_$U{rKqkbMM+3StW-xV8YZ0_9{pZw@I1N?w6VN02KqpuuT6%#K1@zgQF%!)42q!iT7GQf2~Pq(E=c07A`xu>xH!_i)c7AFotBthH*ZD zkftFqVZ(ufu&yH%(&(9va7c&-m8r~P8)y1cNM~(~n*Cc^7DK+}h>V(|JfhHh9m z-8&*ZzM3>)k|!Sd0*TQK-rc%t3U9SS26M?R4`Zf>ix%aPyijGB34}@j9G5&L zv0XTBFn7e*e!hME#A3@flb-&1}QpA5GE zq|qcVJ|`6Ds^G{?(E|~wU@|CNR*g=nD=hnb1h_kqG=A*3R{zyYEAiq=4Od283}rn0 zmvKRS!Z>~99O3|xE=k@L_5`6%DG*6U;)IB1jv_N*+SuK&N=EU^!+%2`Pa64tknaQK zG+*`9`}_CRKHX6N&XyHeMn%%vXQ5_+Pw|Qp1tu9zlR}fylg^Q1%f)!sA<5we85yIx zw``FHQI0Mwv5sW><_BaN_x*7hdTPLE`{wOkq_l@*JP$xbVj;#D&&oqv=#1DO2(2VjVeGUvm3-KR z=c+FcE-EE@Go1M6I+9l|lJV^`8ZWGZ+ik9ba}|P^n|2@Av;LW9>z}BtBGnveQDU;u z_ z&40ESt*7x^4INM@A!C^=HpV=h>b#6|?QJcyG4A)^yPmVAaAFb3hRq)z=Ho8spB*3L z+kc7k-jOt~`}BxVv>{ld7OPZ4@gpCJh#>6^8$NmIlgv1IA`cbq`7BZ}9fTzs4YmDX zhZN^OTW&(~-7JjH1;FHw#+_hqCrO#kOr?Bp0Ej{7)XD8voPOCH^~@~-yJ0b%QS6pg!F4=1=cVQgK)#cTzgQ(f oWYXf;I6F!gzZcw-@xK5A02AOnNFlAraR2}S07*qoM6N<$g4pH&>;M1& literal 0 HcmV?d00001 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 + + + + +