Files
2025-05-18 13:04:45 +08:00

192 lines
5.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "STG_OutputSelectionDlg.h"
#include "Widgets/Layout/SBox.h"
#include "TG_Pin.h"
#include "TG_Graph.h"
#include "Widgets/Layout/SSeparator.h"
#include "SPrimaryButton.h"
#include "Widgets/Layout/SUniformGridPanel.h"
#include "Expressions/Output/TG_Expression_Output.h"
#include "Editor.h"
#include "EdGraph/STG_NodeThumbnail.h"
#include "STG_OutputSelector.h"
#include "TextureGraph.h"
#include "TG_HelperFunctions.h"
#include "EdGraph/TG_EdGraphNode.h"
#include "Widgets/Colors/SColorBlock.h"
#define LOCTEXT_NAMESPACE "STG_OutputSelectionDlg"
void STG_OutputSelectionDlg::Construct(const FArguments& InArgs)
{
EdGraph = InArgs._EdGraph;
SWindow::Construct(SWindow::FArguments()
.Title(InArgs._Title)
.SupportsMinimize(false)
.SupportsMaximize(false)
//.SizingRule( ESizingRule::Autosized )
.ClientSize(FVector2D(350, 450))
[
SNew(SVerticalBox)
+ SVerticalBox::Slot() // Add user input block
.Padding(2, 2, 2, 4)
[
SNew(SBorder)
.BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder"))
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.FillHeight(1)
[
SAssignNew(ScrollBox,SScrollBox)
]
]
]
+ SVerticalBox::Slot()
.AutoHeight()
.HAlign(HAlign_Right)
.VAlign(VAlign_Bottom)
.Padding(8.f, 16.f)
[
SNew(SUniformGridPanel)
.MinDesiredSlotWidth(FAppStyle::GetFloat("StandardDialog.MinDesiredSlotWidth"))
.MinDesiredSlotHeight(FAppStyle::GetFloat("StandardDialog.MinDesiredSlotHeight"))
.SlotPadding(FAppStyle::GetMargin("StandardDialog.SlotPadding"))
+ SUniformGridPanel::Slot(0, 0)
[
SNew(SPrimaryButton)
.Text(LOCTEXT("Export", "Export"))
.OnClicked(this, &STG_OutputSelectionDlg::OnButtonClick, EAppReturnType::Ok)
]
+ SUniformGridPanel::Slot(1, 0)
[
SNew(SButton)
.Text(LOCTEXT("Cancel", "Cancel"))
.ContentPadding(FAppStyle::GetMargin("StandardDialog.ContentPadding"))
.OnClicked(this, &STG_OutputSelectionDlg::OnButtonClick, EAppReturnType::Cancel)
]
]
]);
AddExportItems();
}
void STG_OutputSelectionDlg::AddExportItems()
{
ScrollBox->ClearChildren();
UTG_EdGraph* TGEdGraph = Cast<UTG_EdGraph>(EdGraph);
TGEdGraph->TextureGraph->Graph()->ForEachNodes([this](const UTG_Node* Node, uint32 Index)
{
UTG_Expression_Output* TargetExpression = Cast<UTG_Expression_Output>(Node->GetExpression());
if (TargetExpression)
{
FTG_OutputSettings& OutputSetting = TargetExpression->OutputSettings;
auto OutPinIds = Node->GetOutputPinIds();
for (auto Id : OutPinIds)
{
//This is a work around for checking the type of the output
//Probably we need to have a better solution for checking output type
auto Pin = Node->GetGraph()->GetPin(Id);
FName OutputName = Pin->GetAliasName();
FTG_Variant Variant;
Pin->GetValue(Variant);
TSharedPtr<SWidget> ThumbnailWidget;
if (Variant.IsTexture())
{
TSharedPtr<STG_NodeThumbnail> NodeThumbnail = SNew(STG_NodeThumbnail);
TiledBlobPtr CachedThumb = EdGraph->GetCachedThumbBlob(Id);
if(!CachedThumb)
{
CachedThumb = TextureHelper::GetBlack();
}
if (CachedThumb->IsFinalised())
{
if (NodeThumbnail.IsValid())
{
NodeThumbnail->UpdateBlob(CachedThumb);
}
}
ThumbnailWidget = NodeThumbnail;
}
// else if color do something
else if (Variant.IsColor())
{
FLinearColor ColorValue;
Pin->GetValue(ColorValue);
ThumbnailWidget = SNew(SColorBlock)
.Color(ColorValue);
}
else if(Variant.IsVector())
{
FVector4f Vector;
Pin->GetValue(Vector);
ThumbnailWidget = SNew(SColorBlock)
.Color(Vector);
}
else if (Variant.IsScalar())
{
float Scalar;
Pin->GetValue(Scalar);
ThumbnailWidget = SNew(SColorBlock)
.Color(FLinearColor(Scalar, Scalar, Scalar, 1));
}
ScrollBox->AddSlot()
.Padding(5)
[
SNew(STG_OutputSelector)
.Name(FText::FromString(OutputName.ToString()))
.ThumbnailWidget(ThumbnailWidget)
.OnOutputSelectionChanged(this, &STG_OutputSelectionDlg::OnOutputSelectionChanged)
.bIsSelected(TargetExpression->GetShouldExport())
];
ScrollBox->AddSlot()
[
SNew(SSeparator)
.Thickness(1)
];
}
}
});
}
FReply STG_OutputSelectionDlg::OnButtonClick(EAppReturnType::Type ButtonID)
{
UserResponse = ButtonID;
if (ButtonID == EAppReturnType::Cancel || ButtonID == EAppReturnType::Ok)
{
// Only close the window if canceling or if the ok
RequestDestroyWindow();
}
else
{
// reset the user response in case the window is closed using 'x'.
UserResponse = EAppReturnType::Cancel;
}
return FReply::Handled();
}
EAppReturnType::Type STG_OutputSelectionDlg::ShowModal()
{
GEditor->EditorAddModalWindow(SharedThis(this));
return UserResponse;
}
void STG_OutputSelectionDlg::OnOutputSelectionChanged(const FString ItemName, ECheckBoxState NewState)
{
UTG_EdGraph* TGEdGraph = Cast<UTG_EdGraph>(EdGraph);
TGEdGraph->TextureGraph->Graph()->ForEachNodes([=](const UTG_Node* Node, uint32 Index)
{
UTG_Expression_Output* TargetExpression = Cast<UTG_Expression_Output>(Node->GetExpression());
if (TargetExpression)
{
UTG_Pin* Pin = Node->GetPin(GET_MEMBER_NAME_CHECKED(UTG_Expression_Output, Output));
FName OutputName = Pin->GetAliasName();
if (OutputName == ItemName)
{
TargetExpression->SetShouldExport( NewState == ECheckBoxState::Checked);
}
}
});
}
#undef LOCTEXT_NAMESPACE