[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