Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pj_plugins/dialog_protocol/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,10 @@ class WidgetDataView {
return getString(name, "button_text");
}

[[nodiscard]] std::optional<std::string> buttonIconSvg(std::string_view name) const {
return getString(name, "button_icon_svg");
}

[[nodiscard]] std::optional<std::string> shortcut(std::string_view name) const {
return getString(name, "shortcut");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
15 changes: 15 additions & 0 deletions pj_plugins/dialog_protocol/src/widget_binding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
#include <QPainter>
#include <QPixmap>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QRadioButton>
#include <QShortcut>
#include <QSignalBlocker>
#include <QSpinBox>
#include <QSplitter>
#include <QSvgRenderer>
#include <QTabWidget>
#include <QTableWidget>
#include <QVBoxLayout>
Expand Down Expand Up @@ -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;
}

Expand Down
Loading