+1 vote

Can anyone explain to me what is an accelerator for the PopupMenu node, please?

The document says "Accelerators are special combinations of keys that activate the item, no matter which control is focused.", but it's asking for an int, which is the count of the accelerator. Then how do I set the "special combinations of keys"? Is it the same as a shortcut? If so, when I add_shortcut, do I need to set the accelerator as 1 as well?

asked Sep 12, 2019 in Engine by zyq0825 (13 points)

2 Answers

0 votes

I found your question while trying to figure out the answer myself. Apparently, from my trial and error, it seems to work like this.

When you call the add_item method for PopupMenu, the third parameter for shortcut keys is generated by making an InputEvent and passing a value from that to said third parameter.

For example:

# This sets it to "Ctrl + O"
var i := InputEventKey.new()
i.control = true
i.scancode = KEY_O

# It's important to call `get_scancode_with_modifiers()` to convert the value to `int`
$MyPopup.add_item("Open", 0, i.get_scancode_with_modifiers())

Will result in this:

enter image description here

Edit:
I made it a helper function to make things easier to get that int value.

func get_shortcut(keycode:int,modifier:=[]) -> int:
    var i := InputEventKey.new()
    i.control = modifier.has("ctrl")
    i.shift = modifier.has("shift")
    i.alt = modifier.has("alt")
    i.scancode = keycode
    return i.get_scancode_with_modifiers()

To use it, just do something like get_shortcut(KEY_O,["ctrl"]) = Ctrl+O
For multiple modifiers, just do get_shortcut(KEY_DELETE,["ctrl","shift"]) = Ctrl+Shift+Del.

answered Oct 8, 2019 by sprite-1 (58 points)
edited Oct 8, 2019 by sprite-1
0 votes

You actually don't need to use InputEventKey like sprite-1 suggested. If you look at the get_scancode_with_modifers code, you can see it just OR's the key scancode with a mask for the modifers (KEY_MASK_CTRL, KEY_MASK_SHIFT, KEY_MASK_ALT, and KEY_MASK_META).

Creating an accelerator for a key combination like ctrl+shift+s, for example, is as simple as using:

KEY_S | KEY_MASK_CTRL | KEY_MASK_SHIFT
answered Dec 21, 2019 by Epidal (56 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.