Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-11-14 12:26:00 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-11-14 12:26:00 +0300
commit0b0b3d7f7e720f2073406247957b800e11e4ef98 (patch)
tree6363e5f085780e7d9a581920df5e7cf5007eaf10 /source/blender/windowmanager
parentf91b797b2b6b9d02721c8bf7449602d9f839a15b (diff)
Keymap: assigning keys for tools now checks mode
Adding shortcuts to tools was always adding to the top-level window map.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_keymap.h1
-rw-r--r--source/blender/windowmanager/intern/wm_keymap_utils.c54
2 files changed, 54 insertions, 1 deletions
diff --git a/source/blender/windowmanager/WM_keymap.h b/source/blender/windowmanager/WM_keymap.h
index f93ef005b2a..6072749b283 100644
--- a/source/blender/windowmanager/WM_keymap.h
+++ b/source/blender/windowmanager/WM_keymap.h
@@ -101,6 +101,7 @@ void WM_keymap_add_context_enum_set_items(
wmKeyMap *keymap, const struct EnumPropertyItem *items, const char *data_path,
int type_start, int val, int modifier, int keymodifier);
+wmKeyMap *WM_keymap_guess_from_context(const struct bContext *C);
wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, const char *opname);
void WM_keymap_fix_linking(void);
diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.c b/source/blender/windowmanager/intern/wm_keymap_utils.c
index 47dc07f556e..e3fe1b7abdd 100644
--- a/source/blender/windowmanager/intern/wm_keymap_utils.c
+++ b/source/blender/windowmanager/intern/wm_keymap_utils.c
@@ -102,6 +102,52 @@ void WM_keymap_add_context_enum_set_items(
/** \name Introspection
* \{ */
+wmKeyMap *WM_keymap_guess_from_context(const bContext *C)
+{
+ SpaceLink *sl = CTX_wm_space_data(C);
+ const char *km_id = NULL;
+ if (sl->spacetype == SPACE_VIEW3D) {
+ const enum eContextObjectMode mode = CTX_data_mode_enum(C);
+ switch (mode) {
+ case CTX_MODE_EDIT_MESH: km_id = "Mesh"; break;
+ case CTX_MODE_EDIT_CURVE: km_id = "Curve"; break;
+ case CTX_MODE_EDIT_SURFACE: km_id = "Curve"; break;
+ case CTX_MODE_EDIT_TEXT: km_id = "Font"; break;
+ case CTX_MODE_EDIT_ARMATURE: km_id = "Armature"; break;
+ case CTX_MODE_EDIT_METABALL: km_id = "Metaball"; break;
+ case CTX_MODE_EDIT_LATTICE: km_id = "Lattice"; break;
+ case CTX_MODE_POSE: km_id = "Pose"; break;
+ case CTX_MODE_SCULPT: km_id = "Sculpt"; break;
+ case CTX_MODE_PAINT_WEIGHT: km_id = "Weight Paint"; break;
+ case CTX_MODE_PAINT_VERTEX: km_id = "Vertex Paint"; break;
+ case CTX_MODE_PAINT_TEXTURE: km_id = "Image Paint"; break;
+ case CTX_MODE_PARTICLE: km_id = "Particle"; break;
+ case CTX_MODE_OBJECT: km_id = "Object Mode"; break;
+ case CTX_MODE_GPENCIL_PAINT: km_id = "Grease Pencil Stroke Paint Mode"; break;
+ case CTX_MODE_GPENCIL_EDIT: km_id = "Grease Pencil Stroke Edit Mode"; break;
+ case CTX_MODE_GPENCIL_SCULPT: km_id = "Grease Pencil Stroke Sculpt Mode"; break;
+ case CTX_MODE_GPENCIL_WEIGHT: km_id = "Grease Pencil Stroke Weight Mode"; break;
+ }
+ }
+ else if (sl->spacetype == SPACE_IMAGE) {
+ const SpaceImage *sima = (SpaceImage *)sl;
+ const eSpaceImage_Mode mode = sima->mode;
+ switch (mode) {
+ case SI_MODE_VIEW: km_id = "Image"; break;
+ case SI_MODE_PAINT: km_id = "Image Paint"; break;
+ case SI_MODE_MASK: km_id = "Mask Editing"; break;
+ case SI_MODE_UV: km_id = "UV Editor"; break;
+ }
+ }
+ else {
+ return NULL;
+ }
+
+ wmKeyMap *km = WM_keymap_find_all(C, km_id, 0, 0);
+ BLI_assert(km);
+ return km;
+}
+
/* Guess an appropriate keymap from the operator name */
/* Needs to be kept up to date with Keymap and Operator naming */
wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
@@ -125,7 +171,13 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
/* Window */
if (STRPREFIX(opname, "WM_OT")) {
- km = WM_keymap_find_all(C, "Window", 0, 0);
+ if (STREQ(opname, "WM_OT_tool_set_by_name")) {
+ km = WM_keymap_guess_from_context(C);
+ }
+
+ if (km == NULL) {
+ km = WM_keymap_find_all(C, "Window", 0, 0);
+ }
}
/* Screen & Render */
else if (STRPREFIX(opname, "SCREEN_OT") ||