// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "FindStreamsTask.h" #include "Widgets/SEmptyTab.h" #include "Widgets/SGameSyncTab.h" #include "Widgets/Docking/SDockTab.h" #include "Workspace.h" #include "UserSettings.h" namespace UGSCore { struct FUserWorkspaceSettings; struct FUserProjectSettings; class FDetectProjectSettingsTask; class FPerforceMonitor; class FEventMonitor; } class UGSTabManager; class FLogWidgetTextWriter; enum SyncCategoryType { CurrentWorkspace, AllWorkspaces }; class UGSTab { public: UGSTab(); ~UGSTab(); void Initialize(TSharedPtr UserSettings); const TSharedRef GetTabWidget(); FSpawnTabArgs GetTabArgs() const; void SetTabManager(UGSTabManager* InTabManager); void SetTabArgs(FSpawnTabArgs InTabArgs); void Tick(); bool IsProjectLoaded() const; // Slate callbacks bool OnWorkspaceChosen(const FString& Project); void OnSyncChangelist(int Changelist); void OnViewInSwarmClicked(int Changelist) const; void OnCopyChangeListClicked(int Changelist) const; void OnMoreInfoClicked(int Changelist) const; void OnOpenPerforceClicked() const; void OnSyncLatest(); void OnSyncFilterWindowSaved( const TArray& SyncViewCurrent, const TArray& SyncExcludedCategoriesCurrent, const TArray& SyncViewAll, const TArray& SyncExcludedCategoriesAll); void OnBuildWorkspace(); void OnOpenExplorer(); void OnOpenEditor(); void OnCreateWorkspace(const FString& WorkspaceName, const FString& Stream, const FString& RootDirectory) const; // Accessors bool IsSyncing() const; FString GetSyncProgress() const; const TArray& GetCombinedSyncFilter() const; TArray GetSyncCategories(SyncCategoryType CategoryType) const; TArray GetSyncViews(SyncCategoryType CategoryType) const; UGSTabManager* GetTabManager() const; TSharedPtr GetUserSettings() const; bool ShouldSyncPrecompiledEditor() const; TArray GetAllStreamNames() const; void UpdateGameTabBuildList(); void RefreshBuildList(); void CancelSync(); private: void OnWorkspaceSyncComplete( TSharedRef WorkspaceContext, UGSCore::EWorkspaceUpdateResult SyncResult, const FString& StatusMessage); TMap GetWorkspaceVariables() const; UGSCore::EBuildConfig GetEditorBuildConfig() const; TMap GetDefaultBuildStepObjects(const FString& EditorTargetName); // Allows the queuing of functions from threads to be run on the main thread void QueueMessageForMainThread(TFunction Function); bool ShouldIncludeInReviewedList(const TSet& PromotedChangeNumbers, int ChangeNumber) const; // Core functions bool SetupWorkspace(); FCriticalSection CriticalSection; // Slate Data FSpawnTabArgs TabArgs; TSharedRef TabWidget; TSharedRef EmptyTabView; TSharedRef GameSyncTabView; // Core data UGSTabManager* TabManager = nullptr; FString ProjectFileName; TSharedPtr Workspace; TSharedPtr PerforceClient; TSharedPtr WorkspaceSettings; TSharedPtr ProjectSettings; TSharedPtr DetectSettings; TArray CombinedSyncFilter; TSharedPtr UserSettings; TSharedPtr Log; // Monitoring threads TSharedPtr PerforceMonitor; TSharedPtr EventMonitor; // Queue for handling callbacks from multiple threads that need to be called on the main thread TArray> MessageQueue; std::atomic bHasQueuedMessages; std::atomic bNeedUpdateGameTabBuildList; // If we launch the editor, keep track of it to reap when its exited FProcHandle EditorProcessHandle; };