Skip to content

Commit 62b1bef

Browse files
Custom Keymap Support
1 parent 760d7a2 commit 62b1bef

4 files changed

Lines changed: 168 additions & 121 deletions

File tree

__init__.py

Lines changed: 117 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,85 @@
77
from .preferences import RightMouseNavigationPreferences
88

99
addon_keymaps = []
10+
menumodes = [
11+
"Object Mode",
12+
"Mesh",
13+
"Curve",
14+
"Armature",
15+
"Metaball",
16+
"Lattice",
17+
"Font",
18+
"Pose",
19+
]
20+
panelmodes = [
21+
"Vertex Paint",
22+
"Weight Paint",
23+
"Image Paint",
24+
"Sculpt",
25+
]
1026
classes = [
1127
RightMouseNavigationPreferences,
1228
RMN_OT_right_mouse_navigation,
1329
RMN_OT_toggle_cam_navigation,
1430
]
1531

1632

33+
def register_keymaps(menumodes, panelmodes, keyconfig):
34+
# These Modes all call standard menus
35+
# "Object Mode", "Mesh", "Curve", "Armature", "Metaball", "Lattice",
36+
# "Font", "Pose"
37+
for i in menumodes:
38+
for key in keyconfig.keymaps[i].keymap_items:
39+
if (
40+
# key.idname == "wm.call_menu"
41+
key.type == "RIGHTMOUSE"
42+
and key.active
43+
):
44+
key.active = False
45+
46+
# These Modes call panels instead of menus
47+
# "Vertex Paint", "Weight Paint", "Image Paint", "Sculpt"
48+
for i in panelmodes:
49+
for key in keyconfig.keymaps[i].keymap_items:
50+
if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE" and key.active:
51+
key.active = False
52+
53+
# Changing the Walk Modal Map
54+
for key in keyconfig.keymaps["View3D Walk Modal"].keymap_items:
55+
if key.propvalue == "CANCEL" and key.type == "RIGHTMOUSE" and key.active:
56+
key.active = False
57+
for key in keyconfig.keymaps["View3D Walk Modal"].keymap_items:
58+
if key.propvalue == "CONFIRM" and key.type == "LEFTMOUSE" and key.active:
59+
key.type = "RIGHTMOUSE"
60+
key.value = "RELEASE"
61+
62+
63+
def unregister_keymaps(menumodes, panelmodes, keyconfig):
64+
# Reactivating menus
65+
# "Object Mode", "Mesh", "Curve", "Armature", "Metaball", "Lattice",
66+
# "Font", "Pose"
67+
for i in menumodes:
68+
for key in keyconfig.keymaps[i].keymap_items:
69+
if key.idname == "wm.call_menu" and key.type == "RIGHTMOUSE":
70+
key.active = True
71+
72+
# Reactivating panels
73+
# "Vertex Paint", "Weight Paint", "Image Paint", "Sculpt"
74+
for i in panelmodes:
75+
for key in keyconfig.keymaps[i].keymap_items:
76+
if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE":
77+
key.active = True
78+
79+
# Changing the Walk Modal Map back
80+
for key in keyconfig.keymaps["View3D Walk Modal"].keymap_items:
81+
if key.propvalue == "CANCEL" and key.type == "RIGHTMOUSE":
82+
key.active = True
83+
for key in keyconfig.keymaps["View3D Walk Modal"].keymap_items:
84+
if key.propvalue == "CONFIRM" and key.type == "RIGHTMOUSE":
85+
key.type = "LEFTMOUSE"
86+
key.value = "PRESS"
87+
88+
1789
def register():
1890
if not bpy.app.background:
1991
for cls in classes:
@@ -47,56 +119,28 @@ def register():
47119
addon_keymaps.append((km, kmi))
48120
addon_keymaps.append((km2, kmi2))
49121

