Files
UnrealEngineUWP/Engine/Source/Editor/SourceControlWindows/Private/SSourceControlSubmit.h
paul chipchase 135e304463 Add an ini file option which when set to true allows package submissions to source control to go ahead even if the virtualization process failed.
#rb none
#jira UE-159596
#rnx
#preflight 62d94160110da0f944afdd32

### Problem
- When rolling our virtualization to projects we have run into a number of set up problems which has caused users to fail to submit packages from the editor as when the virtualization failed we prevented the overall submit from going through.
- Although we will eventually work through all of these problems and add better fault tolerance for now it is annoying for the content team so we need an easy way for a project to allow package submits to be completed even if the virtualization process part of the submit failed.
- Worth noting that the virtualization process failing should never affect the state of the package files, the only downside is that the packages may not be virtualized.

### Fix
- The virtualization/rehydration of packages now return an enum instead of a bool although at the moment we are only returning Success and Failed, but it will allow us to expand in the future
- Combined the code calling the virtualization process from both the source control window and the source control changelist window into a single utility function.
-- Now the two windows only diverge on how they report failure to the user.

- This new utility function now checks to see if the virtualization manager suggests if failing the virtualization process should block any package submission to source control or not.
- I am not happy with this solution, but I haven't come up with anything that feels right, this solution will at least work.

[CL 21199597 by paul chipchase in ue5-main branch]
2022-07-21 08:31:47 -04:00

