[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