// Copyright Epic Games, Inc. All Rights Reserved. #include "SMassQuery.h" #include "SMassBitSet.h" #include "MassEntityTypes.h" #include "MassDebuggerModel.h" #include "Widgets/Text/SRichTextBlock.h" #include "Styling/AppStyle.h" #define LOCTEXT_NAMESPACE "SMassDebugger" static_assert(EMassAccessOperation::Read == uint32(EMassBitSetDisplayMode::ReadOnly) && EMassAccessOperation::Write == uint32(EMassBitSetDisplayMode::ReadWrite) , "EMassAccessOperation and EMassBitSetDisplayMode need to be kept in sync"); namespace UE::Mass::Debugger::UI::Private { template void AddBitSetPair(TSharedRef& Box, const TMassExecutionAccess& BitSetAccess, const FString& Label, TSharedRef InDebuggerModel) { if (BitSetAccess.IsEmpty() == false) { static const FSlateBrush* RequiredAccessBrushes[] = { FMassDebuggerStyle::GetBrush("MassDebug.Fragment.ReadOnly") , FMassDebuggerStyle::GetBrush("MassDebug.Fragment.ReadWrite") }; Box->AddSlot() .AutoHeight() [ SNew(SMassBitSet, InDebuggerModel, Label, BitSetAccess.AsArrayView(), RequiredAccessBrushes) .SlotPadding(5.0f) ]; } } } // namespace UE::Mass::Debugger::UI::Private void SMassQuery::Construct(const FArguments& InArgs, TSharedPtr InQueryData, TSharedRef InDebuggerModel) { using UE::Mass::Debugger::UI::Private::AddBitSetPair; using UE::Mass::Debugger::UI::AddBitSet; const FSlateColor ReadOnlyColor = FLinearColor(0.4f, 0.4f, 0.4f, 0.9f); const FSlateColor ReadWriteColor = FLinearColor(0.1f, 0.8f, 0.1f, 0.9f); QueryData = InQueryData; FMassExecutionRequirements& ExecutionRequirements = InQueryData->ExecutionRequirements; TSharedRef Box = SNew(SVerticalBox); static const FSlateBrush* ReadOnlyBrush = FMassDebuggerStyle::GetBrush("MassDebug.Fragment.ReadOnly"); Box->AddSlot() .AutoHeight() [ SNew(SRichTextBlock) .Text(InQueryData->Label) .DecoratorStyleSet(&FAppStyle::Get()) .TextStyle(FAppStyle::Get(), "LargeText") ]; AddBitSetPair(Box, ExecutionRequirements.Fragments, TEXT("Fragments"), InDebuggerModel); AddBitSet(Box, ExecutionRequirements.RequiredAllTags, TEXT("RequiredAllTags"), ReadOnlyBrush, InDebuggerModel); AddBitSet(Box, ExecutionRequirements.RequiredAnyTags, TEXT("RequiredAnyTags"), ReadOnlyBrush, InDebuggerModel); AddBitSet(Box, ExecutionRequirements.RequiredNoneTags,TEXT("RequiredNoneTags"), ReadOnlyBrush, InDebuggerModel); AddBitSetPair(Box, ExecutionRequirements.ChunkFragments, TEXT("Chunk Fragments"), InDebuggerModel); AddBitSetPair(Box, ExecutionRequirements.SharedFragments, TEXT("Shared Fragments"), InDebuggerModel); AddBitSetPair(Box, ExecutionRequirements.ConstSharedFragments, TEXT("Const Shared Fragments"), InDebuggerModel); AddBitSetPair(Box, ExecutionRequirements.RequiredSubsystems, TEXT("Required Subsystems"), InDebuggerModel); if (InQueryData->AdditionalInformation.IsEmpty() == false) { Box->AddSlot() .AutoHeight() [ SNew(SRichTextBlock) .Text(InQueryData->AdditionalInformation) ]; } ChildSlot [ SNew(SBorder) .Padding(10.0f) [ Box ] ]; } #undef LOCTEXT_NAMESPACE