Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_ops.c
| Show First 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | |||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "RNA_enum_types.h" | #include "RNA_enum_types.h" | ||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| #include "WM_types.h" | #include "WM_types.h" | ||||
| #include "ED_screen.h" | #include "ED_screen.h" | ||||
| #include "ED_select_utils.h" | #include "ED_select_utils.h" | ||||
| #include "ED_keymap_templates.h" | |||||
| #include "ED_object.h" | #include "ED_object.h" | ||||
| #include "DEG_depsgraph.h" | #include "DEG_depsgraph.h" | ||||
| #include "object_intern.h" | #include "object_intern.h" | ||||
| /* ************************** registration **********************************/ | /* ************************** registration **********************************/ | ||||
| ▲ Show 20 Lines • Show All 242 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| Object *ob = CTX_data_active_object(C); | Object *ob = CTX_data_active_object(C); | ||||
| return (!ob || ob->mode == OB_MODE_OBJECT); | return (!ob || ob->mode == OB_MODE_OBJECT); | ||||
| } | } | ||||
| void ED_keymap_object(wmKeyConfig *keyconf) | void ED_keymap_object(wmKeyConfig *keyconf) | ||||
| { | { | ||||
| wmKeyMap *keymap; | wmKeyMap *keymap; | ||||
| wmKeyMapItem *kmi; | |||||
| /* Objects, Regardless of Mode -------------------------------------------------- */ | /* Objects, Regardless of Mode -------------------------------------------------- */ | ||||
| keymap = WM_keymap_ensure(keyconf, "Object Non-modal", 0, 0); | keymap = WM_keymap_ensure(keyconf, "Object Non-modal", 0, 0); | ||||
| /* modes */ | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", TABKEY, KM_PRESS, 0, 0); | |||||
| RNA_enum_set(kmi->ptr, "mode", OB_MODE_EDIT); | |||||
| RNA_boolean_set(kmi->ptr, "toggle", true); | |||||
| #if 0 | |||||
| WM_keymap_add_menu_pie(keymap, "VIEW3D_MT_object_mode_pie", TABKEY, KM_PRESS, KM_CTRL, 0); | |||||
| #else | |||||
| WM_keymap_add_item(keymap, "VIEW3D_OT_object_mode_pie_or_toggle", TABKEY, KM_PRESS, KM_CTRL, 0); | |||||
| #endif | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_origin_set", CKEY, KM_PRESS, KM_ALT | KM_SHIFT | KM_CTRL, 0); | |||||
| #endif | |||||
| /* Object Mode ---------------------------------------------------------------- */ | /* Object Mode ---------------------------------------------------------------- */ | ||||
| /* Note: this keymap gets disabled in non-objectmode, */ | /* Note: this keymap gets disabled in non-objectmode, */ | ||||
| keymap = WM_keymap_ensure(keyconf, "Object Mode", 0, 0); | keymap = WM_keymap_ensure(keyconf, "Object Mode", 0, 0); | ||||
| keymap->poll = object_mode_poll; | keymap->poll = object_mode_poll; | ||||
| /* object mode supports PET now */ | |||||
| ED_keymap_proportional_cycle(keyconf, keymap); | |||||
| ED_keymap_proportional_obmode(keyconf, keymap); | |||||
| ED_keymap_template_select_all(keymap, "OBJECT_OT_select_all"); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_select_mirror", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); | |||||
| #endif | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0); | |||||
| RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "PARENT"); | |||||
| RNA_boolean_set(kmi->ptr, "extend", false); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "PARENT"); | |||||
| RNA_boolean_set(kmi->ptr, "extend", true); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0); | |||||
| RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "CHILD"); | |||||
| RNA_boolean_set(kmi->ptr, "extend", false); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "CHILD"); | |||||
| RNA_boolean_set(kmi->ptr, "extend", true); | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_parent_no_inverse_set", PKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); | |||||
| #endif | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_track_set", TKEY, KM_PRESS, KM_CTRL, 0); | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_track_clear", TKEY, KM_PRESS, KM_ALT, 0); | |||||
| #endif | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_constraint_add_with_targets", CKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_constraints_clear", CKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); | |||||
| #endif | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_location_clear", GKEY, KM_PRESS, KM_ALT, 0); | |||||
| RNA_boolean_set(kmi->ptr, "clear_delta", false); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_rotation_clear", RKEY, KM_PRESS, KM_ALT, 0); | |||||
| RNA_boolean_set(kmi->ptr, "clear_delta", false); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0); | |||||
| RNA_boolean_set(kmi->ptr, "clear_delta", false); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_origin_clear", OKEY, KM_PRESS, KM_ALT, 0); | |||||
| #endif | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0); | |||||
| RNA_boolean_set(kmi->ptr, "use_global", false); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| RNA_boolean_set(kmi->ptr, "use_global", true); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0); | |||||
| RNA_boolean_set(kmi->ptr, "use_global", false); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| RNA_boolean_set(kmi->ptr, "use_global", true); | |||||
| WM_keymap_add_menu(keymap, "VIEW3D_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_duplicates_make_real", AKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); | |||||
| #endif | |||||
| WM_keymap_add_menu(keymap, "VIEW3D_MT_object_apply", AKEY, KM_PRESS, KM_CTRL, 0); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_add_menu(keymap, "VIEW3D_MT_make_single_user", UKEY, KM_PRESS, 0, 0); | |||||
| #endif | |||||
| WM_keymap_add_menu(keymap, "VIEW3D_MT_make_links", LKEY, KM_PRESS, KM_CTRL, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move_linked", DKEY, KM_PRESS, KM_ALT, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_join", JKEY, KM_PRESS, KM_CTRL, 0); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_convert", CKEY, KM_PRESS, KM_ALT, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_proxy_make", PKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_make_local", LKEY, KM_PRESS, 0, 0); | |||||
| #endif | |||||
| /* XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith */ | |||||
| WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_insert_menu", IKEY, KM_PRESS, 0, 0); | |||||
| WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_delete_v3d", IKEY, KM_PRESS, KM_ALT, 0); | |||||
| WM_keymap_verify_item(keymap, "ANIM_OT_keying_set_active_set", IKEY, KM_PRESS, KM_CTRL | KM_SHIFT | KM_ALT, 0); | |||||
| WM_keymap_verify_item(keymap, "COLLECTION_OT_create", GKEY, KM_PRESS, KM_CTRL, 0); | |||||
| WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_remove", GKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); | |||||
| WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_remove_all", GKEY, KM_PRESS, KM_SHIFT | KM_CTRL | KM_ALT, 0); | |||||
| WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_add_active", GKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); | |||||
| WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_remove_active", GKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0); | |||||
| WM_keymap_add_menu(keymap, "VIEW3D_MT_object_specials", WKEY, KM_PRESS, 0, 0); | |||||
| #ifdef USE_WM_KEYMAP_27X | |||||
| WM_keymap_verify_item(keymap, "OBJECT_OT_data_transfer", TKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); | |||||
| #endif | |||||
| /* XXX No more available 'T' shortcuts... :/ */ | |||||
| /* WM_keymap_verify_item(keymap, "OBJECT_OT_datalayout_transfer", TKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); */ | |||||
| for (int i = 0; i <= 5; i++) { | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY + i, KM_PRESS, KM_CTRL, 0); | |||||
| RNA_int_set(kmi->ptr, "level", i); | |||||
| } | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_move_to_collection", MKEY, KM_PRESS, 0, 0); | |||||
| WM_keymap_add_item(keymap, "OBJECT_OT_link_to_collection", MKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_clear", HKEY, KM_PRESS, KM_ALT, 0); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, 0, 0); | |||||
| RNA_boolean_set(kmi->ptr, "unselected", false); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| RNA_boolean_set(kmi->ptr, "unselected", true); | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_collection", HKEY, KM_PRESS, KM_CTRL, 0); | |||||
| /* Collection switching. */ | |||||
| for (int i = 0; i < 10; i++) { | |||||
| kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_collection", ZEROKEY + i, KM_PRESS, KM_ANY, 0); | |||||
| RNA_int_set(kmi->ptr, "collection_index", (i == 0) ? 10 : i); | |||||
| } | |||||
| } | |||||
| void ED_keymap_proportional_cycle(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap) | |||||
| { | |||||
| WM_keymap_add_menu_pie(keymap, "VIEW3D_MT_proportional_editing_falloff_pie", OKEY, KM_PRESS, KM_SHIFT, 0); | |||||
| } | |||||
| void ED_keymap_proportional_obmode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap) | |||||
| { | |||||
| wmKeyMapItem *kmi; | |||||
| kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0); | |||||
| RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_edit_objects"); | |||||
| } | |||||
| void ED_keymap_proportional_maskmode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap) | |||||
| { | |||||
| wmKeyMapItem *kmi; | |||||
| kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0); | |||||
| RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_edit_mask"); | |||||
| } | |||||
| void ED_keymap_proportional_editmode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap, | |||||
| const bool do_connected) | |||||
| { | |||||
| wmKeyMapItem *kmi; | |||||
| kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, 0, 0); | |||||
| RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_edit"); | |||||
| RNA_string_set(kmi->ptr, "value_1", "DISABLED"); | |||||
| RNA_string_set(kmi->ptr, "value_2", "ENABLED"); | |||||
| /* for modes/object types that allow 'connected' mode, add the Alt O key */ | |||||
| if (do_connected) { | |||||
| kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, KM_ALT, 0); | |||||
| RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_edit"); | |||||
| RNA_string_set(kmi->ptr, "value_1", "DISABLED"); | |||||
| RNA_string_set(kmi->ptr, "value_2", "CONNECTED"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Map 1..3 to Vert/Edge/Face. | |||||
| */ | |||||
| void ED_keymap_editmesh_elem_mode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap) | |||||
| { | |||||
| for (int i = 0; i < 4; i++) { | |||||
| const bool is_extend = (i & 1); | |||||
| const bool is_expand = (i & 2); | |||||
| const int key_modifier = (is_extend ? KM_SHIFT : 0) | (is_expand ? KM_CTRL : 0); | |||||
| for (int j = 0; j < 3; j++) { | |||||
| wmKeyMapItem *kmi = WM_keymap_add_item( | |||||
| keymap, "MESH_OT_select_mode", ONEKEY + j, KM_PRESS, key_modifier, 0); | |||||
| RNA_enum_set(kmi->ptr, "type", SCE_SELECT_VERTEX << j); | |||||
| if (is_extend) { | |||||
| RNA_boolean_set(kmi->ptr, "use_extend", true); | |||||
| } | |||||
| if (is_expand) { | |||||
| RNA_boolean_set(kmi->ptr, "use_expand", true); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||