/* Dynamically populate an enum of Keying Sets */ EnumPropertyItem *ANIM_keying_sets_enum_itemf (bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Scene *scene = CTX_data_scene(C); KeyingSet *ks; EnumPropertyItem *item= NULL, item_tmp= {0}; int totitem= 0; int i= 0; if (C == NULL) { return DummyRNA_DEFAULT_items; } /* active Keying Set * - only include entry if it exists */ if (scene->active_keyingset) { /* active Keying Set */ item_tmp.identifier= item_tmp.name= "Active Keying Set"; item_tmp.value= i++; RNA_enum_item_add(&item, &totitem, &item_tmp); /* separator */ RNA_enum_item_add_separator(&item, &totitem); } else i++; /* user-defined Keying Sets * - these are listed in the order in which they were defined for the active scene */ if (scene->keyingsets.first) { for (ks= scene->keyingsets.first; ks; ks= ks->next) { if (ANIM_keyingset_context_ok_poll(C, ks)) { item_tmp.identifier= item_tmp.name= ks->name; item_tmp.value= i++; RNA_enum_item_add(&item, &totitem, &item_tmp); } } /* separator */ RNA_enum_item_add_separator(&item, &totitem); } /* builtin Keying Sets */ i= -1; for (ks= builtin_keyingsets.first; ks; ks= ks->next) { /* only show KeyingSet if context is suitable */ if (ANIM_keyingset_context_ok_poll(C, ks)) { item_tmp.identifier= item_tmp.name= ks->name; item_tmp.value= i--; RNA_enum_item_add(&item, &totitem, &item_tmp); } } RNA_enum_item_end(&item, &totitem); *free= 1; return item; }
/* Note: rna_enum_dt_mix_mode_items enum is from rna_modifier.c */ static EnumPropertyItem *dt_mix_mode_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) { EnumPropertyItem *item = NULL; int totitem = 0; const int dtdata_type = RNA_enum_get(ptr, "data_type"); bool support_advanced_mixing, support_threshold; if (!C) { /* needed for docs and i18n tools */ return rna_enum_dt_mix_mode_items; } RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_TRANSFER); BKE_object_data_transfer_get_dttypes_capacity(dtdata_type, &support_advanced_mixing, &support_threshold); if (support_threshold) { RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_ABOVE_THRESHOLD); RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_BELOW_THRESHOLD); } if (support_advanced_mixing) { RNA_enum_item_add_separator(&item, &totitem); RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MIX); RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_ADD); RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_SUB); RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MUL); } RNA_enum_item_end(&item, &totitem); *r_free = true; return item; }
/* Existing + Option to add/use new layer */ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf( bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free) { bGPdata *gpd = CTX_data_gpencil_data(C); bGPDlayer *gpl; EnumPropertyItem *item = NULL, item_tmp = {0}; int totitem = 0; int i = 0; if (ELEM(NULL, C, gpd)) { return DummyRNA_DEFAULT_items; } /* Create new layer */ /* TODO: have some way of specifying that we don't want this? */ { /* active Keying Set */ item_tmp.identifier = "__CREATE__"; item_tmp.name = "New Layer"; item_tmp.value = -1; item_tmp.icon = ICON_ZOOMIN; RNA_enum_item_add(&item, &totitem, &item_tmp); /* separator */ RNA_enum_item_add_separator(&item, &totitem); } /* Existing layers */ for (gpl = gpd->layers.first, i = 0; gpl; gpl = gpl->next, i++) { item_tmp.identifier = gpl->info; item_tmp.name = gpl->info; item_tmp.value = i; if (gpl->flag & GP_LAYER_ACTIVE) item_tmp.icon = ICON_GREASEPENCIL; else item_tmp.icon = ICON_NONE; RNA_enum_item_add(&item, &totitem, &item_tmp); } RNA_enum_item_end(&item, &totitem); *r_free = true; return item; }
/* can be called with C == NULL */ static EnumPropertyItem *group_object_active_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free) { Object *ob; EnumPropertyItem *item = NULL, item_tmp = {0}; int totitem = 0; if (C == NULL) { return DummyRNA_NULL_items; } ob = ED_object_context(C); /* check that the object exists */ if (ob) { Group *group; int i = 0, count = 0; /* if 2 or more groups, add option to add to all groups */ group = NULL; while ((group = BKE_group_object_find(group, ob))) count++; if (count >= 2) { item_tmp.identifier = item_tmp.name = "All Groups"; item_tmp.value = INT_MAX; /* this will give NULL on lookup */ RNA_enum_item_add(&item, &totitem, &item_tmp); RNA_enum_item_add_separator(&item, &totitem); } /* add groups */ group = NULL; while ((group = BKE_group_object_find(group, ob))) { item_tmp.identifier = item_tmp.name = group->id.name + 2; /* item_tmp.icon = ICON_ARMATURE_DATA; */ item_tmp.value = i; RNA_enum_item_add(&item, &totitem, &item_tmp); i++; } } RNA_enum_item_end(&item, &totitem); *r_free = true; return item; }
/* Note: rna_enum_dt_layers_select_src_items enum is from rna_modifier.c */ static EnumPropertyItem *dt_layers_select_src_itemf( bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) { EnumPropertyItem *item = NULL, tmp_item = {0}; int totitem = 0; const int data_type = RNA_enum_get(ptr, "data_type"); if (!C) { /* needed for docs and i18n tools */ return rna_enum_dt_layers_select_src_items; } RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ACTIVE_SRC); RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC); if (data_type == DT_TYPE_MDEFORMVERT) { Object *ob_src = CTX_data_active_object(C); if (BKE_object_pose_armature_get(ob_src)) { RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_SELECT); RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_DEFORM); } if (ob_src) { bDeformGroup *dg; int i; RNA_enum_item_add_separator(&item, &totitem); for (i = 0, dg = ob_src->defbase.first; dg; i++, dg = dg->next) { tmp_item.value = i; tmp_item.identifier = tmp_item.name = dg->name; RNA_enum_item_add(&item, &totitem, &tmp_item); } } } else if (data_type == DT_TYPE_SHAPEKEY) { /* TODO */ } else if (data_type == DT_TYPE_UV) { Object *ob_src = CTX_data_active_object(C); Scene *scene = CTX_data_scene(C); if (ob_src) { DerivedMesh *dm_src; CustomData *pdata; int num_data, i; /* XXX Is this OK? */ dm_src = mesh_get_derived_final(scene, ob_src, CD_MASK_BAREMESH | CD_MTEXPOLY); pdata = dm_src->getPolyDataLayout(dm_src); num_data = CustomData_number_of_layers(pdata, CD_MTEXPOLY); RNA_enum_item_add_separator(&item, &totitem); for (i = 0; i < num_data; i++) { tmp_item.value = i; tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(pdata, CD_MTEXPOLY, i); RNA_enum_item_add(&item, &totitem, &tmp_item); } } } else if (data_type == DT_TYPE_VCOL) { Object *ob_src = CTX_data_active_object(C); Scene *scene = CTX_data_scene(C); if (ob_src) { DerivedMesh *dm_src; CustomData *ldata; int num_data, i; /* XXX Is this OK? */ dm_src = mesh_get_derived_final(scene, ob_src, CD_MASK_BAREMESH | CD_MLOOPCOL); ldata = dm_src->getLoopDataLayout(dm_src); num_data = CustomData_number_of_layers(ldata, CD_MLOOPCOL); RNA_enum_item_add_separator(&item, &totitem); for (i = 0; i < num_data; i++) { tmp_item.value = i; tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(ldata, CD_MLOOPCOL, i); RNA_enum_item_add(&item, &totitem, &tmp_item); } } } RNA_enum_item_end(&item, &totitem); *r_free = true; return item; }