[Bf-blender-cvs] [12d7b71294a] ui-asset-view-template: Fix crash when showing empty shape-keys list
Julian Eisel
noreply at git.blender.org
Sun Mar 21 16:48:30 CET 2021
Commit: 12d7b71294acf5f5c3ea8f6b463641d938d71816
Author: Julian Eisel
Date: Sun Mar 21 16:46:36 2021 +0100
Branches: ui-asset-view-template
https://developer.blender.org/rB12d7b71294acf5f5c3ea8f6b463641d938d71816
Fix crash when showing empty shape-keys list
===================================================================
M source/blender/editors/interface/interface_templates.c
===================================================================
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 546f7e351bb..791b42d8c70 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -5832,9 +5832,9 @@ static void uilist_filter_items_default(struct uiList *ui_list,
* Populated through #ui_template_list_data_retrieve().
*/
typedef struct {
- PointerRNA *dataptr;
+ PointerRNA dataptr;
PropertyRNA *prop;
- PointerRNA *active_dataptr;
+ PointerRNA active_dataptr;
PropertyRNA *activeprop;
const char *item_dyntip_propname;
@@ -5893,6 +5893,8 @@ static bool ui_template_list_data_retrieve(const char *listtype_name,
TemplateListInputData *r_input_data,
uiListType **r_list_type)
{
+ memset(r_input_data, 0, sizeof(*r_input_data));
+
/* Forbid default UI_UL_DEFAULT_CLASS_NAME list class without a custom list_id! */
if (STREQ(UI_UL_DEFAULT_CLASS_NAME, listtype_name) && !(list_id && list_id[0])) {
RNA_warning("template_list using default '%s' UIList class must provide a custom list_id",
@@ -5905,8 +5907,8 @@ static bool ui_template_list_data_retrieve(const char *listtype_name,
return false;
}
+ r_input_data->dataptr = *dataptr;
if (dataptr->data) {
- r_input_data->dataptr = dataptr;
r_input_data->prop = RNA_struct_find_property(dataptr, propname);
if (!r_input_data->prop) {
RNA_warning("Property not found: %s.%s", RNA_struct_identifier(dataptr->type), propname);
@@ -5914,7 +5916,7 @@ static bool ui_template_list_data_retrieve(const char *listtype_name,
}
}
- r_input_data->active_dataptr = active_dataptr;
+ r_input_data->active_dataptr = *active_dataptr;
r_input_data->activeprop = RNA_struct_find_property(active_dataptr, active_propname);
if (!r_input_data->activeprop) {
RNA_warning(
@@ -5942,7 +5944,7 @@ static bool ui_template_list_data_retrieve(const char *listtype_name,
return false;
}
- r_input_data->active_item_idx = RNA_property_int_get(r_input_data->active_dataptr,
+ r_input_data->active_item_idx = RNA_property_int_get(&r_input_data->active_dataptr,
r_input_data->activeprop);
r_input_data->item_dyntip_propname = item_dyntip_propname;
@@ -6015,7 +6017,7 @@ static void ui_template_list_collect_items(PointerRNA *list_ptr,
*/
static void ui_template_list_collect_display_items(bContext *C,
uiList *ui_list,
- const TemplateListInputData *input_data,
+ TemplateListInputData *input_data,
const uiListFilterItemsFunc filter_items_fn,
TemplateListItems *r_items)
{
@@ -6023,7 +6025,7 @@ static void ui_template_list_collect_display_items(bContext *C,
memset(r_items, 0, sizeof(*r_items));
/* Filter list items! (not for compact layout, though) */
- if (input_data->dataptr->data && input_data->prop) {
+ if (input_data->dataptr.data && input_data->prop) {
const int filter_exclude = ui_list->filter_flag & UILST_FLT_EXCLUDE;
const bool order_reverse = (ui_list->filter_sort_flag & UILST_FLT_SORT_REVERSE) != 0;
int items_shown;
@@ -6033,11 +6035,11 @@ static void ui_template_list_collect_display_items(bContext *C,
if (ui_list->layout_type == UILST_LAYOUT_COMPACT) {
dyn_data->items_len = dyn_data->items_shown = RNA_property_collection_length(
- input_data->dataptr, input_data->prop);
+ &input_data->dataptr, input_data->prop);
}
else {
// printf("%s: filtering...\n", __func__);
- filter_items_fn(ui_list, C, input_data->dataptr, RNA_property_identifier(input_data->prop));
+ filter_items_fn(ui_list, C, &input_data->dataptr, RNA_property_identifier(input_data->prop));
// printf("%s: filtering done.\n", __func__);
}
@@ -6046,7 +6048,7 @@ static void ui_template_list_collect_display_items(bContext *C,
r_items->item_vec = MEM_mallocN(sizeof(*r_items->item_vec) * items_shown, __func__);
// printf("%s: items shown: %d.\n", __func__, items_shown);
- ui_template_list_collect_items(input_data->dataptr,
+ ui_template_list_collect_items(&input_data->dataptr,
input_data->prop,
dyn_data,
filter_exclude,
@@ -6246,8 +6248,8 @@ static void ui_template_list_layout_draw(bContext *C,
uiBlock *block = uiLayoutGetBlock(layout);
/* get icon */
- if (input_data->dataptr->data && input_data->prop) {
- StructRNA *ptype = RNA_property_pointer_type(input_data->dataptr, input_data->prop);
+ if (input_data->dataptr.data && input_data->prop) {
+ StructRNA *ptype = RNA_property_pointer_type(&input_data->dataptr, input_data->prop);
rnaicon = RNA_struct_ui_icon(ptype);
}
@@ -6255,7 +6257,7 @@ static void ui_template_list_layout_draw(bContext *C,
switch (ui_list->layout_type) {
case UILST_LAYOUT_DEFAULT: {
/* layout */
- box = uiLayoutListBox(layout, ui_list, input_data->active_dataptr, input_data->activeprop);
+ box = uiLayoutListBox(layout, ui_list, &input_data->active_dataptr, input_data->activeprop);
glob = uiLayoutColumn(box, true);
row = uiLayoutRow(glob, false);
col = uiLayoutColumn(row, true);
@@ -6266,7 +6268,7 @@ static void ui_template_list_layout_draw(bContext *C,
uilist_prepare(ui_list, items, &adjusted_layout_data, &visual_info);
int i = 0;
- if (input_data->dataptr->data && input_data->prop) {
+ if (input_data->dataptr.data && input_data->prop) {
/* create list items */
for (i = visual_info.start_idx; i < visual_info.end_idx; i++) {
PointerRNA *itemptr = &items->item_vec[i].item;
@@ -6290,7 +6292,7 @@ static void ui_template_list_layout_draw(bContext *C,
0,
UI_UNIT_X * 10,
UI_UNIT_Y,
- input_data->active_dataptr,
+ &input_data->active_dataptr,
input_data->activeprop,
0,
0,
@@ -6312,10 +6314,10 @@ static void ui_template_list_layout_draw(bContext *C,
layout_data->draw_item(ui_list,
C,
sub,
- input_data->dataptr,
+ &input_data->dataptr,
itemptr,
icon,
- input_data->active_dataptr,
+ &input_data->active_dataptr,
active_propname,
org_i,
flt_flag);
@@ -6360,7 +6362,7 @@ static void ui_template_list_layout_draw(bContext *C,
case UILST_LAYOUT_COMPACT:
row = uiLayoutRow(layout, true);
- if ((input_data->dataptr->data && input_data->prop) && (dyn_data->items_shown > 0) &&
+ if ((input_data->dataptr.data && input_data->prop) && (dyn_data->items_shown > 0) &&
(items->active_item_idx >= 0) && (items->active_item_idx < dyn_data->items_shown)) {
PointerRNA *itemptr = &items->item_vec[items->active_item_idx].item;
const int org_i = items->item_vec[items->active_item_idx].org_idx;
@@ -6372,10 +6374,10 @@ static void ui_template_list_layout_draw(bContext *C,
layout_data->draw_item(ui_list,
C,
row,
- input_data->dataptr,
+ &input_data->dataptr,
itemptr,
icon,
- input_data->active_dataptr,
+ &input_data->active_dataptr,
active_propname,
org_i,
0);
@@ -6396,7 +6398,7 @@ static void ui_template_list_layout_draw(bContext *C,
0,
UI_UNIT_X * 5,
UI_UNIT_Y,
- input_data->active_dataptr,
+ &input_data->active_dataptr,
input_data->activeprop,
0,
0,
@@ -6409,7 +6411,7 @@ static void ui_template_list_layout_draw(bContext *C,
}
break;
case UILST_LAYOUT_GRID: {
- box = uiLayoutListBox(layout, ui_list, input_data->active_dataptr, input_data->activeprop);
+ box = uiLayoutListBox(layout, ui_list, &input_data->active_dataptr, input_data->activeprop);
glob = uiLayoutColumn(box, true);
row = uiLayoutRow(glob, false);
col = uiLayoutColumn(row, true);
@@ -6418,7 +6420,7 @@ static void ui_template_list_layout_draw(bContext *C,
uilist_prepare(ui_list, items, layout_data, &visual_info);
int i = 0;
- if (input_data->dataptr->data && input_data->prop) {
+ if (input_data->dataptr.data && input_data->prop) {
/* create list items */
for (i = visual_info.start_idx; i < visual_info.end_idx; i++) {
PointerRNA *itemptr = &items->item_vec[i].item;
@@ -6446,7 +6448,7 @@ static void ui_template_list_layout_draw(bContext *C,
0,
UI_UNIT_X * 10,
UI_UNIT_Y,
- input_data->active_dataptr,
+ &input_data->active_dataptr,
input_data->activeprop,
0,
0,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list