Slate: Customizing Navigation Controls

Article written by Cody A.

Slate defines some default navigation key mappings in FNavigationConfig, which is used by most Slate widgets to process input events and translate them to directional inputs or accept/cancel actions. For example, both the Enter and Spacebar key, as well as the Virtual_Accept gamepad key (usually mapped to the bottom face button), are translated to an EUINavigationAction::Accept action:

EUINavigationAction FNavigationConfig::GetNavigationActionForKey(const FKey& InKey) const
    if (InKey == EKeys::Enter || InKey == EKeys::SpaceBar || InKey == EKeys::Virtual_Accept)
        // By default, enter, space, and gamepad accept are all counted as accept
        return EUINavigationAction::Accept;
    else if (InKey == EKeys::Escape || InKey == EKeys::Virtual_Back)
        // By default, escape and gamepad back count as leaving current scope
        return EUINavigationAction::Back;

    return EUINavigationAction::Invalid;

It’s possible to customize the mappings used for these actions by registering your own navigation class. First, you’ll override FNavigationConfig and implement whichever functions you want to modify (GetNavigationDirectionFromKey, GetNavigationActionFromKey, etc.) Then, you’ll provide your navigation config file to SlateApplication via FSlateApplication::SetNavigationConfig.

Note that the editor maintains two separate FNavigationConfig instances, one for the editor and one for gameplay. This prevents changes to runtime navigation controls from affecting the editor.

I’m receiving a bug from Sony because of this issue. Is there a way to detect which Button PS4 is using as a confirmation button dynamically?