From ff322e35bb6449b98fb005af251677b627c1507d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20I=C3=B1igo=20Blasco?= Date: Tue, 14 Apr 2026 01:54:15 +0200 Subject: [PATCH] feat(dialog-sdk): add setButtonIcon for inline SVG on buttons Allow plugins to set an icon on QPushButton widgets from inline SVG data via setButtonIcon(name, svg_string). The host renders the SVG with QSvgRenderer at the button's icon size and applies it as a QIcon. Adds Qt6::SvgWidgets dependency to pj_dialog_engine_qt. --- pj_plugins/dialog_protocol/CMakeLists.txt | 4 ++-- .../include/pj_plugins/host/widget_data_view.hpp | 4 ++++ .../include/pj_plugins/sdk/widget_data.hpp | 7 +++++++ pj_plugins/dialog_protocol/src/widget_binding.cpp | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/pj_plugins/dialog_protocol/CMakeLists.txt b/pj_plugins/dialog_protocol/CMakeLists.txt index b12e8e2e..dc6240d7 100644 --- a/pj_plugins/dialog_protocol/CMakeLists.txt +++ b/pj_plugins/dialog_protocol/CMakeLists.txt @@ -135,7 +135,7 @@ endif() # --- Qt Dialog Engine (optional — requires Qt6) --- if(PJ_BUILD_DIALOG_ENGINE_QT) - find_package(Qt6 REQUIRED COMPONENTS Widgets UiTools Charts) + find_package(Qt6 REQUIRED COMPONENTS Widgets UiTools Charts SvgWidgets) qt_standard_project_setup() # Workaround: Qt 6.5 links AGL framework which was removed in macOS 15+ SDK. @@ -163,7 +163,7 @@ if(PJ_BUILD_DIALOG_ENGINE_QT) ) target_compile_options(pj_dialog_engine_qt PRIVATE ${PJ_WARNING_FLAGS}) target_link_libraries(pj_dialog_engine_qt - PUBLIC pj_dialog_host Qt6::Widgets Qt6::UiTools Qt6::Charts + PUBLIC pj_dialog_host Qt6::Widgets Qt6::UiTools Qt6::Charts Qt6::SvgWidgets ) target_include_directories(pj_dialog_engine_qt PUBLIC include) diff --git a/pj_plugins/dialog_protocol/include/pj_plugins/host/widget_data_view.hpp b/pj_plugins/dialog_protocol/include/pj_plugins/host/widget_data_view.hpp index 0a4d8452..514332b6 100644 --- a/pj_plugins/dialog_protocol/include/pj_plugins/host/widget_data_view.hpp +++ b/pj_plugins/dialog_protocol/include/pj_plugins/host/widget_data_view.hpp @@ -194,6 +194,10 @@ class WidgetDataView { return getString(name, "button_text"); } + [[nodiscard]] std::optional buttonIconSvg(std::string_view name) const { + return getString(name, "button_icon_svg"); + } + [[nodiscard]] std::optional shortcut(std::string_view name) const { return getString(name, "shortcut"); } diff --git a/pj_plugins/dialog_protocol/include/pj_plugins/sdk/widget_data.hpp b/pj_plugins/dialog_protocol/include/pj_plugins/sdk/widget_data.hpp index d791afe1..439375a6 100644 --- a/pj_plugins/dialog_protocol/include/pj_plugins/sdk/widget_data.hpp +++ b/pj_plugins/dialog_protocol/include/pj_plugins/sdk/widget_data.hpp @@ -149,6 +149,13 @@ class WidgetData { return *this; } + /// Set an icon on a QPushButton from inline SVG data. + /// The SVG string is stored as-is and rendered by the host via QSvgRenderer. + WidgetData& setButtonIcon(std::string_view name, std::string_view svg_data) { + entry(name)["button_icon_svg"] = svg_data; + return *this; + } + /// Assign a keyboard shortcut to a QPushButton (e.g. "Ctrl+A", "Ctrl+Shift+A"). /// The host creates a QShortcut that triggers click() on the button. WidgetData& setShortcut(std::string_view name, std::string_view key_sequence) { diff --git a/pj_plugins/dialog_protocol/src/widget_binding.cpp b/pj_plugins/dialog_protocol/src/widget_binding.cpp index 0ac01521..0cbb0588 100644 --- a/pj_plugins/dialog_protocol/src/widget_binding.cpp +++ b/pj_plugins/dialog_protocol/src/widget_binding.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include #include @@ -14,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -211,6 +214,18 @@ static void apply_to_widget(QWidget* w, std::string_view name, const PJ::WidgetD if (auto v = view.buttonText(name)) { btn->setText(QString::fromStdString(*v)); } + if (auto svg = view.buttonIconSvg(name)) { + QByteArray svg_data = QByteArray::fromStdString(*svg); + QSvgRenderer renderer(svg_data); + if (renderer.isValid()) { + int sz = btn->iconSize().height() > 0 ? btn->iconSize().height() : 16; + QPixmap pix(sz, sz); + pix.fill(Qt::transparent); + QPainter painter(&pix); + renderer.render(&painter); + btn->setIcon(QIcon(pix)); + } + } return; }