Skip to content

File SFSettingEntryWidget_Keybind.h

File List > Public > UI > SettingEntries > SFSettingEntryWidget_Keybind.h

Go to the documentation of this file

// Copyright 2026 Anh Pham. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "UI/SettingEntries/SFSettingEntryWidget.h"
#include "Core/SFCoreTypes.h"
#include "CommonInputTypeEnum.h"
#include "SFSettingEntryWidget_Keybind.generated.h"

UENUM(BlueprintType)
enum class ESFKeybindSlot : uint8
{
    None,
    KBMPrimary,
    KBMSecondary,
    Gamepad
};

UCLASS()
class SETTINGSFRAMEWORK_API USFSettingEntryWidget_Keybind : public USFSettingEntryWidget
{
    GENERATED_BODY()

    // TODO: Bind CommonUI actions to Clear and Cancel.
#pragma region Initialization
protected:
    virtual void NativeConstruct() override;
    virtual void NativeOnInitialized() override;
    virtual void InitializeSettingEntry(const class USFSettingDefinition* InSettingDefinition) override;
#pragma endregion

#pragma region Setting Value & State
protected:
    virtual void UpdateVisualValue_Implementation(const class USFSettingValue* NewValue) override;

    void ApplyNewKeybind(FKey NewKey);

    UPROPERTY()
    FSFKeybindValueData CurrentKeybindData;
#pragma endregion

#pragma region Keybind Widgets
protected:
    UFUNCTION()
    void HandleKBMPrimaryButtonClicked();

    UFUNCTION()
    void HandleKBMSecondaryButtonClicked();

    UFUNCTION()
    void HandleGamepadButtonClicked();

    UFUNCTION()
    void HandleInputMethodChanged(ECommonInputType InputType);
    UFUNCTION(BlueprintNativeEvent, Category = "SFSettingEntryWidget_Keybind | Keybind Widgets")
    void SetSlotText(ESFKeybindSlot SlotToSet, FKey Key, bool bIsListening);

    virtual void SetSlotText_Implementation(ESFKeybindSlot SlotToSet, FKey Key, bool bIsListening) {};

    void CancelListening();

    void ClearSlot(ESFKeybindSlot SlotToClear);

    UPROPERTY(BlueprintReadOnly, Category = "SFSettingEntryWidget_Keybind|Keybind Widgets", meta = (BindWidget))
    TObjectPtr<class UCommonButtonBase> KBMPrimaryButton;

    UPROPERTY(BlueprintReadOnly, Category = "SFSettingEntryWidget_Keybind|Keybind Widgets", meta = (BindWidget))
    TObjectPtr<class UCommonButtonBase> KBMSecondaryButton;

    UPROPERTY(BlueprintReadOnly, Category = "SFSettingEntryWidget_Keybind|Keybind Widgets", meta = (BindWidget))
    TObjectPtr<class UCommonButtonBase> GamepadButton;

    ESFKeybindSlot CurrentListeningSlot = ESFKeybindSlot::None;
#pragma endregion

#pragma region Navigation
public:
    virtual UWidget* GetPrimaryFocusTarget_Implementation() const;
#pragma endregion

#pragma region Input
protected:
    virtual FReply NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override;
    virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
    virtual FReply NativeOnMouseWheel(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
#pragma endregion
};