Files
UnrealEngine/Engine/Source/Editor/Kismet/Public/SFixupSelfContextDlg.h
2025-05-18 13:04:45 +08:00

125 lines
3.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/Array.h"
#include "CoreMinimal.h"
#include "Input/Reply.h"
#include "K2Node_CallFunction.h"
#include "Layout/Visibility.h"
#include "Styling/SlateColor.h"
#include "Templates/SharedPointer.h"
#include "Templates/TypeHash.h"
#include "UObject/NameTypes.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Input/STextComboBox.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/SWidget.h"
#include "Widgets/Views/STableRow.h"
#include "Widgets/Views/STableViewBase.h"
class FBlueprintEditor;
class FString;
class ITableRow;
class STableViewBase;
class STextComboBox;
class SWidget;
class SWindow;
class UBlueprint;
class UK2Node_CallFunction;
struct FFixupSelfContextItem
{
public:
/** Enum to describe how the node will be fixed up (or not) */
enum class EFixupStrategy
{
DoNothing,
CreateNewFunction,
RemoveNode
};
/** Constructs a FixupSelfContextItem for a given function name */
FFixupSelfContextItem(FName Function) : FuncName(Function) {}
/** Callback to create a widget for the Item */
TSharedRef<SWidget> CreateWidget(TArray<TSharedPtr<FString>>& InFixupOptions);
/** Function this item relates to */
FName FuncName;
/** Nodes that reference this function */
TArray<UK2Node_CallFunction*> Nodes;
/** Combo box for user to decide fixup strategy */
TSharedPtr<STextComboBox> ComboBox;
};
/** Widget to prompt the user to fixup self context on bad K2Node_CallFunction Pastes */
class SFixupSelfContextDialog : public SCompoundWidget
{
private:
typedef TSharedPtr<FFixupSelfContextItem> FListViewItem;
public:
SLATE_BEGIN_ARGS(SFixupSelfContextDialog)
{}
SLATE_END_ARGS()
void Construct(const FArguments& InArgs, const TArray<UK2Node_CallFunction*>& InNodesToFixup, UBlueprint* InFromBP, const FBlueprintEditor* InBlueprintEditorPtr, bool bInOtherPastedNodes);
/**
* Creates a Confirmation Modal, this function will not return until the Dialog is closed
*
* @param NodesToFixup Array of unresolved function nodes
* @param InFromBP The blueprint that the function was copied from
* @param BlueprintEditorPtr the BlueprintEditor this modal was created by
* @param bOtherPastedNodes Whether other nodes were involved in this paste operation
* @returns True if the user confirmed the operation, False if it was canceled
*/
static bool CreateModal(const TArray<UK2Node_CallFunction*>& NodesToFixup, UBlueprint* InFromBP, const FBlueprintEditor* BlueprintEditorPtr, bool bOtherPastedNodes);
private:
/** Generates a row for a List Item */
TSharedRef<ITableRow> OnGenerateRow(FListViewItem Item, const TSharedRef<STableViewBase>& OwnerTable);
/** Visibility callback for "Nothing pasted" warning */
EVisibility GetNoneWarningVisibility() const;
/** Closes the window */
FReply CloseWindow(bool bConfirmed);
/**
* Creates the missing function or event in the blueprint we are copying to. If the FuncToFix came from
* a custom event, then create a matching one here.
*
* @param FuncToFix The function that needs to be created that was on the old BP, but not this one
*/
void CreateMissingFunctions(FListViewItem FuncToFix);
/** The list of unique functions that need to be fixed */
TArray<FListViewItem> FunctionsToFixup;
/** The find results to modify */
TArray<UK2Node_CallFunction*> NodesToFixup;
/** The blueprint for the new context */
UBlueprint* Blueprint;
/** The blueprint editor this modal was created by */
const FBlueprintEditor* BlueprintEditor;
/** The blueprint that the incoming function is coming from */
UBlueprint* FromBP;
/** Window to close when dialog completed */
TSharedPtr<SWindow> MyWindow;
/** Options for fixup */
TArray<TSharedPtr<FString>> Options;
/** Whether other nodes were involved in this paste operation */
bool bOtherNodes;
/** Whether the user confirmed or canceled the action */
bool bOutConfirmed;
};