From fe81f573162e573975993f9933ec960a2e57fc7d Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 14 Jun 2021 14:32:21 +0100 Subject: [PATCH] Remove recent filters button in favour of styling a fake combo box * The filter icon was confusing since it had a 'refresh' badge instead of 'save/load/recent' type badge, and making the latter readable in a few pixels is not feasible. Having the combo dropdown with saved filters is as intuitive and works in-line. --- qrenderdoc/Styles/RDStyle/RDStyle.cpp | 19 ++++- .../RDTweakedNativeStyle.cpp | 5 ++ qrenderdoc/Widgets/Extended/RDTextEdit.cpp | 72 +++++++++++++++++++ qrenderdoc/Widgets/Extended/RDTextEdit.h | 24 +++++++ qrenderdoc/Windows/EventBrowser.cpp | 11 ++- qrenderdoc/Windows/EventBrowser.ui | 17 ----- 6 files changed, 121 insertions(+), 27 deletions(-) diff --git a/qrenderdoc/Styles/RDStyle/RDStyle.cpp b/qrenderdoc/Styles/RDStyle/RDStyle.cpp index 40fe60b96..0dc66530a 100644 --- a/qrenderdoc/Styles/RDStyle/RDStyle.cpp +++ b/qrenderdoc/Styles/RDStyle/RDStyle.cpp @@ -504,8 +504,13 @@ QRect RDStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, if(sc == QStyle::SC_ComboBoxFrame || sc == QStyle::SC_ComboBoxListBoxPopup) return rect; - rect.adjust(Constants::ComboMargin, Constants::ComboMargin, -Constants::ComboMargin, - -Constants::ComboMargin); + const QStyleOptionComboBox *combo = qstyleoption_cast(opt); + + if(combo->subControls & QStyle::SC_ComboBoxFrame) + { + rect.adjust(Constants::ComboMargin, Constants::ComboMargin, -Constants::ComboMargin, + -Constants::ComboMargin); + } if(sc == QStyle::SC_ComboBoxEditField) return rect.adjusted(0, 0, -Constants::ComboArrowDim, 0); @@ -1138,10 +1143,18 @@ void RDStyle::drawComplexControl(ComplexControl control, const QStyleOptionCompl } else if(control == QStyle::CC_ComboBox) { - drawRoundedRectBorder(opt, p, widget, QPalette::Base, false); + const QStyleOptionComboBox *combo = qstyleoption_cast(opt); + + if(combo->subControls & QStyle::SC_ComboBoxFrame) + { + drawRoundedRectBorder(opt, p, widget, QPalette::Base, false); + } QRectF rect = proxy()->subControlRect(control, opt, QStyle::SC_ComboBoxArrow, widget); + if(!(combo->subControls & QStyle::SC_ComboBoxFrame)) + p->fillRect(rect, opt->palette.brush(QPalette::Base)); + p->save(); p->setRenderHint(QPainter::Antialiasing); diff --git a/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp b/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp index 9adab3bb7..3132e74f6 100644 --- a/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp +++ b/qrenderdoc/Styles/RDTweakedNativeStyle/RDTweakedNativeStyle.cpp @@ -405,6 +405,11 @@ void RDTweakedNativeStyle::drawControl(ControlElement control, const QStyleOptio const QStyleOptionToolButton *toolopt = qstyleoption_cast(opt); + if((toolopt->features & QStyleOptionToolButton::Arrow) && toolopt->arrowType != Qt::NoArrow) + { + return QProxyStyle::drawControl(control, opt, p, widget); + } + QRect rect = toolopt->rect; // even though our style doesn't shift the button contents, this is the tweaked native style so diff --git a/qrenderdoc/Widgets/Extended/RDTextEdit.cpp b/qrenderdoc/Widgets/Extended/RDTextEdit.cpp index 98bbd5425..bb30544dd 100644 --- a/qrenderdoc/Widgets/Extended/RDTextEdit.cpp +++ b/qrenderdoc/Widgets/Extended/RDTextEdit.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include "Code/QRDUtils.h" @@ -80,6 +81,28 @@ void RDTextEdit::setSingleLine() }); } +void RDTextEdit::setDropDown() +{ + if(m_Drop) + return; + + m_Drop = new RDTextEditDropDownButton(this); + m_Drop->setToolButtonStyle(Qt::ToolButtonIconOnly); + m_Drop->setArrowType(Qt::DownArrow); + QObject::connect(m_Drop, &QToolButton::clicked, [this]() { emit(dropDownClicked()); }); + + QStyleOptionComboBox opt; + opt.rect = rect(); + QRect r = style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, this); + + setViewportMargins(0, 0, r.width(), 0); + setMinimumHeight(r.height() + 2); + + m_Drop->setFixedSize(r.size()); + + updateDropButtonGeometry(); +} + void RDTextEdit::setHoverTrack() { setAttribute(Qt::WA_Hover); @@ -348,6 +371,24 @@ void RDTextEdit::mouseMoveEvent(QMouseEvent *e) QTextEdit::mouseMoveEvent(e); } +void RDTextEdit::resizeEvent(QResizeEvent *e) +{ + updateDropButtonGeometry(); + + QTextEdit::resizeEvent(e); +} + +void RDTextEdit::updateDropButtonGeometry() +{ + if(m_Drop) + { + QRect r = contentsRect(); + r.setLeft(r.right() - m_Drop->rect().width() + 1); + r.setSize(m_Drop->size()); + m_Drop->setGeometry(r); + } +} + bool RDTextEdit::event(QEvent *e) { if(e->type() == QEvent::HoverEnter) @@ -360,3 +401,34 @@ bool RDTextEdit::event(QEvent *e) } return QTextEdit::event(e); } + +RDTextEditDropDownButton::RDTextEditDropDownButton(QWidget *parent) : QToolButton(parent) +{ +} + +RDTextEditDropDownButton::~RDTextEditDropDownButton() +{ +} + +void RDTextEditDropDownButton::paintEvent(QPaintEvent *e) +{ + QPainter p(this); + + QStyleOptionToolButton butt; + + initStyleOption(&butt); + + QStyleOptionComboBox opt; + + opt.direction = butt.direction; + opt.rect = butt.rect; + opt.fontMetrics = butt.fontMetrics; + opt.palette = butt.palette; + opt.state = butt.state; + opt.subControls = QStyle::SC_ComboBoxArrow; + opt.activeSubControls = QStyle::SC_ComboBoxArrow; + opt.editable = true; + opt.frame = false; + + style()->drawComplexControl(QStyle::CC_ComboBox, &opt, &p, this); +} diff --git a/qrenderdoc/Widgets/Extended/RDTextEdit.h b/qrenderdoc/Widgets/Extended/RDTextEdit.h index b81eb5d3c..134076437 100644 --- a/qrenderdoc/Widgets/Extended/RDTextEdit.h +++ b/qrenderdoc/Widgets/Extended/RDTextEdit.h @@ -23,11 +23,27 @@ ******************************************************************************/ #pragma once + #include #include +#include class QCompleter; class QStringListModel; +class QToolButton; + +class RDTextEditDropDownButton : public QToolButton +{ +private: + Q_OBJECT + +public: + explicit RDTextEditDropDownButton(QWidget *parent = 0); + ~RDTextEditDropDownButton(); + +protected: + void paintEvent(QPaintEvent *) override; +}; class RDTextEdit : public QTextEdit { @@ -39,11 +55,14 @@ private: QStringListModel *m_CompletionModel = NULL; QString m_WordCharacters; + QToolButton *m_Drop = NULL; + public: explicit RDTextEdit(QWidget *parent = 0); ~RDTextEdit(); void setSingleLine(); + void setDropDown(); void setHoverTrack(); void enableCompletion(); @@ -58,6 +77,7 @@ signals: void leave(); void hoverEnter(); void hoverLeave(); + void dropDownClicked(); void mouseMoved(QMouseEvent *event); void keyPress(QKeyEvent *e); void completionBegin(QString prefix); @@ -70,6 +90,10 @@ protected: void focusOutEvent(QFocusEvent *e); void keyPressEvent(QKeyEvent *e); void mouseMoveEvent(QMouseEvent *event); + void resizeEvent(QResizeEvent *e); + + void updateDropButtonGeometry(); + bool event(QEvent *e); bool eventFilter(QObject *watched, QEvent *event); }; diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index 33a32e8d4..fa76609e6 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -3337,6 +3337,7 @@ EventBrowser::EventBrowser(ICaptureContext &ctx, QWidget *parent) OnCaptureClosed(); ui->filterExpression->setSingleLine(); + ui->filterExpression->setDropDown(); ui->filterExpression->setHoverTrack(); ui->filterExpression->enableCompletion(); ui->filterExpression->setAcceptRichText(false); @@ -3367,7 +3368,7 @@ EventBrowser::EventBrowser(ICaptureContext &ctx, QWidget *parent) QObject::connect(ui->filterExpression, &RDTextEdit::keyPress, this, &EventBrowser::savedFilter_keyPress); - QObject::connect(ui->recentFilters, &QToolButton::clicked, + QObject::connect(ui->filterExpression, &RDTextEdit::dropDownClicked, [this]() { ShowSavedFilterCompleter(ui->filterExpression); }); QObject::connect(ui->filterSettings, &QToolButton::clicked, this, @@ -3588,7 +3589,6 @@ void EventBrowser::CreateFilterDialog() RDLabel *listLabel = new RDLabel(this); RDLabel *filterLabel = new RDLabel(this); CollapseGroupBox *settingsGroup = new CollapseGroupBox(this); - QToolButton *recentFilters = new QToolButton(this); QToolButton *saveFilter = new QToolButton(this); QVBoxLayout *settingsLayout = new QVBoxLayout(); @@ -3650,6 +3650,7 @@ void EventBrowser::CreateFilterDialog() m_FilterSettings.Filter->enableCompletion(); m_FilterSettings.Filter->setAcceptRichText(false); m_FilterSettings.Filter->setSingleLine(); + m_FilterSettings.Filter->setDropDown(); QObject::connect(m_FilterSettings.Filter, &RDTextEdit::keyPress, this, &EventBrowser::filter_forceCompletion_keyPress); @@ -3664,7 +3665,7 @@ void EventBrowser::CreateFilterDialog() QObject::connect(m_FilterSettings.Filter, &RDTextEdit::keyPress, this, &EventBrowser::savedFilter_keyPress); - QObject::connect(recentFilters, &QToolButton::clicked, + QObject::connect(m_FilterSettings.Filter, &RDTextEdit::dropDownClicked, [this]() { ShowSavedFilterCompleter(m_FilterSettings.Filter); }); QObject::connect(saveFilter, &QToolButton::clicked, [this]() { @@ -3806,9 +3807,6 @@ void EventBrowser::CreateFilterDialog() dialog->deleteLater(); }); - recentFilters->setAutoRaise(true); - recentFilters->setIcon(Icons::filter_reapply()); - recentFilters->setToolTip(tr("Load saved filters")); saveFilter->setAutoRaise(true); saveFilter->setIcon(Icons::save()); saveFilter->setText(tr("Save")); @@ -3947,7 +3945,6 @@ For searching arbitrary parameters consider using the $param() function. { filterLayout->addWidget(filterLabel); filterLayout->addWidget(m_FilterSettings.Filter); - filterLayout->addWidget(recentFilters); filterLayout->addWidget(saveFilter); layout->addLayout(filterLayout); diff --git a/qrenderdoc/Windows/EventBrowser.ui b/qrenderdoc/Windows/EventBrowser.ui index e1c46c8b6..a1c78b358 100644 --- a/qrenderdoc/Windows/EventBrowser.ui +++ b/qrenderdoc/Windows/EventBrowser.ui @@ -350,23 +350,6 @@ - - - - Saved filters - - - - - - - :/filter_reapply.png:/filter_reapply.png - - - true - - -