UI: use spacebar for toolbar

- This allows quick, consistent toolbar access
  w/o conflicting w/ the keymap.
  Where pressing space before a key activates that operator as a tool
  instead of running immediately.
- Search can still be accessed by pressing spacebar again.
- When there is no toolbar for a space, operator search still opens.
This commit is contained in:
Campbell Barton 2018-05-21 11:54:47 +02:00
parent 3102821c9c
commit 3b1b625ead
Notes: blender-bot 2023-02-14 06:32:27 +01:00
Referenced by issue #55036, Tool System Todo
4 changed files with 26 additions and 6 deletions

View File

@ -2369,7 +2369,9 @@ class WM_OT_toolbar(Operator):
cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
if cls is None:
self.report({'WARNING'}, f"Toolbar not found for {space_type!r}")
# self.report({'WARNING'}, f"Toolbar not found for {space_type!r}")
# Passthrough to running search directly.
bpy.ops.wm.search_menu('INVOKE_DEFAULT')
return {'CANCELLED'}
wm = context.window_manager
@ -2379,7 +2381,9 @@ class WM_OT_toolbar(Operator):
layout = popover.layout
cls.draw_cls(layout, context, detect_layout=False)
# wm.popup_menu(draw_menu) # this also works
layout.operator_context = 'INVOKE_DEFAULT'
layout.operator("wm.search_menu")
wm.popover(draw_menu, keymap=keymap)
return {'FINISHED'}

View File

@ -598,6 +598,9 @@ def keymap_from_context(context, space_type):
keymap.keymap_items.remove(kmi)
kmi_search = wm.keyconfigs.find_item_from_operator(idname="wm.toolbar")[1]
kmi_search_type = None if not kmi_search else kmi_search.type
items = []
cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
for i, item in enumerate(
@ -613,10 +616,10 @@ def keymap_from_context(context, space_type):
if item.keymap:
kmi_first = item.keymap[0].keymap_items[0]
keymap_found, kmi_found = wm.keyconfigs.find_item_from_operator(
kmi_found = wm.keyconfigs.find_item_from_operator(
idname=kmi_first.idname,
# properties=kmi_first.properties, # prevents matches, don't use.
)
)[1]
if kmi_found is not None:
kmi_found_type = kmi_found.type
# Only for single keys.
@ -633,6 +636,15 @@ def keymap_from_context(context, space_type):
key_modifier=kmi_found.key_modifier,
)
kmi.properties.name = item.text
# Disallow overlap
if kmi_search_type == kmi_found_type:
kmi_search_type = None
# Support double-tap for search.
if kmi_search_type:
keymap.keymap_items.new("wm.search_menu", type=kmi_search_type, value='PRESS')
wm.keyconfigs.update()
return keymap

View File

@ -4637,7 +4637,7 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", UPARROWKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", DOWNARROWKEY, KM_PRESS, KM_CTRL, 0);
/* we already have two keys for this, disabled for use by WM_OT_toolbar */
/* we already have two keys for this. */
#if 0
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_SHIFT, 0);
#endif

View File

@ -3954,12 +3954,16 @@ void wm_window_keymap(wmKeyConfig *keyconf)
WM_keymap_verify_item(keymap, "WM_OT_debug_menu", DKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
/* menus that can be accessed anywhere in blender */
#if 0 /* Now double-tap via toolbar. */
WM_keymap_verify_item(keymap, "WM_OT_search_menu", SPACEKEY, KM_PRESS, 0, 0);
#endif
#ifdef WITH_INPUT_NDOF
WM_keymap_add_menu(keymap, "USERPREF_MT_ndof_settings", NDOF_BUTTON_MENU, KM_PRESS, 0, 0);
#endif
WM_keymap_add_item(keymap, "WM_OT_toolbar", SPACEKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "WM_OT_toolbar", SPACEKEY, KM_PRESS, 0, 0);
/* Space switching */
kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F3KEY, KM_PRESS, KM_SHIFT, 0);