Refactor: UI: Replace uiItemPointerR with uiLayout::prop_search

This converts the public uiItemPointerR and uiItemPointerR_prop
functions to an object-oriented API (uiLayout::prop_search overloads),
matching the python API.

Part of: #117604

Pull Request: https://projects.blender.org/blender/blender/pulls/140930
This commit is contained in:
Guillermo Venegas
2025-06-24 20:47:54 +02:00
committed by Hans Goudey
parent 74fbeeeccb
commit 2e5138fed8
33 changed files with 156 additions and 181 deletions

View File

@@ -444,6 +444,31 @@ struct uiLayout : uiItem {
std::optional<blender::StringRef> name,
int icon);
/**
* Adds a RNA enum/pointer/string/ property item, and exposes it into the layout. Button input
* would suggest values from the search property collection.
* \param searchprop: Collection property in \a searchptr from where to take input values.
* \param results_are_suggestions: Allow inputs that not match any suggested value.
*/
void prop_search(PointerRNA *ptr,
PropertyRNA *prop,
PointerRNA *searchptr,
PropertyRNA *searchprop,
std::optional<blender::StringRefNull> name,
int icon,
bool results_are_suggestions);
/**
* Adds a RNA enum/pointer/string/ property item, and exposes it into the layout. Button input
* would suggest values from the search property collection, input must match a suggested value.
* \param searchprop: Collection property in \a searchptr from where to take input values.
*/
void prop_search(PointerRNA *ptr,
blender::StringRefNull propname,
PointerRNA *searchptr,
blender::StringRefNull searchpropname,
std::optional<blender::StringRefNull> name,
int icon);
/** Adds a separator item, that adds empty space between items. */
void separator(float factor = 1.0f, LayoutSeparatorType type = LayoutSeparatorType::Auto);
};
@@ -763,21 +788,6 @@ void uiItemEnumR_string(uiLayout *layout,
std::optional<blender::StringRefNull> name,
int icon);
void uiItemsEnumR(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname);
void uiItemPointerR_prop(uiLayout *layout,
PointerRNA *ptr,
PropertyRNA *prop,
PointerRNA *searchptr,
PropertyRNA *searchprop,
std::optional<blender::StringRefNull> name,
int icon,
bool results_are_suggestions);
void uiItemPointerR(uiLayout *layout,
PointerRNA *ptr,
blender::StringRefNull propname,
PointerRNA *searchptr,
blender::StringRefNull searchpropname,
std::optional<blender::StringRefNull> name,
int icon);
/**
* Create a list of enum items.

View File

@@ -2730,18 +2730,17 @@ uiBut *ui_but_add_search(uiBut *but,
return but;
}
void uiItemPointerR_prop(uiLayout *layout,
PointerRNA *ptr,
PropertyRNA *prop,
PointerRNA *searchptr,
PropertyRNA *searchprop,
const std::optional<StringRefNull> name_opt,
int icon,
bool results_are_suggestions)
void uiLayout::prop_search(PointerRNA *ptr,
PropertyRNA *prop,
PointerRNA *searchptr,
PropertyRNA *searchprop,
const std::optional<StringRefNull> name_opt,
int icon,
bool results_are_suggestions)
{
const bool use_prop_sep = bool(layout->flag_ & uiItemInternalFlag::PropSep);
ui_block_new_button_group(layout->block(), uiButtonGroupFlag(0));
const bool use_prop_sep = bool(flag_ & uiItemInternalFlag::PropSep);
uiBlock *block = this->block();
ui_block_new_button_group(block, uiButtonGroupFlag(0));
const PropertyType type = RNA_property_type(prop);
if (!ELEM(type, PROP_POINTER, PROP_STRING, PROP_ENUM)) {
@@ -2777,23 +2776,21 @@ void uiItemPointerR_prop(uiLayout *layout,
}
/* create button */
uiBlock *block = layout->block();
int w, h;
ui_item_rna_size(layout, name, icon, ptr, prop, 0, false, false, &w, &h);
ui_item_rna_size(this, name, icon, ptr, prop, 0, false, false, &w, &h);
w += UI_UNIT_X; /* X icon needs more space */
uiBut *but = ui_item_with_label(layout, block, name, icon, ptr, prop, 0, 0, 0, w, h, 0);
uiBut *but = ui_item_with_label(this, block, name, icon, ptr, prop, 0, 0, 0, w, h, 0);
but = ui_but_add_search(but, ptr, prop, searchptr, searchprop, results_are_suggestions);
}
void uiItemPointerR(uiLayout *layout,
PointerRNA *ptr,
const StringRefNull propname,
PointerRNA *searchptr,
const StringRefNull searchpropname,
const std::optional<StringRefNull> name,
int icon)
void uiLayout::prop_search(PointerRNA *ptr,
const StringRefNull propname,
PointerRNA *searchptr,
const StringRefNull searchpropname,
const std::optional<StringRefNull> name,
int icon)
{
/* validate arguments */
PropertyRNA *prop = RNA_struct_find_property(ptr, propname.c_str());
@@ -2809,7 +2806,7 @@ void uiItemPointerR(uiLayout *layout,
return;
}
uiItemPointerR_prop(layout, ptr, prop, searchptr, searchprop, name, icon, false);
this->prop_search(ptr, prop, searchptr, searchprop, name, icon, false);
}
void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)

