2021-01-11 15:31:58 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "SSourceControlChangelists.h"
# include "EditorStyleSet.h"
2021-01-18 15:31:14 -04:00
# include "Algo/Transform.h"
2021-01-11 15:31:58 -04:00
# include "Widgets/DeclarativeSyntaxSupport.h"
# include "Widgets/Images/SImage.h"
# include "Widgets/Layout/SScrollBorder.h"
2021-01-27 15:28:56 -04:00
# include "Widgets/Input/SButton.h"
# include "Widgets/Layout/SBorder.h"
# include "Widgets/Layout/SBox.h"
2021-01-11 15:31:58 -04:00
# include "ISourceControlProvider.h"
# include "ISourceControlModule.h"
# include "SourceControlOperations.h"
2021-01-18 09:42:33 -04:00
# include "ToolMenus.h"
2021-01-11 21:46:43 -04:00
# include "Widgets/Images/SLayeredImage.h"
2021-01-18 09:42:33 -04:00
# include "SSourceControlDescription.h"
2021-01-19 14:50:23 -04:00
# include "SourceControlWindows.h"
2021-02-04 11:50:49 -04:00
# include "SourceControlHelpers.h"
2021-01-19 14:50:23 -04:00
# include "AssetToolsModule.h"
# include "ContentBrowserModule.h"
# include "IContentBrowserSingleton.h"
2021-01-20 09:51:23 -04:00
# include "Misc/MessageDialog.h"
2021-02-04 11:50:49 -04:00
# include "Algo/AnyOf.h"
# include "SSourceControlSubmit.h"
# include "Framework/Application/SlateApplication.h"
2021-01-19 14:50:23 -04:00
2021-01-11 15:31:58 -04:00
# define LOCTEXT_NAMESPACE "SourceControlChangelist"
2021-01-18 15:31:14 -04:00
//////////////////////////////
struct FSCCFileDragDropOp : public FDragDropOperation
{
DRAG_DROP_OPERATOR_TYPE ( FSCCFileDragDropOp , FDragDropOperation ) ;
using FDragDropOperation : : Construct ;
virtual TSharedPtr < SWidget > GetDefaultDecorator ( ) const override
{
2021-02-04 17:41:41 -04:00
return SSourceControlCommon : : GetSCCFileWidget ( Files [ 0 ] ) ;
2021-01-18 15:31:14 -04:00
}
TArray < FSourceControlStateRef > Files ;
} ;
//////////////////////////////
2021-01-11 15:31:58 -04:00
SSourceControlChangelistsWidget : : SSourceControlChangelistsWidget ( )
{
}
void SSourceControlChangelistsWidget : : Construct ( const FArguments & InArgs )
{
2021-01-13 11:07:12 -04:00
// Register delegates
ISourceControlModule & SCCModule = ISourceControlModule : : Get ( ) ;
SCCModule . RegisterProviderChanged ( FSourceControlProviderChanged : : FDelegate : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnSourceControlProviderChanged ) ) ;
SourceControlStateChangedDelegateHandle = SCCModule . GetProvider ( ) . RegisterSourceControlStateChanged_Handle ( FSourceControlStateChanged : : FDelegate : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnSourceControlStateChanged ) ) ;
2021-01-11 15:31:58 -04:00
TreeView = CreateTreeviewWidget ( ) ;
ChildSlot
2021-01-13 16:50:22 -04:00
[
2021-01-27 15:28:56 -04:00
SNew ( SVerticalBox )
+ SVerticalBox : : Slot ( )
. AutoHeight ( )
2021-01-11 15:31:58 -04:00
[
2021-01-27 15:28:56 -04:00
SNew ( SBorder )
. BorderImage ( FEditorStyle : : GetBrush ( " ToolPanel.GroupBorder " ) )
. Padding ( 4 )
[
SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
. HAlign ( HAlign_Left )
. VAlign ( VAlign_Center )
. AutoWidth ( )
[
MakeToolBar ( )
]
]
]
+ SVerticalBox : : Slot ( )
[
SNew ( SScrollBorder , TreeView . ToSharedRef ( ) )
. Visibility ( TAttribute < EVisibility > : : Create ( TAttribute < EVisibility > : : FGetter : : CreateLambda ( [ ] ( ) - > EVisibility { return ISourceControlModule : : Get ( ) . IsEnabled ( ) ? EVisibility : : Visible : EVisibility : : Hidden ; } ) ) )
[
TreeView . ToSharedRef ( )
]
2021-01-13 16:50:22 -04:00
]
] ;
bShouldRefresh = true ;
2021-01-11 15:31:58 -04:00
}
2021-01-27 15:28:56 -04:00
TSharedRef < SWidget > SSourceControlChangelistsWidget : : MakeToolBar ( )
{
FSlimHorizontalToolBarBuilder ToolBarBuilder ( nullptr , FMultiBoxCustomization : : None ) ;
ToolBarBuilder . AddToolBarButton (
FUIAction (
FExecuteAction : : CreateLambda ( [ this ] ( ) {
RequestRefresh ( ) ;
} ) ) ,
NAME_None ,
LOCTEXT ( " SourceControl_RefreshButton " , " Refresh " ) ,
LOCTEXT ( " SourceControl_RefreshButton_Tooltip " , " Refreshes changelists from source control provider. " ) ,
FSlateIcon ( FEditorStyle : : GetStyleSetName ( ) , " SourceControl.Actions.Refresh " ) ) ;
return ToolBarBuilder . MakeWidget ( ) ;
}
2021-01-13 16:50:22 -04:00
void SSourceControlChangelistsWidget : : Tick ( const FGeometry & AllottedGeometry , const double InCurrentTime , const float InDeltaTime )
{
if ( bShouldRefresh )
{
if ( ISourceControlModule : : Get ( ) . IsEnabled ( ) )
{
RequestRefresh ( ) ;
bShouldRefresh = false ;
}
else
{
// No provider available, clear changelist tree
ClearChangelistsTree ( ) ;
}
}
}
void SSourceControlChangelistsWidget : : RequestRefresh ( )
2021-01-11 15:31:58 -04:00
{
2021-01-13 11:07:12 -04:00
if ( ISourceControlModule : : Get ( ) . IsEnabled ( ) )
{
2021-01-13 16:50:22 -04:00
TSharedRef < FUpdatePendingChangelistsStatus , ESPMode : : ThreadSafe > UpdatePendingChangelistsOperation = ISourceControlOperation : : Create < FUpdatePendingChangelistsStatus > ( ) ;
2021-01-13 11:07:12 -04:00
UpdatePendingChangelistsOperation - > SetUpdateAllChangelists ( true ) ;
UpdatePendingChangelistsOperation - > SetUpdateFilesStates ( true ) ;
2021-01-26 09:19:24 -04:00
UpdatePendingChangelistsOperation - > SetUpdateShelvedFilesStates ( true ) ;
2021-01-11 15:31:58 -04:00
2021-01-13 11:07:12 -04:00
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
2021-02-08 09:36:20 -04:00
SourceControlProvider . Execute ( UpdatePendingChangelistsOperation , EConcurrency : : Asynchronous ) ;
2021-01-13 11:07:12 -04:00
}
else
{
// No provider available, clear changelist tree
2021-01-13 16:50:22 -04:00
ClearChangelistsTree ( ) ;
}
}
void SSourceControlChangelistsWidget : : ClearChangelistsTree ( )
{
if ( ! ChangelistsNodes . IsEmpty ( ) )
{
2021-01-13 11:07:12 -04:00
ChangelistsNodes . Empty ( ) ;
TreeView - > RequestTreeRefresh ( ) ;
}
}
2021-01-11 15:31:58 -04:00
2021-01-13 16:50:22 -04:00
void SSourceControlChangelistsWidget : : Refresh ( )
2021-01-11 15:31:58 -04:00
{
2021-01-13 11:07:12 -04:00
if ( ISourceControlModule : : Get ( ) . IsEnabled ( ) )
2021-01-11 15:31:58 -04:00
{
2021-01-26 10:56:16 -04:00
TMap < FSourceControlChangelistStateRef , ExpandedState > ExpandedStates ;
SaveExpandedState ( ExpandedStates ) ;
2021-01-13 11:07:12 -04:00
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
TArray < FSourceControlChangelistRef > Changelists = SourceControlProvider . GetChangelists ( EStateCacheUsage : : Use ) ;
TArray < FSourceControlChangelistStateRef > ChangelistsStates ;
SourceControlProvider . GetState ( Changelists , ChangelistsStates , EStateCacheUsage : : Use ) ;
ChangelistsNodes . Reset ( ChangelistsStates . Num ( ) ) ;
for ( FSourceControlChangelistStateRef ChangelistState : ChangelistsStates )
2021-01-11 15:31:58 -04:00
{
2021-01-13 11:07:12 -04:00
FChangelistTreeItemRef ChangelistTreeItem = MakeShareable ( new FChangelistTreeItem ( ChangelistState ) ) ;
2021-01-11 15:31:58 -04:00
2021-01-13 11:07:12 -04:00
for ( FSourceControlStateRef FileRef : ChangelistState - > GetFilesStates ( ) )
{
FChangelistTreeItemRef FileTreeItem = MakeShareable ( new FFileTreeItem ( FileRef ) ) ;
ChangelistTreeItem - > AddChild ( FileTreeItem ) ;
}
2021-01-26 09:19:24 -04:00
if ( ChangelistState - > GetShelvedFilesStates ( ) . Num ( ) > 0 )
{
FChangelistTreeItemRef ShelvedChangelistTreeItem = MakeShareable ( new FShelvedChangelistTreeItem ( ) ) ;
ChangelistTreeItem - > AddChild ( ShelvedChangelistTreeItem ) ;
for ( FSourceControlStateRef ShelvedFileRef : ChangelistState - > GetShelvedFilesStates ( ) )
{
FChangelistTreeItemRef ShelvedFileTreeItem = MakeShareable ( new FShelvedFileTreeItem ( ShelvedFileRef ) ) ;
ShelvedChangelistTreeItem - > AddChild ( ShelvedFileTreeItem ) ;
}
}
2021-01-13 11:07:12 -04:00
ChangelistsNodes . Add ( ChangelistTreeItem ) ;
}
2021-01-13 16:50:22 -04:00
2021-01-26 10:56:16 -04:00
RestoreExpandedState ( ExpandedStates ) ;
2021-01-13 16:50:22 -04:00
TreeView - > RequestTreeRefresh ( ) ;
2021-01-13 11:07:12 -04:00
}
else
{
2021-01-13 16:50:22 -04:00
ClearChangelistsTree ( ) ;
2021-01-11 15:31:58 -04:00
}
}
2021-01-13 16:50:22 -04:00
void SSourceControlChangelistsWidget : : OnSourceControlProviderChanged ( ISourceControlProvider & OldProvider , ISourceControlProvider & NewProvider )
2021-01-11 15:31:58 -04:00
{
2021-01-13 16:50:22 -04:00
OldProvider . UnregisterSourceControlStateChanged_Handle ( SourceControlStateChangedDelegateHandle ) ;
SourceControlStateChangedDelegateHandle = NewProvider . RegisterSourceControlStateChanged_Handle ( FSourceControlStateChanged : : FDelegate : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnSourceControlStateChanged ) ) ;
2021-01-11 15:31:58 -04:00
2021-01-13 16:50:22 -04:00
bShouldRefresh = true ;
}
2021-01-11 15:31:58 -04:00
2021-01-13 16:50:22 -04:00
void SSourceControlChangelistsWidget : : OnSourceControlStateChanged ( )
{
Refresh ( ) ;
}
2021-01-11 15:31:58 -04:00
2021-01-13 16:50:22 -04:00
void SSourceControlChangelistsWidget : : OnChangelistsStatusUpdated ( const FSourceControlOperationRef & InOperation , ECommandResult : : Type InType )
{
Refresh ( ) ;
2021-01-11 15:31:58 -04:00
}
2021-01-13 20:52:07 -04:00
void SChangelistTree : : Private_SetItemSelection ( FChangelistTreeItemPtr TheItem , bool bShouldBeSelected , bool bWasUserDirected )
{
bool bAllowSelectionChange = true ;
if ( bShouldBeSelected & & ! SelectedItems . IsEmpty ( ) )
{
// Prevent selecting changelists and files at the same time.
FChangelistTreeItemPtr CurrentlySelectedItem = ( * SelectedItems . begin ( ) ) ;
if ( TheItem - > GetTreeItemType ( ) ! = CurrentlySelectedItem - > GetTreeItemType ( ) )
{
bAllowSelectionChange = false ;
}
// Prevent selecting items that don't share the same root
else if ( TheItem - > GetParent ( ) ! = CurrentlySelectedItem - > GetParent ( ) )
{
bAllowSelectionChange = false ;
}
}
if ( bAllowSelectionChange )
{
STreeView : : Private_SetItemSelection ( TheItem , bShouldBeSelected , bWasUserDirected ) ;
}
}
2021-01-18 09:42:33 -04:00
FSourceControlChangelistStatePtr SSourceControlChangelistsWidget : : GetCurrentChangelistState ( )
{
if ( ! TreeView )
{
return nullptr ;
}
TArray < FChangelistTreeItemPtr > SelectedItems = TreeView - > GetSelectedItems ( ) ;
if ( SelectedItems . Num ( ) ! = 1 | | SelectedItems [ 0 ] - > GetTreeItemType ( ) ! = IChangelistTreeItem : : Changelist )
{
return nullptr ;
}
else
{
return StaticCastSharedPtr < FChangelistTreeItem > ( SelectedItems [ 0 ] ) - > ChangelistState ;
}
}
FSourceControlChangelistPtr SSourceControlChangelistsWidget : : GetCurrentChangelist ( )
{
FSourceControlChangelistStatePtr ChangelistState = GetCurrentChangelistState ( ) ;
return ChangelistState ? ( FSourceControlChangelistPtr ) ( ChangelistState - > GetChangelist ( ) ) : nullptr ;
}
2021-01-26 09:19:24 -04:00
FSourceControlChangelistStatePtr SSourceControlChangelistsWidget : : GetChangelistStateFromSelection ( )
2021-01-18 09:42:33 -04:00
{
if ( ! TreeView )
{
return nullptr ;
}
TArray < FChangelistTreeItemPtr > SelectedItems = TreeView - > GetSelectedItems ( ) ;
2021-01-26 09:19:24 -04:00
if ( SelectedItems . Num ( ) = = 0 | | SelectedItems [ 0 ] - > GetTreeItemType ( ) = = IChangelistTreeItem : : Invalid )
2021-01-18 09:42:33 -04:00
{
return nullptr ;
}
2021-01-26 09:19:24 -04:00
FChangelistTreeItemPtr Item = SelectedItems [ 0 ] ;
while ( Item & & Item - > GetTreeItemType ( ) ! = IChangelistTreeItem : : Invalid )
2021-01-18 09:42:33 -04:00
{
2021-01-26 09:19:24 -04:00
if ( Item - > GetTreeItemType ( ) = = IChangelistTreeItem : : Changelist )
return StaticCastSharedPtr < FChangelistTreeItem > ( Item ) - > ChangelistState ;
else
Item = Item - > GetParent ( ) ;
2021-01-18 09:42:33 -04:00
}
2021-01-26 09:19:24 -04:00
return nullptr ;
2021-01-18 09:42:33 -04:00
}
2021-01-26 09:19:24 -04:00
FSourceControlChangelistPtr SSourceControlChangelistsWidget : : GetChangelistFromSelection ( )
2021-01-18 09:42:33 -04:00
{
2021-01-26 09:19:24 -04:00
FSourceControlChangelistStatePtr ChangelistState = GetChangelistStateFromSelection ( ) ;
2021-01-18 09:42:33 -04:00
return ChangelistState ? ( FSourceControlChangelistPtr ) ( ChangelistState - > GetChangelist ( ) ) : nullptr ;
}
TArray < FString > SSourceControlChangelistsWidget : : GetSelectedFiles ( )
{
TArray < FChangelistTreeItemPtr > SelectedItems = TreeView - > GetSelectedItems ( ) ;
if ( SelectedItems . Num ( ) = = 0 | | SelectedItems [ 0 ] - > GetTreeItemType ( ) ! = IChangelistTreeItem : : File )
{
return TArray < FString > ( ) ;
}
else
{
TArray < FString > Files ;
for ( FChangelistTreeItemPtr Item : SelectedItems )
{
Files . Add ( StaticCastSharedPtr < FFileTreeItem > ( Item ) - > FileState - > GetFilename ( ) ) ;
}
return Files ;
}
}
2021-01-26 09:19:24 -04:00
TArray < FString > SSourceControlChangelistsWidget : : GetSelectedShelvedFiles ( )
{
TArray < FString > ShelvedFiles ;
TArray < FChangelistTreeItemPtr > SelectedItems = TreeView - > GetSelectedItems ( ) ;
if ( SelectedItems . Num ( ) > 0 )
{
if ( SelectedItems [ 0 ] - > GetTreeItemType ( ) = = IChangelistTreeItem : : ShelvedChangelist )
{
check ( SelectedItems . Num ( ) = = 1 ) ;
const TArray < FChangelistTreeItemPtr > & ShelvedChildren = SelectedItems [ 0 ] - > GetChildren ( ) ;
for ( FChangelistTreeItemPtr Item : ShelvedChildren )
{
ShelvedFiles . Add ( StaticCastSharedPtr < FShelvedFileTreeItem > ( Item ) - > FileState - > GetFilename ( ) ) ;
}
}
else if ( SelectedItems [ 0 ] - > GetTreeItemType ( ) = = IChangelistTreeItem : : ShelvedFile )
{
for ( FChangelistTreeItemPtr Item : SelectedItems )
{
ShelvedFiles . Add ( StaticCastSharedPtr < FShelvedFileTreeItem > ( Item ) - > FileState - > GetFilename ( ) ) ;
}
}
}
return ShelvedFiles ;
}
2021-01-18 09:42:33 -04:00
void SSourceControlChangelistsWidget : : OnNewChangelist ( )
{
FText ChangelistDescription ;
bool bOk = GetChangelistDescription (
nullptr ,
LOCTEXT ( " SourceControl.Changelist.New.Title " , " New Changelist... " ) ,
LOCTEXT ( " SourceControl.Changelist.New.Label " , " Enter a description for the changelist: " ) ,
ChangelistDescription ) ;
if ( ! bOk )
{
return ;
}
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
auto NewChangelistOperation = ISourceControlOperation : : Create < FNewChangelist > ( ) ;
NewChangelistOperation - > SetDescription ( ChangelistDescription ) ;
SourceControlProvider . Execute ( NewChangelistOperation ) ;
}
void SSourceControlChangelistsWidget : : OnDeleteChangelist ( )
{
if ( GetCurrentChangelist ( ) = = nullptr )
{
return ;
}
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
SourceControlProvider . Execute ( ISourceControlOperation : : Create < FDeleteChangelist > ( ) , GetCurrentChangelist ( ) ) ;
}
bool SSourceControlChangelistsWidget : : CanDeleteChangelist ( )
{
FSourceControlChangelistStatePtr Changelist = GetCurrentChangelistState ( ) ;
return Changelist ! = nullptr & & Changelist - > GetFilesStates ( ) . Num ( ) = = 0 & & Changelist - > GetShelvedFilesStates ( ) . Num ( ) = = 0 ;
}
void SSourceControlChangelistsWidget : : OnEditChangelist ( )
{
FSourceControlChangelistStatePtr ChangelistState = GetCurrentChangelistState ( ) ;
if ( ChangelistState = = nullptr )
{
return ;
}
FText NewChangelistDescription = ChangelistState - > GetDescriptionText ( ) ;
bool bOk = GetChangelistDescription (
nullptr ,
LOCTEXT ( " SourceControl.Changelist.New.Title " , " Edit Changelist... " ) ,
LOCTEXT ( " SourceControl.Changelist.New.Label " , " Enter a new description for the changelist: " ) ,
NewChangelistDescription ) ;
if ( ! bOk )
{
return ;
}
auto EditChangelistOperation = ISourceControlOperation : : Create < FEditChangelist > ( ) ;
EditChangelistOperation - > SetDescription ( NewChangelistDescription ) ;
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
SourceControlProvider . Execute ( EditChangelistOperation , ChangelistState - > GetChangelist ( ) ) ;
}
void SSourceControlChangelistsWidget : : OnRevertUnchanged ( )
{
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
auto RevertUnchangedOperation = ISourceControlOperation : : Create < FRevertUnchanged > ( ) ;
2021-01-26 09:19:24 -04:00
SourceControlProvider . Execute ( RevertUnchangedOperation , GetChangelistFromSelection ( ) , GetSelectedFiles ( ) ) ;
2021-01-18 09:42:33 -04:00
}
2021-01-27 16:11:25 -04:00
bool SSourceControlChangelistsWidget : : CanRevertUnchanged ( )
{
return GetSelectedFiles ( ) . Num ( ) > 0 | | ( GetCurrentChangelistState ( ) & & GetCurrentChangelistState ( ) - > GetFilesStates ( ) . Num ( ) > 0 ) ;
}
2021-01-19 14:50:23 -04:00
void SSourceControlChangelistsWidget : : OnRevert ( )
{
2021-01-20 09:51:23 -04:00
FText DialogText ;
FText DialogTitle ;
2021-01-19 14:50:23 -04:00
2021-01-20 09:51:23 -04:00
const bool bApplyOnChangelist = ( GetCurrentChangelist ( ) ! = nullptr ) ;
if ( bApplyOnChangelist )
{
DialogText = LOCTEXT ( " SourceControl_ConfirmRevertChangelist " , " Are you sure you want to revert this changelist? " ) ;
DialogTitle = LOCTEXT ( " SourceControl_ConfirmRevertChangelist_Title " , " Confirm changelist revert " ) ;
}
else
{
DialogText = LOCTEXT ( " SourceControl_ConfirmRevertFiles " , " Are you sure you want to revert the selected files? " ) ;
DialogTitle = LOCTEXT ( " SourceControl_ConfirmReverFiles_Title " , " Confirm files revert " ) ;
}
EAppReturnType : : Type UserConfirmation = FMessageDialog : : Open ( EAppMsgType : : OkCancel , EAppReturnType : : Ok , DialogText , & DialogTitle ) ;
if ( UserConfirmation ! = EAppReturnType : : Ok )
{
return ;
}
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
2021-01-19 14:50:23 -04:00
auto RevertOperation = ISourceControlOperation : : Create < FRevert > ( ) ;
2021-01-26 09:19:24 -04:00
SourceControlProvider . Execute ( RevertOperation , GetChangelistFromSelection ( ) , GetSelectedFiles ( ) ) ;
}
2021-01-19 14:50:23 -04:00
2021-01-27 16:11:25 -04:00
bool SSourceControlChangelistsWidget : : CanRevert ( )
{
return GetSelectedFiles ( ) . Num ( ) > 0 | | ( GetCurrentChangelistState ( ) & & GetCurrentChangelistState ( ) - > GetFilesStates ( ) . Num ( ) > 0 ) ;
}
2021-01-26 09:19:24 -04:00
void SSourceControlChangelistsWidget : : OnShelve ( )
{
2021-02-08 15:32:48 -04:00
FSourceControlChangelistStatePtr CurrentChangelist = GetChangelistStateFromSelection ( ) ;
if ( ! CurrentChangelist )
{
return ;
}
FText ChangelistDescription = CurrentChangelist - > GetDescriptionText ( ) ;
if ( ChangelistDescription . IsEmptyOrWhitespace ( ) )
{
bool bOk = GetChangelistDescription (
nullptr ,
LOCTEXT ( " SourceControl.Changelist.NewShelve " , " Shelving files... " ) ,
LOCTEXT ( " SourceControl.Changelist.NewShelve.Label " , " Enter a description for the changelist holding the shelve: " ) ,
ChangelistDescription ) ;
if ( ! bOk )
{
// User cancelled entering a changelist description; abort shelve
return ;
}
}
2021-01-26 09:19:24 -04:00
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
auto ShelveOperation = ISourceControlOperation : : Create < FShelve > ( ) ;
2021-02-08 15:32:48 -04:00
ShelveOperation - > SetDescription ( ChangelistDescription ) ;
SourceControlProvider . Execute ( ShelveOperation , CurrentChangelist - > GetChangelist ( ) , GetSelectedFiles ( ) ) ;
2021-01-26 09:19:24 -04:00
}
2021-01-19 14:50:23 -04:00
2021-01-26 09:19:24 -04:00
void SSourceControlChangelistsWidget : : OnUnshelve ( )
{
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
auto UnshelveOperation = ISourceControlOperation : : Create < FUnshelve > ( ) ;
SourceControlProvider . Execute ( UnshelveOperation , GetChangelistFromSelection ( ) , GetSelectedShelvedFiles ( ) ) ;
}
void SSourceControlChangelistsWidget : : OnDeleteShelvedFiles ( )
{
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
auto DeleteShelvedOperation = ISourceControlOperation : : Create < FDeleteShelved > ( ) ;
SourceControlProvider . Execute ( DeleteShelvedOperation , GetChangelistFromSelection ( ) , GetSelectedShelvedFiles ( ) ) ;
2021-01-19 14:50:23 -04:00
}
2021-02-04 11:50:49 -04:00
static void GetChangelistValidationResult ( FSourceControlChangelistPtr InChangelist , FString & OutValidationText , FName & OutValidationIcon )
{
FSourceControlPreSubmitDataValidationDelegate ValidationDelegate = ISourceControlModule : : Get ( ) . GetRegisteredPreSubmitDataValidation ( ) ;
EDataValidationResult ValidationResult = EDataValidationResult : : NotValidated ;
TArray < FText > ValidationErrors ;
TArray < FText > ValidationWarnings ;
if ( ValidationDelegate . ExecuteIfBound ( InChangelist , ValidationResult , ValidationErrors , ValidationWarnings ) )
{
if ( ValidationResult = = EDataValidationResult : : Invalid | | ValidationErrors . Num ( ) > 0 )
{
OutValidationIcon = " MessageLog.Error " ;
OutValidationText = LOCTEXT ( " SourceControl.Submit.ChangelistValidationError " , " Changelist validation failed! " ) . ToString ( ) ;
}
else if ( ValidationResult = = EDataValidationResult : : NotValidated | | ValidationWarnings . Num ( ) > 0 )
{
OutValidationIcon = " MessageLog.Warning " ;
OutValidationText = LOCTEXT ( " SourceControl.Submit.ChangelistValidationWarning " , " Changelist validation has warnings! " ) . ToString ( ) ;
}
else
{
OutValidationIcon = " MessageLog.Note " ;
OutValidationText = LOCTEXT ( " SourceControl.Submit.ChangelistValidationSuccess " , " Changelist validation succesful! " ) . ToString ( ) ;
}
int32 NumLinesDisplayed = 0 ;
auto AppendInfo = [ & OutValidationText , & NumLinesDisplayed ] ( const TArray < FText > & Info , const FString & InfoType ) {
const int32 MaxNumLinesDisplayed = 5 ;
if ( Info . Num ( ) > 0 )
{
OutValidationText + = LINE_TERMINATOR ;
OutValidationText + = FString : : Printf ( TEXT ( " Encountered %d %s: " ) , Info . Num ( ) , * InfoType ) ;
for ( const FText & Line : Info )
{
if ( NumLinesDisplayed > = MaxNumLinesDisplayed )
{
break ;
}
OutValidationText + = LINE_TERMINATOR ;
OutValidationText + = Line . ToString ( ) ;
+ + NumLinesDisplayed ;
}
}
} ;
AppendInfo ( ValidationErrors , TEXT ( " errors " ) ) ;
AppendInfo ( ValidationWarnings , TEXT ( " warnings " ) ) ;
}
}
2021-01-18 09:42:33 -04:00
void SSourceControlChangelistsWidget : : OnSubmitChangelist ( )
{
2021-01-27 16:11:25 -04:00
FSourceControlChangelistStatePtr ChangelistState = GetCurrentChangelistState ( ) ;
2021-01-18 09:42:33 -04:00
2021-01-27 16:11:25 -04:00
if ( ! ChangelistState )
2021-01-18 09:42:33 -04:00
{
return ;
}
2021-02-04 11:50:49 -04:00
FString ChangelistValidationText ;
FName ChangelistValidationIconName ;
GetChangelistValidationResult ( ChangelistState - > GetChangelist ( ) , ChangelistValidationText , ChangelistValidationIconName ) ;
2021-01-18 09:42:33 -04:00
2021-02-04 11:50:49 -04:00
// Build list of states for the dialog
FText ChangelistDescription = ChangelistState - > GetDescriptionText ( ) ;
const bool bAskForChangelistDescription = ( ChangelistDescription . IsEmptyOrWhitespace ( ) ) ;
2021-01-20 09:51:23 -04:00
2021-02-04 11:50:49 -04:00
TSharedRef < SWindow > NewWindow = SNew ( SWindow )
. Title ( NSLOCTEXT ( " SourceControl.ConfirmSubmit " , " Title " , " Confirm changelist submit " ) )
. SizingRule ( ESizingRule : : UserSized )
. ClientSize ( FVector2D ( 600 , 400 ) )
. SupportsMaximize ( true )
. SupportsMinimize ( false ) ;
TSharedRef < SSourceControlSubmitWidget > SourceControlWidget =
SNew ( SSourceControlSubmitWidget )
. ParentWindow ( NewWindow )
. Items ( ChangelistState - > GetFilesStates ( ) )
. Description ( ChangelistDescription )
. ChangeValidationDescription ( ChangelistValidationText )
. ChangeValidationIcon ( ChangelistValidationIconName )
. AllowDescriptionChange ( bAskForChangelistDescription )
. AllowUncheckFiles ( false )
. AllowKeepCheckedOut ( false ) ;
NewWindow - > SetContent (
SourceControlWidget
) ;
FSlateApplication : : Get ( ) . AddModalWindow ( NewWindow , NULL ) ;
if ( SourceControlWidget - > GetResult ( ) = = ESubmitResults : : SUBMIT_ACCEPTED )
2021-01-20 09:51:23 -04:00
{
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
auto SubmitChangelistOperation = ISourceControlOperation : : Create < FCheckIn > ( ) ;
2021-02-04 11:50:49 -04:00
// Replace description only if there was none
2021-01-27 16:11:25 -04:00
if ( bAskForChangelistDescription )
{
2021-02-04 11:50:49 -04:00
FChangeListDescription Description ;
SourceControlWidget - > FillChangeListDescription ( Description ) ;
SubmitChangelistOperation - > SetDescription ( Description . Description ) ;
2021-01-27 16:11:25 -04:00
}
SourceControlProvider . Execute ( SubmitChangelistOperation , ChangelistState - > GetChangelist ( ) ) ;
2021-01-20 09:51:23 -04:00
}
2021-01-18 09:42:33 -04:00
}
bool SSourceControlChangelistsWidget : : CanSubmitChangelist ( )
{
FSourceControlChangelistStatePtr Changelist = GetCurrentChangelistState ( ) ;
2021-01-27 16:11:25 -04:00
return Changelist ! = nullptr & & Changelist - > GetFilesStates ( ) . Num ( ) > 0 & & Changelist - > GetShelvedFilesStates ( ) . Num ( ) = = 0 ;
2021-01-18 09:42:33 -04:00
}
2021-01-19 14:50:23 -04:00
void SSourceControlChangelistsWidget : : OnLocateFile ( )
{
2021-01-22 16:21:29 -04:00
TArray < FAssetData > AssetsToSync ;
TArray < FChangelistTreeItemPtr > SelectedItems = TreeView - > GetSelectedItems ( ) ;
2021-01-19 14:50:23 -04:00
2021-01-22 16:21:29 -04:00
for ( const FChangelistTreeItemPtr & SelectedItem : SelectedItems )
2021-01-19 14:50:23 -04:00
{
2021-01-22 16:21:29 -04:00
if ( SelectedItem - > GetTreeItemType ( ) = = IChangelistTreeItem : : File )
2021-01-19 14:50:23 -04:00
{
2021-01-22 16:21:29 -04:00
AssetsToSync . Append ( StaticCastSharedPtr < FFileTreeItem > ( SelectedItem ) - > GetAssetData ( ) ) ;
2021-01-19 14:50:23 -04:00
}
}
if ( AssetsToSync . Num ( ) > 0 )
{
FContentBrowserModule & ContentBrowserModule = FModuleManager : : Get ( ) . LoadModuleChecked < FContentBrowserModule > ( " ContentBrowser " ) ;
ContentBrowserModule . Get ( ) . SyncBrowserToAssets ( AssetsToSync , true ) ;
}
}
bool SSourceControlChangelistsWidget : : CanLocateFile ( )
{
return GetSelectedFiles ( ) . Num ( ) > 0 ;
}
void SSourceControlChangelistsWidget : : OnShowHistory ( )
{
TArray < FString > SelectedFiles = GetSelectedFiles ( ) ;
if ( SelectedFiles . Num ( ) > 0 )
{
FSourceControlWindows : : DisplayRevisionHistory ( SelectedFiles ) ;
}
}
void SSourceControlChangelistsWidget : : OnDiffAgainstDepot ( )
{
TArray < FString > SelectedFiles = GetSelectedFiles ( ) ;
if ( SelectedFiles . Num ( ) > 0 )
{
FSourceControlWindows : : DiffAgainstWorkspace ( SelectedFiles [ 0 ] ) ;
}
}
bool SSourceControlChangelistsWidget : : CanDiffAgainstDepot ( )
{
return GetSelectedFiles ( ) . Num ( ) = = 1 ;
}
2021-01-26 09:19:24 -04:00
void SSourceControlChangelistsWidget : : OnDiffAgainstWorkspace ( )
{
2021-02-08 09:36:20 -04:00
if ( GetSelectedShelvedFiles ( ) . Num ( ) > 0 )
{
FSourceControlStateRef FileState = StaticCastSharedPtr < FShelvedFileTreeItem > ( TreeView - > GetSelectedItems ( ) [ 0 ] ) - > FileState ;
FSourceControlWindows : : DiffAgainstShelvedFile ( FileState ) ;
}
2021-01-26 09:19:24 -04:00
}
bool SSourceControlChangelistsWidget : : CanDiffAgainstWorkspace ( )
{
return GetSelectedShelvedFiles ( ) . Num ( ) = = 1 ;
}
2021-01-18 09:42:33 -04:00
TSharedPtr < SWidget > SSourceControlChangelistsWidget : : OnOpenContextMenu ( )
{
UToolMenus * ToolMenus = UToolMenus : : Get ( ) ;
static const FName MenuName = " SourceControl.ChangelistContextMenu " ;
if ( ! ToolMenus - > IsMenuRegistered ( MenuName ) )
{
ToolMenus - > RegisterMenu ( MenuName ) ;
}
// Build up the menu for a selection
FToolMenuContext Context ;
UToolMenu * Menu = ToolMenus - > GenerateMenu ( MenuName , Context ) ;
bool bHasSelectedChangelist = ( GetCurrentChangelist ( ) ! = nullptr ) ;
2021-01-26 09:19:24 -04:00
bool bHasSelectedFiles = ( GetSelectedFiles ( ) . Num ( ) > 0 ) ;
bool bHasSelectedShelvedFiles = ( GetSelectedShelvedFiles ( ) . Num ( ) > 0 ) ;
bool bHasEmptySelection = ( ! bHasSelectedChangelist & & ! bHasSelectedFiles & & ! bHasSelectedShelvedFiles ) ;
2021-01-18 09:42:33 -04:00
FToolMenuSection & Section = Menu - > AddSection ( " Source Control " ) ;
// This should appear only on change lists
if ( bHasSelectedChangelist )
{
Section . AddMenuEntry ( " SubmitChangelist " , LOCTEXT ( " SourceControl_SubmitChangelist " , " Submit Changelist " ) , LOCTEXT ( " SourceControl_SubmitChangeslit_Tooltip " , " Submits a changelist " ) , FSlateIcon ( ) ,
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnSubmitChangelist ) ,
FCanExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : CanSubmitChangelist ) ) ) ;
}
// This can appear on both files & changelist
2021-01-26 09:19:24 -04:00
if ( bHasSelectedChangelist | | bHasSelectedFiles )
2021-01-18 09:42:33 -04:00
{
Section . AddMenuEntry ( " RevertUnchanged " , LOCTEXT ( " SourceControl_RevertUnchanged " , " Revert Unchanged " ) , LOCTEXT ( " SourceControl_Revert_Unchanged_Tooltip " , " Reverts unchanged files & changelists " ) , FSlateIcon ( ) ,
2021-01-27 16:11:25 -04:00
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnRevertUnchanged ) ,
FCanExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : CanRevertUnchanged ) ) ) ;
2021-01-19 14:50:23 -04:00
Section . AddMenuEntry ( " Revert " , LOCTEXT ( " SourceControl_Revert " , " Revert Files " ) , LOCTEXT ( " SourceControl_Revert_Tooltip " , " Reverts all files in the changelist or from the selection " ) , FSlateIcon ( ) ,
2021-01-27 16:11:25 -04:00
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnRevert ) ,
FCanExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : CanRevert ) ) ) ;
2021-01-19 14:50:23 -04:00
}
2021-01-26 09:19:24 -04:00
if ( bHasSelectedFiles | | bHasSelectedShelvedFiles | | ( bHasSelectedChangelist & & ( GetCurrentChangelistState ( ) - > GetFilesStates ( ) . Num ( ) > 0 | | GetCurrentChangelistState ( ) - > GetShelvedFilesStates ( ) . Num ( ) > 0 ) ) )
{
2021-01-27 16:11:25 -04:00
Section . AddSeparator ( " ShelveSeparator " ) ;
2021-01-26 09:19:24 -04:00
}
if ( bHasSelectedFiles | | ( bHasSelectedChangelist & & GetCurrentChangelistState ( ) - > GetFilesStates ( ) . Num ( ) > 0 ) )
{
Section . AddMenuEntry ( " Shelve " , LOCTEXT ( " SourceControl_Shelve " , " Shelve Files " ) , LOCTEXT ( " SourceControl_Shelve_Tooltip " , " Shelves the changelist or the selected files " ) , FSlateIcon ( ) ,
FUIAction ( FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnShelve ) ) ) ;
}
if ( bHasSelectedShelvedFiles | | ( bHasSelectedChangelist & & GetCurrentChangelistState ( ) - > GetShelvedFilesStates ( ) . Num ( ) > 0 ) )
{
Section . AddMenuEntry ( " Unshelve " , LOCTEXT ( " SourceControl_Unshelve " , " Unshelve Files " ) , LOCTEXT ( " SourceControl_Unshelve_Tooltip " , " Unshelve selected files or changelist " ) , FSlateIcon ( ) ,
FUIAction ( FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnUnshelve ) ) ) ;
Section . AddMenuEntry ( " DeleteShelved " , LOCTEXT ( " SourceControl_DeleteShelved " , " Delete Shelved Files " ) , LOCTEXT ( " SourceControl_DeleteShelved_Tooltip " , " Delete selected shelved files or all from changelist " ) , FSlateIcon ( ) ,
FUIAction ( FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnDeleteShelvedFiles ) ) ) ;
}
// Shelved files-only operations
if ( bHasSelectedShelvedFiles )
{
// Diff against workspace
Section . AddMenuEntry ( " DiffAgainstWorkspace " , LOCTEXT ( " SourceControl_DiffAgainstWorkspace " , " Diff Against Workspace Files " ) , LOCTEXT ( " SourceControl_DiffAgainstWorkspace_Tooltip " , " Diff shelved file against the (local) workspace file " ) , FSlateIcon ( ) ,
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnDiffAgainstWorkspace ) ,
FCanExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : CanDiffAgainstWorkspace ) ) ) ;
}
2021-01-19 14:50:23 -04:00
if ( bHasEmptySelection | | bHasSelectedChangelist )
{
2021-01-27 16:11:25 -04:00
Section . AddSeparator ( " ChangelistsSeparator " ) ;
2021-01-19 14:50:23 -04:00
}
// This should appear only if we have no selection
if ( bHasEmptySelection )
{
Section . AddMenuEntry ( " NewChangelist " , LOCTEXT ( " SourceControl_NewChangelist " , " New Changelist " ) , LOCTEXT ( " SourceControl_NewChangelist_Tooltip " , " Creates an empty changelist " ) , FSlateIcon ( ) ,
FUIAction ( FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnNewChangelist ) ) ) ;
}
if ( bHasSelectedChangelist )
{
Section . AddMenuEntry ( " EditChangelist " , LOCTEXT ( " SourceControl_EditChangelist " , " Edit Changelist " ) , LOCTEXT ( " SourceControl_Edit_Changelist_Tooltip " , " Edit a changelist description " ) , FSlateIcon ( ) ,
FUIAction ( FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnEditChangelist ) ) ) ;
Section . AddMenuEntry ( " DeleteChangelist " , LOCTEXT ( " SourceControl_DeleteChangelist " , " Delete Empty Changelist " ) , LOCTEXT ( " SourceControl_Delete_Changelist_Tooltip " , " Deletes an empty changelist " ) , FSlateIcon ( ) ,
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnDeleteChangelist ) ,
FCanExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : CanDeleteChangelist ) ) ) ;
}
// Files-only operations
2021-01-26 09:19:24 -04:00
if ( bHasSelectedFiles )
2021-01-19 14:50:23 -04:00
{
2021-01-27 16:11:25 -04:00
Section . AddSeparator ( " FilesSeparator " ) ;
2021-01-19 14:50:23 -04:00
2021-01-27 16:11:25 -04:00
Section . AddMenuEntry ( " LocateFile " , LOCTEXT ( " SourceControl_LocateFile " , " Locate File " ) , LOCTEXT ( " SourceControl_LocateFile_Tooltip " , " Locate File in Project... " ) , FSlateIcon ( ) ,
2021-01-19 14:50:23 -04:00
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnLocateFile ) ,
FCanExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : CanLocateFile ) ) ) ;
2021-01-27 16:11:25 -04:00
Section . AddMenuEntry ( " ShowHistory " , LOCTEXT ( " SourceControl_ShowHistory " , " Show History " ) , LOCTEXT ( " SourceControl_ShowHistory_ToolTip " , " Show File History From Selection... " ) , FSlateIcon ( ) ,
2021-01-19 14:50:23 -04:00
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnShowHistory ) ) ) ;
2021-01-27 16:11:25 -04:00
Section . AddMenuEntry ( " DiffAgainstLocalVersion " , LOCTEXT ( " SourceControl_DiffAgainstDepot " , " Diff Against Depot " ) , LOCTEXT ( " SourceControl_DiffAgainstLocal_Tooltip " , " Diff local file against depot revision. " ) , FSlateIcon ( ) ,
2021-01-19 14:50:23 -04:00
FUIAction (
FExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : OnDiffAgainstDepot ) ,
FCanExecuteAction : : CreateSP ( this , & SSourceControlChangelistsWidget : : CanDiffAgainstDepot ) ) ) ;
2021-01-18 09:42:33 -04:00
}
return ToolMenus - > GenerateWidget ( Menu ) ;
}
2021-01-11 15:31:58 -04:00
TSharedRef < SChangelistTree > SSourceControlChangelistsWidget : : CreateTreeviewWidget ( )
{
return SAssignNew ( TreeView , SChangelistTree )
. ItemHeight ( 24.0f )
. TreeItemsSource ( & ChangelistsNodes )
. OnGenerateRow ( this , & SSourceControlChangelistsWidget : : OnGenerateRow )
. OnGetChildren ( this , & SSourceControlChangelistsWidget : : OnGetChildren )
. SelectionMode ( ESelectionMode : : Multi )
2021-01-18 09:42:33 -04:00
. OnContextMenuOpening ( this , & SSourceControlChangelistsWidget : : OnOpenContextMenu )
2021-01-11 15:31:58 -04:00
. HeaderRow
(
SNew ( SHeaderRow )
+ SHeaderRow : : Column ( " Change " )
. DefaultLabel ( LOCTEXT ( " Change " , " Change " ) )
. FillWidth ( 0.2f )
+ SHeaderRow : : Column ( " Description " )
. DefaultLabel ( LOCTEXT ( " Description " , " Description " ) )
2021-01-20 11:49:37 -04:00
. FillWidth ( 0.6f )
+ SHeaderRow : : Column ( " Type " )
. DefaultLabel ( LOCTEXT ( " Type " , " Type " ) )
. FillWidth ( 0.2f )
2021-01-11 15:31:58 -04:00
) ;
}
class SChangelistTableRow : public SMultiColumnTableRow < FChangelistTreeItemPtr >
{
public :
SLATE_BEGIN_ARGS ( SChangelistTableRow )
: _TreeItemToVisualize ( )
{ }
SLATE_ARGUMENT ( FChangelistTreeItemPtr , TreeItemToVisualize )
SLATE_END_ARGS ( )
public :
/**
* Construct child widgets that comprise this widget .
*
* @ param InArgs Declaration from which to construct this widget .
*/
void Construct ( const FArguments & InArgs , const TSharedRef < STableViewBase > & InOwner )
{
TreeItem = static_cast < FChangelistTreeItem * > ( InArgs . _TreeItemToVisualize . Get ( ) ) ;
auto Args = FSuperRowType : : FArguments ( ) ;
SMultiColumnTableRow < FChangelistTreeItemPtr > : : Construct ( Args , InOwner ) ;
}
// SMultiColumnTableRow overrides
virtual TSharedRef < SWidget > GenerateWidgetForColumn ( const FName & ColumnName ) override
{
if ( ColumnName = = TEXT ( " Change " ) )
{
const FSlateBrush * IconBrush = FEditorStyle : : GetBrush ( " SourceControl.Changelist " ) ;
return SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
. AutoWidth ( )
. VAlign ( VAlign_Center )
[
SNew ( SExpanderArrow , SharedThis ( this ) )
]
+ SHorizontalBox : : Slot ( )
. AutoWidth ( )
. VAlign ( VAlign_Center )
[
SNew ( SImage )
. Image ( IconBrush )
]
+ SHorizontalBox : : Slot ( )
. AutoWidth ( )
. Padding ( 2.0f , 0.0f )
. VAlign ( VAlign_Center )
[
SNew ( STextBlock )
. Text ( this , & SChangelistTableRow : : GetChangelistText )
] ;
}
else if ( ColumnName = = TEXT ( " Description " ) )
{
return SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
. AutoWidth ( )
. Padding ( 2.0f , 0.0f )
. VAlign ( VAlign_Center )
[
SNew ( STextBlock )
. Text ( this , & SChangelistTableRow : : GetChangelistDescriptionText )
] ;
}
else
{
return SNullWidget : : NullWidget ;
}
}
FText GetChangelistText ( ) const
{
return TreeItem - > GetDisplayText ( ) ;
}
FText GetChangelistDescriptionText ( ) const
{
FString DescriptionString = TreeItem - > GetDescriptionText ( ) . ToString ( ) ;
2021-02-08 15:32:48 -04:00
// Here we'll both remove \r\n (when edited from the dialog) and \n (when we get it from the SCC)
DescriptionString . ReplaceInline ( TEXT ( " \r " ) , TEXT ( " " ) ) ;
2021-01-11 15:31:58 -04:00
DescriptionString . ReplaceInline ( TEXT ( " \n " ) , TEXT ( " " ) ) ;
DescriptionString . TrimEndInline ( ) ;
return FText : : FromString ( DescriptionString ) ;
}
2021-01-18 15:31:14 -04:00
protected :
//~ Begin STableRow Interface.
virtual FReply OnDrop ( const FGeometry & InGeometry , const FDragDropEvent & InDragDropEvent ) override
{
TSharedPtr < FSCCFileDragDropOp > Operation = InDragDropEvent . GetOperationAs < FSCCFileDragDropOp > ( ) ;
if ( Operation . IsValid ( ) )
{
FSourceControlChangelistPtr Changelist = TreeItem - > ChangelistState - > GetChangelist ( ) ;
check ( Changelist . IsValid ( ) ) ;
TArray < FString > Files ;
Algo : : Transform ( Operation - > Files , Files , [ ] ( const FSourceControlStateRef & State ) { return State - > GetFilename ( ) ; } ) ;
ISourceControlProvider & SourceControlProvider = ISourceControlModule : : Get ( ) . GetProvider ( ) ;
SourceControlProvider . Execute ( ISourceControlOperation : : Create < FMoveToChangelist > ( ) , Changelist , Files ) ;
}
return FReply : : Handled ( ) ;
}
//~ End STableRow Interface.
2021-01-11 15:31:58 -04:00
private :
/** The info about the widget that we are visualizing. */
FChangelistTreeItem * TreeItem ;
} ;
2021-01-20 11:49:37 -04:00
class SFileTableRow : public SMultiColumnTableRow < FChangelistTreeItemPtr >
2021-01-11 15:31:58 -04:00
{
public :
SLATE_BEGIN_ARGS ( SFileTableRow )
: _TreeItemToVisualize ( )
{ }
SLATE_ARGUMENT ( FChangelistTreeItemPtr , TreeItemToVisualize )
2021-01-18 15:31:14 -04:00
SLATE_EVENT ( FOnDragDetected , OnDragDetected )
2021-01-11 15:31:58 -04:00
SLATE_END_ARGS ( )
public :
/**
* Construct child widgets that comprise this widget .
*
* @ param InArgs Declaration from which to construct this widget .
*/
void Construct ( const FArguments & InArgs , const TSharedRef < STableViewBase > & InOwner )
{
TreeItem = static_cast < FFileTreeItem * > ( InArgs . _TreeItemToVisualize . Get ( ) ) ;
2021-01-20 11:49:37 -04:00
auto Args = FSuperRowType : : FArguments ( )
. OnDragDetected ( InArgs . _OnDragDetected )
. ShowSelection ( true ) ;
FSuperRowType : : Construct ( Args , InOwner ) ;
}
// SMultiColumnTableRow overrides
virtual TSharedRef < SWidget > GenerateWidgetForColumn ( const FName & ColumnName ) override
{
if ( ColumnName = = TEXT ( " Change " ) ) // eq. to name
{
2021-02-04 17:41:41 -04:00
const int32 LeftOffset = ( TreeItem - > IsShelved ( ) ? 60 : 40 ) ;
2021-01-20 11:49:37 -04:00
return SNew ( SHorizontalBox )
2021-01-11 15:31:58 -04:00
// Icon
2021-01-18 15:31:14 -04:00
+ SHorizontalBox : : Slot ( )
2021-01-11 15:31:58 -04:00
. AutoWidth ( )
2021-02-04 17:41:41 -04:00
. Padding ( LeftOffset , 0 , 4 , 0 )
2021-01-11 15:31:58 -04:00
[
2021-02-04 17:41:41 -04:00
SSourceControlCommon : : GetSCCFileWidget ( TreeItem - > FileState , TreeItem - > IsShelved ( ) )
2021-01-11 15:31:58 -04:00
]
+ SHorizontalBox : : Slot ( )
. AutoWidth ( )
. VAlign ( VAlign_Center )
[
SNew ( STextBlock )
2021-01-20 11:49:37 -04:00
. Text ( this , & SFileTableRow : : GetDisplayName )
] ;
}
else if ( ColumnName = = TEXT ( " Description " ) ) // eq. to path
{
return SNew ( STextBlock )
2021-02-04 17:41:41 -04:00
. Text ( this , & SFileTableRow : : GetDisplayPath )
. ToolTipText ( this , & SFileTableRow : : GetFilename ) ;
2021-01-20 11:49:37 -04:00
}
else if ( ColumnName = = TEXT ( " Type " ) )
{
return SNew ( STextBlock )
. Text ( this , & SFileTableRow : : GetDisplayType )
. ColorAndOpacity ( this , & SFileTableRow : : GetDisplayColor ) ;
}
else
{
return SNullWidget : : NullWidget ;
}
2021-01-11 15:31:58 -04:00
}
2021-01-20 11:49:37 -04:00
FText GetDisplayName ( ) const
2021-01-11 15:31:58 -04:00
{
2021-02-04 17:41:41 -04:00
return TreeItem - > GetAssetName ( ) ;
}
FText GetFilename ( ) const
{
return TreeItem - > GetFileName ( ) ;
2021-01-20 11:49:37 -04:00
}
FText GetDisplayPath ( ) const
{
2021-02-04 17:41:41 -04:00
return TreeItem - > GetAssetPath ( ) ;
2021-01-20 11:49:37 -04:00
}
FText GetDisplayType ( ) const
{
2021-02-04 17:41:41 -04:00
return TreeItem - > GetAssetType ( ) ;
2021-01-20 11:49:37 -04:00
}
FSlateColor GetDisplayColor ( ) const
{
2021-02-04 17:41:41 -04:00
return TreeItem - > GetAssetTypeColor ( ) ;
2021-01-11 15:31:58 -04:00
}
2021-01-18 15:31:14 -04:00
protected :
//~ Begin STableRow Interface.
virtual void OnDragEnter ( FGeometry const & InGeometry , FDragDropEvent const & InDragDropEvent ) override
{
TSharedPtr < FDragDropOperation > DragOperation = InDragDropEvent . GetOperation ( ) ;
DragOperation - > SetCursorOverride ( EMouseCursor : : SlashedCircle ) ;
}
virtual void OnDragLeave ( FDragDropEvent const & InDragDropEvent ) override
{
TSharedPtr < FDragDropOperation > DragOperation = InDragDropEvent . GetOperation ( ) ;
DragOperation - > SetCursorOverride ( EMouseCursor : : None ) ;
}
//~ End STableRow Interface.
2021-01-11 15:31:58 -04:00
private :
/** The info about the widget that we are visualizing. */
FFileTreeItem * TreeItem ;
} ;
2021-01-26 09:19:24 -04:00
class SShelvedChangelistTableRow : public SMultiColumnTableRow < FChangelistTreeItemPtr >
{
public :
SLATE_BEGIN_ARGS ( SShelvedChangelistTableRow )
: _TreeItemToVisualize ( )
{ }
SLATE_ARGUMENT ( FChangelistTreeItemPtr , TreeItemToVisualize )
SLATE_END_ARGS ( )
public :
/**
* Construct child widgets that comprise this widget .
*
* @ param InArgs Declaration from which to construct this widget .
*/
void Construct ( const FArguments & InArgs , const TSharedRef < STableViewBase > & InOwner )
{
TreeItem = static_cast < FShelvedChangelistTreeItem * > ( InArgs . _TreeItemToVisualize . Get ( ) ) ;
auto Args = FSuperRowType : : FArguments ( ) ;
SMultiColumnTableRow < FChangelistTreeItemPtr > : : Construct ( Args , InOwner ) ;
}
// SMultiColumnTableRow overrides
virtual TSharedRef < SWidget > GenerateWidgetForColumn ( const FName & ColumnName ) override
{
if ( ColumnName = = TEXT ( " Change " ) )
{
return SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
. AutoWidth ( )
. VAlign ( VAlign_Center )
. Padding ( 5 , 0 , 4 , 0 )
[
SNew ( SExpanderArrow , SharedThis ( this ) )
]
+ SHorizontalBox : : Slot ( )
. AutoWidth ( )
. VAlign ( VAlign_Center )
. Padding ( 5 , 0 , 0 , 0 )
[
SNew ( SImage )
. Image ( FEditorStyle : : GetBrush ( " SourceControl.Changelist " ) )
]
+ SHorizontalBox : : Slot ( )
. Padding ( 2.0f , 0.0f )
. VAlign ( VAlign_Center )
[
SNew ( STextBlock )
. Text ( this , & SShelvedChangelistTableRow : : GetText )
] ;
}
else
{
return SNullWidget : : NullWidget ;
}
}
protected :
FText GetText ( ) const
{
return TreeItem - > GetDisplayText ( ) ;
}
private :
/** The info about the widget that we are visualizing. */
FShelvedChangelistTreeItem * TreeItem ;
} ;
2021-01-11 15:31:58 -04:00
TSharedRef < ITableRow > SSourceControlChangelistsWidget : : OnGenerateRow ( FChangelistTreeItemPtr InTreeItem , const TSharedRef < STableViewBase > & OwnerTable )
{
switch ( InTreeItem - > GetTreeItemType ( ) )
{
case IChangelistTreeItem : : Changelist :
return SNew ( SChangelistTableRow , OwnerTable )
. TreeItemToVisualize ( InTreeItem ) ;
case IChangelistTreeItem : : File :
return SNew ( SFileTableRow , OwnerTable )
2021-01-18 15:31:14 -04:00
. TreeItemToVisualize ( InTreeItem )
. OnDragDetected ( this , & SSourceControlChangelistsWidget : : OnFilesDragged ) ;
2021-01-11 15:31:58 -04:00
2021-01-26 09:19:24 -04:00
case IChangelistTreeItem : : ShelvedChangelist :
return SNew ( SShelvedChangelistTableRow , OwnerTable )
. TreeItemToVisualize ( InTreeItem ) ;
case IChangelistTreeItem : : ShelvedFile :
2021-02-04 17:41:41 -04:00
return SNew ( SFileTableRow , OwnerTable )
2021-01-26 09:19:24 -04:00
. TreeItemToVisualize ( InTreeItem ) ;
2021-01-11 15:31:58 -04:00
default :
check ( false ) ;
} ;
return SNew ( STableRow < TSharedPtr < FString > > , OwnerTable ) ;
}
2021-01-18 15:31:14 -04:00
FReply SSourceControlChangelistsWidget : : OnFilesDragged ( const FGeometry & InGeometry , const FPointerEvent & InMouseEvent )
{
if ( InMouseEvent . IsMouseButtonDown ( EKeys : : LeftMouseButton ) & & ! TreeView - > GetSelectedItems ( ) . IsEmpty ( ) )
{
TSharedRef < FSCCFileDragDropOp > Operation = MakeShareable ( new FSCCFileDragDropOp ( ) ) ;
Algo : : Transform ( TreeView - > GetSelectedItems ( ) , Operation - > Files , [ ] ( FChangelistTreeItemPtr InTreeItem ) { check ( InTreeItem - > GetTreeItemType ( ) = = IChangelistTreeItem : : File ) ; return static_cast < FFileTreeItem * > ( InTreeItem . Get ( ) ) - > FileState ; } ) ;
Operation - > Construct ( ) ;
return FReply : : Handled ( ) . BeginDragDrop ( Operation ) ;
}
return FReply : : Unhandled ( ) ;
}
2021-01-11 15:31:58 -04:00
void SSourceControlChangelistsWidget : : OnGetChildren ( FChangelistTreeItemPtr InParent , TArray < FChangelistTreeItemPtr > & OutChildren )
{
for ( auto & Child : InParent - > GetChildren ( ) )
{
// Should never have bogus entries in this list
check ( Child . IsValid ( ) ) ;
OutChildren . Add ( Child ) ;
}
}
2021-01-26 10:56:16 -04:00
void SSourceControlChangelistsWidget : : SaveExpandedState ( TMap < FSourceControlChangelistStateRef , ExpandedState > & ExpandedStates ) const
{
for ( FChangelistTreeItemPtr Root : ChangelistsNodes )
{
if ( Root - > GetTreeItemType ( ) ! = IChangelistTreeItem : : Changelist )
{
continue ;
}
bool bChangelistExpanded = TreeView - > IsItemExpanded ( Root ) ;
bool bShelveExpanded = false ;
for ( FChangelistTreeItemPtr Child : Root - > GetChildren ( ) )
{
if ( Child - > GetTreeItemType ( ) = = IChangelistTreeItem : : ShelvedChangelist )
{
bShelveExpanded = TreeView - > IsItemExpanded ( Child ) ;
break ;
}
}
ExpandedState State ;
State . bChangelistExpanded = bChangelistExpanded ;
State . bShelveExpanded = bShelveExpanded ;
ExpandedStates . Add ( StaticCastSharedPtr < FChangelistTreeItem > ( Root ) - > ChangelistState , State ) ;
}
}
void SSourceControlChangelistsWidget : : RestoreExpandedState ( const TMap < FSourceControlChangelistStateRef , ExpandedState > & ExpandedStates )
{
for ( FChangelistTreeItemPtr Root : ChangelistsNodes )
{
if ( Root - > GetTreeItemType ( ) ! = IChangelistTreeItem : : Changelist )
{
continue ;
}
FSourceControlChangelistStateRef ChangelistState = StaticCastSharedPtr < FChangelistTreeItem > ( Root ) - > ChangelistState ;
const ExpandedState * State = ExpandedStates . Find ( ChangelistState ) ;
if ( ! State )
{
continue ;
}
TreeView - > SetItemExpansion ( Root , State - > bChangelistExpanded ) ;
for ( FChangelistTreeItemPtr Child : Root - > GetChildren ( ) )
{
if ( Child - > GetTreeItemType ( ) = = IChangelistTreeItem : : ShelvedChangelist )
{
TreeView - > SetItemExpansion ( Child , State - > bShelveExpanded ) ;
break ;
}
}
}
}
2021-01-11 15:31:58 -04:00
# undef LOCTEXT_NAMESPACE