// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. #include "Components/EditableText.h" #include "UObject/ConstructorHelpers.h" #include "Engine/Font.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Widgets/Input/SEditableText.h" #include "Slate/SlateBrushAsset.h" #define LOCTEXT_NAMESPACE "UMG" ///////////////////////////////////////////////////// // UEditableText static FEditableTextStyle* DefaultEditableTextStyle = nullptr; UEditableText::UEditableText(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { if (DefaultEditableTextStyle == nullptr) { // HACK: THIS SHOULD NOT COME FROM CORESTYLE AND SHOULD INSTEAD BE DEFINED BY ENGINE TEXTURES/PROJECT SETTINGS DefaultEditableTextStyle = new FEditableTextStyle(FCoreStyle::Get().GetWidgetStyle("NormalEditableText")); // Unlink UMG default colors from the editor settings colors. DefaultEditableTextStyle->UnlinkColors(); } WidgetStyle = *DefaultEditableTextStyle; ColorAndOpacity_DEPRECATED = FLinearColor::Black; if (!IsRunningDedicatedServer()) { static ConstructorHelpers::FObjectFinder RobotoFontObj(*UWidget::GetDefaultFontName()); Font_DEPRECATED = FSlateFontInfo(RobotoFontObj.Object, 12, FName("Bold")); } IsReadOnly = false; IsPassword = false; MinimumDesiredWidth = 0.0f; IsCaretMovedWhenGainFocus = true; SelectAllTextWhenFocused = false; RevertTextOnEscape = false; ClearKeyboardFocusOnCommit = true; SelectAllTextOnCommit = false; AllowContextMenu = true; VirtualKeyboardDismissAction = EVirtualKeyboardDismissAction::TextChangeOnDismiss; Clipping = EWidgetClipping::ClipToBounds; AccessibleBehavior = ESlateAccessibleBehavior::Auto; bCanChildrenBeAccessible = false; } void UEditableText::ReleaseSlateResources(bool bReleaseChildren) { Super::ReleaseSlateResources(bReleaseChildren); MyEditableText.Reset(); } TSharedRef UEditableText::RebuildWidget() { MyEditableText = SNew( SEditableText ) .Style( &WidgetStyle ) .MinDesiredWidth( MinimumDesiredWidth ) .IsCaretMovedWhenGainFocus( IsCaretMovedWhenGainFocus ) .SelectAllTextWhenFocused( SelectAllTextWhenFocused ) .RevertTextOnEscape( RevertTextOnEscape ) .ClearKeyboardFocusOnCommit( ClearKeyboardFocusOnCommit ) .SelectAllTextOnCommit( SelectAllTextOnCommit ) .OnTextChanged( BIND_UOBJECT_DELEGATE( FOnTextChanged, HandleOnTextChanged ) ) .OnTextCommitted( BIND_UOBJECT_DELEGATE( FOnTextCommitted, HandleOnTextCommitted ) ) .VirtualKeyboardType( EVirtualKeyboardType::AsKeyboardType( KeyboardType.GetValue() ) ) .VirtualKeyboardOptions(VirtualKeyboardOptions) .VirtualKeyboardDismissAction(VirtualKeyboardDismissAction) .Justification( Justification ); return MyEditableText.ToSharedRef(); } void UEditableText::SynchronizeProperties() { Super::SynchronizeProperties(); TAttribute TextBinding = PROPERTY_BINDING(FText, Text); TAttribute HintTextBinding = PROPERTY_BINDING(FText, HintText); MyEditableText->SetText(TextBinding); MyEditableText->SetHintText(HintTextBinding); MyEditableText->SetIsReadOnly(IsReadOnly); MyEditableText->SetIsPassword(IsPassword); MyEditableText->SetAllowContextMenu(AllowContextMenu); MyEditableText->SetVirtualKeyboardDismissAction(VirtualKeyboardDismissAction); MyEditableText->SetJustification(Justification); // TODO UMG Complete making all properties settable on SEditableText ShapedTextOptions.SynchronizeShapedTextProperties(*MyEditableText); } FText UEditableText::GetText() const { if ( MyEditableText.IsValid() ) { return MyEditableText->GetText(); } return Text; } void UEditableText::SetText(FText InText) { Text = InText; if ( MyEditableText.IsValid() ) { MyEditableText->SetText(Text); } } void UEditableText::SetIsPassword(bool InbIsPassword) { IsPassword = InbIsPassword; if ( MyEditableText.IsValid() ) { MyEditableText->SetIsPassword(IsPassword); } } void UEditableText::SetHintText(FText InHintText) { HintText = InHintText; if ( MyEditableText.IsValid() ) { MyEditableText->SetHintText(HintText); } } void UEditableText::SetIsReadOnly(bool InbIsReadyOnly) { IsReadOnly = InbIsReadyOnly; if ( MyEditableText.IsValid() ) { MyEditableText->SetIsReadOnly(IsReadOnly); } } void UEditableText::SetClearKeyboardFocusOnCommit(bool bInClearKeyboardFocusOnCommit) { ClearKeyboardFocusOnCommit = bInClearKeyboardFocusOnCommit; MyEditableText->SetClearKeyboardFocusOnCommit(ClearKeyboardFocusOnCommit); } void UEditableText::HandleOnTextChanged(const FText& InText) { OnTextChanged.Broadcast(InText); } void UEditableText::HandleOnTextCommitted(const FText& InText, ETextCommit::Type CommitMethod) { OnTextCommitted.Broadcast(InText, CommitMethod); } void UEditableText::PostLoad() { Super::PostLoad(); if ( GetLinkerUE4Version() < VER_UE4_DEPRECATE_UMG_STYLE_ASSETS ) { if ( Style_DEPRECATED != nullptr ) { const FEditableTextStyle* StylePtr = Style_DEPRECATED->GetStyle(); if ( StylePtr != nullptr ) { WidgetStyle = *StylePtr; } Style_DEPRECATED = nullptr; } if ( BackgroundImageSelected_DEPRECATED != nullptr ) { WidgetStyle.BackgroundImageSelected = BackgroundImageSelected_DEPRECATED->Brush; BackgroundImageSelected_DEPRECATED = nullptr; } if ( BackgroundImageComposing_DEPRECATED != nullptr ) { WidgetStyle.BackgroundImageComposing = BackgroundImageComposing_DEPRECATED->Brush; BackgroundImageComposing_DEPRECATED = nullptr; } if ( CaretImage_DEPRECATED != nullptr ) { WidgetStyle.CaretImage = CaretImage_DEPRECATED->Brush; CaretImage_DEPRECATED = nullptr; } } if (GetLinkerUE4Version() < VER_UE4_DEPRECATE_UMG_STYLE_OVERRIDES) { if (Font_DEPRECATED.HasValidFont()) { WidgetStyle.Font = Font_DEPRECATED; Font_DEPRECATED = FSlateFontInfo(); } if (ColorAndOpacity_DEPRECATED != FLinearColor::Black) { WidgetStyle.ColorAndOpacity = ColorAndOpacity_DEPRECATED; ColorAndOpacity_DEPRECATED = FLinearColor::Black; } } } #if WITH_ACCESSIBILITY TSharedPtr UEditableText::GetAccessibleWidget() const { return MyEditableText; } #endif #if WITH_EDITOR const FText UEditableText::GetPaletteCategory() { return LOCTEXT("Input", "Input"); } #endif ///////////////////////////////////////////////////// #undef LOCTEXT_NAMESPACE