Files
UnrealEngineUWP/Engine/Source/Editor/SourceControlWindows/Private/SSourceControlCommon.h
patrick laflamme 7f2a598696 Refactored the Changelist Window UI to work better with large changelists along with bug fixes.
This submit should not regress any existing functionalites of the previous widget.

Along with the user interface changes, notable bug fixes were included
  - If a changelist is not specified for P4 operations 'Mark for Add', 'Mark for Delete and 'Checkout', defaulted to the 'default' P4 changlist. Without a valid changelist, the cache wasn't properly updated.
  - Fixed updating the cache for P4 'Mark for delete' operation not correctly updating the file changelist cached in the file state.

Other changes:
  - P4 changelists are now always returned sorted by changelist number, ascending.
  - Some of the safe operations were running synchronous are not running asynchrnous (create new changelist, delete empty changelist, delete shelved files).

This submit addresses the following Jiras:

#jira UE-155207 - Refactor the changelist window layout to have the left/right panel.
#jira UE-155209 - Add the context menu on right click on a file or a changelist.
#jira UE-155218 - Support creating new empty changelist from the changelist view.
#jira UE-155220 - Support moving files from the selected changelist (right view) to another changelist (left view)
#jira UE-155211 - Add visual feedback for any operation taking more than 0.5s.
#jira UE-155212 - Display a list of uncontrolled files in the left panel of the changelist window
#jira UE-155499 - Changelist windows buttons should be disabled if SCC is disabled
#jira UE-155229 - Add an option to automatically refresh the changelist window when new assets are imported|created (as uncontrolled), marked for add, checked out, marked for delete
#jira UE-107577 - Source Control's Changelists dialog does not refresh to reflect changes made while open

#rb Patrick.Enfedaque
#preflight 62ff946ef7404b55a326297b

[CL 21499885 by patrick laflamme in ue5-main branch]
2022-08-22 21:20:05 -04:00