50-
active_kc = wm.keyconfigs.active
51-
52-
menumodes = [
53-
"Object Mode",
54-
"Mesh",
55-
"Curve",
56-
"Armature",
57-
"Metaball",
58-
"Lattice",
59-
"Font",
60-
"Pose",
61-
]
62-
panelmodes = [
63-
"Vertex Paint",
64-
"Weight Paint",
65-
"Image Paint",
66-
"Sculpt",
67-
]
68-
69-
# These Modes all call standard menus
70-
# "Object Mode", "Mesh", "Curve", "Armature", "Metaball", "Lattice",
71-
# "Font", "Pose"
72-
for i in menumodes:
73-
for key in active_kc.keymaps[i].keymap_items:
74-
if (
75-
# key.idname == "wm.call_menu"
76-
key.type == "RIGHTMOUSE"
77-
and key.active
78-
):
79-
key.active = False
80-
81-
# These Modes call panels instead of menus
82-
# "Vertex Paint", "Weight Paint", "Image Paint", "Sculpt"
83-
for i in panelmodes:
84-
for key in active_kc.keymaps[i].keymap_items:
85-
if (
86-
key.idname == "wm.call_panel"
87-
and key.type == "RIGHTMOUSE"
88-
and key.active
89-
):
90-
key.active = False
91-
92-
# Changing the Walk Modal Map
93-
for key in active_kc.keymaps["View3D Walk Modal"].keymap_items:
94-
if key.propvalue == "CANCEL" and key.type == "RIGHTMOUSE" and key.active:
95-
key.active = False
96-
for key in active_kc.keymaps["View3D Walk Modal"].keymap_items:
97-
if key.propvalue == "CONFIRM" and key.type == "LEFTMOUSE" and key.active:
98-
key.type = "RIGHTMOUSE"
99-
key.value = "RELEASE"
122+
active_keyconfig = wm.keyconfigs.active
123+
blender_keyconfig = wm.keyconfigs["Blender"]
124+
user_keyconfig = wm.keyconfigs["Blender user"]
125+
126+
try:
127+
register_keymaps(
128+
menumodes=menumodes,
129+
panelmodes=panelmodes,
130+
keyconfig=active_keyconfig,
131+
)
132+
except:
133+
register_keymaps(
134+
menumodes=menumodes,
135+
panelmodes=panelmodes,
136+
keyconfig=blender_keyconfig,
137+
)
138+
finally:
139+
register_keymaps(
140+
menumodes=menumodes,
141+
panelmodes=panelmodes,
142+
keyconfig=user_keyconfig,
143+
)
100144

101145

102146
def unregister():
@@ -105,51 +149,31 @@ def unregister():
105149
bpy.utils.unregister_class(cls)
106150

107151
wm = bpy.context.window_manager
108-
active_kc = wm.keyconfigs.active
109-
addon_kc = wm.keyconfigs.addon
110152

111-
menumodes = [
112-
"Object Mode",
113-
"Mesh",
114-
"Curve",
115-
"Armature",
116-
"Metaball",
117-
"Lattice",
118-
"Font",
119-
"Pose",
120-
"Node Editor",
121-
]
122-
panelmodes = [
123-
"Vertex Paint",
124-
"Weight Paint",
125-
"Image Paint",
126-
"Sculpt",
127-
]
128-
129-
# Reactivating menus
130-
# "Object Mode", "Mesh", "Curve", "Armature", "Metaball", "Lattice",
131-
# "Font", "Pose"
132-
for i in menumodes:
133-
for key in active_kc.keymaps[i].keymap_items:
134-
if key.idname == "wm.call_menu" and key.type == "RIGHTMOUSE":
135-
key.active = True
136-
137-
# Reactivating panels
138-
# "Vertex Paint", "Weight Paint", "Image Paint", "Sculpt"
139-
for i in panelmodes:
140-
for key in active_kc.keymaps[i].keymap_items:
141-
if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE":
142-
key.active = True
143-
144-
# Changing the Walk Modal Map back
145-
for key in active_kc.keymaps["View3D Walk Modal"].keymap_items:
146-
if key.propvalue == "CANCEL" and key.type == "RIGHTMOUSE":
147-
key.active = True
148-
for key in active_kc.keymaps["View3D Walk Modal"].keymap_items:
149-
if key.propvalue == "CONFIRM" and key.type == "RIGHTMOUSE":
150-
key.type = "LEFTMOUSE"
151-
key.value = "PRESS"
153+
active_keyconfig = wm.keyconfigs.active
154+
blender_keyconfig = wm.keyconfigs["Blender"]
155+
user_keyconfig = wm.keyconfigs["Blender user"]
156+
157+
try:
158+
unregister_keymaps(
159+
menumodes=menumodes,
160+
panelmodes=panelmodes,
161+
keyconfig=active_keyconfig,
162+
)
163+
except:
164+
unregister_keymaps(
165+
menumodes=menumodes,
166+
panelmodes=panelmodes,
167+
keyconfig=blender_keyconfig,
168+
)
169+
finally:
170+
unregister_keymaps(
171+
menumodes=menumodes,
172+
panelmodes=panelmodes,
173+
keyconfig=user_keyconfig,
174+
)
152175

