* Enums can now be dynamically created in the _itemf callback,
  using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
  for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
  for operators. This doesn't fit design well at all, needed to do
  some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
  _itemf callback, for docs and fallback in case there is no context.

* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
  (unselected, deselect), to make them consistent with other ops.
This commit is contained in:
2009-07-10 19:56:13 +00:00
parent a95c68a3ea
commit 2e3e044d27
28 changed files with 383 additions and 241 deletions

View File

@@ -5799,29 +5799,38 @@ static EnumPropertyItem merge_type_items[]= {
{5, "COLLAPSE", 0, "Collapse", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem *merge_type_itemf(PointerRNA *ptr)
static EnumPropertyItem *merge_type_itemf(bContext *C, PointerRNA *ptr, int *free)
{
/* XXX need context here */
#if 0
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
if(em->selectmode & SCE_SELECT_VERTEX)
if(em->selected.first && em->selected.last &&
((EditSelection*)em->selected.first)->type == EDITVERT && ((EditSelection*)em->selected.last)->type == EDITVERT)
event = pupmenu("Merge %t|At First %x6|At Last%x1|At Center%x3|At Cursor%x4|Collapse%x2");
else if (em->selected.first && ((EditSelection*)em->selected.first)->type == EDITVERT)
event = pupmenu("Merge %t|At First %x6|At Center%x3|At Cursor%x4|Collapse%x2");
else if (em->selected.last && ((EditSelection*)em->selected.last)->type == EDITVERT)
event = pupmenu("Merge %t|At Last %x1|At Center%x3|At Cursor%x4|Collapse%x2");
else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse%x2");
else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse%x2");
if(obedit && obedit->type == OB_MESH) {
EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
EnumPropertyItem *item= NULL;
int totitem= 0;
BKE_mesh_end_editmesh(obedit->data, em);
#endif
if(em->selectmode & SCE_SELECT_VERTEX) {
if(em->selected.first && em->selected.last &&
((EditSelection*)em->selected.first)->type == EDITVERT && ((EditSelection*)em->selected.last)->type == EDITVERT) {
RNA_enum_item_add(&item, &totitem, &merge_type_items[0]);
RNA_enum_item_add(&item, &totitem, &merge_type_items[1]);
}
else if(em->selected.first && ((EditSelection*)em->selected.first)->type == EDITVERT)
RNA_enum_item_add(&item, &totitem, &merge_type_items[1]);
else if(em->selected.last && ((EditSelection*)em->selected.last)->type == EDITVERT)
RNA_enum_item_add(&item, &totitem, &merge_type_items[0]);
}
return merge_type_items;
RNA_enum_item_add(&item, &totitem, &merge_type_items[2]);
RNA_enum_item_add(&item, &totitem, &merge_type_items[3]);
RNA_enum_item_add(&item, &totitem, &merge_type_items[4]);
RNA_enum_item_end(&item, &totitem);
*free= 1;
return item;
}
return NULL;
}
void MESH_OT_merge(wmOperatorType *ot)
@@ -5841,7 +5850,7 @@ void MESH_OT_merge(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
prop= RNA_def_enum(ot->srna, "type", merge_type_items, 6, "Type", "Merge method to use.");
prop= RNA_def_enum(ot->srna, "type", merge_type_items, 3, "Type", "Merge method to use.");
RNA_def_enum_funcs(prop, merge_type_itemf);
RNA_def_boolean(ot->srna, "uvs", 0, "UVs", "Move UVs according to merge.");
}