View File

@@ -3934,8 +3934,7 @@ static void edbm_blend_from_shape_ui(bContext *C, wmOperator *op)
layout->use_property_split_set(true);
layout->use_property_decorate_set(false);
uiItemPointerR(
layout, op->ptr, "shape", &ptr_key, "key_blocks", std::nullopt, ICON_SHAPEKEY_DATA);
layout->prop_search(op->ptr, "shape", &ptr_key, "key_blocks", std::nullopt, ICON_SHAPEKEY_DATA);
layout->prop(op->ptr, "blend", UI_ITEM_NONE, std::nullopt, ICON_NONE);
layout->prop(op->ptr, "add", UI_ITEM_NONE, std::nullopt, ICON_NONE);
}

View File

@@ -794,7 +794,7 @@ static void graph_panel_driverVar__rotDiff(uiLayout *layout, ID *id, DriverVar *
if (dtar->id && GS(dtar->id->name) == ID_OB && ob1->pose) {
PointerRNA tar_ptr = RNA_pointer_create_discrete(dtar->id, &RNA_Pose, ob1->pose);
uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
col->prop_search(&dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
/* Object 2 */
@@ -804,7 +804,7 @@ static void graph_panel_driverVar__rotDiff(uiLayout *layout, ID *id, DriverVar *
if (dtar2->id && GS(dtar2->id->name) == ID_OB && ob2->pose) {
PointerRNA tar_ptr = RNA_pointer_create_discrete(dtar2->id, &RNA_Pose, ob2->pose);
uiItemPointerR(col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
col->prop_search(&dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
}
@@ -828,8 +828,7 @@ static void graph_panel_driverVar__locDiff(uiLayout *layout, ID *id, DriverVar *
if (dtar->id && GS(dtar->id->name) == ID_OB && ob1->pose) {
PointerRNA tar_ptr = RNA_pointer_create_discrete(dtar->id, &RNA_Pose, ob1->pose);
uiItemPointerR(
col, &dtar_ptr, "bone_target", &tar_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
col->prop_search(&dtar_ptr, "bone_target", &tar_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
}
/* we can clear it again now - it's only needed when creating the ID/Bone fields */
@@ -844,8 +843,7 @@ static void graph_panel_driverVar__locDiff(uiLayout *layout, ID *id, DriverVar *
if (dtar2->id && GS(dtar2->id->name) == ID_OB && ob2->pose) {
PointerRNA tar_ptr = RNA_pointer_create_discrete(dtar2->id, &RNA_Pose, ob2->pose);
uiItemPointerR(
col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
col->prop_search(&dtar2_ptr, "bone_target", &tar_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
}
/* we can clear it again now - it's only needed when creating the ID/Bone fields */
@@ -871,8 +869,7 @@ static void graph_panel_driverVar__transChan(uiLayout *layout, ID *id, DriverVar
if (dtar->id && GS(dtar->id->name) == ID_OB && ob->pose) {
PointerRNA tar_ptr = RNA_pointer_create_discrete(dtar->id, &RNA_Pose, ob->pose);
uiItemPointerR(
col, &dtar_ptr, "bone_target", &tar_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
col->prop_search(&dtar_ptr, "bone_target", &tar_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
}
sub = &layout->column(true);

View File

@@ -336,8 +336,7 @@ static void rna_uiItemPointerR(uiLayout *layout,
std::optional<StringRefNull> text = rna_translate_ui_text(
name, text_ctxt, nullptr, prop, translate);
uiItemPointerR_prop(
layout, ptr, prop, searchptr, searchprop, text, icon, results_are_suggestions);
layout->prop_search(ptr, prop, searchptr, searchprop, text, icon, results_are_suggestions);
}
static PointerRNA rna_uiItemO(uiLayout *layout,

View File

@@ -361,17 +361,16 @@ static void panel_draw(const bContext *C, Panel *panel)
(RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE))
{
PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
uiItemPointerR(col,
ptr,
"texture_coords_bone",
&texture_coords_obj_data_ptr,
"bones",
IFACE_("Bone"),
ICON_NONE);
col->prop_search(ptr,
"texture_coords_bone",
&texture_coords_obj_data_ptr,
"bones",
IFACE_("Bone"),
ICON_NONE);
}
}
else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
col->prop_search(ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
}
layout->separator();

View File

@@ -1172,8 +1172,8 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
layout->use_property_split_set(true);
uiItemPointerR(
layout, ptr, "particle_uv", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
layout->prop_search(
ptr, "particle_uv", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
row = &layout->row(true, IFACE_("Show"));
row->prop(ptr, "show_alive", toggles_flag, std::nullopt, ICON_NONE);

View File

@@ -817,13 +817,8 @@ static void panel_draw(const bContext *C, Panel *panel)
subcol->prop(ptr, "fade_thickness_strength", UI_ITEM_NONE, IFACE_("Thickness"), ICON_NONE);
subcol->prop(ptr, "fade_opacity_strength", UI_ITEM_NONE, IFACE_("Opacity"), ICON_NONE);
uiItemPointerR(col,
ptr,
"target_vertex_group",
&ob_ptr,
"vertex_groups",
IFACE_("Weight Output"),
ICON_NONE);
col->prop_search(
ptr, "target_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Weight Output"), ICON_NONE);
}
if (uiLayout *influence_panel = layout->panel_prop(

View File

@@ -277,8 +277,7 @@ static void panel_draw(const bContext *C, Panel *panel)
RNA_enum_get(&hook_object_ptr, "type") == OB_ARMATURE)
{
PointerRNA hook_object_data_ptr = RNA_pointer_get(&hook_object_ptr, "data");
uiItemPointerR(
col, ptr, "subtarget", &hook_object_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
col->prop_search(ptr, "subtarget", &hook_object_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
}
layout->prop(ptr, "strength", UI_ITEM_R_SLIDER, std::nullopt, ICON_NONE);

View File

@@ -107,22 +107,20 @@ void draw_layer_filter_settings(const bContext * /*C*/, uiLayout *layout, Pointe
row = &col->row(true);
row->use_property_decorate_set(false);
if (use_layer_group_filter) {
uiItemPointerR(row,
ptr,
"tree_node_filter",
&obj_data_ptr,
"layer_groups",
"Group",
ICON_GREASEPENCIL_LAYER_GROUP);
row->prop_search(ptr,
"tree_node_filter",
&obj_data_ptr,
"layer_groups",
"Group",
ICON_GREASEPENCIL_LAYER_GROUP);
}
else {
uiItemPointerR(row,
ptr,
"tree_node_filter",
&obj_data_ptr,
"layers",
std::nullopt,
ICON_OUTLINER_DATA_GP_LAYER);
row->prop_search(ptr,
"tree_node_filter",
&obj_data_ptr,
"layers",
std::nullopt,
ICON_OUTLINER_DATA_GP_LAYER);
}
sub = &row->row(true);
sub->prop(ptr, "use_layer_group_filter", UI_ITEM_NONE, "", ICON_GREASEPENCIL_LAYER_GROUP);
@@ -150,8 +148,8 @@ void draw_material_filter_settings(const bContext * /*C*/, uiLayout *layout, Poi
col = &layout->column(true);
row = &col->row(true);
row->use_property_decorate_set(false);
uiItemPointerR(
row, ptr, "material_filter", &obj_data_ptr, "materials", std::nullopt, ICON_SHADING_TEXTURE);
row->prop_search(
ptr, "material_filter", &obj_data_ptr, "materials", std::nullopt, ICON_SHADING_TEXTURE);
sub = &row->row(true);
sub->prop(ptr, "invert_material_filter", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT);
@@ -176,7 +174,7 @@ void draw_vertex_group_settings(const bContext * /*C*/, uiLayout *layout, Pointe
col = &layout->column(true);
row = &col->row(true);
row->use_property_decorate_set(false);
uiItemPointerR(row, ptr, "vertex_group_name", &ob_ptr, "vertex_groups", std::nullopt, ICON_NONE);
row->prop_search(ptr, "vertex_group_name", &ob_ptr, "vertex_groups", std::nullopt, ICON_NONE);
sub = &row->row(true);
sub->active_set(has_vertex_group);
sub->use_property_decorate_set(false);

View File

@@ -230,8 +230,7 @@ static void panel_draw(const bContext *C, Panel *panel)
layout->use_property_split_set(true);
row = &layout->row(true);
uiItemPointerR(
row, ptr, "target_vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_NONE);
row->prop_search(ptr, "target_vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_NONE);
sub = &row->row(true);
bool has_output = RNA_string_length(ptr, "target_vertex_group") != 0;

View File

@@ -253,8 +253,7 @@ static void panel_draw(const bContext *C, Panel *panel)
layout->use_property_split_set(true);
row = &layout->row(true);
uiItemPointerR(
row, ptr, "target_vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_NONE);
row->prop_search(ptr, "target_vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_NONE);
sub = &row->row(true);
bool has_output = RNA_string_length(ptr, "target_vertex_group") != 0;
sub->use_property_decorate_set(false);

View File

@@ -463,8 +463,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
RNA_enum_get(&hook_object_ptr, "type") == OB_ARMATURE)
{
PointerRNA hook_object_data_ptr = RNA_pointer_get(&hook_object_ptr, "data");
uiItemPointerR(
col, ptr, "subtarget", &hook_object_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
col->prop_search(ptr, "subtarget", &hook_object_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
}
modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", std::nullopt);

View File

@@ -249,15 +249,10 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
}
uiLayout *col = &layout->column(false);
uiItemPointerR(col,
ptr,
"target_layer",
&obj_data_ptr,
"layers",
std::nullopt,
ICON_OUTLINER_DATA_GP_LAYER);
uiItemPointerR(
col, ptr, "target_material", &obj_data_ptr, "materials", std::nullopt, ICON_MATERIAL);
col->prop_search(
ptr, "target_layer", &obj_data_ptr, "layers", std::nullopt, ICON_OUTLINER_DATA_GP_LAYER);
col->prop_search(
ptr, "target_material", &obj_data_ptr, "materials", std::nullopt, ICON_MATERIAL);
col = &layout->column(false);
col->prop(ptr, "thickness", UI_ITEM_R_SLIDER, IFACE_("Line Thickness"), ICON_NONE);
@@ -646,7 +641,7 @@ static void vgroup_panel_draw(const bContext * /*C*/, Panel *panel)
col->prop(ptr, "use_output_vertex_group_match_by_name", UI_ITEM_NONE, std::nullopt, ICON_NONE);
uiItemPointerR(col, ptr, "vertex_group", &ob_ptr, "vertex_groups", IFACE_("Target"), ICON_NONE);
col->prop_search(ptr, "vertex_group", &ob_ptr, "vertex_groups", IFACE_("Target"), ICON_NONE);
}
static void bake_panel_draw(const bContext * /*C*/, Panel *panel)

View File

@@ -384,8 +384,8 @@ static void panel_draw(const bContext *C, Panel *panel)
uiTemplateCacheFile(layout, C, ptr, "cache_file");
if (has_cache_file) {
uiItemPointerR(
layout, ptr, "object_path", &cache_file_ptr, "object_paths", std::nullopt, ICON_NONE);
layout->prop_search(
ptr, "object_path", &cache_file_ptr, "object_paths", std::nullopt, ICON_NONE);
}
if (RNA_enum_get(&ob_ptr, "type") == OB_MESH) {

View File

@@ -533,13 +533,12 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
layout->prop(ptr, "object", UI_ITEM_NONE, std::nullopt, ICON_NONE);
if (!RNA_pointer_is_null(&particle_obj_ptr)) {
uiItemPointerR(layout,
ptr,
"particle_system",
&particle_obj_ptr,
"particle_systems",
IFACE_("Particle System"),
ICON_NONE);
layout->prop_search(ptr,
"particle_system",
&particle_obj_ptr,
"particle_systems",
IFACE_("Particle System"),
ICON_NONE);
}
else {
layout->prop(ptr, "particle_system_index", UI_ITEM_NONE, IFACE_("Particle System"), ICON_NONE);
@@ -613,10 +612,10 @@ static void layers_panel_draw(const bContext * /*C*/, Panel *panel)
layout->use_property_split_set(true);
col = &layout->column(false);
uiItemPointerR(
col, ptr, "index_layer_name", &obj_data_ptr, "vertex_colors", IFACE_("Index"), ICON_NONE);
uiItemPointerR(
col, ptr, "value_layer_name", &obj_data_ptr, "vertex_colors", IFACE_("Value"), ICON_NONE);
col->prop_search(
ptr, "index_layer_name", &obj_data_ptr, "vertex_colors", IFACE_("Index"), ICON_NONE);
col->prop_search(
ptr, "value_layer_name", &obj_data_ptr, "vertex_colors", IFACE_("Value"), ICON_NONE);
}
static void panel_register(ARegionType *region_type)

View File

@@ -214,15 +214,14 @@ static void vertex_group_panel_draw(const bContext * /*C*/, Panel *panel)
layout->use_property_split_set(true);
col = &layout->column(false);
uiItemPointerR(
col, ptr, "shell_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Shell"), ICON_NONE);
uiItemPointerR(col,
ptr,
"rim_vertex_group",
&ob_ptr,
"vertex_groups",
CTX_IFACE_(BLT_I18NCONTEXT_ID_MESH, "Rim"),
ICON_NONE);
col->prop_search(
ptr, "shell_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Shell"), ICON_NONE);
col->prop_search(ptr,
"rim_vertex_group",
&ob_ptr,
"vertex_groups",
CTX_IFACE_(BLT_I18NCONTEXT_ID_MESH, "Rim"),
ICON_NONE);
}
static void panel_register(ARegionType *region_type)

View File

@@ -133,7 +133,7 @@ void modifier_vgroup_ui(uiLayout *layout,
bool has_vertex_group = RNA_string_length(ptr, vgroup_prop.c_str()) != 0;
uiLayout *row = &layout->row(true);
uiItemPointerR(row, ptr, vgroup_prop, ob_ptr, "vertex_groups", text, ICON_GROUP_VERTEX);
row->prop_search(ptr, vgroup_prop, ob_ptr, "vertex_groups", text, ICON_GROUP_VERTEX);
if (invert_vgroup_prop) {
uiLayout *sub = &row->row(true);
sub->active_set(has_vertex_group);

View File

@@ -305,8 +305,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
layout->use_property_split_set(true);
uiItemPointerR(
layout, ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
layout->prop_search(ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
/* Aspect and Scale are only used for camera projectors. */
bool has_camera = false;

View File

@@ -251,8 +251,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
layout->use_property_split_set(true);
uiItemPointerR(
layout, ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
layout->prop_search(ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
col = &layout->column(false);
col->prop(ptr, "center", UI_ITEM_NONE, std::nullopt, ICON_NONE);
@@ -266,15 +265,14 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
warp_obj_ptr = RNA_pointer_get(ptr, "object_from");
if (!RNA_pointer_is_null(&warp_obj_ptr) && RNA_enum_get(&warp_obj_ptr, "type") == OB_ARMATURE) {
PointerRNA warp_obj_data_ptr = RNA_pointer_get(&warp_obj_ptr, "data");
uiItemPointerR(
col, ptr, "bone_from", &warp_obj_data_ptr, "bones", std::nullopt, ICON_BONE_DATA);
col->prop_search(ptr, "bone_from", &warp_obj_data_ptr, "bones", std::nullopt, ICON_BONE_DATA);
}
col->prop(ptr, "object_to", UI_ITEM_NONE, CTX_IFACE_(BLT_I18NCONTEXT_MODIFIER, "To"), ICON_NONE);
warp_obj_ptr = RNA_pointer_get(ptr, "object_to");
if (!RNA_pointer_is_null(&warp_obj_ptr) && RNA_enum_get(&warp_obj_ptr, "type") == OB_ARMATURE) {
PointerRNA warp_obj_data_ptr = RNA_pointer_get(&warp_obj_ptr, "data");
uiItemPointerR(col, ptr, "bone_to", &warp_obj_data_ptr, "bones", std::nullopt, ICON_BONE_DATA);
col->prop_search(ptr, "bone_to", &warp_obj_data_ptr, "bones", std::nullopt, ICON_BONE_DATA);
}
modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", std::nullopt);

View File

@@ -355,8 +355,8 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
if (!RNA_pointer_is_null(&from_obj_ptr) && RNA_enum_get(&from_obj_ptr, "type") == OB_ARMATURE) {
PointerRNA from_obj_data_ptr = RNA_pointer_get(&from_obj_ptr, "data");
uiItemPointerR(
col, ptr, "bone_from", &from_obj_data_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
col->prop_search(
ptr, "bone_from", &from_obj_data_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
}
col = &layout->column(true);
@@ -364,7 +364,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
PointerRNA to_obj_ptr = RNA_pointer_get(ptr, "object_to");
if (!RNA_pointer_is_null(&to_obj_ptr) && RNA_enum_get(&to_obj_ptr, "type") == OB_ARMATURE) {
PointerRNA to_obj_data_ptr = RNA_pointer_get(&to_obj_ptr, "data");
uiItemPointerR(col, ptr, "bone_to", &to_obj_data_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
col->prop_search(ptr, "bone_to", &to_obj_data_ptr, "bones", IFACE_("Bone"), ICON_BONE_DATA);
}
layout->prop(ptr, "use_volume_preserve", UI_ITEM_NONE, std::nullopt, ICON_NONE);
@@ -420,18 +420,17 @@ static void texture_panel_draw(const bContext *C, Panel *panel)
(RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE))
{
PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
uiItemPointerR(col,
ptr,
"texture_coords_bone",
&texture_coords_obj_data_ptr,
"bones",
IFACE_("Bone"),
ICON_NONE);
col->prop_search(ptr,
"texture_coords_bone",
&texture_coords_obj_data_ptr,
"bones",
IFACE_("Bone"),
ICON_NONE);
}
}
else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
col->prop_search(ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
}
}

View File

@@ -382,18 +382,17 @@ static void texture_panel_draw(const bContext *C, Panel *panel)
(RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE))
{
PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
uiItemPointerR(col,
ptr,
"texture_coords_bone",
&texture_coords_obj_data_ptr,
"bones",
IFACE_("Bone"),
ICON_NONE);
col->prop_search(ptr,
"texture_coords_bone",
&texture_coords_obj_data_ptr,
"bones",
IFACE_("Bone"),
ICON_NONE);
}
}
else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
col->prop_search(ptr, "uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_GROUP_UVS);
}
}

View File

@@ -345,8 +345,8 @@ void weightvg_ui_common(const bContext *C, PointerRNA *ob_ptr, PointerRNA *ptr,
}
else if (mask_tex_mapping == MOD_DISP_MAP_UV && RNA_enum_get(ob_ptr, "type") == OB_MESH) {
PointerRNA obj_data_ptr = RNA_pointer_get(ob_ptr, "data");
uiItemPointerR(
layout, ptr, "mask_tex_uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_NONE);
layout->prop_search(
ptr, "mask_tex_uv_layer", &obj_data_ptr, "uv_layers", std::nullopt, ICON_NONE);
}
}
}

View File

@@ -295,8 +295,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
layout->use_property_split_set(true);
col = &layout->column(true);
uiItemPointerR(
col, ptr, "vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_GROUP_VERTEX);
col->prop_search(ptr, "vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_GROUP_VERTEX);
layout->prop(ptr, "default_weight", UI_ITEM_R_SLIDER, std::nullopt, ICON_NONE);

View File

@@ -635,8 +635,8 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
layout->use_property_split_set(true);
uiItemPointerR(
layout, ptr, "vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_GROUP_VERTEX);
layout->prop_search(
ptr, "vertex_group", &ob_ptr, "vertex_groups", std::nullopt, ICON_GROUP_VERTEX);
layout->prop(ptr, "target", UI_ITEM_NONE, std::nullopt, ICON_NONE);

View File

@@ -81,7 +81,7 @@ static void node_composit_buts_keyingscreen(uiLayout *layout, bContext *C, Point
&clip->id, &RNA_MovieTracking, &clip->tracking);
col = &layout->column(true);
uiItemPointerR(col, ptr, "tracking_object", &tracking_ptr, "objects", "", ICON_OBJECT_DATA);
col->prop_search(ptr, "tracking_object", &tracking_ptr, "objects", "", ICON_OBJECT_DATA);
}
}

View File

@@ -61,7 +61,7 @@ static void cmp_node_planetrackdeform_declare(NodeDeclarationBuilder &b)
&clip->id, &RNA_MovieTracking, tracking);
uiLayout *col = &layout->column(false);
uiItemPointerR(col, ptr, "tracking_object", &tracking_ptr, "objects", "", ICON_OBJECT_DATA);
col->prop_search(ptr, "tracking_object", &tracking_ptr, "objects", "", ICON_OBJECT_DATA);
tracking_object = BKE_tracking_object_get_named(tracking,
node_storage(*node).tracking_object);
@@ -69,8 +69,7 @@ static void cmp_node_planetrackdeform_declare(NodeDeclarationBuilder &b)
PointerRNA object_ptr = RNA_pointer_create_discrete(
&clip->id, &RNA_MovieTrackingObject, tracking_object);
uiItemPointerR(
col, ptr, "plane_track_name", &object_ptr, "plane_tracks", "", ICON_ANIM_DATA);
col->prop_search(ptr, "plane_track_name", &object_ptr, "plane_tracks", "", ICON_ANIM_DATA);
}
else {
layout->prop(ptr, "plane_track_name", UI_ITEM_NONE, "", ICON_ANIM_DATA);

View File

@@ -80,14 +80,14 @@ static void node_composit_buts_trackpos(uiLayout *layout, bContext *C, PointerRN
PointerRNA tracking_ptr = RNA_pointer_create_discrete(&clip->id, &RNA_MovieTracking, tracking);
col = &layout->column(false);
uiItemPointerR(col, ptr, "tracking_object", &tracking_ptr, "objects", "", ICON_OBJECT_DATA);
col->prop_search(ptr, "tracking_object", &tracking_ptr, "objects", "", ICON_OBJECT_DATA);
tracking_object = BKE_tracking_object_get_named(tracking, data->tracking_object);
if (tracking_object) {
PointerRNA object_ptr = RNA_pointer_create_discrete(
&clip->id, &RNA_MovieTrackingObject, tracking_object);
uiItemPointerR(col, ptr, "track_name", &object_ptr, "tracks", "", ICON_ANIM_DATA);
col->prop_search(ptr, "track_name", &object_ptr, "tracks", "", ICON_ANIM_DATA);
}
else {
layout->prop(ptr, "track_name", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_ANIM_DATA);

View File

@@ -494,36 +494,35 @@ static void draw_property_for_socket(DrawGroupInputsContext &ctx,
const std::string rna_path = fmt::format("[\"{}\"]", BLI_str_escape(identifier.c_str()));
/* Use #uiItemPointerR to draw pointer properties because #uiLayout::prop would not have enough
* information about what type of ID to select for editing the values. This is because
/* Use #uiLayout::prop_search to draw pointer properties because #uiLayout::prop would not have
* enough information about what type of ID to select for editing the values. This is because
* pointer IDProperties contain no information about their type. */
const bke::bNodeSocketType *typeinfo = socket.socket_typeinfo();
const eNodeSocketDatatype type = typeinfo ? typeinfo->type : SOCK_CUSTOM;
const char *name = socket.name ? IFACE_(socket.name) : "";
switch (type) {
case SOCK_OBJECT: {
uiItemPointerR(
row, ctx.properties_ptr, rna_path, ctx.bmain_ptr, "objects", name, ICON_OBJECT_DATA);
row->prop_search(
ctx.properties_ptr, rna_path, ctx.bmain_ptr, "objects", name, ICON_OBJECT_DATA);
break;
}
case SOCK_COLLECTION: {
uiItemPointerR(row,
ctx.properties_ptr,
rna_path,
ctx.bmain_ptr,
"collections",
name,
ICON_OUTLINER_COLLECTION);
row->prop_search(ctx.properties_ptr,
rna_path,
ctx.bmain_ptr,
"collections",
name,
ICON_OUTLINER_COLLECTION);
break;
}
case SOCK_MATERIAL: {
uiItemPointerR(
row, ctx.properties_ptr, rna_path, ctx.bmain_ptr, "materials", name, ICON_MATERIAL);
row->prop_search(
ctx.properties_ptr, rna_path, ctx.bmain_ptr, "materials", name, ICON_MATERIAL);
break;
}
case SOCK_TEXTURE: {
uiItemPointerR(
row, ctx.properties_ptr, rna_path, ctx.bmain_ptr, "textures", name, ICON_TEXTURE);
row->prop_search(
ctx.properties_ptr, rna_path, ctx.bmain_ptr, "textures", name, ICON_TEXTURE);
break;
}
case SOCK_IMAGE: {

View File

@@ -46,7 +46,7 @@ static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRN
if (depsgraph) {
Object *object_eval = DEG_get_evaluated(depsgraph, object);
PointerRNA dataptr = RNA_id_pointer_create(static_cast<ID *>(object_eval->data));
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
layout->prop_search(ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
return;
}
}

View File

@@ -35,7 +35,7 @@ static void node_shader_buts_tangent(uiLayout *layout, bContext *C, PointerRNA *
if (depsgraph) {
Object *object_eval = DEG_get_evaluated(depsgraph, object);
PointerRNA dataptr = RNA_id_pointer_create(static_cast<ID *>(object_eval->data));
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
layout->prop_search(ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
return;
}
}

View File

@@ -37,7 +37,7 @@ static void node_shader_buts_uvmap(uiLayout *layout, bContext *C, PointerRNA *pt
if (depsgraph) {
Object *object_eval = DEG_get_evaluated(depsgraph, object);
PointerRNA dataptr = RNA_id_pointer_create(static_cast<ID *>(object_eval->data));
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
layout->prop_search(ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
return;
}
}

View File

@@ -33,7 +33,7 @@ static void node_shader_buts_vertex_color(uiLayout *layout, bContext *C, Pointer
if (depsgraph) {
Object *object_eval = DEG_get_evaluated(depsgraph, object);
PointerRNA dataptr = RNA_id_pointer_create(static_cast<ID *>(object_eval->data));
uiItemPointerR(layout, ptr, "layer_name", &dataptr, "color_attributes", "", ICON_GROUP_VCOL);
layout->prop_search(ptr, "layer_name", &dataptr, "color_attributes", "", ICON_GROUP_VCOL);
return;
}
}