From 7ca87766253d85979a8fe0e8c7858c6967545269 Mon Sep 17 00:00:00 2001 From: Artur Twardy Date: Tue, 8 Oct 2024 15:49:42 +0200 Subject: [PATCH] Lua: Expose LineEdit type to lua Change-Id: Icd74bd5c9af12bbf737fca29417d011f9c58de81 Reviewed-by: Marcus Tillmanns --- src/libs/utils/layoutbuilder.cpp | 47 +++++++++++++++++++++++++++ src/libs/utils/layoutbuilder.h | 20 ++++++++++++ src/plugins/lua/bindings/gui.cpp | 56 ++++++++++++++++++++++++++++++++ src/plugins/lua/meta/gui.lua | 12 +++++++ 4 files changed, 135 insertions(+) diff --git a/src/libs/utils/layoutbuilder.cpp b/src/libs/utils/layoutbuilder.cpp index 5d2147a3bef..3539e6fd2dd 100644 --- a/src/libs/utils/layoutbuilder.cpp +++ b/src/libs/utils/layoutbuilder.cpp @@ -6,6 +6,7 @@ #include "filepath.h" #include "icon.h" #include "qtcassert.h" +#include "fancylineedit.h" #include #include @@ -1096,6 +1097,52 @@ void addToLayout(Layout *layout, const Stretch &inner) lt->addStretch(inner.stretch); } +LineEdit::LineEdit(std::initializer_list ps) +{ + ptr = new Implementation; + apply(this, ps); +} + +QString LineEdit::text() const +{ + return access(this)->text(); +} + +void LineEdit::setRightSideIconPath(const Utils::FilePath &path) +{ + if (!path.isEmpty()) { + QIcon icon(path.toFSPathString()); + QTC_CHECK(!icon.isNull()); + access(this)->setButtonIcon(Utils::FancyLineEdit::Right, icon); + access(this)->setButtonVisible(Utils::FancyLineEdit::Right, !icon.isNull()); + } +} + +void LineEdit::setPlaceHolderText(const QString &text) +{ + access(this)->setPlaceholderText(text); +} + +void LineEdit::setCompleter(QCompleter *completer) +{ + access(this)->setSpecialCompleter(completer); +} + +void LineEdit::setMinimumHeight(int height) +{ + access(this)->setMinimumHeight(height); +} + +void LineEdit::onReturnPressed(const std::function &func) +{ + QObject::connect(access(this), &Utils::FancyLineEdit::returnPressed, func); +} + +void LineEdit::onRightSideIconClicked(const std::function &func) +{ + QObject::connect(access(this), &Utils::FancyLineEdit::rightButtonClicked, func); +} + // void createItem(LayoutItem *item, QWidget *t) // { // if (auto l = qobject_cast(t)) diff --git a/src/libs/utils/layoutbuilder.h b/src/libs/utils/layoutbuilder.h index b95c68ff04e..515773377fa 100644 --- a/src/libs/utils/layoutbuilder.h +++ b/src/libs/utils/layoutbuilder.h @@ -20,6 +20,7 @@ QT_BEGIN_NAMESPACE class QBoxLayout; +class QCompleter; class QFormLayout; class QGridLayout; class QGroupBox; @@ -41,6 +42,7 @@ QT_END_NAMESPACE namespace Utils { +class FancyLineEdit; class FilePath; } // Utils @@ -322,6 +324,24 @@ public: void setReadOnly(bool); }; +class QTCREATOR_UTILS_EXPORT LineEdit : public Widget +{ +public: + using Implementation = Utils::FancyLineEdit; + using I = Building::BuilderItem; + using Id = Implementation *; + + LineEdit(std::initializer_list ps); + + QString text() const; + void setRightSideIconPath(const Utils::FilePath &path); + void setPlaceHolderText(const QString &text); + void setCompleter(QCompleter *completer); + void setMinimumHeight(int height); + void onReturnPressed(const std::function &); + void onRightSideIconClicked(const std::function &); +}; + class QTCREATOR_UTILS_EXPORT Splitter : public Widget { public: diff --git a/src/plugins/lua/bindings/gui.cpp b/src/plugins/lua/bindings/gui.cpp index ead579cbc9d..f85ea59cc85 100644 --- a/src/plugins/lua/bindings/gui.cpp +++ b/src/plugins/lua/bindings/gui.cpp @@ -107,9 +107,54 @@ HAS_MEM_FUNC(setIconPath, hasSetIconPath); HAS_MEM_FUNC(setFlat, hasSetFlat); HAS_MEM_FUNC(setOpenExternalLinks, hasSetOpenExternalLinks); HAS_MEM_FUNC(setIconSize, hasSetIconSize); +HAS_MEM_FUNC(setRightSideIconPath, hasSetRightSideIconPath); +HAS_MEM_FUNC(setPlaceHolderText, hasSetPlaceHolderText); +HAS_MEM_FUNC(setCompleter, hasSetCompleter); +HAS_MEM_FUNC(setMinimumHeight, hasSetMinimumHeight); +HAS_MEM_FUNC(onReturnPressed, hasOnReturnPressed); +HAS_MEM_FUNC(onRightSideIconClicked, hasOnRightSideIconClicked); + template void setProperties(std::unique_ptr &item, const sol::table &children, QObject *guard) { + if constexpr (hasSetRightSideIconPath::value) { + const auto path = children.get>("rightSideIconPath"); + if (path) + item->setRightSideIconPath(*path); + } + + if constexpr (hasSetPlaceHolderText::value) { + const auto text = children.get>("placeHolderText"); + if (text) + item->setPlaceHolderText(*text); + } + + if constexpr (hasSetCompleter::value) { + const auto completer = children.get("completer"); + if (completer) + item->setCompleter(completer); + } + + if constexpr (hasSetMinimumHeight::value) { + const auto minHeight = children.get>("minimumHeight"); + if (minHeight) + item->setMinimumHeight(*minHeight); + } + + if constexpr (hasOnReturnPressed &)>::value) { + const auto callback = children.get>("onReturnPressed"); + if (callback) + { + item->onReturnPressed([func = *callback]() { void_safe_call(func); }); + } + } + + if constexpr (hasOnRightSideIconClicked &)>::value) { + const auto callback = children.get>("onRightSideIconClicked"); + if (callback) + item->onRightSideIconClicked([func = *callback]() { void_safe_call(func); }); + } + if constexpr (hasSetFlat::value) { const auto flat = children.get>("flat"); if (flat) @@ -467,6 +512,17 @@ void setupGuiModule() sol::base_classes, sol::bases()); + gui.new_usertype( + "LineEdit", + sol::call_constructor, + sol::factories([guard](const sol::table &children) { + return constructWidgetType(children, guard); + }), + "text", + sol::property(&LineEdit::text), + sol::base_classes, + sol::bases()); + gui.new_usertype( "SpinBox", sol::call_constructor, diff --git a/src/plugins/lua/meta/gui.lua b/src/plugins/lua/meta/gui.lua index fc958d7ff39..fc87f11b6f6 100644 --- a/src/plugins/lua/meta/gui.lua +++ b/src/plugins/lua/meta/gui.lua @@ -137,6 +137,18 @@ function textEdit:markdown() end ---@return TextEdit function gui.TextEdit(options) end +---A Single line text edit +---@class LineEdit : Widget +---@field rightSideIconPath? FilePath A path to icon +---@field placeHolderText? string A placeholder text for intput +---@field completer? QCompleter A QCompleter object. +---@field minimumHeight? int Minimum height of input +---@field onReturnPressed? function The function to be called when Enter is pressed +---@field onRightSideIconClicked? function The function to be called when right side icon is clicked +---@field text string Current text + +local lineEdit = {} + ---@class PushButton : Widget local pushButton = {}