Okay then, detailed code block and new version of it.
No need to make “safer” version or whatever.
Everything is set right. No issues with held input.
// Navigation Root - Triggered From Menu Base - ButtonState = Button Heldvoid UCndWgt_MenuPage_Master::BPF_PageNav_Handle(ECndWidget_HandleActions Handle_Action, bool ButtonState)
{
if (CND_DebugLog)
{
if (!Data.IsAutoScrolling_Items || !Data.IsAutoScrolling_Values)
{
UE_LOG(LogTemp, Warning, TEXT("%s | Nav Triggered - Handle: [%s]. WindowType [%s]. State: [%s]."),
*CND_DebugString,
*UEnum::GetValueAsString(Handle_Action),
*UEnum::GetValueAsString(Data.Active.Window),
ButtonState ? TEXT("True") : TEXT("False")
);
}
}
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;
}
}
}
else
{
if (Data.IsAutoScrolling_Items || Data.IsAutoScrolling_Values)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Stopped [%s] [%s]"),
*CND_DebugString,
*UEnum::GetValueAsString(Handle_Action),
ButtonState ? TEXT("True") : TEXT("False")
);
// Stop Auto-Scroll
BPF_PageNav_AutoScroll_Clear();
}
}
}
void UCndWgt_MenuPage_Master::BPF_Page_NavigateItem(ECndWidget_HandleActions Handle_Action, bool ButtonState)
{
// Prevent Cross-Scrolling Values (Check if we're not scrolling values right now.)
if (!Data.IsAutoScrolling_Values)
{
UCndWgt_MenuParts_ListItem_Master* Item_Desired = nullptr;
if (ButtonState)
{
// If not valid.
if (!Window_Active.Item[VAL_Current])
{
if (Window_Active.Items.Num() > 0)
{
Window_Active.Item[VAL_Current] = Window_Active.Items[0];
Item_Desired = Window_Active.Item[VAL_Current];
}
}
else
{
auto* Current = Window_Active.Item[VAL_Current];
// Navigate Via Neighoubring Widget Positions
Item_Desired = BPF_PageNav_FindNeighbour(Current, Handle_Action);
}
if (Item_Desired)
{
BPF_PageItem_Highlight(Item_Desired, true);
}
if (CanAutoScroll_Items)
{
if (!Data.IsAutoScrolling_Items)
{
Data.HA_Last = Handle_Action;
Data.Delay = NAV_Delay_Items;
BPF_PageNav_AutoScroll_Start(AutoScroll_Speed_Items_Initial);
}
else
{
if (AutoScroll_Speed_Items > 0.09f)
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Items - Detected"),
*CND_DebugString
);
}
BPF_PageNav_Autoscroll(AutoScroll_Speed_Items);
}
}
}
}
}
if (Data.IsAutoScrolling_Items)
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Items - Detected | State [%s] - Action [%s] - Speed [%s] - Can Scroll Values [%s]"),
*CND_DebugString,
ButtonState ? TEXT("True") : TEXT("False"),
*UEnum::GetValueAsString(Handle_Action),
*FString::SanitizeFloat(AutoScroll_Speed_Items),
Data.IsAutoScrolling_Values ? TEXT("True") : TEXT("False")
);
}
}
}
void UCndWgt_MenuPage_Master::BPF_Page_NavigateValue(ECndWidget_HandleActions Handle_Action, bool ButtonState)
{
// Prevent Cross-Scrolling Items (Check if we're not scrolling items right now.)
if (!Data.IsAutoScrolling_Items)
{
UCndWgt_MenuParts_ListItem_Master* Item_Desired = nullptr;
if (ButtonState)
{
if (Window_Active.Item[VAL_Current])
{
Item_Desired = Window_Active.Item[VAL_Current];
if (ButtonState) Item_Desired->ED_OnItem_Interacted.Broadcast(Handle_Action, ButtonState);
if (CanAutoScroll_Values)
{
switch (Item_Desired->ItemType)
{
case LI_SelectionList:
case LI_NumSlider:
{
if (!Data.IsAutoScrolling_Values)
{
Data.HA_Last = Handle_Action;
Data.Delay = NAV_Delay_Value;
BPF_PageNav_AutoScroll_Start(AutoScroll_Speed_Values_Initial);
}
else
{
if (AutoScroll_Speed_Values > 0.09f)
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Values - Detected"),
*CND_DebugString
);
}
BPF_PageNav_Autoscroll(AutoScroll_Speed_Values);
}
}
break;
}
}
}
}
}
}
if (Data.IsAutoScrolling_Values)
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Items - Detected | State [%s] - Action [%s] - Speed [%s] - Can Scroll Items [%s]"),
*CND_DebugString,
ButtonState ? TEXT("True") : TEXT("False"),
*UEnum::GetValueAsString(Handle_Action),
*FString::SanitizeFloat(AutoScroll_Speed_Values),
Data.IsAutoScrolling_Items ? TEXT("True") : TEXT("False")
);
}
}
}
void UCndWgt_MenuPage_Master::BPF_PageNav_AutoScroll_Start(float Speed)
{
Data.TDEL_UI_AutoScroll_Start.Unbind();
switch (Data.Delay)
{
case NAV_Delay_Items:
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Started - Items [%s] Speed: [%s]."),
*CND_DebugString,
*UEnum::GetValueAsString(Data.HA_Last),
*FString::SanitizeFloat(AutoScroll_Speed_Items_Initial)
);
}
Data.IsAutoScrolling_Items = true;
Data.TDEL_UI_AutoScroll_Start.BindUFunction(this, FName("BPF_Page_NavigateItem"), Data.HA_Last, true);
Data.TDEL_UI_AutoScroll_Loop.BindUFunction(this, FName("BPF_Page_NavigateItem"), Data.HA_Last, true);
break;
}
case NAV_Delay_Value:
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Started - Value [%s] Speed: [%s]."),
*CND_DebugString,
*UEnum::GetValueAsString(Data.HA_Last),
*FString::SanitizeFloat(AutoScroll_Speed_Values_Initial)
);
}
Data.IsAutoScrolling_Values = true;
Data.TDEL_UI_AutoScroll_Start.BindUFunction(this, FName("BPF_Page_NavigateValue"), Data.HA_Last, true);
Data.TDEL_UI_AutoScroll_Loop.BindUFunction(this, FName("BPF_Page_NavigateValue"), Data.HA_Last, true);
break;
}
}
GetWorld()->GetTimerManager().SetTimer(
Data.TH_UI_AutoScroll_Start,
Data.TDEL_UI_AutoScroll_Start,
Speed,
false
);
}
void UCndWgt_MenuPage_Master::BPF_PageNav_Autoscroll(float Speed)
{
switch (Data.Delay)
{
case NAV_Delay_Items:
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Items... Speed: [%s]"),
*CND_DebugString,
*FString::SanitizeFloat(AutoScroll_Speed_Items)
);
}
//BPF_Page_NavigateItem(Data.HA_Last, true);
break;
}
case NAV_Delay_Value:
{
if (CND_DebugLog)
{
UE_LOG(LogTemp, Warning,
TEXT("%s | Autoscrolling Values... Speed: [%s]"),
*CND_DebugString,
*FString::SanitizeFloat(AutoScroll_Speed_Values)
);
}
//BPF_Page_NavigateValue(Data.HA_Last, true);
break;
}
}
// Delay
GetWorld()->GetTimerManager().SetTimer(
Data.TH_UI_AutoScroll_Loop,
Data.TDEL_UI_AutoScroll_Loop,
Speed,
false
);
}
void UCndWgt_MenuPage_Master::BPF_PageNav_AutoScroll_Clear()
{
// Delay: Clear the timer for Action
GetWorld()->GetTimerManager().ClearTimer(Data.TH_UI_AutoScroll_Start);
GetWorld()->GetTimerManager().ClearTimer(Data.TH_UI_AutoScroll_Loop);
Data.IsAutoScrolling_Items = false;
Data.IsAutoScrolling_Values = false;
Data.TDEL_UI_AutoScroll_Start.Unbind();
Data.TDEL_UI_AutoScroll_Loop.Unbind();
}
But logs show some sort of bool anomaly:
LogTemp: Warning: CND_DEBUG (Player Pawn) | BP_IA_MenuHandle - Handle: [HA_ItemDown]. State: [True].
LogTemp: Warning: CND_DEBUG (Widget) | Menu Base | BPF_MenuNav_Handle - [Page: CndPage_UI_Options] [Menu Type: CndMenuType_Shared] [Handle Action: HA_ItemDown] [State: True].
LogTemp: Warning: CND_DEBUG (Widget - [CndPage_UI_Options]) | Nav Triggered - Handle: [HA_ItemDown]. WindowType [WindowType_Vertical]. State: [True].
LogTemp: Warning: CND_DEBUG (Widget - [CndPage_UI_Options]) | Autoscrolling Started - Items [HA_ItemDown] Speed: [0.25].
LogTemp: Warning: CND_DEBUG (Widget - [CndPage_UI_Options]) | Autoscrolling Items - Detected | State [True] - Action [HA_ItemDown] - Speed [0.125] - Can Scroll Values [False]
LogTemp: Warning: CND_DEBUG (Widget - [CndPage_UI_Options]) | Autoscrolling Items - Detected | State [False] - Action [HA_ItemDown] - Speed [0.125] - Can Scroll Values [False]
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG: Windows Controller Type: PC
LogTemp: Warning: CND_DEBUG (Player Pawn) | BP_IA_MenuHandle - Handle: [HA_ItemDown]. State: [False].
LogTemp: Warning: CND_DEBUG (Widget) | Menu Base | BPF_MenuNav_Handle - [Page: CndPage_UI_Options] [Menu Type: CndMenuType_Shared] [Handle Action: HA_ItemDown] [State: False].
LogTemp: Warning: CND_DEBUG (Widget - [CndPage_UI_Options]) | Nav Triggered - Handle: [HA_ItemDown]. WindowType [WindowType_Vertical]. State: [False].
LogTemp: Warning: CND_DEBUG (Widget - [CndPage_UI_Options]) | Autoscrolling Stopped [HA_ItemDown] [False]