Files
UnrealEngineUWP/Engine/Source/Runtime/UMG/Private/Components/MultiLineEditableText.cpp
patrick boutot 4f178c7f0c UMG: Update the Widget with accessors.
#rb vincent.gauthier
#preflight 627a4e42705bfaf9ae31ee20

#ROBOMERGE-AUTHOR: patrick.boutot
#ROBOMERGE-SOURCE: CL 20123512 via CL 20123528 via CL 20123564
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v943-19904690)

[CL 20125750 by patrick boutot in ue5-main branch]
2022-05-10 13:53:03 -04:00

219 lines
6.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Components/MultiLineEditableText.h"
#include "UObject/ConstructorHelpers.h"
#include "Engine/Font.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Text/SMultiLineEditableText.h"
#include "Styling/UMGCoreStyle.h"
#define LOCTEXT_NAMESPACE "UMG"
/////////////////////////////////////////////////////
// UMultiLineEditableText
static FTextBlockStyle* DefaultMultiLineEditableTextStyle = nullptr;
#if WITH_EDITOR
static FTextBlockStyle* EditorMultiLineEditableTextStyle = nullptr;
#endif
UMultiLineEditableText::UMultiLineEditableText(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
if (DefaultMultiLineEditableTextStyle == nullptr)
{
DefaultMultiLineEditableTextStyle = new FTextBlockStyle(FUMGCoreStyle::Get().GetWidgetStyle<FTextBlockStyle>("NormalText"));
// Unlink UMG default colors.
DefaultMultiLineEditableTextStyle->UnlinkColors();
}
WidgetStyle = *DefaultMultiLineEditableTextStyle;
#if WITH_EDITOR
if (EditorMultiLineEditableTextStyle == nullptr)
{
EditorMultiLineEditableTextStyle = new FTextBlockStyle(FCoreStyle::Get().GetWidgetStyle<FTextBlockStyle>("NormalText"));
// Unlink UMG Editor colors from the editor settings colors.
EditorMultiLineEditableTextStyle->UnlinkColors();
}
if (IsEditorWidget())
{
WidgetStyle = *EditorMultiLineEditableTextStyle;
// The CDO isn't an editor widget and thus won't use the editor style, call post edit change to mark difference from CDO
PostEditChange();
}
#endif // WITH_EDITOR
bIsReadOnly = false;
SelectAllTextWhenFocused = false;
ClearTextSelectionOnFocusLoss = true;
RevertTextOnEscape = false;
ClearKeyboardFocusOnCommit = true;
AllowContextMenu = true;
SetClipping(EWidgetClipping::ClipToBounds);
VirtualKeyboardDismissAction = EVirtualKeyboardDismissAction::TextChangeOnDismiss;
AutoWrapText = true;
if (!IsRunningDedicatedServer())
{
static ConstructorHelpers::FObjectFinder<UFont> RobotoFontObj(*UWidget::GetDefaultFontName());
WidgetStyle.SetFont(FSlateFontInfo(RobotoFontObj.Object, 12, FName("Bold")));
}
}
void UMultiLineEditableText::ReleaseSlateResources(bool bReleaseChildren)
{
Super::ReleaseSlateResources(bReleaseChildren);
MyMultiLineEditableText.Reset();
}
TSharedRef<SWidget> UMultiLineEditableText::RebuildWidget()
{
MyMultiLineEditableText = SNew(SMultiLineEditableText)
.TextStyle(&WidgetStyle)
.AllowContextMenu(AllowContextMenu)
.IsReadOnly(bIsReadOnly)
// .MinDesiredWidth(MinimumDesiredWidth)
// .IsCaretMovedWhenGainFocus(IsCaretMovedWhenGainFocus)
.SelectAllTextWhenFocused(SelectAllTextWhenFocused)
.ClearTextSelectionOnFocusLoss(ClearTextSelectionOnFocusLoss)
.RevertTextOnEscape(RevertTextOnEscape)
.ClearKeyboardFocusOnCommit(ClearKeyboardFocusOnCommit)
// .SelectAllTextOnCommit(SelectAllTextOnCommit)
// .BackgroundImageSelected(BackgroundImageSelected ? TAttribute<const FSlateBrush*>(&BackgroundImageSelected->Brush) : TAttribute<const FSlateBrush*>())
// .BackgroundImageSelectionTarget(BackgroundImageSelectionTarget ? TAttribute<const FSlateBrush*>(&BackgroundImageSelectionTarget->Brush) : TAttribute<const FSlateBrush*>())
// .BackgroundImageComposing(BackgroundImageComposing ? TAttribute<const FSlateBrush*>(&BackgroundImageComposing->Brush) : TAttribute<const FSlateBrush*>())
// .CaretImage(CaretImage ? TAttribute<const FSlateBrush*>(&CaretImage->Brush) : TAttribute<const FSlateBrush*>())
.VirtualKeyboardOptions(VirtualKeyboardOptions)
.VirtualKeyboardDismissAction(VirtualKeyboardDismissAction)
.OnTextChanged(BIND_UOBJECT_DELEGATE(FOnTextChanged, HandleOnTextChanged))
.OnTextCommitted(BIND_UOBJECT_DELEGATE(FOnTextCommitted, HandleOnTextCommitted))
;
return MyMultiLineEditableText.ToSharedRef();
}
void UMultiLineEditableText::SynchronizeProperties()
{
Super::SynchronizeProperties();
TAttribute<FText> HintTextBinding = PROPERTY_BINDING(FText, HintText);
MyMultiLineEditableText->SetTextStyle(&WidgetStyle);
MyMultiLineEditableText->SetText(Text);
MyMultiLineEditableText->SetHintText(HintTextBinding);
MyMultiLineEditableText->SetAllowContextMenu(AllowContextMenu);
MyMultiLineEditableText->SetIsReadOnly(bIsReadOnly);
MyMultiLineEditableText->SetVirtualKeyboardDismissAction(VirtualKeyboardDismissAction);
MyMultiLineEditableText->SetSelectAllTextWhenFocused(SelectAllTextWhenFocused);
MyMultiLineEditableText->SetClearTextSelectionOnFocusLoss(ClearTextSelectionOnFocusLoss);
MyMultiLineEditableText->SetRevertTextOnEscape(RevertTextOnEscape);
MyMultiLineEditableText->SetClearKeyboardFocusOnCommit(ClearKeyboardFocusOnCommit);
// MyMultiLineEditableText->SetColorAndOpacity(ColorAndOpacity);
// TODO UMG Complete making all properties settable on SMultiLineEditableText
Super::SynchronizeTextLayoutProperties(*MyMultiLineEditableText);
}
void UMultiLineEditableText::SetJustification(ETextJustify::Type InJustification)
{
Super::SetJustification(InJustification);
if (MyMultiLineEditableText.IsValid())
{
MyMultiLineEditableText->SetJustification(InJustification);
}
}
FText UMultiLineEditableText::GetText() const
{
if ( MyMultiLineEditableText.IsValid() )
{
return MyMultiLineEditableText->GetText();
}
return Text;
}
void UMultiLineEditableText::SetText(FText InText)
{
Text = InText;
if ( MyMultiLineEditableText.IsValid() )
{
MyMultiLineEditableText->SetText(Text);
}
}
FText UMultiLineEditableText::GetHintText() const
{
if (MyMultiLineEditableText.IsValid())
{
return MyMultiLineEditableText->GetHintText();
}
return HintText;
}
void UMultiLineEditableText::SetHintText(FText InHintText)
{
HintText = InHintText;
HintTextDelegate.Clear();
if (MyMultiLineEditableText.IsValid())
{
TAttribute<FText> HintTextBinding = PROPERTY_BINDING(FText, HintText);
MyMultiLineEditableText->SetHintText(HintTextBinding);
}
}
void UMultiLineEditableText::SetIsReadOnly(bool bReadOnly)
{
bIsReadOnly = bReadOnly;
if ( MyMultiLineEditableText.IsValid() )
{
MyMultiLineEditableText->SetIsReadOnly(bIsReadOnly);
}
}
void UMultiLineEditableText::SetWidgetStyle(const FTextBlockStyle& InWidgetStyle)
{
WidgetStyle = InWidgetStyle;
if (MyMultiLineEditableText.IsValid())
{
MyMultiLineEditableText->SetTextStyle(&WidgetStyle);
}
}
void UMultiLineEditableText::HandleOnTextChanged(const FText& InText)
{
OnTextChanged.Broadcast(InText);
}
void UMultiLineEditableText::HandleOnTextCommitted(const FText& InText, ETextCommit::Type CommitMethod)
{
OnTextCommitted.Broadcast(InText, CommitMethod);
}
#if WITH_EDITOR
const FText UMultiLineEditableText::GetPaletteCategory()
{
return LOCTEXT("Input", "Input");
}
#endif
/////////////////////////////////////////////////////
#undef LOCTEXT_NAMESPACE