Files
UnrealEngineUWP/Engine/Source/Editor/NiagaraEditor/Private/ViewModels/NiagaraScriptParameterViewModel.cpp
Marcus Wassmer 2c8ce304cd Comprehensive Editor/Monolithic non-unity IWYU fixes for Niagara
#rb none
#lockdown Nick.Penwarden

[CL 3251623 by Marcus Wassmer in Main branch]
2017-01-09 20:19:50 -05:00

172 lines
5.8 KiB
C++

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#include "NiagaraScriptParameterViewModel.h"
#include "NiagaraEditorUtilities.h"
#include "NiagaraTypes.h"
#include "ScopedTransaction.h"
#include "Editor.h"
#define LOCTEXT_NAMESPACE "ScriptParameterViewModel"
FNiagaraScriptParameterViewModel::FNiagaraScriptParameterViewModel(FNiagaraVariable& InGraphVariable, UObject& InGraphVariableOwner, FNiagaraVariable* InCompiledVariable, UObject* InCompiledVariableOwner, ENiagaraParameterEditMode ParameterEditMode)
: FNiagaraParameterViewModel(ParameterEditMode)
, GraphVariable(InGraphVariable)
, GraphVariableOwner(InGraphVariableOwner)
, CompiledVariable(InCompiledVariable)
, CompiledVariableOwner(InCompiledVariableOwner)
, ValueObject(nullptr)
{
bool bUsingCompiledVariable = InCompiledVariable != nullptr;
checkf(bUsingCompiledVariable == false || InCompiledVariableOwner != nullptr, TEXT("When using a compiled variable, it's owner must not be null"));
DefaultValueType = INiagaraParameterViewModel::EDefaultValueType::Struct;
RefreshParameterValue();
}
FNiagaraScriptParameterViewModel::FNiagaraScriptParameterViewModel(FNiagaraVariable& InGraphVariable, UObject& InGraphVariableOwner, UObject* InValueObject, ENiagaraParameterEditMode ParameterEditMode)
: FNiagaraParameterViewModel(ParameterEditMode)
, GraphVariable(InGraphVariable)
, GraphVariableOwner(InGraphVariableOwner)
, CompiledVariable(nullptr)
, CompiledVariableOwner(nullptr)
, ValueObject(InValueObject)
{
DefaultValueType = INiagaraParameterViewModel::EDefaultValueType::Object;
}
FGuid FNiagaraScriptParameterViewModel::GetId() const
{
return GraphVariable.GetId();
}
FName FNiagaraScriptParameterViewModel::GetName() const
{
return GraphVariable.GetName();
}
FText FNiagaraScriptParameterViewModel::GetTypeDisplayName() const
{
return FText::Format(LOCTEXT("TypeTextFormat", "Type: {0}"), GraphVariable.GetType().GetStruct()->GetDisplayNameText());
}
void FNiagaraScriptParameterViewModel::NameTextComitted(const FText& Name, ETextCommit::Type CommitInfo)
{
FName NewName = *Name.ToString();
if (GraphVariable.GetName() != NewName)
{
FScopedTransaction ScopedTransaction(LOCTEXT("EditInputName", "Edit input name"));
GraphVariableOwner.Modify();
GraphVariable.SetName(NewName);
OnNameChangedDelegate.Broadcast();
}
}
TSharedPtr<FNiagaraTypeDefinition> FNiagaraScriptParameterViewModel::GetType() const
{
return MakeShareable(new FNiagaraTypeDefinition(GraphVariable.GetType()));
}
void FNiagaraScriptParameterViewModel::SelectedTypeChanged(TSharedPtr<FNiagaraTypeDefinition> Item, ESelectInfo::Type SelectionType)
{
if (Item.IsValid() && GraphVariable.GetType() != *Item)
{
FScopedTransaction ScopedTransaction(LOCTEXT("EditInputType", "Edit input type"));
GraphVariableOwner.Modify();
GraphVariable.SetType(*Item);
FNiagaraEditorUtilities::ResetVariableToDefaultValue(GraphVariable);
OnTypeChangedDelegate.Broadcast();
}
}
INiagaraParameterViewModel::EDefaultValueType FNiagaraScriptParameterViewModel::GetDefaultValueType()
{
return DefaultValueType;
}
TSharedRef<FStructOnScope> FNiagaraScriptParameterViewModel::GetDefaultValueStruct()
{
return ParameterValue.ToSharedRef();
}
UObject* FNiagaraScriptParameterViewModel::GetDefaultValueObject()
{
return ValueObject;
}
void FNiagaraScriptParameterViewModel::NotifyDefaultValuePropertyChanged(const FPropertyChangedEvent& PropertyChangedEvent)
{
if (DefaultValueType == INiagaraParameterViewModel::EDefaultValueType::Struct)
{
FScopedTransaction ScopedTransaction(LOCTEXT("EditParameterValueProperty", "Edit parameter value"));
ValueVariableOwner->Modify();
ValueVariable->SetData(ParameterValue->GetStructMemory());
}
OnDefaultValueChangedDelegate.Broadcast(&GraphVariable);
}
void FNiagaraScriptParameterViewModel::NotifyBeginDefaultValueChange()
{
GEditor->BeginTransaction(LOCTEXT("BeginEditParameterValue", "Edit parameter value"));
ValueVariableOwner->Modify();
}
void FNiagaraScriptParameterViewModel::NotifyEndDefaultValueChange()
{
if (GEditor->IsTransactionActive())
{
GEditor->EndTransaction();
}
}
bool DataMatches(const uint8* DataA, const uint8* DataB, int32 Length)
{
for (int32 i = 0; i < Length; ++i)
{
if (DataA[i] != DataB[i])
{
return false;
}
}
return true;
}
void FNiagaraScriptParameterViewModel::NotifyDefaultValueChanged()
{
if (ValueVariable->IsDataAllocated() == false ||
DataMatches(ValueVariable->GetData(), ParameterValue->GetStructMemory(), ValueVariable->GetSizeInBytes()) == false)
{
FScopedTransaction ScopedTransaction(LOCTEXT("EditParameterValue", "Edit parameter value"));
ValueVariableOwner->Modify();
ValueVariable->SetData(ParameterValue->GetStructMemory());
OnDefaultValueChangedDelegate.Broadcast(&GraphVariable);
}
}
FNiagaraScriptParameterViewModel::FOnNameChanged& FNiagaraScriptParameterViewModel::OnNameChanged()
{
return OnNameChangedDelegate;
}
void FNiagaraScriptParameterViewModel::RefreshParameterValue()
{
if (CompiledVariable != nullptr && CompiledVariable->GetType().GetStruct() == GraphVariable.GetType().GetStruct())
{
// If the compiled variable is valid and the same type as the graph variable we will update that value to allow for changes to be
// seen in the simulation without compiling.
ValueVariable = CompiledVariable;
ValueVariableOwner = CompiledVariableOwner;
}
else
{
// If the compiled variable is null or the type of the graph variable has been changed,
// then we edit the value in the graph variable so that the value is of the correct type and can be edited.
ValueVariable = &GraphVariable;
ValueVariableOwner = &GraphVariableOwner;
}
ParameterValue = MakeShareable(new FStructOnScope(GraphVariable.GetType().GetStruct()));
ValueVariable->AllocateData();
ValueVariable->CopyTo(ParameterValue->GetStructMemory());
OnDefaultValueChangedDelegate.Broadcast(&GraphVariable);
}
#undef LOCTEXT_NAMESPACE // "ScriptParameterViewModel"