// 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("NormalText")); // Unlink UMG default colors. DefaultMultiLineEditableTextStyle->UnlinkColors(); } WidgetStyle = *DefaultMultiLineEditableTextStyle; #if WITH_EDITOR if (EditorMultiLineEditableTextStyle == nullptr) { EditorMultiLineEditableTextStyle = new FTextBlockStyle(FCoreStyle::Get().GetWidgetStyle("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; Clipping = EWidgetClipping::ClipToBounds; VirtualKeyboardDismissAction = EVirtualKeyboardDismissAction::TextChangeOnDismiss; AutoWrapText = true; if (!IsRunningDedicatedServer()) { static ConstructorHelpers::FObjectFinder RobotoFontObj(*UWidget::GetDefaultFontName()); Font_DEPRECATED = FSlateFontInfo(RobotoFontObj.Object, 12, FName("Bold")); WidgetStyle.SetFont(Font_DEPRECATED); } } void UMultiLineEditableText::ReleaseSlateResources(bool bReleaseChildren) { Super::ReleaseSlateResources(bReleaseChildren); MyMultiLineEditableText.Reset(); } TSharedRef 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(&BackgroundImageSelected->Brush) : TAttribute()) // .BackgroundImageSelectionTarget(BackgroundImageSelectionTarget ? TAttribute(&BackgroundImageSelectionTarget->Brush) : TAttribute()) // .BackgroundImageComposing(BackgroundImageComposing ? TAttribute(&BackgroundImageComposing->Brush) : TAttribute()) // .CaretImage(CaretImage ? TAttribute(&CaretImage->Brush) : TAttribute()) .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 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 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); } void UMultiLineEditableText::PostLoad() { Super::PostLoad(); if (GetLinkerUEVersion() < VER_UE4_DEPRECATE_UMG_STYLE_OVERRIDES) { if (Font_DEPRECATED.HasValidFont()) { WidgetStyle.Font = Font_DEPRECATED; Font_DEPRECATED = FSlateFontInfo(); } } } #if WITH_EDITOR const FText UMultiLineEditableText::GetPaletteCategory() { return LOCTEXT("Input", "Input"); } #endif ///////////////////////////////////////////////////// #undef LOCTEXT_NAMESPACE