Hello [mention removed],
Thank you for the detailed repro steps. I’ve been able to reproduce this issue on my end.
In UE 5.4, the SNiagaraColorParameterEditor was refactored to use a new modular SNiagaraColorEditor widget (see NiagaraColorTypeEditorUtilities.cpp), which changed how color preview interactions are handled. Here is the relevant change.
In older versions, the class used direct SColorPickerArgs bindings such as OnInteractivePickBegin and OnInteractivePickEnd to drive interactive updates, enabling the color picker preview to take effect. In the new setup, these hooks are no longer being used in the SNiagaraColorEditor implementation.
I found a workaround that restores the expected behavior. You would need to modify both the SNiagaraColorEditor .h and .cpp file.
Here’s the modification:
`// SNiagaraColorEditor.h:
// Force the color update during interaction with the color picker
void OnColorPickerInteraction();
// SNiagaraColorEditor.cpp:
FReply SNiagaraColorEditor::OnColorBlockMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
if (MouseEvent.GetEffectingButton() != EKeys::LeftMouseButton)
{
return FReply::Unhandled();
}
OnBeginEditingDelegate.ExecuteIfBound();
FColorPickerArgs PickerArgs;
{
PickerArgs.bUseAlpha = bShowAlpha;
PickerArgs.bOnlyRefreshOnMouseUp = false;
PickerArgs.bOnlyRefreshOnOk = false;
PickerArgs.DisplayGamma = TAttribute::Create(TAttribute::FGetter::CreateUObject(GEngine, &UEngine::GetDisplayGamma));
PickerArgs.OnColorCommitted = FOnLinearColorValueChanged::CreateSP(this, &SNiagaraColorEditor::ColorPickerColorCommitted);
PickerArgs.OnColorPickerCancelled = FOnColorPickerCancelled::CreateSP(this, &SNiagaraColorEditor::OnColorPickerCancelled);
PickerArgs.OnColorPickerWindowClosed = FOnWindowClosed::CreateSP(this, &SNiagaraColorEditor::OnColorPickerClosed);
// Workaround to force color pick preview
PickerArgs.OnInteractivePickEnd = FSimpleDelegate::CreateSP(this, &SNiagaraColorEditor::OnColorPickerInteraction);
PickerArgs.InitialColor = Color.Get(FLinearColor::White);
PickerArgs.ParentWidget = ColorBlock;
FWidgetPath ParentWidgetPath;
if (FSlateApplication::Get().FindPathToWidget(ColorBlock.ToSharedRef(), ParentWidgetPath))
{
PickerArgs.bOpenAsMenu = FSlateApplication::Get().FindMenuInWidgetPath(ParentWidgetPath).IsValid();
}
}
OpenColorPicker(PickerArgs);
OnColorPickerOpenedDelegate.ExecuteIfBound();
return FReply::Handled();
}
void SNiagaraColorEditor::OnColorPickerInteraction()
{
OnEndEditingDelegate.ExecuteIfBound();
}`With the delegate bound, the color picker preview will now take effect immediately whenever you interact with it.
Please let me know if this workaround helps. I’ll follow up with the Epic team to confirm whether this behavior change was intentional or a regression introduced during the widget refactor.
Best,
Francisco