226 lines
7.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Layout/Visibility.h"
#include "Input/Reply.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SWidget.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Views/SListView.h"
#include "Widgets/Views/STableViewBase.h"
#include "Widgets/Views/STableRow.h"
#include "ISourceControlState.h"
#include "SSourceControlCommon.h"
class SMultiLineEditableTextBox;
class SWindow;
//-------------------------------------
// Source Control Window Constants
//-------------------------------------
namespace ESubmitResults
{
enum Type
{
SUBMIT_ACCEPTED,
SUBMIT_CANCELED
};
}
//-----------------------------------------------
// Source Control Check in Helper Struct
//-----------------------------------------------
class FChangeListDescription
{
public:
TArray<FString> FilesForAdd;
TArray<FString> FilesForSubmit;
FText Description;
};
bool TryToVirtualizeFilesToSubmit(const TArray<FString>& FilesToSubmit, FText& Description, FText& OutFailureMsg);
class SSourceControlSubmitWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SSourceControlSubmitWidget)
: _ParentWindow()
, _Items()
, _Description()
, _ChangeValidationIcon()
, _ChangeValidationDescription()
, _AllowDescriptionChange(true)
, _AllowUncheckFiles(true)
, _AllowKeepCheckedOut(true)
, _AllowSubmit(true)
{}
SLATE_ATTRIBUTE(TSharedPtr<SWindow>, ParentWindow)
SLATE_ATTRIBUTE(TArray<FSourceControlStateRef>, Items)
SLATE_ATTRIBUTE(FText, Description)
SLATE_ATTRIBUTE(FName, ChangeValidationIcon)
SLATE_ATTRIBUTE(FString, ChangeValidationDescription)
SLATE_ATTRIBUTE(bool, AllowDescriptionChange)
SLATE_ATTRIBUTE(bool, AllowUncheckFiles)
SLATE_ATTRIBUTE(bool, AllowKeepCheckedOut)
SLATE_ATTRIBUTE(bool, AllowSubmit)
SLATE_END_ARGS()
~SSourceControlSubmitWidget();
/** Constructs the widget */
void Construct(const FArguments& InArgs);
/** Used to intercept Escape key press, and interpret it as cancel */
virtual FReply OnKeyDown( const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent ) override;
/** Get dialog result */
ESubmitResults::Type GetResult() { return DialogResult; }
/** Returns a widget representing the item and column supplied */
TSharedRef<SWidget> GenerateWidgetForItemAndColumn(TSharedPtr<FFileTreeItem> Item, const FName ColumnID) const;
/** Gets the requested files and the change list description*/
void FillChangeListDescription(FChangeListDescription& OutDesc);
/** Does the user want to keep the files checked out */
bool WantToKeepCheckedOut();
/** Clears the current change list description */
void ClearChangeListDescription();
private:
/**
* @return the desired toggle state for the ToggleSelectedCheckBox.
* Returns Unchecked, unless all of the selected items are Checked.
*/
ECheckBoxState GetToggleSelectedState() const;
/**
* Toggles the highlighted items.
* If no items are explicitly highlighted, toggles all items in the list.
*/
void OnToggleSelectedCheckBox(ECheckBoxState InNewState);
/** Called when the settings of the dialog are to be accepted*/
FReply SubmitClicked();
/** Called when the settings of the dialog are to be ignored*/
FReply CancelClicked();
/** Called to check if the submit button is enabled or not. */
bool IsSubmitEnabled() const;
/** Check if the warning panel should be visible. */
EVisibility IsWarningPanelVisible() const;
/** Called when the Keep checked out Checkbox is changed */
void OnCheckStateChanged_KeepCheckedOut(ECheckBoxState InState);
/** Get the current state of the Keep Checked Out checkbox */
ECheckBoxState GetKeepCheckedOut() const;
/** Check if Provider can checkout files */
bool CanCheckOut() const;
/** Called by SListView to get a widget corresponding to the supplied item */
TSharedRef<ITableRow> OnGenerateRowForList(TSharedPtr<FFileTreeItem> SubmitItemData, const TSharedRef<STableViewBase>& OwnerTable);
/**
* Returns the current column sort mode (ascending or descending) if the ColumnId parameter matches the current
* column to be sorted by, otherwise returns EColumnSortMode_None.
*
* @param ColumnId Column ID to query sort mode for.
*
* @return The sort mode for the column, or EColumnSortMode_None if it is not known.
*/
EColumnSortMode::Type GetColumnSortMode(const FName ColumnId) const;
/**
* Callback for SHeaderRow::Column::OnSort, called when the column to sort by is changed.
*
* @param ColumnId The new column to sort by
* @param InSortMode The sort mode (ascending or descending)
*/
void OnColumnSortModeChanged(const EColumnSortPriority::Type SortPriority, const FName& ColumnId, const EColumnSortMode::Type InSortMode);
/**
* Requests that the source list data be sorted according to the current sort column and mode,
* and refreshes the list view.
*/
void RequestSort();
/**
* Sorts the source list data according to the current sort column and mode.
*/
void SortTree();
TSharedPtr<SWidget> OnCreateContextMenu();
bool CanDiffAgainstDepot() const;
void OnDiffAgainstDepot();
void OnDiffAgainstDepotSelected(TSharedPtr<FFileTreeItem> InSelectedItem);
private:
ESubmitResults::Type DialogResult;
/** ListBox for selecting which object to consolidate */
TSharedPtr<SListView<TSharedPtr<FFileTreeItem>>> ListView;
/** Collection of objects (Widgets) to display in the List View. */
TArray<TSharedPtr<FFileTreeItem>> ListViewItems;
/** Pointer to the parent modal window */
TWeakPtr<SWindow> ParentFrame;
/** Internal widgets to save having to get in multiple places*/
TSharedPtr<SMultiLineEditableTextBox> ChangeListDescriptionTextCtrl;
/** State of the "Keep checked out" checkbox */
ECheckBoxState KeepCheckedOut;
/** Whether the submit button should be enabled or not */
bool bAllowSubmit;
/** Specify which column to sort with */
FName SortByColumn;
/** Currently selected sorting mode */
EColumnSortMode::Type SortMode;
/** Submit Description saved when the widget is destroyed if canceled */
static FText SavedChangeListDescription;
};
class SSourceControlSubmitListRow : public SMultiColumnTableRow<TSharedPtr<FFileTreeItem>>
{
public:
SLATE_BEGIN_ARGS(SSourceControlSubmitListRow) {}
/** The SSourceControlSubmitWidget that owns the tree. We'll only keep a weak reference to it. */
SLATE_ARGUMENT(TSharedPtr<SSourceControlSubmitWidget>, SourceControlSubmitWidget)
/** The list item for this row */
SLATE_ARGUMENT(TSharedPtr<FFileTreeItem>, Item)
SLATE_END_ARGS()
/** Construct function for this widget */
void Construct(const FArguments& InArgs, const TSharedRef<STableViewBase>& InOwnerTableView);
/** Overridden from SMultiColumnTableRow. Generates a widget for this column of the list row. */
virtual TSharedRef<SWidget> GenerateWidgetForColumn(const FName& ColumnName) override;
private:
/** Weak reference to the SSourceControlSubmitWidget that owns our list */
TWeakPtr<SSourceControlSubmitWidget> SourceControlSubmitWidgetPtr;
/** The item associated with this row of data */
TSharedPtr<FFileTreeItem> Item;
};