// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Experimental/BuildServerInterface.h" #include "Experimental/ZenServerInterface.h" #include "Internationalization/Regex.h" #include "Templates/SharedPointer.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Widgets/Input/SComboBox.h" #include "Widgets/Layout/SGridPanel.h" #include "Widgets/SBoxPanel.h" #include "Widgets/SCompoundWidget.h" #include "Widgets/SWidget.h" #include "Widgets/Views/ITableRow.h" #include "Widgets/Views/SListView.h" #include "Widgets/Views/STableRow.h" #include "Widgets/Views/STableViewBase.h" #include "ZenBuildUtils.h" #define UE_API STORAGESERVERWIDGETS_API class FUProjectDictionary; class SMultiSelectComboBox; namespace UE::Zen::Build { struct FListBuildsState; } DECLARE_DELEGATE_ThreeParams(FOnBuildTransferStarted, UE::Zen::Build::FBuildServiceInstance::FBuildTransfer /*Transfer*/, FStringView /*Name*/, FStringView /*Platform*/); class SBuildSelection : public SCompoundWidget { SLATE_BEGIN_ARGS(SBuildSelection) : _ZenServiceInstance(nullptr) , _BuildServiceInstance(nullptr) { } SLATE_ATTRIBUTE(TSharedPtr, ZenServiceInstance); SLATE_ATTRIBUTE(TSharedPtr, BuildServiceInstance); SLATE_EVENT(FOnBuildTransferStarted, OnBuildTransferStarted) SLATE_END_ARGS() struct FBuildGroup : public TSharedFromThis { FString Namespace; FString DisplayName; FString CommitIdentifier; FString Suffix; FDateTime CreatedAt; FString Category; FString Job; TMap PerPlatformBuilds; }; UE_API void Construct(const FArguments& InArgs); private: enum class EBuildType { Oplog, StagedBuild, PackagedBuild, EditorPreCompiledBinary, EditorInstalledBuild, Unknown, Count }; struct FKnownBuildType { EBuildType Type; FText UserText; }; static TPair MakeKnownBuildTypePattern(const FStringView InPattern, EBuildType Type, FText&& InText); UE_API EBuildType GetSelectedBuildType() const; UE_API void RebuildLists(); UE_API void RegenerateBuildGroups(UE::Zen::Build::FListBuildsState& ListBuildsState); UE_API void ConditionalSortBuildGroups(); UE_API void RegenerateActivePlatformFilters(); UE_API void ValidateBuildGroupSelection(); UE_API TSharedRef OnGenerateTextBlockFromString(TSharedPtr Item); UE_API TSharedRef OnGenerateBuildTypeTextBlockFromString(TSharedPtr Item); UE_API bool BuildGroupIsSelectableOrNavigable(TSharedPtr InItem) const; UE_API TSharedRef GenerateBuildGroupRow(TSharedPtr InItem, const TSharedRef& InOwningTable); UE_API TSharedPtr OnGetBuildGroupContextMenuContent() const; UE_API void OnOpenDestinationDirectoryClicked(); UE_API TSharedRef GetBuildDestinationPanel(); UE_API TSharedRef GetGridPanel(); UE_API void BuildGroupSelectionChanged(TSharedPtr Item, ESelectInfo::Type SelectInfo); EColumnSortMode::Type GetColumnSortMode(const FName ColumnId) const; void OnColumnSortModeChanged(const EColumnSortPriority::Type SortPriority, const FName& ColumnId, const EColumnSortMode::Type InSortMode); FText ConvertBuildTypeToText(const FString& InBuildType); UE_API void SetUserSelectedDestination(const FStringView InDestination); UE_API FString GetUserSelectedDestination() const; UE_API FString GetDefaultDestination() const; UE_API FString GetEffectiveDestination() const; void SetSelectedStream(const TSharedPtr InSelectedStream); void SetSelectedProject(const TSharedPtr InSelectedProject); void SetSelectedBuildType(const TSharedPtr InBuildType); bool WriteSetting(FStringView InSectionName, FStringView InKeyName, FStringView InValue); bool WriteSetting(FStringView InKeyName, FStringView InValue); bool ReadSetting(FStringView InSectionName, FStringView InKeyName, FString& OutValue); bool ReadSetting(FStringView InKeyName, FString& OutValue); void SetUserSelectedProjectDictionaryRoot(FStringView InRoot); static UE_API FString SanitizeForPath(const FString& InString); static UE_API FString SanitizeForZenId(const FString& InString); static UE_API FString SanitizeBucketSegment(const FString& InString); static const TCHAR* LexToString(EBuildType BuildType); UE_API FReply ExploreDestination_OnClicked(); static const FString EmptyString; TMap EngineInstallations; TUniquePtr FallbackProjectDictionary; FString UserSelectedProjectDictionaryRootDir; TUniquePtr UserSelectedProjectDictionary; FString BuildUrl; FString BuildId; FString BuildVersion; FString BranchName; int EffectiveCompatibleChangelist = 0; TSharedPtr>> ProjectWidget; TSharedPtr>> StreamWidget; TSharedPtr>> BuildTypeWidget; TSharedPtr RequiredPlatformsWidget; TSharedPtr SelectedGroupPlatformGrid; TArray SelectedGroupSelectedPlatforms; TMultiMap BucketsToNamespaces; TArray> ProjectList; TArray> StreamList; TArray> BuildTypeList; TArray> PlatformList; TArray ActivePlatformFilters; FString UserSelectedDestinations[(int)EBuildType::Count]; bool bAppendBuildNameToDestinations[(int)EBuildType::Count]; TSharedPtr SelectedStream; TSharedPtr SelectedProject; TSharedPtr SelectedBuildType; FString SelectedCommitFilter; TArray> KnownBuildTypePatterns; TSharedPtr>> BuildGroupListView; FName BuildGroupSortByColumn; EColumnSortMode::Type BuildGroupSortMode; std::atomic BuildListRefreshesInProgress = 0; std::atomic BuildRefreshGeneration = 0; TArray> BuildGroups; SVerticalBox::FSlot* GridSlot = nullptr; TAttribute> ZenServiceInstance; TAttribute> BuildServiceInstance; FOnBuildTransferStarted OnBuildTransferStarted; }; typedef TSharedPtr FBuildSelectionBuildGroupPtr; class SBuildGroupTableRow : public SMultiColumnTableRow { public: SLATE_BEGIN_ARGS(SBuildGroupTableRow) { } SLATE_END_ARGS() void Construct(const FArguments& InArgs, const TSharedRef& InOwnerTableView, const FBuildSelectionBuildGroupPtr InBuildGroup); virtual TSharedRef GenerateWidgetForColumn(const FName& ColumnName) override; const FSlateBrush* GetBorder() const; FReply OnBrowseClicked(); private: FBuildSelectionBuildGroupPtr BuildGroup; }; #undef UE_API