[Bf-blender-cvs] [082da58685a] hair_guides_grooming: Quicker invoke for the Add Region operator by selecting just the face map.

Lukas Tönne noreply at git.blender.org
Sat Jun 9 06:35:53 CEST 2018


Commit: 082da58685a3f7203f7a1375262e4daf43aa3138
Author: Lukas Tönne
Date:   Sat Jun 9 05:35:09 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rB082da58685a3f7203f7a1375262e4daf43aa3138

Quicker invoke for the Add Region operator by selecting just the face map.

===================================================================

M	source/blender/editors/groom/editgroom_region.c

===================================================================

diff --git a/source/blender/editors/groom/editgroom_region.c b/source/blender/editors/groom/editgroom_region.c
index 2812bc3da89..ea5ba59cd31 100644
--- a/source/blender/editors/groom/editgroom_region.c
+++ b/source/blender/editors/groom/editgroom_region.c
@@ -49,6 +49,7 @@
 
 #include "RNA_access.h"
 #include "RNA_define.h"
+#include "RNA_enum_types.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -90,28 +91,63 @@ static int region_add_poll(bContext *C)
 	return groom->scalp_object != NULL;
 }
 
+
+static const EnumPropertyItem *region_add_facemap_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
+{
+	if (C == NULL) {
+		return DummyRNA_NULL_items;
+	}
+	Object *ob = ED_object_context(C);
+	if (!ob || ob->type != OB_GROOM)
+	{
+		return DummyRNA_NULL_items;
+	}
+	Groom *groom = ob->data;
+	Object *scalp_ob = groom->scalp_object;
+	if (!scalp_ob)
+	{
+		return DummyRNA_NULL_items;
+	}
+
+	EnumPropertyItem *item = NULL, item_tmp = {0};
+	int totitem = 0;
+
+	int i = 0;
+	for (bFaceMap *fmap = scalp_ob->fmaps.first; fmap; fmap = fmap->next, ++i)
+	{
+		item_tmp.identifier = fmap->name;
+		item_tmp.name = fmap->name;
+		item_tmp.description = "";
+		item_tmp.value = i;
+		RNA_enum_item_add(&item, &totitem, &item_tmp);
+	}
+
+	RNA_enum_item_end(&item, &totitem);
+	*r_free = true;
+
+	return item;
+}
+
 static int region_add_exec(bContext *C, wmOperator *op)
 {
 	const Depsgraph *depsgraph = CTX_data_depsgraph(C);
 	Object *ob = ED_object_context(C);
 	Groom *groom = ob->data;
-	char scalp_facemap_name[MAX_VGROUP_NAME];
-	RNA_string_get(op->ptr, "scalp_facemap", scalp_facemap_name);
-	if (scalp_facemap_name[0] == '\0' ||
-	    !BKE_object_facemap_find_name(groom->scalp_object, scalp_facemap_name))
+	if (!groom->scalp_object)
 	{
 		return OPERATOR_CANCELLED;
 	}
 
-	WM_operator_view3d_unit_defaults(C, op);
-
-	float loc[3], rot[3];
-	unsigned int layer;
-	if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL))
+	char scalp_facemap_name[MAX_VGROUP_NAME];
+	int fmap_index = RNA_enum_get(op->ptr, "scalp_facemap");
+	bFaceMap *fmap = BLI_findlink(&groom->scalp_object->fmaps, fmap_index);
+	if (!fmap)
+	{
 		return OPERATOR_CANCELLED;
+	}
+	BLI_strncpy(scalp_facemap_name, fmap->name, sizeof(scalp_facemap_name));
 
-	float mat[4][4];
-	ED_object_new_primitive_matrix(C, ob, loc, rot, mat);
+	WM_operator_view3d_unit_defaults(C, op);
 
 	GroomRegion *region = MEM_callocN(sizeof(GroomRegion), "groom region");
 	ListBase *regions = (groom->editgroom ? &groom->editgroom->regions : &groom->regions);
@@ -142,26 +178,10 @@ static int region_add_exec(bContext *C, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
-static void region_add_draw(bContext *C, wmOperator *op)
-{
-	uiLayout *layout = op->layout;
-	Object *ob = ED_object_context(C);
-	Groom *groom = ob->data;
-	PointerRNA scalp_ob_ptr;
-	RNA_id_pointer_create(&groom->scalp_object->id, &scalp_ob_ptr);
-
-	if (groom->scalp_object)
-	{
-		uiItemPointerR(layout, op->ptr, "scalp_facemap", &scalp_ob_ptr, "face_maps", NULL, ICON_NONE);
-	}
-	else
-	{
-		uiItemR(layout, op->ptr, "scalp_facemap", 0, NULL, ICON_NONE);
-	}
-}
-
 void GROOM_OT_region_add(wmOperatorType *ot)
 {
+	PropertyRNA *prop;
+
 	/* identifiers */
 	ot->name = "Add Region";
 	ot->description = "Add a new region to the groom object";
@@ -170,14 +190,15 @@ void GROOM_OT_region_add(wmOperatorType *ot)
 	/* api callbacks */
 	ot->exec = region_add_exec;
 	ot->poll = region_add_poll;
-	ot->invoke = WM_operator_props_popup_confirm;
-	ot->ui = region_add_draw;
+	ot->invoke = WM_enum_search_invoke;
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
-	ED_object_add_generic_props(ot, false);
-	RNA_def_string(ot->srna, "scalp_facemap", NULL, MAX_VGROUP_NAME, "Scalp Facemap Name", "Facemap to which to bind the new region");
+	prop = RNA_def_enum(ot->srna, "scalp_facemap", DummyRNA_NULL_items, 0, "Scalp Facemap", "Facemap to which to bind the new region");
+	RNA_def_enum_funcs(prop, region_add_facemap_itemf);
+	RNA_def_property_flag(prop, PROP_ENUM_NO_TRANSLATE);
+	ot->prop = prop;
 }
 
 /* GROOM_OT_region_bind */



More information about the Bf-blender-cvs mailing list