diff options
5 files changed, 25 insertions, 2 deletions
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.h b/source/blender/windowmanager/gizmo/WM_gizmo_api.h index 667646cf601..2a4f6b344a9 100644 --- a/source/blender/windowmanager/gizmo/WM_gizmo_api.h +++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.h @@ -83,6 +83,8 @@ struct wmGizmoOpElem *WM_gizmo_operator_get( struct PointerRNA *WM_gizmo_operator_set( struct wmGizmo *gz, int part_index, struct wmOperatorType *ot, struct IDProperty *properties); +int WM_gizmo_operator_invoke( + struct bContext *C, struct wmGizmo *gz, struct wmGizmoOpElem *gzop); /* callbacks */ void WM_gizmo_set_fn_custom_modal(struct wmGizmo *gz, wmGizmoFnModal fn); diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.h b/source/blender/windowmanager/gizmo/WM_gizmo_types.h index c92172dff15..ee574d26750 100644 --- a/source/blender/windowmanager/gizmo/WM_gizmo_types.h +++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.h @@ -87,6 +87,9 @@ typedef enum eWM_GizmoFlag { WM_GIZMO_MOVE_CURSOR = (1 << 7), /** Don't write into the depth buffer when selecting. */ WM_GIZMO_SELECT_BACKGROUND = (1 << 8), + + /** Use the active tools operator properties when running as an operator. */ + WM_GIZMO_OPERATOR_TOOL_INIT = (1 << 9), } eWM_GizmoFlag; /** diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c index 0bef33a8855..00586816933 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c @@ -48,6 +48,7 @@ #include "BKE_idprop.h" #include "WM_api.h" +#include "WM_toolsystem.h" #include "WM_types.h" #include "ED_screen.h" @@ -271,6 +272,23 @@ PointerRNA *WM_gizmo_operator_set( return &gzop->ptr; } +int WM_gizmo_operator_invoke(bContext *C, wmGizmo *gz, wmGizmoOpElem *gzop) +{ + if (gz->flag & WM_GIZMO_OPERATOR_TOOL_INIT) { + /* Merge toolsettings into the gizmo properties. */ + PointerRNA tref_ptr; + bToolRef *tref = WM_toolsystem_ref_from_context(C); + if (tref && WM_toolsystem_ref_properties_get_from_operator(tref, gzop->type, &tref_ptr)) { + if (gzop->ptr.data == NULL) { + IDPropertyTemplate val = {0}; + gzop->ptr.data = IDP_New(IDP_GROUP, &val, "wmOperatorProperties"); + } + IDP_MergeGroup(gzop->ptr.data, tref_ptr.data, false); + } + } + return WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr); +} + static void wm_gizmo_set_matrix_rotation_from_z_axis__internal( float matrix[4][4], const float z_axis[3]) { diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c index 89df826617b..8483b251cec 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c @@ -404,7 +404,7 @@ static bool gizmo_tweak_start_and_finish( gz->parent_gzgroup->type->invoke_prepare(C, gz->parent_gzgroup, gz); } /* Allow for 'button' gizmos, single click to run an action. */ - WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr); + WM_gizmo_operator_invoke(C, gz, gzop); } return true; } diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c index 68c736404e8..26355151a40 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c @@ -971,7 +971,7 @@ void wm_gizmomap_modal_set( struct wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, gz->highlight_part); if (gzop && gzop->type) { - const int retval = WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr); + const int retval = WM_gizmo_operator_invoke(C, gz, gzop); if ((retval & OPERATOR_RUNNING_MODAL) == 0) { wm_gizmomap_modal_set(gzmap, C, gz, event, false); } |