Files
UnrealEngine/Engine/Source/Runtime/Slate/Public/Widgets/Input/SSuggestionTextBox.h
2025-05-18 13:04:45 +08:00

267 lines
8.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Styling/SlateColor.h"
#include "Fonts/SlateFontInfo.h"
#include "Input/Reply.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SCompoundWidget.h"
#include "Styling/SlateTypes.h"
#include "Styling/CoreStyle.h"
#include "Widgets/Input/SEditableTextBox.h"
#include "Widgets/Notifications/SErrorText.h"
#include "Widgets/Views/STableViewBase.h"
#include "Widgets/Views/STableRow.h"
class SMenuAnchor;
class SVerticalBox;
template< typename ObjectType > class TAttribute;
/**
* Delegate type for showing the input history.
*
* The first parameter will contain the history of input strings to show.
*/
DECLARE_DELEGATE_OneParam(FOnShowingHistory, OUT TArray<FString>&)
/**
* Delegate type for showing a list of suggestions.
*
* The first parameter is the current input text.
* The second parameter will contain the list of suggestions to show.
*/
DECLARE_DELEGATE_TwoParams(FOnShowingSuggestions, const FString&, OUT TArray<FString>&)
/**
* Implements an editable text box that can show auto-complete histories and suggestions lists.
*/
class SSuggestionTextBox
: public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SSuggestionTextBox)
: _BackgroundColor(FLinearColor::White)
, _BackgroundImage(FCoreStyle::Get().GetBrush("SuggestionTextBox.Background"))
, _ClearKeyboardFocusOnCommit(true)
, _ErrorReporting()
, _Font( FCoreStyle::Get().GetFontStyle( TEXT( "NormalFont" ) ) )
, _ForegroundColor( FCoreStyle::Get().GetSlateColor( "InvertedForeground" ) )
, _HintText()
, _IsCaretMovedWhenGainFocus (true)
, _MinDesiredWidth(0.0f)
, _RevertTextOnEscape(false)
, _SelectAllTextOnCommit(false)
, _SelectAllTextWhenFocused(false)
, _TextStyle( &FCoreStyle::Get().GetWidgetStyle<FEditableTextBoxStyle>("NormalEditableTextBox") )
, _SuggestionTextStyle( &FCoreStyle::Get().GetWidgetStyle<FTextBlockStyle>("SuggestionTextBox.Text") )
, _SuggestionListMaxHeight(250.0)
, _Text()
{ }
/** The color of the background/border around the editable text. */
SLATE_ATTRIBUTE(FSlateColor, BackgroundColor)
/** The image of the background/border around the editable text. */
SLATE_ARGUMENT(const FSlateBrush*, BackgroundImage)
/** Whether to clear keyboard focus when pressing enter to commit changes. */
SLATE_ATTRIBUTE(bool, ClearKeyboardFocusOnCommit)
/** Provides an alternative mechanism for error reporting. */
SLATE_ARGUMENT(TSharedPtr<class IErrorReportingWidget>, ErrorReporting)
/** Font color and opacity. */
SLATE_ATTRIBUTE(FSlateFontInfo, Font)
/** Text color and opacity. */
SLATE_ATTRIBUTE(FSlateColor, ForegroundColor)
/** Hint text that appears when there is no text in the text box. */
SLATE_ATTRIBUTE(FText, HintText)
/** Workaround as we loose focus when the auto completion closes. */
SLATE_ATTRIBUTE(bool, IsCaretMovedWhenGainFocus)
/** Minimum width that a text block should be. */
SLATE_ATTRIBUTE(float, MinDesiredWidth)
/** Called before the history list is shown. */
SLATE_EVENT(FOnShowingHistory, OnShowingHistory)
/** Called before the suggestion list is shown. */
SLATE_EVENT(FOnShowingSuggestions, OnShowingSuggestions)
/** Called whenever the text is changed programmatically or interactively by the user. */
SLATE_EVENT(FOnTextChanged, OnTextChanged)
/** Called when the text has been committed. */
SLATE_EVENT(FOnTextCommitted, OnTextCommitted)
/** Whether to allow the user to back out of changes when they press the escape key. */
SLATE_ATTRIBUTE(bool, RevertTextOnEscape)
/** Whether to select all text when pressing enter to commit changes. */
SLATE_ATTRIBUTE(bool, SelectAllTextOnCommit)
/** Whether to select all text when the user clicks to give focus on the widget. */
SLATE_ATTRIBUTE(bool, SelectAllTextWhenFocused)
/** The styling of the text box. */
SLATE_STYLE_ARGUMENT(FEditableTextBoxStyle, TextStyle)
/** The styling of the suggestion text. */
SLATE_STYLE_ARGUMENT(FTextBlockStyle, SuggestionTextStyle)
/** The maximum height of the suggestion list. */
SLATE_ATTRIBUTE(float, SuggestionListMaxHeight)
/** Sets the text content for this editable text box widget. */
SLATE_ATTRIBUTE(FText, Text)
SLATE_END_ARGS()
public:
/** Default constructor. */
SLATE_API SSuggestionTextBox( );
public:
/**
* Construct this widget. Called by the SNew() Slate macro.
*
* @param InArgs Declaration used by the SNew() macro to construct this widget.
*/
SLATE_API void Construct( const FArguments& InArgs );
/**
* Returns the text string.
*
* @return The text string.
*/
FText GetText( ) const
{
return TextBox->GetText();
}
/**
* Sets an optional error string.
*
* If InError is a non-empty string the TextBox will the ErrorReporting provided during construction.
* If no error reporting was provided, the TextBox will create a default error reporter.
*
* @param InError The error string to set.
*/
void SetError( const FString& InError )
{
TextBox->SetError(InError);
}
/**
* Sets the text string currently being edited
*
* @param InNewText The new text string.
*/
SLATE_API void SetText( const TAttribute< FText >& InNewText );
protected:
/** Clears the list of suggestions and hides the suggestions list. */
SLATE_API void ClearSuggestions( );
/** Sets the keyboard focus to the text box. */
SLATE_API void FocusTextBox( );
/**
* Gets the string value of the currently selected suggestion.
*
* @return Suggestion string, or empty if no suggestion is selected.
*/
SLATE_API FString GetSelectedSuggestionString( ) const;
/** Highlights the selected suggestion in the suggestion list. */
SLATE_API void MarkActiveSuggestion( );
/**
* Sets the list of suggestions.
*
* @param SuggestionStrings The suggestion strings.
* @param InHistoryMode Whether the suggestions represent the input history.
*/
SLATE_API void SetSuggestions( TArray<FString>& SuggestionStrings, bool InHistoryMode );
protected:
// SWidget overrides
SLATE_API virtual void OnFocusLost( const FFocusEvent& InFocusEvent ) override;
SLATE_API virtual FReply OnKeyDown( const FGeometry& MyGeometry, const FKeyEvent& KeyEvent ) override;
SLATE_API virtual bool SupportsKeyboardFocus( ) const override;
private:
// Callback for generating a row widget for the suggestion list view.
SLATE_API TSharedRef<ITableRow> HandleSuggestionListViewGenerateRow( TSharedPtr<FString> Message, const TSharedRef<STableViewBase>& OwnerTable );
// Callback for changing the selected suggestion.
SLATE_API void HandleSuggestionListViewSelectionChanged( TSharedPtr<FString> NewValue, ESelectInfo::Type SelectInfo );
// Callback for getting the highlight string in a suggestion list row widget.
SLATE_API FText HandleSuggestionListWidgetHighlightText( ) const;
// Callback for changing the text box input.
SLATE_API void HandleTextBoxTextChanged( const FText& InText );
// Callback committing the text box input.
SLATE_API void HandleTextBoxTextCommitted( const FText& InText, ETextCommit::Type CommitInfo );
// Called when global focus changes so we can detect when to close the SuggestionList.
SLATE_API void OnGlobalFocusChanging(const FFocusEvent& FocusEvent, const FWeakWidgetPath& OldFocusedWidgetPath, const TSharedPtr<SWidget>& OldFocusedWidget, const FWidgetPath& NewFocusedWidgetPath, const TSharedPtr<SWidget>& NewFocusedWidget);
private:
// Holds a flag to prevent recursive calls in UI callbacks.
bool IgnoreUIUpdate;
// Holds the box for history and auto-complete suggestions.
TSharedPtr<SMenuAnchor> MenuAnchor;
// Holds the current list of suggestions.
TArray<TSharedPtr<FString> > Suggestions;
// Holds the list view that displays the suggestions.
TSharedPtr<SListView<TSharedPtr<FString> > > SuggestionListView;
// Holds the index of the selected suggestion (-1 for no selection).
int32 SelectedSuggestion;
// Holds the editable text box.
TSharedPtr<SEditableTextBox> TextBox;
// The styling of the suggestion text.
const FTextBlockStyle* SuggestionTextStyle;
// The VerticalBox containing the SuggestionList.
TSharedPtr<SVerticalBox> VerticalBox;
private:
// Holds a delegate that is executed before the input history is shown.
FOnShowingHistory OnShowingHistory;
// Holds a delegate that is executed before the suggestions list is shown.
FOnShowingSuggestions OnShowingSuggestions;
// Holds a delegate that is executed when the text has changed.
FOnTextChanged OnTextChanged;
// Holds a delegate that is executed when the text has been committed.
FOnTextCommitted OnTextCommitted;
};