So I tried making the QoL feature, Auto-Scrolling for UI pages like Options.
Problem is it only fires once instead of looping when the button is held.
Here’s how the set up looks:
UFUNCTION()
void BPF_PageNav_Handle(ECndWidget_HandleActions Handle_Action, bool ButtonState);
UFUNCTION()
void BPF_Page_NavigateItem(ECndWidget_HandleActions Handle_Action, bool ButtonState);
UFUNCTION()
void BPF_Page_NavigateValue(ECndWidget_HandleActions Handle_Action, bool ButtonState);
void BPF_Page_NavigateAutoscroll(ECndWidget_HandleActions Handle_Action, bool ButtonState, float Speed);
UFUNCTION()
void BPF_PageNav_AutoScroll_Clear();
// Triggered From Menu Base
void UCndWgt_MenuPage_Master::BPF_PageNav_Handle(ECndWidget_HandleActions Handle_Action, bool ButtonState)
{
if (ButtonState)
{
switch (Handle_Action)
{
// Page Item Selection
case HA_ItemUp:
case HA_ItemDown:
case HA_ItemNext:
case HA_ItemPrev:
{
switch (Window_Active.Type)
{
case WindowType_Vertical:
{
switch (Handle_Action)
{
// Page Item Selection
case HA_ItemUp:
case HA_ItemDown:
{
BPF_Page_NavigateItem(Handle_Action, ButtonState);
break;
}
case HA_ItemNext:
case HA_ItemPrev:
{
BPF_Page_NavigateValue(Handle_Action, ButtonState);
break;
}
break;
}
break;
}
}
break;
}
}
void UCndWgt_MenuPage_Master::BPF_Page_NavigateItem(ECndWidget_HandleActions Handle_Action, bool ButtonState)
{
UCndWgt_MenuParts_ListItem_Master* Item_Desired = nullptr;
if (ButtonState)
{
}
// Check if we’re not scrolling item’s value right now.
if (!Data.IsAutoScrolling_Values)
{
if (CanAutoScroll_Items)
{
if (AutoScroll_Speed_Items > 0.09f)
{
if (!Data.IsAutoScrolling_Items)
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Started - Items [%s] [%s] Speed: [%s]"),
*CND_DebugString,
*UEnum::GetValueAsString(Handle_Action),
ButtonState ? TEXT("True") : TEXT("False"),
*FString::SanitizeFloat(AutoScroll_Speed_Items)
);
}
Data.TDEL_UI_AutoScroll.Unbind();
Data.TDEL_UI_AutoScroll.BindUFunction(this, FName("BPF_Page_NavigateItem"), Handle_Action, ButtonState);
Data.IsAutoScrolling_Items = true;
}
if (Data.IsAutoScrolling_Items)
{
BPF_Page_NavigateAutoscroll(Handle_Action, ButtonState, AutoScroll_Speed_Items);
}
}
}
}
}
void UCndWgt_MenuPage_Master::BPF_Page_NavigateAutoscroll(ECndWidget_HandleActions Handle_Action, bool ButtonState, float Speed)
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling... [%s] [%s]"),
*CND_DebugString,
*UEnum::GetValueAsString(Handle_Action),
ButtonState ? TEXT("True") : TEXT("False")
);
}
// Delay: Set up a timer for Action
GetWorld()->GetTimerManager().SetTimer(
Data.TH_UI_AutoScroll,
Data.TDEL_UI_AutoScroll,
Speed,
false
);
}