176+
addon_kc = wm.keyconfigs.addon
153177
# Remove only the keymap items that this addon registered
154178
for km, kmi_orig in addon_keymaps:
155179
try:

blender_manifest.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
schema_version = "1.0.0"
22

33
id = "right_mouse_navigation"
4-
version = "2.6.0"
4+
version = "2.7.0"
55
name = "Right Mouse Navigation"
66
tagline = "Game Engine Movement and Menus"
77
maintainer = "Spectral Vectors and Contributors"

operators.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -95,22 +95,20 @@ def reset_cursor():
9595
return {"PASS_THROUGH"}
9696

9797
def callMenu(self, context):
98-
select_mouse = context.window_manager.keyconfigs.active.preferences.select_mouse
98+
wm = context.window_manager
99+
blender_keyconfig = wm.keyconfigs["Blender"]
100+
101+
select_mouse = blender_keyconfig.preferences.select_mouse
99102
space_type = context.space_data.type
100103

101104
if select_mouse == "LEFT":
102105
if space_type == "NODE_EDITOR":
103106
node_tree = context.space_data.node_tree
104107
if node_tree:
105-
if (
106-
node_tree.nodes.active is not None
107-
and node_tree.nodes.active.select
108-
):
108+
if node_tree.nodes.active is not None and node_tree.nodes.active.select:
109109
bpy.ops.wm.call_menu(name="NODE_MT_context_menu")
110110
else:
111-
bpy.ops.wm.search_single_menu(
112-
"INVOKE_DEFAULT", menu_idname="NODE_MT_add"
113-
)
111+
bpy.ops.wm.search_single_menu("INVOKE_DEFAULT", menu_idname="NODE_MT_add")
114112
else:
115113
try:
116114
bpy.ops.wm.call_menu(name=self.menu_by_mode[context.mode])
@@ -157,6 +155,7 @@ def execute(self, context):
157155
return {"CANCELLED"}
158156

159157
elif space_type == "NODE_EDITOR" and enable_nodes:
158+
print("In the Nodes")
160159
bpy.ops.view2d.pan("INVOKE_DEFAULT")
161160
wm = context.window_manager
162161
# Adding the timer and starting the loop
@@ -181,9 +180,7 @@ class RMN_OT_toggle_cam_navigation(Operator):
181180
bl_options = {"REGISTER", "UNDO"}
182181

183182
def execute(self, context):
184-
context.preferences.addons[
185-
__package__
186-
].preferences.disable_camera_navigation = not context.preferences.addons[
187-
__package__
188-
].preferences.disable_camera_navigation
183+
context.preferences.addons[__package__].preferences.disable_camera_navigation = (
184+
not context.preferences.addons[__package__].preferences.disable_camera_navigation
185+
)
189186
return {"FINISHED"}

