// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Internationalization/Text.h" #include "NiagaraCommon.h" #include "Templates/SharedPointer.h" #include "ViewModels/Stack/NiagaraStackEntry.h" class FNiagaraSystemViewModel; class UNiagaraStackEntry; class UNiagaraStackFunctionInput; class UNiagaraStackRoot; class UNiagaraStackScriptItemGroup; class UNiagaraStackModuleItem; class UNiagaraStackObject; class UNiagaraStackPropertyRow; template struct TNiagaraStackQueryResult { TNiagaraStackQueryResult(TNiagaraStackEntry* InStackEntry, FText InErrorMessage) : StackEntry(InStackEntry) , ErrorMessage(InErrorMessage) { } bool IsValid() const { return StackEntry != nullptr; } TNiagaraStackEntry* StackEntry; FText ErrorMessage; }; template class TNiagaraStackQueryBase { public: TNiagaraStackQueryBase(TNiagaraStackEntry& InStackEntry) : StackEntry(&InStackEntry) { } TNiagaraStackQueryBase(FText InErrorMessage) : StackEntry(nullptr) , ErrorMessage(InErrorMessage) { ensureMsgf(ErrorMessage.IsEmpty() == false, TEXT("Error message must not be empty.")); } TNiagaraStackEntry* GetEntry() const { return StackEntry; } FText GetErrorMessage() const { return ErrorMessage; } TNiagaraStackQueryResult GetResult() const { return TNiagaraStackQueryResult(StackEntry, ErrorMessage); } private: TNiagaraStackEntry* StackEntry; FText ErrorMessage; }; class FNiagaraStackPropertyRowQuery : public TNiagaraStackQueryBase { public: FNiagaraStackPropertyRowQuery(UNiagaraStackPropertyRow& InStackEntry) : TNiagaraStackQueryBase(InStackEntry) { } FNiagaraStackPropertyRowQuery(FText InErrorMessage) : TNiagaraStackQueryBase(InErrorMessage) { } }; class FNiagaraStackObjectQuery : public TNiagaraStackQueryBase { public: FNiagaraStackObjectQuery(UNiagaraStackObject& InStackEntry) : TNiagaraStackQueryBase(InStackEntry) { } FNiagaraStackObjectQuery(FText InErrorMessage) : TNiagaraStackQueryBase(InErrorMessage) { } FNiagaraStackPropertyRowQuery NIAGARAEDITOR_API FindPropertyRow(FName PropertyName) const; }; class FNiagaraStackFunctionInputQuery : public TNiagaraStackQueryBase { public: FNiagaraStackFunctionInputQuery(UNiagaraStackFunctionInput& InStackEntry) : TNiagaraStackQueryBase(InStackEntry) { } FNiagaraStackFunctionInputQuery(FText InErrorMessage) : TNiagaraStackQueryBase(InErrorMessage) { } FNiagaraStackObjectQuery NIAGARAEDITOR_API FindObjectValue() const; }; class FNiagaraStackModuleItemQuery : public TNiagaraStackQueryBase { public: FNiagaraStackModuleItemQuery(UNiagaraStackModuleItem& InStackEntry) : TNiagaraStackQueryBase(InStackEntry) { } FNiagaraStackModuleItemQuery(FText InErrorMessage) : TNiagaraStackQueryBase(InErrorMessage) { } FNiagaraStackFunctionInputQuery NIAGARAEDITOR_API FindFunctionInput(FName InputName) const; }; class FNiagaraStackScriptItemGroupQuery : public TNiagaraStackQueryBase { public: FNiagaraStackScriptItemGroupQuery(UNiagaraStackScriptItemGroup& InStackEntry) : TNiagaraStackQueryBase(InStackEntry) { } FNiagaraStackScriptItemGroupQuery(FText InErrorMessage) : TNiagaraStackQueryBase(InErrorMessage) { } FNiagaraStackModuleItemQuery NIAGARAEDITOR_API FindSetParametersItem(FName ParameterName) const; FNiagaraStackModuleItemQuery NIAGARAEDITOR_API FindModuleItem(const FString& ModuleName) const; }; class FNiagaraStackRootQuery : public TNiagaraStackQueryBase { public: static FNiagaraStackRootQuery SystemStackRootEntry(TSharedRef InSystemViewModel); static FNiagaraStackRootQuery NIAGARAEDITOR_API EmitterStackRootEntry(TSharedRef InSystemViewModel, FName EmitterName); FNiagaraStackScriptItemGroupQuery NIAGARAEDITOR_API FindScriptGroup(ENiagaraScriptUsage ScriptUsage, FGuid ScriptUsageId) const; private: FNiagaraStackRootQuery(UNiagaraStackRoot& InStackEntry) : TNiagaraStackQueryBase(InStackEntry) { } FNiagaraStackRootQuery(FText InErrorMessage) : TNiagaraStackQueryBase(InErrorMessage) { } };