289 lines
8.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Styling/SlateColor.h"
#include "Styling/SlateTypes.h"
#include "SourceControlAssetDataCache.h"
#include "ISourceControlProvider.h"
#include "UncontrolledChangelistState.h"
struct FAssetData;
/**
* Modelizes a changelist node in a source control tree-like structure.
* The modelized tree stored is as below in memory.
*
* > Changelist
* File
* > ShelvedChangelist
* ShelvedFile
*
* > UncontrolledChangelist
* File
* Offline File
*/
struct IChangelistTreeItem : TSharedFromThis<IChangelistTreeItem>
{
enum TreeItemType
{
Changelist, // Node displaying a change list description.
UncontrolledChangelist, // Node displaying an uncontrolled change list description.
File, // Node displaying a file information.
ShelvedChangelist, // Node displaying shelved files as children.
ShelvedFile, // Node displaying a shelved file information.
OfflineFile, // Node displaying an offline file information.
};
virtual ~IChangelistTreeItem() = default;
/** Get this item's parent. Can be nullptr for root nodes. */
TSharedPtr<IChangelistTreeItem> GetParent() const;
/** Get this item's children, if any. Although we store as weak pointers, they are guaranteed to be valid. */
const TArray<TSharedPtr<IChangelistTreeItem>>& GetChildren() const;
/** Returns the TreeItem's type */
const TreeItemType GetTreeItemType() const { return Type; }
/** Add a child to this item */
void AddChild(TSharedRef<IChangelistTreeItem> Child);
/** Remove a child from this item */
void RemoveChild(const TSharedRef<IChangelistTreeItem>& Child);
protected:
IChangelistTreeItem(TreeItemType InType) { Type = InType; }
/** This item's parent, if any. */
TSharedPtr<IChangelistTreeItem> Parent;
/** Array of children contained underneath this item */
TArray<TSharedPtr<IChangelistTreeItem>> Children;
/** This item type. */
TreeItemType Type;
};
/** Displays a changelist icon/number/description. */
struct FChangelistTreeItem : public IChangelistTreeItem
{
FChangelistTreeItem(TSharedRef<ISourceControlChangelistState> InChangelistState)
: IChangelistTreeItem(IChangelistTreeItem::Changelist)
, ChangelistState(MoveTemp(InChangelistState))
{
}
FText GetDisplayText() const
{
return ChangelistState->GetDisplayText();
}
FText GetDescriptionText() const
{
return ChangelistState->GetDescriptionText();
}
int32 GetFileCount() const
{
return ChangelistState->GetFilesStates().Num();
}
int32 GetShelvedFileCount() const
{
return ChangelistState->GetShelvedFilesStates().Num();
}
TSharedRef<ISourceControlChangelistState> ChangelistState;
};
/** Displays an uncontrolled changelist icon/number/description. */
struct FUncontrolledChangelistTreeItem : public IChangelistTreeItem
{
FUncontrolledChangelistTreeItem(FUncontrolledChangelistStateRef InUncontrolledChangelistState)
: IChangelistTreeItem(IChangelistTreeItem::UncontrolledChangelist)
, UncontrolledChangelistState(InUncontrolledChangelistState)
{
}
FText GetDisplayText() const
{
return UncontrolledChangelistState->GetDisplayText();
}
FText GetDescriptionText() const
{
return UncontrolledChangelistState->GetDescriptionText();
}
int32 GetFileCount() const
{
return UncontrolledChangelistState->GetFilesStates().Num();
}
int32 GetOfflineFileCount() const
{
return UncontrolledChangelistState->GetOfflineFiles().Num();
}
FUncontrolledChangelistStateRef UncontrolledChangelistState;
};
/** Displays a set of files under a changelist or uncontrolled changelist. */
struct FFileTreeItem : public IChangelistTreeItem
{
explicit FFileTreeItem(FSourceControlStateRef InFileState, bool bBeautifyPaths = true, bool bIsShelvedFile = false);
/** Updates informations based on AssetData */
void RefreshAssetInformation();
/** Returns the asset name of the item */
FText GetAssetName();
/** Returns the asset path of the item */
FText GetAssetPath() const { return AssetPath; }
/** Returns the asset type of the item */
FText GetAssetType() const { return AssetType; }
/** Returns the asset type color of the item */
FSlateColor GetAssetTypeColor() const { return FSlateColor(AssetTypeColor); }
/** Returns the package name of the item to display */
FText GetPackageName() const { return PackageName; }
/** Returns the file name of the item in source control */
FText GetFileName() const { return FText::FromString(FileState->GetFilename()); }
/** Returns the name of the icon to be used in the list item widget */
FName GetIconName() const { return FileState->GetIcon().GetStyleName(); }
/** Returns the tooltip text for the icon */
FText GetIconTooltip() const { return FileState->GetDisplayTooltip(); }
/** Returns the checkbox state of this item */
ECheckBoxState GetCheckBoxState() const { return CheckBoxState; }
/** Sets the checkbox state of this item */
void SetCheckBoxState(ECheckBoxState NewState) { CheckBoxState = NewState; }
/** true if the item is not in source control and needs to be added prior to checkin */
bool NeedsAdding() const { return !FileState->IsSourceControlled(); }
/** true if the item is in source control and is able to be checked in */
bool CanCheckIn() const { return FileState->CanCheckIn() || FileState->IsDeleted(); }
/** true if the item is enabled in the list */
bool IsEnabled() const { return !FileState->IsConflicted() && FileState->IsCurrent(); }
/** true if the item is source controlled and not marked for add nor for delete */
bool CanDiff() const { return FileState->IsSourceControlled() && !FileState->IsAdded() && !FileState->IsDeleted(); }
const FAssetDataArrayPtr& GetAssetData() const
{
return Assets;
}
bool IsShelved() const { return GetTreeItemType() == IChangelistTreeItem::ShelvedFile; }
private:
/** Returns a string representing the name of the asset represented by the given AssetData */
FString RetrieveAssetName(const FAssetData& InAssetData) const;
/** Returns a string representing the path of the asset represented by the given AssetData */
FString RetrieveAssetPath(const FAssetData& InAssetData) const;
public:
/** Shared pointer to the source control state object itself */
FSourceControlStateRef FileState;
private:
/** Checkbox state, used only in the Submit dialog */
ECheckBoxState CheckBoxState;
/** Cached asset name to display */
FText AssetName;
/** Cached asset path to display */
FText AssetPath;
/** Cached asset type to display */
FText AssetType;
/** Cached asset type related color to display */
FColor AssetTypeColor;
/** Cached package name to display */
FText PackageName;
/** Matching asset(s) to facilitate Locate in content browser */
FAssetDataArrayPtr Assets;
/** Represents the minimum amount of time between to attempt to refresh AssetData */
const FTimespan MinTimeBetweenUpdate;
/** Timestamp representing the time at which the last information update was made */
FTimespan LastUpdateTime;
/** True if informations returned from the cache are up to date */
bool bAssetsUpToDate;
};
/** Root node to group shelved files as children. */
struct FShelvedChangelistTreeItem : public IChangelistTreeItem
{
FShelvedChangelistTreeItem() : IChangelistTreeItem(IChangelistTreeItem::ShelvedChangelist) {}
FText GetDisplayText() const;
};
struct FShelvedFileTreeItem : public FFileTreeItem
{
explicit FShelvedFileTreeItem(FSourceControlStateRef InFileState, bool bBeautifyPaths = true)
: FFileTreeItem(InFileState, bBeautifyPaths,/*bIsShelved=*/true)
{
}
};
struct FOfflineFileTreeItem : public IChangelistTreeItem
{
explicit FOfflineFileTreeItem(const FString& InFilename);
public:
const FText& GetPackageName() const { return PackageName; }
const FText& GetDisplayName() const { return AssetName; }
const FText& GetDisplayPath() const { return AssetPath; }
const FText& GetDisplayType() const { return AssetType; }
const FSlateColor& GetDisplayColor() const { return AssetTypeColor; }
private:
TArray<FAssetData> Assets;
FText PackageName;
FText AssetName;
FText AssetPath;
FText AssetType;
FSlateColor AssetTypeColor;
};
namespace SSourceControlCommon
{
TSharedRef<SWidget> GetSCCFileWidget(FSourceControlStateRef InFileState, bool bIsShelvedFile = false);
FText GetDefaultAssetName();
FText GetDefaultAssetType();
FText GetDefaultUnknownAssetType();
FText GetDefaultMultipleAsset();
}
typedef TSharedPtr<FUncontrolledChangelistTreeItem> FUncontrolledChangelistTreeItemPtr;
typedef TSharedRef<FUncontrolledChangelistTreeItem> FUncontrolledChangelistTreeItemRef;
typedef TSharedPtr<IChangelistTreeItem> FChangelistTreeItemPtr;
typedef TSharedRef<IChangelistTreeItem> FChangelistTreeItemRef;
typedef TSharedPtr<FFileTreeItem> FFileTreeItemPtr;
typedef TSharedRef<FFileTreeItem> FFileTreeItemRef;