[Bf-blender-cvs] [698dbd65006] blender2.8: UI: generate dynamic keymap for popup toolbar
Campbell Barton
noreply at git.blender.org
Mon May 21 10:46:30 CEST 2018
Commit: 698dbd65006fe686c991ef3d104cf569d3373711
Author: Campbell Barton
Date: Mon May 21 10:43:15 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB698dbd65006fe686c991ef3d104cf569d3373711
UI: generate dynamic keymap for popup toolbar
Set keys for tools based on the current keymap.
This keeps consistency between tools immediate execution.
===================================================================
M release/scripts/startup/bl_operators/wm.py
M release/scripts/startup/bl_ui/space_toolsystem_common.py
===================================================================
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 9320145369c..83a5eefcbe5 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -2360,40 +2360,27 @@ class WM_OT_toolbar(Operator):
bl_idname = "wm.toolbar"
bl_label = "Toolbar"
- keymap = None
-
def execute(self, context):
+ from bl_ui.space_toolsystem_common import (
+ ToolSelectPanelHelper,
+ keymap_from_context,
+ )
space_type = context.space_data.type
- from bl_ui.space_toolsystem_common import ToolSelectPanelHelper
+
cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
if cls is None:
self.report({'WARNING'}, f"Toolbar not found for {space_type!r}")
return {'CANCELLED'}
wm = context.window_manager
-
- if WM_OT_toolbar.keymap is None:
- keyconf = wm.keyconfigs.active
- km = keyconf.keymaps.new("Toolbar Popup", space_type='EMPTY', region_type='TEMPORARY')
- WM_OT_toolbar.keymap = km
-
- # Example
- for key, value in (
- ('G', "Move"),
- ('R', "Rotate"),
- ('S', "Scale"),
- ('C', "Select Circle"),
- ('B', "Select Border"),
- ):
- kmi = km.keymap_items.new("wm.tool_set_by_name", key, 'PRESS')
- kmi.properties.name = value
+ keymap = keymap_from_context(context, space_type)
def draw_menu(popover, context):
layout = popover.layout
cls.draw_cls(layout, context, detect_layout=False)
# wm.popup_menu(draw_menu) # this also works
- wm.popover(draw_menu, keymap=WM_OT_toolbar.keymap)
+ wm.popover(draw_menu, keymap=keymap)
return {'FINISHED'}
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py
index e1594dfa8ad..fd2300dab22 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_common.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py
@@ -583,6 +583,59 @@ def activate_by_name(context, space_type, text):
return False
+def keymap_from_context(context, space_type):
+ """
+ Keymap for popup toolbar, currently generated each time.
+ """
+ use_simple_keymap = False
+ km_name = "Toolbar Popup"
+ wm = context.window_manager
+ keyconf = wm.keyconfigs.active
+ keymap = keyconf.keymaps.get(km_name)
+ if keymap is None:
+ keymap = keyconf.keymaps.new(km_name, space_type='EMPTY', region_type='TEMPORARY')
+ for kmi in keymap.keymap_items:
+ keymap.keymap_items.remove(kmi)
+
+
+ items = []
+ cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
+ for i, item in enumerate(
+ ToolSelectPanelHelper._tools_flatten(cls.tools_from_context(context))
+ ):
+ if item is not None:
+ if use_simple_keymap:
+ # Simply assign a key from A-Z
+ items.append(((chr(ord('A') + i)), item.text))
+ kmi = keymap.keymap_items.new("wm.tool_set_by_name", key, 'PRESS')
+ kmi.properties.name = item.text
+ continue
+
+ if item.keymap:
+ kmi_first = item.keymap[0].keymap_items[0]
+ keymap_found, kmi_found = wm.keyconfigs.find_item_from_operator(
+ idname=kmi_first.idname,
+ # properties=kmi_first.properties, # prevents matches, don't use.
+ )
+ if kmi_found is not None:
+ kmi_found_type = kmi_found.type
+ # Only for single keys.
+ if len(kmi_found_type) == 1:
+ kmi = keymap.keymap_items.new(
+ idname="wm.tool_set_by_name",
+ type=kmi_found_type,
+ value='PRESS',
+ any=kmi_found.any,
+ shift=kmi_found.shift,
+ ctrl=kmi_found.ctrl,
+ alt=kmi_found.alt,
+ oskey=kmi_found.oskey,
+ key_modifier=kmi_found.key_modifier,
+ )
+ kmi.properties.name = item.text
+ wm.keyconfigs.update()
+ return keymap
+
classes = (
WM_MT_toolsystem_submenu,
)
More information about the Bf-blender-cvs
mailing list