Files
UnrealEngine/Engine/Source/Editor/SceneOutliner/Private/SSourceControlWidget.cpp
2025-05-18 13:04:45 +08:00

107 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SSourceControlWidget.h"
#include "UncontrolledChangelistsModule.h"
#define LOCTEXT_NAMESPACE "SceneOutlinerSourceControlWidget"
void SSourceControlWidget::Construct(const FArguments& InArgs, TSharedPtr<FSceneOutlinerTreeItemSCC> InItemSourceControl)
{
check(InItemSourceControl.IsValid());
ItemSourceControl = InItemSourceControl;
ItemSourceControl->OnSourceControlStateChanged.BindLambda([this, WeakThis = AsWeak()](FSourceControlStatePtr SourceControlState)
{
if (WeakThis.IsValid())
{
UpdateSourceControlState(SourceControlState);
}
});
ItemSourceControl->OnUncontrolledChangelistsStateChanged.BindLambda([this, WeakThis = AsWeak()](TSharedPtr<FUncontrolledChangelistState> UncontrolledChangelistState)
{
if (WeakThis.IsValid())
{
UpdateUncontrolledChangelistState(UncontrolledChangelistState);
}
});
SImage::Construct(
SImage::FArguments()
.ColorAndOpacity(this, &SSourceControlWidget::GetForegroundColor)
.Image(FStyleDefaults::GetNoBrush()));
UpdateSourceControlState(ItemSourceControl->GetSourceControlState());
}
FReply SSourceControlWidget::OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent)
{
check(ItemSourceControl);
FSourceControlStatePtr SourceControlState = ItemSourceControl->RefreshSourceControlState();
UpdateSourceControlState(SourceControlState);
return FReply::Handled();
}
void SSourceControlWidget::UpdateSourceControlState(FSourceControlStatePtr SourceControlState)
{
TWeakPtr<FUncontrolledChangelistState> UncontrolledChangelistState = ItemSourceControl->GetUncontrolledChangelistState();
UpdateWidget(SourceControlState, UncontrolledChangelistState.Pin());
}
void SSourceControlWidget::UpdateUncontrolledChangelistState(TSharedPtr<FUncontrolledChangelistState> UncontrolledChangelistState)
{
UpdateWidget(ItemSourceControl->GetSourceControlState(), UncontrolledChangelistState);
}
void SSourceControlWidget::UpdateWidget(FSourceControlStatePtr SourceControlState, const TSharedPtr<FUncontrolledChangelistState>& UncontrolledChangelistState)
{
RemoveAllLayers();
static const FName UncontrolledChangelistIconName = TEXT("Icons.Unlink");
// Custom logic to combine uncontrolled and source control state
if (SourceControlState.IsValid() && UncontrolledChangelistState.IsValid())
{
// We use the uncontrolled icon as the base icon
const FSlateBrush* ImageBrush = FAppStyle::GetBrush(UncontrolledChangelistIconName);
// We use the overlay from the source control icon (if any)
const FSlateBrush* OverlayBrush = SourceControlState->GetIcon().GetOverlayIcon();
// We use the color of the source control icon
FSlateColor IconColor = SourceControlState->GetIcon().GetIcon()->TintColor;
SetImage(ImageBrush);
if (OverlayBrush)
{
AddLayer(OverlayBrush);
}
SetColorAndOpacity(IconColor);
SetToolTipText(FText::Format(LOCTEXT("UncontrolledSourceControlCombinedTooltip",
"{0}\nStatus in revision control: {1}"),
UncontrolledChangelistState->GetDisplayTooltip(), SourceControlState->GetDisplayTooltip()));
}
else if (SourceControlState.IsValid() && !UncontrolledChangelistState.IsValid())
{
SetFromSlateIcon(SourceControlState->GetIcon());
SetToolTipText(SourceControlState->GetDisplayTooltip());
}
else if (!SourceControlState.IsValid() && UncontrolledChangelistState.IsValid())
{
SetImage(FAppStyle::GetBrush(UncontrolledChangelistIconName));
SetToolTipText(UncontrolledChangelistState->GetDisplayTooltip());
}
else
{
SetImage(nullptr);
SetToolTipText(TAttribute<FText>());
}
}
#undef LOCTEXT_NAMESPACE