Tool System: improve popup w/ modifier keys
When the toolbar is accessed with modifiers (eg shift-space): - Check if we can use the key without any modifiers to set the cursor. - Pie-menu stile release event no longer checks for modifiers.
This commit is contained in:
		@@ -733,6 +733,8 @@ def keymap_from_context(context, space_type):
 | 
			
		||||
    def dict_as_tuple(d):
 | 
			
		||||
        return tuple((k, v) for (k, v) in sorted(d.items()))
 | 
			
		||||
 | 
			
		||||
    tool_blacklist = set()
 | 
			
		||||
 | 
			
		||||
    use_simple_keymap = False
 | 
			
		||||
 | 
			
		||||
    # Press the toolbar popup key again to set the default tool,
 | 
			
		||||
@@ -771,15 +773,6 @@ def keymap_from_context(context, space_type):
 | 
			
		||||
 | 
			
		||||
    cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
 | 
			
		||||
 | 
			
		||||
    items_all = [
 | 
			
		||||
        # 0: tool
 | 
			
		||||
        # 1: keymap item (direct access)
 | 
			
		||||
        # 2: keymap item (newly calculated for toolbar)
 | 
			
		||||
        [item, None, None]
 | 
			
		||||
        for item in ToolSelectPanelHelper._tools_flatten(cls.tools_from_context(context))
 | 
			
		||||
        if item is not None
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    if use_hack_properties:
 | 
			
		||||
        kmi_hack = keymap.keymap_items.new("wm.tool_set_by_name", 'A', 'PRESS')
 | 
			
		||||
        kmi_hack_properties = kmi_hack.properties
 | 
			
		||||
@@ -791,10 +784,8 @@ def keymap_from_context(context, space_type):
 | 
			
		||||
        kmi_toolbar = wm.keyconfigs.find_item_from_operator(idname="wm.toolbar")[1]
 | 
			
		||||
        kmi_toolbar_type = None if not kmi_toolbar else kmi_toolbar.type
 | 
			
		||||
        if use_tap_reset and kmi_toolbar_type is not None:
 | 
			
		||||
            kmi_toolbar_args = {
 | 
			
		||||
                "type": kmi_toolbar_type,
 | 
			
		||||
                **modifier_keywords_from_item(kmi_toolbar),
 | 
			
		||||
            }
 | 
			
		||||
            kmi_toolbar_args_type_only = {"type": kmi_toolbar_type}
 | 
			
		||||
            kmi_toolbar_args = {**kmi_toolbar_args_type_only, **modifier_keywords_from_item(kmi_toolbar)}
 | 
			
		||||
        else:
 | 
			
		||||
            use_tap_reset = False
 | 
			
		||||
        del kmi_toolbar
 | 
			
		||||
@@ -817,15 +808,25 @@ def keymap_from_context(context, space_type):
 | 
			
		||||
    if use_tap_reset:
 | 
			
		||||
        kmi_toolbar_tuple = dict_as_tuple(kmi_toolbar_args)
 | 
			
		||||
        if kmi_toolbar_tuple not in kmi_unique_args:
 | 
			
		||||
            kmi = keymap.keymap_items.new(
 | 
			
		||||
                "wm.tool_set_by_name",
 | 
			
		||||
                value='PRESS' if use_toolbar_release_hack else 'DOUBLE_CLICK',
 | 
			
		||||
                **kmi_toolbar_args,
 | 
			
		||||
            )
 | 
			
		||||
            kmi.properties.name = tap_reset_tool
 | 
			
		||||
        kmi_unique_args.add(kmi_toolbar_tuple)
 | 
			
		||||
            # Used after keymap is setup.
 | 
			
		||||
            kmi_unique_args.add(kmi_toolbar_tuple)
 | 
			
		||||
        else:
 | 
			
		||||
            use_tap_reset = False
 | 
			
		||||
        del kmi_toolbar_tuple
 | 
			
		||||
 | 
			
		||||
    if use_tap_reset:
 | 
			
		||||
        tool_blacklist.add(tap_reset_tool)
 | 
			
		||||
 | 
			
		||||
    items_all = [
 | 
			
		||||
        # 0: tool
 | 
			
		||||
        # 1: keymap item (direct access)
 | 
			
		||||
        # 2: keymap item (newly calculated for toolbar)
 | 
			
		||||
        [item, None, None]
 | 
			
		||||
        for item in ToolSelectPanelHelper._tools_flatten(cls.tools_from_context(context))
 | 
			
		||||
        if item is not None
 | 
			
		||||
        if item.text not in tool_blacklist
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    if use_simple_keymap:
 | 
			
		||||
        # Simply assign a key from A-Z.
 | 
			
		||||
        for i, (item, _, _) in enumerate(items_all):
 | 
			
		||||
@@ -836,7 +837,6 @@ def keymap_from_context(context, space_type):
 | 
			
		||||
        for item_container in items_all:
 | 
			
		||||
            item = item_container[0]
 | 
			
		||||
            # Only check the first item in the tools key-map (a little arbitrary).
 | 
			
		||||
 | 
			
		||||
            if use_hack_properties:
 | 
			
		||||
                # First check for direct assignment.
 | 
			
		||||
                kmi_hack_properties.name = item.text
 | 
			
		||||
@@ -1010,11 +1010,35 @@ def keymap_from_context(context, space_type):
 | 
			
		||||
    if use_hack_properties:
 | 
			
		||||
        keymap.keymap_items.remove(kmi_hack)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    # Keepo last so we can try add a key without any modifiers
 | 
			
		||||
    # in the case this toolbar was activated with modifiers.
 | 
			
		||||
    if use_tap_reset:
 | 
			
		||||
        if len(kmi_toolbar_args_type_only) == len(kmi_toolbar_args):
 | 
			
		||||
            kmi_toolbar_args_available = kmi_toolbar_args
 | 
			
		||||
        else:
 | 
			
		||||
            # We have modifiers, see if we have a free key w/o modifiers.
 | 
			
		||||
            kmi_toolbar_tuple = dict_as_tuple(kmi_toolbar_args_type_only)
 | 
			
		||||
            if kmi_toolbar_tuple not in kmi_unique_args:
 | 
			
		||||
                kmi_toolbar_args_available = kmi_toolbar_args_type_only
 | 
			
		||||
                kmi_unique_args.add(kmi_toolbar_tuple)
 | 
			
		||||
            else:
 | 
			
		||||
                kmi_toolbar_args_available = kmi_toolbar_args
 | 
			
		||||
            del kmi_toolbar_tuple
 | 
			
		||||
 | 
			
		||||
        kmi = keymap.keymap_items.new(
 | 
			
		||||
            "wm.tool_set_by_name",
 | 
			
		||||
            value='PRESS' if use_toolbar_release_hack else 'DOUBLE_CLICK',
 | 
			
		||||
            **kmi_toolbar_args_available,
 | 
			
		||||
        )
 | 
			
		||||
        kmi.properties.name = tap_reset_tool
 | 
			
		||||
 | 
			
		||||
    if use_release_confirm:
 | 
			
		||||
        kmi = keymap.keymap_items.new(
 | 
			
		||||
            "ui.button_execute",
 | 
			
		||||
            type=kmi_toolbar_type,
 | 
			
		||||
            value='RELEASE',
 | 
			
		||||
            any=True,
 | 
			
		||||
        )
 | 
			
		||||
        kmi.properties.skip_depressed = True
 | 
			
		||||
 | 
			
		||||
@@ -1025,6 +1049,7 @@ def keymap_from_context(context, space_type):
 | 
			
		||||
                "wm.tool_set_by_name",
 | 
			
		||||
                type=kmi_toolbar_type,
 | 
			
		||||
                value='RELEASE',
 | 
			
		||||
                any=True,
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
    wm.keyconfigs.update()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user