diff options
Diffstat (limited to 'source/blender/windowmanager')
3 files changed, 78 insertions, 35 deletions
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.h b/source/blender/windowmanager/gizmo/WM_gizmo_api.h index 4c24762416e..bef3cd51aea 100644 --- a/source/blender/windowmanager/gizmo/WM_gizmo_api.h +++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.h @@ -235,14 +235,21 @@ void WM_gizmo_target_property_subscribe_all(struct wmGizmo *gz, /* wmGizmoGroup */ /* Callbacks for 'wmGizmoGroupType.setup_keymap' */ -struct wmKeyMap *WM_gizmogroup_keymap_common_with_name(const struct wmGizmoGroupType *gzgt, - struct wmKeyConfig *config, - const char *idname); -struct wmKeyMap *WM_gizmogroup_keymap_common(const struct wmGizmoGroupType *gzgt, - struct wmKeyConfig *config); - -struct wmKeyMap *WM_gizmogroup_keymap_common_select(const struct wmGizmoGroupType *gzgt, - struct wmKeyConfig *config); +struct wmKeyMap *WM_gizmogroup_keymap_template_ex(struct wmKeyConfig *config, + const char *idname, + const struct wmGizmoMapType_Params *params); +struct wmKeyMap *WM_gizmogroup_keymap_template(const struct wmGizmoGroupType *gzgt, + struct wmKeyConfig *config); + +struct wmKeyMap *WM_gizmogroup_keymap_template_select_ex( + struct wmKeyConfig *config, const char *idname, const struct wmGizmoMapType_Params *params); +struct wmKeyMap *WM_gizmogroup_keymap_template_select(const struct wmGizmoGroupType *gzgt, + struct wmKeyConfig *config); + +struct wmKeyMap *WM_gizmogroup_keymap_generic(const struct wmGizmoGroupType *gzgt, + struct wmKeyConfig *config); +struct wmKeyMap *WM_gizmogroup_keymap_generic_select(const struct wmGizmoGroupType *gzgt, + struct wmKeyConfig *config); void WM_gizmogroup_ensure_init(const struct bContext *C, struct wmGizmoGroup *gzgroup); diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c index 68020c736d8..d4e1dbfac73 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c @@ -682,37 +682,53 @@ static wmKeyMap *gizmogroup_tweak_modal_keymap(wmKeyConfig *keyconf, const char /** * Common default keymap for gizmo groups. * - * \param name: Typically #wmGizmoGroupType.name. + * \param name: Typically #wmGizmoGroupType.name + * \param params: Typically #wmGizmoGroupType.gzmap_params */ -wmKeyMap *WM_gizmogroup_keymap_common_with_name(const wmGizmoGroupType *gzgt, - wmKeyConfig *config, - const char *name) +wmKeyMap *WM_gizmogroup_keymap_template_ex(wmKeyConfig *config, + const char *name, + const struct wmGizmoMapType_Params *params) { /* Use area and region id since we might have multiple gizmos * with the same name in different areas/regions. */ - wmKeyMap *km = WM_keymap_ensure( - config, name, gzgt->gzmap_params.spaceid, gzgt->gzmap_params.regionid); - - WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", LEFTMOUSE, KM_PRESS, KM_ANY, 0); + wmKeyMap *km = WM_keymap_ensure(config, name, params->spaceid, params->regionid); + if (BLI_listbase_is_empty(&km->items)) { + WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", LEFTMOUSE, KM_PRESS, KM_ANY, 0); + } gizmogroup_tweak_modal_keymap(config, name); return km; } -wmKeyMap *WM_gizmogroup_keymap_common(const wmGizmoGroupType *gzgt, wmKeyConfig *config) +wmKeyMap *WM_gizmogroup_keymap_template(const wmGizmoGroupType *gzgt, wmKeyConfig *config) { - return WM_gizmogroup_keymap_common_with_name(gzgt, config, gzgt->name); + return WM_gizmogroup_keymap_template_ex(config, gzgt->name, &gzgt->gzmap_params); +} + +wmKeyMap *WM_gizmogroup_keymap_generic(const wmGizmoGroupType *UNUSED(gzgt), wmKeyConfig *config) +{ + struct wmGizmoMapType_Params params = { + .spaceid = SPACE_EMPTY, + .regionid = RGN_TYPE_WINDOW, + }; + return WM_gizmogroup_keymap_template_ex(config, "Generic Gizmos", ¶ms); } /** * Variation of #WM_gizmogroup_keymap_common but with keymap items for selection + * + * \param name: Typically #wmGizmoGroupType.name + * \param params: Typically #wmGizmoGroupType.gzmap_params */ -wmKeyMap *WM_gizmogroup_keymap_common_select(const wmGizmoGroupType *gzgt, wmKeyConfig *config) +wmKeyMap *WM_gizmogroup_keymap_template_select_ex(wmKeyConfig *config, + const char *name, + const struct wmGizmoMapType_Params *params) { /* Use area and region id since we might have multiple gizmos * with the same name in different areas/regions. */ - wmKeyMap *km = WM_keymap_ensure( - config, gzgt->name, gzgt->gzmap_params.spaceid, gzgt->gzmap_params.regionid); + wmKeyMap *km = WM_keymap_ensure(config, name, params->spaceid, params->regionid); + const bool do_init = BLI_listbase_is_empty(&km->items); + /* FIXME(campbell) */ #if 0 const int select_mouse = (U.flag & USER_LMOUSESELECT) ? LEFTMOUSE : RIGHTMOUSE; @@ -724,23 +740,43 @@ wmKeyMap *WM_gizmogroup_keymap_common_select(const wmGizmoGroupType *gzgt, wmKey const int action_mouse = LEFTMOUSE; #endif - WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", action_mouse, KM_PRESS, KM_ANY, 0); - WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", select_tweak, KM_ANY, 0, 0); - gizmogroup_tweak_modal_keymap(config, gzgt->name); + if (do_init) { + WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", action_mouse, KM_PRESS, KM_ANY, 0); + WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_tweak", select_tweak, KM_ANY, 0, 0); + } + gizmogroup_tweak_modal_keymap(config, name); - wmKeyMapItem *kmi = WM_keymap_add_item( - km, "GIZMOGROUP_OT_gizmo_select", select_mouse, KM_PRESS, 0, 0); - RNA_boolean_set(kmi->ptr, "extend", false); - RNA_boolean_set(kmi->ptr, "deselect", false); - RNA_boolean_set(kmi->ptr, "toggle", false); - kmi = WM_keymap_add_item(km, "GIZMOGROUP_OT_gizmo_select", select_mouse, KM_PRESS, KM_SHIFT, 0); - RNA_boolean_set(kmi->ptr, "extend", false); - RNA_boolean_set(kmi->ptr, "deselect", false); - RNA_boolean_set(kmi->ptr, "toggle", true); + if (do_init) { + wmKeyMapItem *kmi = WM_keymap_add_item( + km, "GIZMOGROUP_OT_gizmo_select", select_mouse, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "extend", false); + RNA_boolean_set(kmi->ptr, "deselect", false); + RNA_boolean_set(kmi->ptr, "toggle", false); + kmi = WM_keymap_add_item( + km, "GIZMOGROUP_OT_gizmo_select", select_mouse, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", false); + RNA_boolean_set(kmi->ptr, "deselect", false); + RNA_boolean_set(kmi->ptr, "toggle", true); + } return km; } +wmKeyMap *WM_gizmogroup_keymap_template_select(const wmGizmoGroupType *gzgt, wmKeyConfig *config) +{ + return WM_gizmogroup_keymap_template_select_ex(config, gzgt->name, &gzgt->gzmap_params); +} + +wmKeyMap *WM_gizmogroup_keymap_generic_select(const wmGizmoGroupType *UNUSED(gzgt), + wmKeyConfig *config) +{ + struct wmGizmoMapType_Params params = { + .spaceid = SPACE_EMPTY, + .regionid = RGN_TYPE_WINDOW, + }; + return WM_gizmogroup_keymap_template_select_ex(config, "Generic Gizmos Select", ¶ms); +} + /** \} */ /* wmGizmoGroup */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c index 7c8db18c0ca..d09e088af7f 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c @@ -97,10 +97,10 @@ static void wm_gizmogrouptype_append__end(wmGizmoGroupType *gzgt) /* if not set, use default */ if (gzgt->setup_keymap == NULL) { if (gzgt->flag & WM_GIZMOGROUPTYPE_SELECT) { - gzgt->setup_keymap = WM_gizmogroup_keymap_common_select; + gzgt->setup_keymap = WM_gizmogroup_keymap_generic_select; } else { - gzgt->setup_keymap = WM_gizmogroup_keymap_common; + gzgt->setup_keymap = WM_gizmogroup_keymap_generic; } } |