diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 344b5a305d3..07150b3d00a 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -957,6 +957,10 @@ public: bool m_autoApplyOnEditingFinished = false; bool m_validatePlaceHolder = false; + FilePath m_rightSideIconPath; + int m_minimumHeight = 0; + QPointer m_completer; + UndoableValue undoable; }; @@ -1205,6 +1209,20 @@ void StringAspect::addToLayoutImpl(Layout &parent) auto lineEditDisplay = createSubWidget(); addMacroExpansion(lineEditDisplay); lineEditDisplay->setPlaceholderText(d->m_placeHolderText); + lineEditDisplay->setMinimumHeight(d->m_minimumHeight); + + if (d->m_completer) + lineEditDisplay->setSpecialCompleter(d->m_completer); + + if (!d->m_rightSideIconPath.isEmpty()) { + QIcon icon(d->m_rightSideIconPath.toFSPathString()); + QTC_CHECK(!icon.isNull()); + lineEditDisplay->setButtonIcon(FancyLineEdit::Right, icon); + lineEditDisplay->setButtonVisible(FancyLineEdit::Right, true); + connect(lineEditDisplay, &FancyLineEdit::rightButtonClicked, + this, &StringAspect::rightSideIconClicked); + } + if (!d->m_historyCompleterKey.isEmpty()) lineEditDisplay->setHistoryCompleter(d->m_historyCompleterKey); @@ -1418,6 +1436,27 @@ void StringAspect::setChecked(bool checked) return d->m_checkerImpl.setChecked(checked); } +void StringAspect::addOnRightSideIconClicked(QObject *guard, + const std::function &callback) +{ + connect(this, &StringAspect::rightSideIconClicked, guard, callback); +} + +void StringAspect::setMinimumHeight(int height) +{ + d->m_minimumHeight = height; +} + +void StringAspect::setCompleter(QCompleter *completer) +{ + d->m_completer = completer; +} + +void StringAspect::setRightSideIconPath(const FilePath &path) +{ + d->m_rightSideIconPath = path; +} + /*! \class Utils::FilePathAspect diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index 4391a4f0b59..f1c59c908b2 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -633,6 +633,11 @@ public: bool isChecked() const; void setChecked(bool checked); + void setRightSideIconPath(const FilePath &path); + void addOnRightSideIconClicked(QObject *guard, const std::function &); + void setMinimumHeight(int); + void setCompleter(QCompleter *completer); + enum DisplayStyle { LabelDisplay, LineEditDisplay, @@ -652,6 +657,7 @@ signals: void acceptRichTextChanged(bool acceptRichText); void validationFunctionChanged(const FancyLineEdit::ValidationFunction &validator); void placeholderTextChanged(const QString &placeholderText); + void rightSideIconClicked(); protected: void addToLayoutImpl(Layouting::Layout &parent) override; diff --git a/src/libs/utils/layoutbuilder.cpp b/src/libs/utils/layoutbuilder.cpp index b0306f53353..0ae96b90799 100644 --- a/src/libs/utils/layoutbuilder.cpp +++ b/src/libs/utils/layoutbuilder.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -897,6 +898,11 @@ void PushButton::setIconPath(const Utils::FilePath &iconPath) access(this)->setIcon(icon.icon()); } +void PushButton::setIconSize(const QSize &size) +{ + access(this)->setIconSize(size); +} + void PushButton::setFlat(bool flat) { access(this)->setFlat(flat); diff --git a/src/libs/utils/layoutbuilder.h b/src/libs/utils/layoutbuilder.h index dcd87016408..cbe29b55d02 100644 --- a/src/libs/utils/layoutbuilder.h +++ b/src/libs/utils/layoutbuilder.h @@ -28,6 +28,7 @@ class QLabel; class QLayout; class QObject; class QPushButton; +class QSize; class QSpinBox; class QSplitter; class QStackedWidget; @@ -295,6 +296,7 @@ public: void setText(const QString &); void setIconPath(const Utils::FilePath &); + void setIconSize(const QSize &); void setFlat(bool); void onClicked(const std::function &, QObject *guard); }; diff --git a/src/plugins/lua/bindings/gui.cpp b/src/plugins/lua/bindings/gui.cpp index c021c60924b..ca26c77d8d5 100644 --- a/src/plugins/lua/bindings/gui.cpp +++ b/src/plugins/lua/bindings/gui.cpp @@ -106,6 +106,7 @@ HAS_MEM_FUNC(setAutoFillBackground, hasSetAutoFillBackground); HAS_MEM_FUNC(setIconPath, hasSetIconPath); HAS_MEM_FUNC(setFlat, hasSetFlat); HAS_MEM_FUNC(setOpenExternalLinks, hasSetOpenExternalLinks); +HAS_MEM_FUNC(setIconSize, hasSetIconSize); template void setProperties(std::unique_ptr &item, const sol::table &children, QObject *guard) { @@ -121,6 +122,12 @@ void setProperties(std::unique_ptr &item, const sol::table &children, QObject item->setIconPath(*iconPath); } + if constexpr (hasSetIconSize::value) { + const auto iconSize = children.get>("iconSize"); + if (iconSize) + item->setIconSize(*iconSize); + } + if constexpr (hasSetWindowFlags::value) { sol::optional windowFlags = children.get>( "windowFlags"); diff --git a/src/plugins/lua/bindings/settings.cpp b/src/plugins/lua/bindings/settings.cpp index 64ecd1e8dc0..4c63dfad41c 100644 --- a/src/plugins/lua/bindings/settings.cpp +++ b/src/plugins/lua/bindings/settings.cpp @@ -164,6 +164,17 @@ void typedAspectCreate(StringAspect *aspect, const std::string &key, const sol:: aspect->setAutoApplyOnEditingFinished(value.as()); else if (key == "elideMode") aspect->setElideMode((Qt::TextElideMode) value.as()); + else if (key == "rightSideIconPath") + aspect->setRightSideIconPath(value.as()); + else if (key == "minimumHeight") + aspect->setMinimumHeight(value.as()); + else if (key == "completer") + aspect->setCompleter(value.as()); + else if (key == "addOnRightSideIconClicked") { + aspect->addOnRightSideIconClicked(aspect, [func = value.as()]() { + void_safe_call(func); + }); + } else typedAspectCreate(static_cast *>(aspect), key, value); } diff --git a/src/plugins/lua/meta/settings.lua b/src/plugins/lua/meta/settings.lua index 1c8175d2932..748a55e0c2a 100644 --- a/src/plugins/lua/meta/settings.lua +++ b/src/plugins/lua/meta/settings.lua @@ -126,6 +126,9 @@ settings.StringDisplayStyle = { ---@field acceptRichText? boolean ---@field autoApplyOnEditingFinished? boolean ---@field elideMode? Qt.TextElideMode The elide mode of the aspect. +---@field rightSideIconPath? string Path to the icon +---@field minimumHeight? int +---@field completer QCompleter? A QCompleter object. StringAspectCreate = {} ---@class StringAspect : TypedAspect