Refector: UI: Add uiLayout decorator, menu_contents and progress_indicator methods
This replaces uiItemMContents, uiItemDecoratorR* and uiItemProgressIndicator API with uiLayout methods following uiLayout refactors and the Python API. `eButProgressType` is changed to a typed enum class `blender::ui::ButProgressType` Part of: #117604 Pull Request: https://projects.blender.org/blender/blender/pulls/141189
This commit is contained in:
committed by
Pratik Borhade
parent
9809385ffa
commit
a0f9e25682
@@ -1520,7 +1520,7 @@ void ui_template_node_operator_asset_menu_items(uiLayout &layout,
|
||||
}
|
||||
uiLayout *col = &layout.column(false);
|
||||
col->context_string_set("asset_catalog_path", item->catalog_path().str());
|
||||
uiItemMContents(col, "GEO_MT_node_operator_catalog_assets");
|
||||
col->menu_contents("GEO_MT_node_operator_catalog_assets");
|
||||
}
|
||||
|
||||
void ui_template_node_operator_asset_root_items(uiLayout &layout, const bContext &C)
|
||||
|
||||
@@ -39,6 +39,7 @@ enum class ItemType : int8_t;
|
||||
enum class ItemInternalFlag : uint8_t;
|
||||
enum class EmbossType : uint8_t;
|
||||
enum class LayoutAlign : int8_t;
|
||||
enum class ButProgressType : int8_t;
|
||||
} // namespace blender::ui
|
||||
|
||||
struct PanelLayout {
|
||||
@@ -352,6 +353,18 @@ struct uiLayout : uiItem {
|
||||
|
||||
/** Items. */
|
||||
|
||||
/**
|
||||
* Insert a decorator item for a button with the same property as \a prop.
|
||||
* To force inserting a blank dummy element, nullptr can be passed for \a or and \a prop.
|
||||
*/
|
||||
void decorator(PointerRNA *ptr, PropertyRNA *prop, int index);
|
||||
/**
|
||||
* Insert a decorator item for a button with the same property as \a prop.
|
||||
* To force inserting a blank dummy element, nullptr can be passed for \a ptr or `std::nullopt`
|
||||
* for \a propname.
|
||||
*/
|
||||
void decorator(PointerRNA *ptr, std::optional<blender::StringRefNull> propname, int index);
|
||||
|
||||
/** Adds a label item that will display text and/or icon in the layout. */
|
||||
void label(blender::StringRef name, int icon);
|
||||
|
||||
@@ -366,6 +379,9 @@ struct uiLayout : uiItem {
|
||||
*/
|
||||
void menu(blender::StringRef menuname, std::optional<blender::StringRef> name, int icon);
|
||||
|
||||
/** Adds the menu content into this layout. */
|
||||
void menu_contents(blender::StringRef menuname);
|
||||
|
||||
/**
|
||||
* Adds a menu item, which is a button that when active will display a menu.
|
||||
* \param name: Label to show in the menu button.
|
||||
@@ -440,6 +456,11 @@ struct uiLayout : uiItem {
|
||||
wmOperatorCallContext context,
|
||||
eUI_Item_Flag flag,
|
||||
const char *menu_id);
|
||||
|
||||
void progress_indicator(const char *text,
|
||||
float factor,
|
||||
blender::ui::ButProgressType progress_type);
|
||||
|
||||
/**
|
||||
* Adds a RNA property item, and exposes it into the layout.
|
||||
* \param ptr: RNA pointer to the struct owner of \a prop.
|
||||
@@ -705,6 +726,10 @@ enum class LayoutAlign : int8_t {
|
||||
Center = 2,
|
||||
Right = 3,
|
||||
};
|
||||
enum class ButProgressType : int8_t {
|
||||
Bar = 0,
|
||||
Ring = 1,
|
||||
};
|
||||
} // namespace blender::ui
|
||||
|
||||
enum eUI_Item_Flag : uint16_t {
|
||||
@@ -902,36 +927,6 @@ uiLayout *uiItemL_respect_property_split(uiLayout *layout, blender::StringRef te
|
||||
* Label icon for dragging.
|
||||
*/
|
||||
void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, blender::StringRef name, int icon);
|
||||
/**
|
||||
* Menu contents.
|
||||
*/
|
||||
void uiItemMContents(uiLayout *layout, blender::StringRef menuname);
|
||||
|
||||
/* Decorators. */
|
||||
|
||||
/**
|
||||
* Insert a decorator item for a button with the same property as \a prop.
|
||||
* To force inserting a blank dummy element, NULL can be passed for \a ptr and \a prop.
|
||||
*/
|
||||
void uiItemDecoratorR_prop(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index);
|
||||
/**
|
||||
* Insert a decorator item for a button with the same property as \a prop.
|
||||
* To force inserting a blank dummy element, NULL can be passed for \a ptr and \a propname.
|
||||
*/
|
||||
void uiItemDecoratorR(uiLayout *layout,
|
||||
PointerRNA *ptr,
|
||||
std::optional<blender::StringRefNull> propname,
|
||||
int index);
|
||||
|
||||
enum eButProgressType {
|
||||
UI_BUT_PROGRESS_TYPE_BAR = 0,
|
||||
UI_BUT_PROGRESS_TYPE_RING = 1,
|
||||
};
|
||||
|
||||
void uiItemProgressIndicator(uiLayout *layout,
|
||||
const char *text,
|
||||
float factor,
|
||||
eButProgressType progress_type);
|
||||
|
||||
/**
|
||||
* Level items.
|
||||
|
||||
@@ -415,7 +415,7 @@ struct uiButProgress : public uiBut {
|
||||
/** Progress in 0..1 range */
|
||||
float progress_factor = 0.0f;
|
||||
/** The display style (bar, pie... etc). */
|
||||
eButProgressType progress_type = UI_BUT_PROGRESS_TYPE_BAR;
|
||||
blender::ui::ButProgressType progress_type = blender::ui::ButProgressType::Bar;
|
||||
};
|
||||
|
||||
/** Derived struct for #UI_BTYPE_SEPR_LINE. */
|
||||
|
||||
@@ -2363,7 +2363,7 @@ void uiLayout::prop(PointerRNA *ptr,
|
||||
PropertyRNA *prop_dec = use_blank_decorator ? nullptr : but_decorate->rnaprop;
|
||||
|
||||
/* The icons are set in 'ui_but_anim_flag' */
|
||||
uiItemDecoratorR_prop(layout_col, ptr_dec, prop_dec, but_decorate->rnaindex);
|
||||
layout_col->decorator(ptr_dec, prop_dec, but_decorate->rnaindex);
|
||||
but = block->buttons.last().get();
|
||||
|
||||
if (!tmp.is_empty()) {
|
||||
@@ -2926,7 +2926,7 @@ void uiLayout::menu(const StringRef menuname, const std::optional<StringRef> nam
|
||||
this->menu(mt, name, icon);
|
||||
}
|
||||
|
||||
void uiItemMContents(uiLayout *layout, const StringRef menuname)
|
||||
void uiLayout::menu_contents(const StringRef menuname)
|
||||
{
|
||||
MenuType *mt = WM_menutype_find(menuname, false);
|
||||
if (mt == nullptr) {
|
||||
@@ -2934,23 +2934,23 @@ void uiItemMContents(uiLayout *layout, const StringRef menuname)
|
||||
return;
|
||||
}
|
||||
|
||||
uiBlock *block = layout->block();
|
||||
uiBlock *block = this->block();
|
||||
bContext *C = static_cast<bContext *>(block->evil_C);
|
||||
if (WM_menutype_poll(C, mt) == false) {
|
||||
return;
|
||||
}
|
||||
|
||||
UI_menutype_draw(C, mt, layout);
|
||||
UI_menutype_draw(C, mt, this);
|
||||
}
|
||||
|
||||
void uiItemDecoratorR_prop(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index)
|
||||
void uiLayout::decorator(PointerRNA *ptr, PropertyRNA *prop, int index)
|
||||
{
|
||||
uiBlock *block = layout->block();
|
||||
uiBlock *block = this->block();
|
||||
|
||||
UI_block_layout_set_current(block, layout);
|
||||
uiLayout *col = &layout->column(false);
|
||||
col->space_ = 0;
|
||||
col->emboss_ = blender::ui::EmbossType::None;
|
||||
UI_block_layout_set_current(block, this);
|
||||
uiLayout &col = this->column(false);
|
||||
col.space_ = 0;
|
||||
col.emboss_ = blender::ui::EmbossType::None;
|
||||
|
||||
if (ELEM(nullptr, ptr, prop) || !RNA_property_animateable(ptr, prop)) {
|
||||
uiBut *but = uiDefIconBut(block,
|
||||
@@ -2998,10 +2998,7 @@ void uiItemDecoratorR_prop(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop,
|
||||
}
|
||||
}
|
||||
|
||||
void uiItemDecoratorR(uiLayout *layout,
|
||||
PointerRNA *ptr,
|
||||
const std::optional<StringRefNull> propname,
|
||||
int index)
|
||||
void uiLayout::decorator(PointerRNA *ptr, const std::optional<StringRefNull> propname, int index)
|
||||
{
|
||||
PropertyRNA *prop = nullptr;
|
||||
|
||||
@@ -3009,7 +3006,7 @@ void uiItemDecoratorR(uiLayout *layout,
|
||||
/* validate arguments */
|
||||
prop = RNA_struct_find_property(ptr, propname->c_str());
|
||||
if (!prop) {
|
||||
ui_item_disabled(layout, propname->c_str());
|
||||
ui_item_disabled(this, propname->c_str());
|
||||
RNA_warning(
|
||||
"property not found: %s.%s", RNA_struct_identifier(ptr->type), propname->c_str());
|
||||
return;
|
||||
@@ -3017,7 +3014,7 @@ void uiItemDecoratorR(uiLayout *layout,
|
||||
}
|
||||
|
||||
/* ptr and prop are allowed to be nullptr here. */
|
||||
uiItemDecoratorR_prop(layout, ptr, prop, index);
|
||||
this->decorator(ptr, prop, index);
|
||||
}
|
||||
|
||||
void uiLayout::popover(const bContext *C,
|
||||
@@ -3264,16 +3261,15 @@ void uiLayout::separator(float factor, const LayoutSeparatorType type)
|
||||
}
|
||||
}
|
||||
|
||||
void uiItemProgressIndicator(uiLayout *layout,
|
||||
const char *text,
|
||||
const float factor,
|
||||
const eButProgressType progress_type)
|
||||
void uiLayout::progress_indicator(const char *text,
|
||||
const float factor,
|
||||
const blender::ui::ButProgressType progress_type)
|
||||
{
|
||||
const bool has_text = text && text[0];
|
||||
uiBlock *block = layout->block();
|
||||
uiBlock *block = this->block();
|
||||
short width;
|
||||
|
||||
if (progress_type == UI_BUT_PROGRESS_TYPE_BAR) {
|
||||
if (progress_type == blender::ui::ButProgressType::Bar) {
|
||||
width = UI_UNIT_X * 5;
|
||||
}
|
||||
else if (has_text) {
|
||||
@@ -3283,7 +3279,7 @@ void uiItemProgressIndicator(uiLayout *layout,
|
||||
width = UI_UNIT_X;
|
||||
}
|
||||
|
||||
UI_block_layout_set_current(block, layout);
|
||||
UI_block_layout_set_current(block, this);
|
||||
uiBut *but = uiDefBut(block,
|
||||
UI_BTYPE_PROGRESS,
|
||||
0,
|
||||
@@ -3297,13 +3293,13 @@ void uiItemProgressIndicator(uiLayout *layout,
|
||||
0.0,
|
||||
"");
|
||||
|
||||
if (has_text && (progress_type == UI_BUT_PROGRESS_TYPE_RING)) {
|
||||
if (has_text && (progress_type == blender::ui::ButProgressType::Ring)) {
|
||||
/* For progress bar, centered is okay, left aligned for ring/pie. */
|
||||
but->drawflag |= UI_BUT_TEXT_LEFT;
|
||||
}
|
||||
|
||||
uiButProgress *progress_bar = static_cast<uiButProgress *>(but);
|
||||
progress_bar->progress_type = eButProgressType(progress_type);
|
||||
progress_bar->progress_type = progress_type;
|
||||
progress_bar->progress_factor = factor;
|
||||
}
|
||||
|
||||
|
||||
@@ -3923,11 +3923,11 @@ static void widget_progress_indicator(uiBut *but,
|
||||
{
|
||||
uiButProgress *but_progress = static_cast<uiButProgress *>(but);
|
||||
switch (but_progress->progress_type) {
|
||||
case UI_BUT_PROGRESS_TYPE_BAR: {
|
||||
case blender::ui::ButProgressType::Bar: {
|
||||
widget_progress_type_bar(but_progress, wcol, rect, roundboxalign, zoom);
|
||||
break;
|
||||
}
|
||||
case UI_BUT_PROGRESS_TYPE_RING: {
|
||||
case blender::ui::ButProgressType::Ring: {
|
||||
widget_progress_type_ring(but_progress, wcol, rect);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ void uiTemplateCacheFileTimeSettings(uiLayout *layout, PointerRNA *fileptr)
|
||||
subsub = &sub->row(true);
|
||||
subsub->active_set(RNA_boolean_get(fileptr, "override_frame"));
|
||||
subsub->prop(fileptr, "frame", UI_ITEM_NONE, "", ICON_NONE);
|
||||
uiItemDecoratorR(row, fileptr, "frame", 0);
|
||||
row->decorator(fileptr, "frame", 0);
|
||||
|
||||
row = &layout->row(false);
|
||||
row->prop(fileptr, "frame_offset", UI_ITEM_NONE, std::nullopt, ICON_NONE);
|
||||
|
||||
@@ -211,7 +211,7 @@ static void template_search_buttons(const bContext *C,
|
||||
UI_block_align_end(block);
|
||||
|
||||
if (decorator_layout) {
|
||||
uiItemDecoratorR(decorator_layout, nullptr, "", RNA_NO_INDEX);
|
||||
decorator_layout->decorator(nullptr, "", RNA_NO_INDEX);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -398,7 +398,7 @@ void ui_template_modifier_asset_menu_items(uiLayout &layout, const StringRef cat
|
||||
layout.separator();
|
||||
uiLayout *col = &layout.column(false);
|
||||
col->context_string_set("asset_catalog_path", item->catalog_path().str());
|
||||
uiItemMContents(col, "OBJECT_MT_add_modifier_catalog_assets");
|
||||
col->menu_contents("OBJECT_MT_add_modifier_catalog_assets");
|
||||
}
|
||||
|
||||
} // namespace blender::ed::object
|
||||
|
||||
@@ -324,7 +324,7 @@ void ui_template_node_asset_menu_items(uiLayout &layout,
|
||||
}
|
||||
uiLayout *col = &layout.column(false);
|
||||
col->context_string_set("asset_catalog_path", item->catalog_path().str());
|
||||
uiItemMContents(col, "NODE_MT_node_add_catalog_assets");
|
||||
col->menu_contents("NODE_MT_node_add_catalog_assets");
|
||||
}
|
||||
|
||||
} // namespace blender::ed::space_node
|
||||
|
||||
@@ -918,8 +918,7 @@ static void ui_node_draw_input(uiLayout &layout,
|
||||
case SOCK_RGBA:
|
||||
sub->prop(&inputptr, "default_value", UI_ITEM_NONE, "", ICON_NONE);
|
||||
if (split_wrapper.decorate_column) {
|
||||
uiItemDecoratorR(
|
||||
split_wrapper.decorate_column, &inputptr, "default_value", RNA_NO_INDEX);
|
||||
split_wrapper.decorate_column->decorator(&inputptr, "default_value", RNA_NO_INDEX);
|
||||
}
|
||||
break;
|
||||
case SOCK_STRING: {
|
||||
@@ -934,8 +933,7 @@ static void ui_node_draw_input(uiLayout &layout,
|
||||
sub->prop(&inputptr, "default_value", UI_ITEM_NONE, "", ICON_NONE);
|
||||
}
|
||||
if (split_wrapper.decorate_column) {
|
||||
uiItemDecoratorR(
|
||||
split_wrapper.decorate_column, &inputptr, "default_value", RNA_NO_INDEX);
|
||||
split_wrapper.decorate_column->decorator(&inputptr, "default_value", RNA_NO_INDEX);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -952,7 +950,7 @@ static void ui_node_draw_input(uiLayout &layout,
|
||||
}
|
||||
|
||||
if (add_dummy_decorator && split_wrapper.decorate_column) {
|
||||
uiItemDecoratorR(split_wrapper.decorate_column, nullptr, std::nullopt, 0);
|
||||
split_wrapper.decorate_column->decorator(nullptr, std::nullopt, 0);
|
||||
}
|
||||
|
||||
node_socket_add_tooltip(ntree, input, *row);
|
||||
|
||||
@@ -3629,7 +3629,7 @@ static wmOperatorStatus outliner_operator_menu(bContext *C, const char *opname)
|
||||
layout->separator();
|
||||
}
|
||||
|
||||
uiItemMContents(layout, "OUTLINER_MT_context_menu");
|
||||
layout->menu_contents("OUTLINER_MT_context_menu");
|
||||
|
||||
UI_popup_menu_end(C, pup);
|
||||
|
||||
|
||||
@@ -344,6 +344,11 @@ static void rna_uiItemPointerR(uiLayout *layout,
|
||||
layout->prop_search(ptr, prop, searchptr, searchprop, text, icon, results_are_suggestions);
|
||||
}
|
||||
|
||||
void rna_uiLayoutDecorator(uiLayout *layout, PointerRNA *ptr, const char *propname, int index)
|
||||
{
|
||||
layout->decorator(ptr, propname, index);
|
||||
}
|
||||
|
||||
static PointerRNA rna_uiItemO(uiLayout *layout,
|
||||
const char *opname,
|
||||
const char *name,
|
||||
@@ -494,7 +499,7 @@ static void rna_uiItemM(uiLayout *layout,
|
||||
|
||||
static void rna_uiItemM_contents(uiLayout *layout, const char *menuname)
|
||||
{
|
||||
uiItemMContents(layout, menuname);
|
||||
layout->menu_contents(menuname);
|
||||
}
|
||||
|
||||
static void rna_uiItemPopoverPanel(uiLayout *layout,
|
||||
@@ -538,7 +543,7 @@ static void rna_uiItemProgress(uiLayout *layout,
|
||||
text = BLT_pgettext((text_ctxt && text_ctxt[0]) ? text_ctxt : BLT_I18NCONTEXT_DEFAULT, text);
|
||||
}
|
||||
|
||||
uiItemProgressIndicator(layout, text, factor, eButProgressType(progress_type));
|
||||
layout->progress_indicator(text, factor, blender::ui::ButProgressType(progress_type));
|
||||
}
|
||||
|
||||
static void rna_uiItemSeparator(uiLayout *layout, float factor, int type)
|
||||
@@ -1187,8 +1192,8 @@ void RNA_api_ui_layout(StructRNA *srna)
|
||||
};
|
||||
|
||||
static const EnumPropertyItem progress_type_items[] = {
|
||||
{UI_BUT_PROGRESS_TYPE_BAR, "BAR", 0, "Bar", ""},
|
||||
{UI_BUT_PROGRESS_TYPE_RING, "RING", 0, "Ring", ""},
|
||||
{int(blender::ui::ButProgressType::Bar), "BAR", 0, "Bar", ""},
|
||||
{int(blender::ui::ButProgressType::Ring), "RING", 0, "Ring", ""},
|
||||
{0, nullptr, 0, nullptr, nullptr},
|
||||
};
|
||||
|
||||
@@ -1478,7 +1483,7 @@ void RNA_api_ui_layout(StructRNA *srna)
|
||||
RNA_def_boolean(
|
||||
func, "results_are_suggestions", false, "", "Accept inputs that do not match any item");
|
||||
|
||||
func = RNA_def_function(srna, "prop_decorator", "uiItemDecoratorR");
|
||||
func = RNA_def_function(srna, "prop_decorator", "rna_uiLayoutDecorator");
|
||||
api_ui_item_rna_common(func);
|
||||
RNA_def_int(func,
|
||||
"index",
|
||||
@@ -1617,7 +1622,7 @@ void RNA_api_ui_layout(StructRNA *srna)
|
||||
RNA_def_enum(func,
|
||||
"type",
|
||||
progress_type_items,
|
||||
UI_BUT_PROGRESS_TYPE_BAR,
|
||||
int(blender::ui::ButProgressType::Bar),
|
||||
"Type",
|
||||
"The type of progress indicator");
|
||||
|
||||
|
||||
@@ -242,7 +242,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
|
||||
sub = &sub->row(true);
|
||||
sub->active_set(RNA_boolean_get(ptr, "use_symmetry"));
|
||||
sub->prop(ptr, "symmetry_axis", UI_ITEM_R_EXPAND, std::nullopt, ICON_NONE);
|
||||
uiItemDecoratorR(row, ptr, "symmetry_axis", 0);
|
||||
row->decorator(ptr, "symmetry_axis", 0);
|
||||
|
||||
layout->prop(ptr, "use_collapse_triangulate", UI_ITEM_NONE, std::nullopt, ICON_NONE);
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ static void data_panel_draw(const bContext * /*C*/, Panel *panel)
|
||||
sub = &sub->row(true);
|
||||
sub->active_set(RNA_boolean_get(ptr, "use_mirror_u"));
|
||||
sub->prop(ptr, "mirror_offset_u", UI_ITEM_R_SLIDER, "", ICON_NONE);
|
||||
uiItemDecoratorR(row, ptr, "mirror_offset_u", 0);
|
||||
row->decorator(ptr, "mirror_offset_u", 0);
|
||||
|
||||
row = &col->row(true, IFACE_("V"));
|
||||
row->use_property_decorate_set(false);
|
||||
@@ -210,7 +210,7 @@ static void data_panel_draw(const bContext * /*C*/, Panel *panel)
|
||||
sub = &sub->row(true);
|
||||
sub->active_set(RNA_boolean_get(ptr, "use_mirror_v"));
|
||||
sub->prop(ptr, "mirror_offset_v", UI_ITEM_R_SLIDER, "", ICON_NONE);
|
||||
uiItemDecoratorR(row, ptr, "mirror_offset_v", 0);
|
||||
row->decorator(ptr, "mirror_offset_v", 0);
|
||||
|
||||
col = &layout->column(true);
|
||||
col->prop(ptr, "offset_u", UI_ITEM_R_SLIDER, IFACE_("Offset U"), ICON_NONE);
|
||||
|
||||
@@ -308,7 +308,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
|
||||
sub->active_set(RNA_boolean_get(ptr, "use_add"));
|
||||
sub->use_property_split_set(false);
|
||||
sub->prop(ptr, "add_threshold", UI_ITEM_R_SLIDER, IFACE_("Threshold"), ICON_NONE);
|
||||
uiItemDecoratorR(row, ptr, "add_threshold", 0);
|
||||
row->decorator(ptr, "add_threshold", 0);
|
||||
|
||||
col = &layout->column(false, IFACE_("Group Remove"));
|
||||
row = &col->row(true);
|
||||
@@ -319,7 +319,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
|
||||
sub->active_set(RNA_boolean_get(ptr, "use_remove"));
|
||||
sub->use_property_split_set(false);
|
||||
sub->prop(ptr, "remove_threshold", UI_ITEM_R_SLIDER, IFACE_("Threshold"), ICON_NONE);
|
||||
uiItemDecoratorR(row, ptr, "remove_threshold", 0);
|
||||
row->decorator(ptr, "remove_threshold", 0);
|
||||
|
||||
layout->prop(ptr, "normalize", UI_ITEM_NONE, std::nullopt, ICON_NONE);
|
||||
|
||||
|
||||
@@ -446,7 +446,7 @@ static void add_attribute_search_or_value_buttons(DrawGroupInputsContext &ctx,
|
||||
else {
|
||||
const char *name = socket.name ? IFACE_(socket.name) : "";
|
||||
prop_row->prop(ctx.properties_ptr, rna_path, UI_ITEM_NONE, name, ICON_NONE);
|
||||
uiItemDecoratorR(layout, ctx.properties_ptr, rna_path.c_str(), -1);
|
||||
layout->decorator(ctx.properties_ptr, rna_path.c_str(), -1);
|
||||
}
|
||||
|
||||
ctx.draw_attribute_toggle_fn(*prop_row, ICON_SPREADSHEET, socket);
|
||||
|
||||
Reference in New Issue
Block a user