preferences.py

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,32 @@ def cam_lock_update(self, context):
3636
bpy.types.VIEW3D_HT_tool_header.remove(draw_cam_lock)
3737

3838

39-
def update_node_keymap(self, context):
40-
wm = context.window_manager
41-
active_kc = wm.keyconfigs.active
42-
for key in active_kc.keymaps["Node Editor"].keymap_items:
39+
def node_keymap(keyconfig):
40+
for key in keyconfig.keymaps["Node Editor"].keymap_items:
4341
if key.idname == "wm.call_menu" and key.type == "RIGHTMOUSE":
4442
key.active = not key.active
4543

46-
addon_kc = wm.keyconfigs.addon
47-
for key in addon_kc.keymaps["Node Editor"].keymap_items:
44+
45+
def update_node_keymap(self, context):
46+
wm = context.window_manager
47+
active_keyconfig = wm.keyconfigs.active
48+
blender_keyconfig = wm.keyconfigs["Blender"]
49+
user_keyconfig = wm.keyconfigs["Blender user"]
50+
51+
try:
52+
node_keymap(active_keyconfig)
53+
except:
54+
node_keymap(blender_keyconfig)
55+
finally:
56+
node_keymap(user_keyconfig)
57+
58+
preferences = context.preferences
59+
addon_prefs = preferences.addons[__package__].preferences
60+
# addon_kc = wm.keyconfigs.addon
61+
62+
for key in user_keyconfig.keymaps["Node Editor"].keymap_items:
4863
if key.idname == "rmn.right_mouse_navigation" and key.type == "RIGHTMOUSE":
49-
key.active = not key.active
64+
key.active = addon_prefs.enable_for_node_editors
5065

5166

5267
class RightMouseNavigationPreferences(AddonPreferences):
@@ -110,7 +125,7 @@ def draw(self, context):
110125
row = layout.row()
111126
box = row.box()
112127
box.label(text="Navigation", icon="ORIENTATION_GIMBAL")
113-
box.prop(self, "navigation_mode")
128+
box.prop(self, "navigation_mode", text="Mode")
114129
box = row.box()
115130
box.label(text="Menu / Movement", icon="DRIVER_DISTANCE")
116131
box.prop(self, "time")
@@ -131,8 +146,9 @@ def draw(self, context):
131146
row = layout.row()
132147
box = row.box()
133148
box.label(text="Camera", icon="CAMERA_DATA")
134-
box.prop(self, "disable_camera_navigation")
135-
box.prop(self, "show_cam_lock_ui")
149+
row = box.row()
150+
row.prop(self, "disable_camera_navigation")
151+
row.prop(self, "show_cam_lock_ui")
136152

137153
# Keymap Customization
138154
import rna_keymap_ui
@@ -157,14 +173,24 @@ def draw(self, context):
157173
]
158174

159175
wm = bpy.context.window_manager
160-
active_kc = wm.keyconfigs.active
176+
active_keyconfig = wm.keyconfigs.active
177+
blender_keyconfig = wm.keyconfigs["Blender"]
178+
user_keyconfig = wm.keyconfigs["Blender user"]
161179

162180
addon_keymaps = []
163181

164-
walk_km = active_kc.keymaps["View3D Walk Modal"]
182+
def walk_keymaps(keyconfig):
183+
walk_km = keyconfig.keymaps["View3D Walk Modal"]
184+
185+
for key in walk_km.keymap_items:
186+
addon_keymaps.append((walk_km, key))
165187

166-
for key in walk_km.keymap_items:
167-
addon_keymaps.append((walk_km, key))
188+
try:
189+
walk_keymaps(active_keyconfig)
190+
except:
191+
walk_keymaps(blender_keyconfig)
192+
finally:
193+
walk_keymaps(user_keyconfig)
168194

169195
header, panel = layout.panel(idname="keymap", default_closed=True)
170196
header.label(text="Navigation Keymap")

0 commit comments

Comments
 (0)