Give FindOneWithInternalID the power to handle arrays of smart pointers.
Eliminate FindNoneWithInternalID, finish migration to FindNoDuplicateNames.
This commit is contained in:
@@ -75,8 +75,9 @@ public:
|
|||||||
// Check graph name uniqueness and legality
|
// Check graph name uniqueness and legality
|
||||||
FName InternalID = WingUtils::CheckProposedName(Graph, WingOut::Stdout);
|
FName InternalID = WingUtils::CheckProposedName(Graph, WingOut::Stdout);
|
||||||
if (InternalID.IsNone()) return;
|
if (InternalID.IsNone()) return;
|
||||||
if (!WingUtils::FindNoneWithInternalID(InternalID, WingUtils::AllGraphs(BP), TEXT("Graph"), WingOut::Stdout))
|
TSet<FName> Names;
|
||||||
return;
|
if (!WingUtils::FindNoDuplicateName(Names, InternalID, TEXT("Graph"), WingOut::Stdout)) return;
|
||||||
|
if (!WingUtils::FindNoDuplicateNames(Names, WingUtils::AllGraphs(BP), TEXT("Graph"), WingOut::Stdout)) return;
|
||||||
|
|
||||||
// Parse and validate variables before making changes
|
// Parse and validate variables before making changes
|
||||||
WingVariables Vars;
|
WingVariables Vars;
|
||||||
|
|||||||
@@ -39,10 +39,9 @@ public:
|
|||||||
|
|
||||||
FBPVariableDescription* Var = WingUtils::FindOneWithExternalID(Dispatcher, BP->NewVariables, TEXT("Dispatcher"), WingOut::Stdout);
|
FBPVariableDescription* Var = WingUtils::FindOneWithExternalID(Dispatcher, BP->NewVariables, TEXT("Dispatcher"), WingOut::Stdout);
|
||||||
if (!Var) return;
|
if (!Var) return;
|
||||||
TObjectPtr<UEdGraph>* SigGraph = WingUtils::FindOneWithExternalID(Dispatcher, BP->DelegateSignatureGraphs, TEXT("Dispatcher Signature Graph"), WingOut::Stdout);
|
TObjectPtr<UEdGraph> Graph = WingUtils::FindOneWithExternalID(Dispatcher, BP->DelegateSignatureGraphs, TEXT("Dispatcher Signature Graph"), WingOut::Stdout);
|
||||||
if (!SigGraph) return;
|
if (!Graph) return;
|
||||||
|
|
||||||
UEdGraph* Graph = *SigGraph;
|
|
||||||
FName VarFName = Var->VarName;
|
FName VarFName = Var->VarName;
|
||||||
|
|
||||||
// Remove the member variable (also destroys referencing nodes)
|
// Remove the member variable (also destroys referencing nodes)
|
||||||
|
|||||||
@@ -274,12 +274,6 @@ FName WingUtils::GetFName(const FWingProperty &Prop)
|
|||||||
return Prop.Prop->GetFName();
|
return Prop.Prop->GetFName();
|
||||||
}
|
}
|
||||||
|
|
||||||
FName WingUtils::GetFName(const TSharedPtr<IPropertyHandle> &H)
|
|
||||||
{
|
|
||||||
return H->GetProperty()->GetFName();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// Formatting other things
|
// Formatting other things
|
||||||
// ============================================================
|
// ============================================================
|
||||||
@@ -385,21 +379,6 @@ bool WingUtils::CheckExactlyOneNamed(int Count, const TCHAR *Kind, FName Name, W
|
|||||||
return CheckExactlyOneNamed(Count, Kind, ExternalizeID(Name), Errors);
|
return CheckExactlyOneNamed(Count, Kind, ExternalizeID(Name), Errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WingUtils::CheckExactlyNoneNamed(int Count, const TCHAR *Kind, const FString &Name, WingOut Errors)
|
|
||||||
{
|
|
||||||
if (Count > 0)
|
|
||||||
{
|
|
||||||
Errors.Printf(TEXT("A %s named %s already exists."), Kind, *Name);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WingUtils::CheckExactlyNoneNamed(int Count, const TCHAR *Kind, FName Name, WingOut Errors)
|
|
||||||
{
|
|
||||||
return CheckExactlyNoneNamed(Count, Kind, ExternalizeID(Name), Errors);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WingUtils::CheckCanRename(UEdGraphNode* Node, const FString &Name, WingOut Errors)
|
bool WingUtils::CheckCanRename(UEdGraphNode* Node, const FString &Name, WingOut Errors)
|
||||||
{
|
{
|
||||||
if (!Node->bCanRenameNode)
|
if (!Node->bCanRenameNode)
|
||||||
|
|||||||
@@ -538,11 +538,11 @@ bool WingVariables::ModifyEditablePinBase(WingVariableList &List, UK2Node_Editab
|
|||||||
{
|
{
|
||||||
for (Var &V : List.Variables)
|
for (Var &V : List.Variables)
|
||||||
{
|
{
|
||||||
TSharedPtr<FUserPinInfo> *Found =
|
TSharedPtr<FUserPinInfo> Found =
|
||||||
WingUtils::FindOneWithInternalID(V.Name, Node->UserDefinedPins, List.ListName, Errors);
|
WingUtils::FindOneWithInternalID(V.Name, Node->UserDefinedPins, List.ListName, Errors);
|
||||||
if (!Found) return false;
|
if (!Found) return false;
|
||||||
(*Found)->PinType = V.Type;
|
Found->PinType = V.Type;
|
||||||
if (V.DefaultSpecified) (*Found)->PinDefaultValue = V.DefaultValue;
|
if (V.DefaultSpecified) Found->PinDefaultValue = V.DefaultValue;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -736,13 +736,13 @@ bool WingVariables::RemoveGraph(WingOut Errors)
|
|||||||
// Verify that all named variables exist before removing anything.
|
// Verify that all named variables exist before removing anything.
|
||||||
for (const Var& V : InputVariables.Variables)
|
for (const Var& V : InputVariables.Variables)
|
||||||
{
|
{
|
||||||
TSharedPtr<FUserPinInfo>* Found =
|
TSharedPtr<FUserPinInfo> Found =
|
||||||
WingUtils::FindOneWithInternalID(V.Name, InputNode->UserDefinedPins, TEXT("input variable"), Errors);
|
WingUtils::FindOneWithInternalID(V.Name, InputNode->UserDefinedPins, TEXT("input variable"), Errors);
|
||||||
if (!Found) return false;
|
if (!Found) return false;
|
||||||
}
|
}
|
||||||
for (const Var& V : OutputVariables.Variables)
|
for (const Var& V : OutputVariables.Variables)
|
||||||
{
|
{
|
||||||
TSharedPtr<FUserPinInfo>* Found =
|
TSharedPtr<FUserPinInfo> Found =
|
||||||
WingUtils::FindOneWithInternalID(V.Name, OutputNode->UserDefinedPins, TEXT("output variable"), Errors);
|
WingUtils::FindOneWithInternalID(V.Name, OutputNode->UserDefinedPins, TEXT("output variable"), Errors);
|
||||||
if (!Found) return false;
|
if (!Found) return false;
|
||||||
}
|
}
|
||||||
@@ -778,7 +778,7 @@ bool WingVariables::RemoveCustomEvent(WingOut Errors)
|
|||||||
// Verify that all named parameters exist before removing anything.
|
// Verify that all named parameters exist before removing anything.
|
||||||
for (const Var& V : InputVariables.Variables)
|
for (const Var& V : InputVariables.Variables)
|
||||||
{
|
{
|
||||||
TSharedPtr<FUserPinInfo>* Found =
|
TSharedPtr<FUserPinInfo> Found =
|
||||||
WingUtils::FindOneWithInternalID(V.Name, CustomEvent->UserDefinedPins, TEXT("event parameter"), Errors);
|
WingUtils::FindOneWithInternalID(V.Name, CustomEvent->UserDefinedPins, TEXT("event parameter"), Errors);
|
||||||
if (!Found) return false;
|
if (!Found) return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ public:
|
|||||||
FName PinCategory;
|
FName PinCategory;
|
||||||
FName PinSubCategory;
|
FName PinSubCategory;
|
||||||
FString PinSubCategoryObject;
|
FString PinSubCategoryObject;
|
||||||
// The following are only set for interfaces and Objects.
|
|
||||||
FName BroadCategory;
|
FName BroadCategory;
|
||||||
bool IsUserDefined = false;
|
bool IsUserDefined = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -68,29 +68,43 @@ public:
|
|||||||
static FName GetFName(const UWingComponentReference *Ref) { return Ref->VariableName; }
|
static FName GetFName(const UWingComponentReference *Ref) { return Ref->VariableName; }
|
||||||
static FName GetFName(const UWidget *Widget) { return Widget->GetFName(); }
|
static FName GetFName(const UWidget *Widget) { return Widget->GetFName(); }
|
||||||
static FName GetFName(const WingVariables::Var &Var) { return Var.Name; }
|
static FName GetFName(const WingVariables::Var &Var) { return Var.Name; }
|
||||||
static FName GetFName(const TSharedPtr<IPropertyHandle> &H);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// When searching an array of structs, you want to
|
// When searching an array of structs, you want to
|
||||||
// return a pointer to one of the structs. When
|
// return a pointer to one of the structs. When
|
||||||
// searching an array of pointers, you want to return
|
// searching an array of pointers, you want to return
|
||||||
// one of the pointers. These helpers make it easy for
|
// one of the pointers. When searching an array of
|
||||||
// the search templates below to do that.
|
// smart pointers, you want to return one of the smart
|
||||||
|
// pointers. The AsPointerLike helper below makes it
|
||||||
|
// easy for the search templates below to do that.
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template<class T> static const T* EltAsPtr(const TArray<T> &A, const T &Elt) { return &Elt; }
|
template<class T> struct IsPointerLike : std::false_type {};
|
||||||
template<class T> static T* EltAsPtr(TArray<T> &A, T &Elt) { return &Elt; }
|
template<class T> struct IsPointerLike<T*> : std::true_type {};
|
||||||
template<class T> static T* EltAsPtr(const TArray<T*> &A, T* &Elt) { return Elt; }
|
template<class T> struct IsPointerLike<TSharedPtr<T>> : std::true_type {};
|
||||||
template<class T> static T* EltAsPtr(TArray<T*> &A, T* &Elt) { return Elt; }
|
template<class T> struct IsPointerLike<TWeakObjectPtr<T>> : std::true_type {};
|
||||||
template<class T> static const T* EltAsPtr(const TArray<const T*> &A, const T* &Elt) { return Elt; }
|
template<class T> struct IsPointerLike<TObjectPtr<T>> : std::true_type {};
|
||||||
template<class T> static const T* EltAsPtr(TArray<const T*> &A, const T* &Elt) { return Elt; }
|
template<class T> struct IsPointerLike<TStrongObjectPtr<T>> : std::true_type {};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
static decltype(auto) AsPointerLike(T&& Elt)
|
||||||
|
{
|
||||||
|
if constexpr (IsPointerLike<std::remove_cvref_t<T>>::value)
|
||||||
|
{
|
||||||
|
return std::remove_cvref_t<T>(Elt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return &Elt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Search Templates. Search an array for an item with a
|
// Search Templates. Search an array for an item with a
|
||||||
// given name. Works correctly no matter how a name is
|
// given name. Works correctly no matter how a name is
|
||||||
// expressed: eg, "A+B" finds the same results as
|
// expressed: eg, "A+B" finds the same results as
|
||||||
// "A+B". Handles failure cases correctly: two
|
// "A+B". Handles failure cases correctly: two
|
||||||
// items with the same name, no such item, and malformed
|
// items with the same name, no such item, and malformed
|
||||||
@@ -107,9 +121,9 @@ public:
|
|||||||
template<typename ArrayType>
|
template<typename ArrayType>
|
||||||
static auto FindOneWithInternalID(FName InternalID, ArrayType &&Array, const TCHAR *Kind, WingOut Errors)
|
static auto FindOneWithInternalID(FName InternalID, ArrayType &&Array, const TCHAR *Kind, WingOut Errors)
|
||||||
{
|
{
|
||||||
decltype(EltAsPtr(Array, Array[0])) Result = nullptr;
|
decltype(AsPointerLike(Array[0])) Result = nullptr;
|
||||||
int Count = 0;
|
int Count = 0;
|
||||||
for (auto &Elt : Array) if (GetFName(Elt) == InternalID) { Count++; Result = EltAsPtr(Array, Elt); }
|
for (auto &Elt : Array) if (GetFName(Elt) == InternalID) { Count++; Result = AsPointerLike(Elt); }
|
||||||
if (!CheckExactlyOneNamed(Count, Kind, InternalID, Errors)) Result = nullptr;
|
if (!CheckExactlyOneNamed(Count, Kind, InternalID, Errors)) Result = nullptr;
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
@@ -117,28 +131,12 @@ public:
|
|||||||
template<typename ArrayType>
|
template<typename ArrayType>
|
||||||
static auto FindOneWithExternalID(const FString &ExternalID, ArrayType &&Array, const TCHAR *Kind, WingOut Errors)
|
static auto FindOneWithExternalID(const FString &ExternalID, ArrayType &&Array, const TCHAR *Kind, WingOut Errors)
|
||||||
{
|
{
|
||||||
decltype(EltAsPtr(Array, Array[0])) Result = nullptr;
|
decltype(AsPointerLike(Array[0])) Result = nullptr;
|
||||||
FName InternalID = CheckInternalizeID(ExternalID, Errors);
|
FName InternalID = CheckInternalizeID(ExternalID, Errors);
|
||||||
if (!InternalID.IsNone()) Result = FindOneWithInternalID(InternalID, Array, Kind, Errors);
|
if (!InternalID.IsNone()) Result = FindOneWithInternalID(InternalID, Array, Kind, Errors);
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ArrayType>
|
|
||||||
static bool FindNoneWithInternalID(FName InternalID, ArrayType &&Array, const TCHAR *Kind, WingOut Errors)
|
|
||||||
{
|
|
||||||
for (auto &Elt : Array) if (GetFName(Elt) == InternalID)
|
|
||||||
return CheckExactlyNoneNamed(1, Kind, InternalID, Errors);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ArrayType>
|
|
||||||
static bool FindNoneWithExternalID(const FString &ExternalID, ArrayType &&Array, const TCHAR *Kind, WingOut Errors)
|
|
||||||
{
|
|
||||||
FName InternalID = CheckInternalizeID(ExternalID, Errors);
|
|
||||||
if (InternalID.IsNone()) return false;
|
|
||||||
return FindNoneWithInternalID(InternalID, Array, Kind, Errors);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool FindNoDuplicateName(TSet<FName> &Collection, FName InternalID, const TCHAR *Kind, WingOut Errors)
|
static bool FindNoDuplicateName(TSet<FName> &Collection, FName InternalID, const TCHAR *Kind, WingOut Errors)
|
||||||
{
|
{
|
||||||
if (Collection.Contains(InternalID))
|
if (Collection.Contains(InternalID))
|
||||||
@@ -276,9 +274,6 @@ public:
|
|||||||
// ----- Common Error Reporting -----
|
// ----- Common Error Reporting -----
|
||||||
static bool CheckExactlyOneNamed(int Count, const TCHAR *Kind, const FString &Name, WingOut Errors);
|
static bool CheckExactlyOneNamed(int Count, const TCHAR *Kind, const FString &Name, WingOut Errors);
|
||||||
static bool CheckExactlyOneNamed(int Count, const TCHAR *Kind, FName Name, WingOut Errors);
|
static bool CheckExactlyOneNamed(int Count, const TCHAR *Kind, FName Name, WingOut Errors);
|
||||||
static bool CheckExactlyNoneNamed(int Count, const TCHAR *Kind, const FString &Name, WingOut Errors);
|
|
||||||
static bool CheckExactlyNoneNamed(int Count, const TCHAR *Kind, FName Name, WingOut Errors);
|
|
||||||
|
|
||||||
static bool CheckCanRename(UEdGraphNode* Node, const FString &Name, WingOut Errors);
|
static bool CheckCanRename(UEdGraphNode* Node, const FString &Name, WingOut Errors);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user