diff --git a/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp index 77199017c14..9352052a5ac 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.cpp @@ -28,30 +28,87 @@ #include #include +#include #include #include -#include +#include +#include namespace QmlDesigner { +LineEdit::LineEdit(QWidget *parent) + : QLineEdit(parent) +{ + clearButton = new QToolButton(this); + + const QString fontName = "qtds_propertyIconFont.ttf"; + const int searchIconSize = 16; + const int clearIconSize = 12; + const QColor iconColor(QmlDesigner::Theme::getColor(QmlDesigner::Theme::DSiconColor)); + + const QIcon searchIcon + = Utils::StyleHelper::getIconFromIconFont(fontName, + QmlDesigner::Theme::getIconUnicode( + QmlDesigner::Theme::Icon::search), + searchIconSize, + searchIconSize, + iconColor); + + const QIcon clearIcon + = Utils::StyleHelper::getIconFromIconFont(fontName, + QmlDesigner::Theme::getIconUnicode( + QmlDesigner::Theme::Icon::closeCross), + clearIconSize, + clearIconSize, + iconColor); + + addAction(searchIcon, QLineEdit::LeadingPosition); + + clearButton->setIcon(clearIcon); + clearButton->setIconSize(QSize(clearIconSize, clearIconSize)); + clearButton->setCursor(Qt::ArrowCursor); + clearButton->hide(); + clearButton->setStyleSheet(Theme::replaceCssColors( + QString("QToolButton { border: none; padding: 0px; }" + "QToolButton:hover { background: creatorTheme.DScontrolBackgroundHover; }"))); + + setClearButtonEnabled(false); + + connect(clearButton, &QToolButton::clicked, this, &QLineEdit::clear); + connect(this, &QLineEdit::textChanged, this, &LineEdit::updateClearButton); + + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); + setStyleSheet(QString("QLineEdit { padding-right: %1px; } ") + .arg(clearButton->sizeHint().width() + frameWidth + 8)); + + setFixedHeight(29); +} + +void LineEdit::resizeEvent(QResizeEvent *) +{ + QSize hint = clearButton->sizeHint(); + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); + + clearButton->move(rect().right() - frameWidth - hint.width() - 3, + (rect().bottom() + 1 - hint.height()) / 2); +} + +void LineEdit::updateClearButton(const QString& text) +{ + clearButton->setVisible(!text.isEmpty()); +} + NavigatorSearchWidget::NavigatorSearchWidget(QWidget *parent) : QWidget(parent) { auto layout = new QBoxLayout(QBoxLayout::LeftToRight); + layout->setSpacing(0); + layout->setContentsMargins(5, 5, 5, 3); setLayout(layout); - const QString fontName = "qtds_propertyIconFont.ttf"; - const int iconSize = 15; - const QColor iconColor(QmlDesigner::Theme::getColor(QmlDesigner::Theme::IconsBaseColor)); - const QIcon searchIcon = Utils::StyleHelper::getIconFromIconFont( - fontName, QmlDesigner::Theme::getIconUnicode(QmlDesigner::Theme::Icon::search), - iconSize, iconSize, iconColor); - - m_textField = new QLineEdit; + m_textField = new LineEdit; m_textField->setPlaceholderText(tr("Filter")); m_textField->setFrame(false); - m_textField->setClearButtonEnabled(true); - m_textField->addAction(searchIcon, QLineEdit::LeadingPosition); connect(m_textField, &QLineEdit::textChanged, this, &NavigatorSearchWidget::textChanged); diff --git a/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.h b/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.h index d1c4e0269b6..f96c3202ace 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorsearchwidget.h @@ -27,8 +27,27 @@ #include +class QToolButton; + namespace QmlDesigner { +class LineEdit : public QLineEdit +{ + Q_OBJECT + +public: + LineEdit(QWidget *parent = nullptr); + +protected: + void resizeEvent(QResizeEvent *); + +private slots: + void updateClearButton(const QString &text); + +private: + QToolButton *clearButton; +}; + class NavigatorSearchWidget : public QWidget { Q_OBJECT @@ -42,8 +61,7 @@ signals: void textChanged(const QString &text); private: - - QLineEdit *m_textField; + LineEdit *m_textField; }; } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp index 4929c75bd91..5899ec9dd7b 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp @@ -69,6 +69,10 @@ NavigatorWidget::NavigatorWidget(NavigatorView *view) toolBar->setParent(this); layout->addWidget(toolBar); + m_searchWidget = new NavigatorSearchWidget(); + connect(m_searchWidget, &NavigatorSearchWidget::textChanged, this, &NavigatorWidget::textFilterChanged); + layout->addWidget(m_searchWidget); + layout->addWidget(m_treeView); setLayout(layout); @@ -161,10 +165,6 @@ QToolBar *NavigatorWidget::createToolBar() for (auto toolButton : buttons) toolBar->addWidget(toolButton); - m_searchWidget = new NavigatorSearchWidget(); - connect(m_searchWidget, &NavigatorSearchWidget::textChanged, this, &NavigatorWidget::textFilterChanged); - toolBar->addWidget(m_searchWidget); - return toolBar; }