Might help someone, I approached it differently and set the color in C++ (and was extremely lazy and just set everything back to white before setting the new selected color, I wouldn’t do that for real (honest!) I’d add a currently selected index etc.)
Setting the color was way harder than I expected you have to include the two obvious includes
#include "Styling/SlateColor.h"
#include "Math/Color.h"
But it still wont compile, turns out slate color is in a different module called SLATECORE so you have to add that into the PuzzlePlatforms.Build.cs file as well like we did for the onlinesubsystem etc.
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "UMG" , "OnlineSubsystem" , "SLATECORE", "OnlineSubsystemSteam" });
I found a handy way to check if something needs an additional module, if you search for it and look at the strcut piece you can get a hint there for what might be needed then search to confirm etc.
struct SLATECORE_API FSlateColor
My very lazy code, I wanted to practice iterating through objects in a for loop and casting them so did it like this, there are better ways to do it but it was fun to figure out. I added a function to get a reference to the actual text block but looking at how SetColorAndOpacity works I think I probably could have just applied it at parent level and it would have cascaded down to child elements, but I wanted to practice getting references anyway.
void UMainMenu::SelectIndex(uint32 Index)
{
SelectedIndex = Index;
//ServerList->GetChildAt(Index)->SetToolTipText(FText::FromString("asdasdasdasdasd"));
//UEditableText* t = Cast<UEditableText>(ServerList->GetChildAt(Index));
UServerRow* r;
TArray<UWidget*> AllChildren = ServerList->GetAllChildren();
for (UWidget* Child : AllChildren)
{
r = Cast<UServerRow>(Child);
if (IsValid(r))
{
UTextBlock* t = r->GetTextBlock();
if (IsValid(t))
{
t->SetColorAndOpacity(FSlateColor(FLinearColor(1, 1, 1, 1)));
}
}
}
r = Cast<UServerRow>(ServerList->GetChildAt(Index));
if (IsValid(r))
{
UTextBlock* t = r->GetTextBlock();
if (IsValid(t))
{
t->SetColorAndOpacity(FSlateColor(FLinearColor(1, 0.5f, 0.5f, 1)));
}
}
UE_LOG(LogTemp, Warning, TEXT("Selected Index callback %d"), SelectedIndex.GetValue());
}