[Bf-blender-cvs] [eca3250] wiggly-widgets: Little experiment: hook up a transform operator to a bone facemap. For now moves the mesh only, doesn't set the bone as selected.

Antony Riakiotakis noreply at git.blender.org
Mon Dec 22 12:04:52 CET 2014


Commit: eca3250c89aebfdc2d0cc96bf39a7dc1cd87b113
Author: Antony Riakiotakis
Date:   Mon Dec 22 12:04:45 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBeca3250c89aebfdc2d0cc96bf39a7dc1cd87b113

Little experiment: hook up a transform operator to a bone facemap. For
now moves the mesh only, doesn't set the bone as selected.

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

M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/windowmanager/intern/wm_widgets.c

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

diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index fdd993d..bad2fa7 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -809,6 +809,7 @@ static void WIDGETGROUP_armature_facemap_draw(const struct bContext *C, struct w
 	wmWidget *widget;
 	Object *armature;
 	PointerRNA famapptr;
+	PropertyRNA *prop;
 	ModifierData *md;
 	VirtualModifierData virtualModifierData;
 	int index = 0;
@@ -830,9 +831,14 @@ static void WIDGETGROUP_armature_facemap_draw(const struct bContext *C, struct w
 	
 	for (; fmap; fmap = fmap->next, index++) {
 		if (BKE_pose_channel_find_name(armature->pose, fmap->name)) {
+			PointerRNA *opptr;
 			widget = WIDGET_facemap_new(wgroup, 0, ob, index);
 			RNA_pointer_create(&ob->id, &RNA_FaceMap, fmap, &famapptr);
 			WM_widget_property(widget, FACEMAP_SLOT_FACEMAP, &famapptr, "name");
+			opptr = WM_widget_operator(widget, "TRANSFORM_OT_translate");
+			if ((prop = RNA_struct_find_property(opptr, "release_confirm"))) {
+				RNA_property_boolean_set(opptr, prop, true);
+			}
 			WIDGET_facemap_set_color(widget, color_shape);
 			WM_widget_set_draw_on_hover_only(widget, true);
 		}
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index 08ac745..9f02428 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -201,6 +201,9 @@ PointerRNA *WM_widget_operator(struct wmWidget *widget, const char *opname)
 		
 		return &widget->opptr;
 	}
+	else {
+		fprintf(stderr, "Error binding operator to widget: operator %s not found!\n", opname);
+	}
 	
 	return NULL;
 }
@@ -242,7 +245,7 @@ static bool widgets_compare(wmWidget *widget, wmWidget *widget2)
 {
 	int i;
 	
-	if (widget->max_prop != widget2->max_prop || widget->opptr.data != widget2->opptr.data)
+	if (widget->max_prop != widget2->max_prop)
 		return false;
 	
 	for (i = 0; i < widget->max_prop; i++) {
@@ -682,21 +685,18 @@ struct wmWidget *wm_widgetmap_get_highlighted_widget(struct wmWidgetMap *wmap)
 void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C, struct wmEvent *event, struct wmWidget *widget, bool call_op)
 {
 	if (widget) {
-		if (!widget->handler) {
-			/* widget does nothing, pass */
-			wmap->active_widget = NULL;
-		}
-		else if (call_op) {
+		if (call_op) {
 			wmOperatorType *ot;
 			const char *opname = (widget->opname) ? widget->opname : "WM_OT_widget_tweak";
 			
 			ot = WM_operatortype_find(opname, 0);
 			
 			if (ot) {
-				widget->flag |= WM_WIDGET_ACTIVE;
 				/* first activate the widget itself */
-				if (widget->invoke) {
+				if (widget->invoke && widget->handler) {
+					widget->flag |= WM_WIDGET_ACTIVE;
 					widget->invoke(C, event, widget);
+					wmap->active_widget = widget;
 				}
 
 				/* if operator runs modal, we will need to activate the current widgetmap on the operator handler, so it can
@@ -707,7 +707,6 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
 					
 					if (handler && handler->op && handler->op->type == ot) {
 						handler->widgetmap = wmap;
-						wmap->active_widget = widget;
 					}
 				}
 				
@@ -729,11 +728,11 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
 			}
 		}
 		else {
-			widget->flag |= WM_WIDGET_ACTIVE;
-			if (widget->invoke) {
+			if (widget->invoke && widget->handler) {
+				widget->flag |= WM_WIDGET_ACTIVE;
 				widget->invoke(C, event, widget);
+				wmap->active_widget = widget;
 			}
-			wmap->active_widget = widget;
 		}
 	}
 	else {




More information about the Bf-blender-cvs mailing list