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

181 lines
5.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Misc/Attribute.h"
#include "Layout/Visibility.h"
#include "Fonts/SlateFontInfo.h"
#include "Input/Reply.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Styling/SlateTypes.h"
#include "Styling/CoreStyle.h"
#include "Widgets/Input/SEditableTextBox.h"
#define LOCTEXT_NAMESPACE "Slate"
class FActiveTimerHandle;
/** A text box that is used for searching. Meant to be as easy to use as possible with as few options as possible. */
class SSearchBox : public SEditableTextBox
{
public:
/** Which direction to go when searching */
enum SearchDirection
{
Previous,
Next,
};
/** Data for external search results to be shown in the search box. */
struct FSearchResultData
{
/** The total number of search results. */
int32 NumSearchResults;
/** The index of the currently focused search result. */
int32 CurrentSearchResultIndex;
};
DECLARE_DELEGATE_OneParam(FOnSearch, SSearchBox::SearchDirection);
SLATE_BEGIN_ARGS(SSearchBox)
: _Style( &FCoreStyle::Get().GetWidgetStyle<FSearchBoxStyle>("SearchBox") )
, _HintText( LOCTEXT("SearchHint", "Search") )
, _InitialText()
, _SearchResultData()
, _IsSearching(false)
, _OnTextChanged()
, _OnTextCommitted()
, _OnVerifyTextChanged()
, _OnSearch()
, _SelectAllTextWhenFocused( true )
, _DelayChangeNotificationsWhileTyping( true )
, _DelayChangeNotificationsWhileTypingSeconds(0.25f)
{ }
/** Style used to draw this search box */
SLATE_STYLE_ARGUMENT( FSearchBoxStyle, Style )
/** The text displayed in the SearchBox when no text has been entered */
SLATE_ATTRIBUTE( FText, HintText )
/** The text displayed in the SearchBox when it's created */
SLATE_ATTRIBUTE( FText, InitialText )
/** Optional search result data to be shown in the search bar. */
SLATE_ATTRIBUTE( TOptional<FSearchResultData>, SearchResultData )
/** Whether or not an external search is currently running. */
SLATE_ATTRIBUTE( bool, IsSearching )
/** Invoked whenever the text changes */
SLATE_EVENT( FOnTextChanged, OnTextChanged )
/** Invoked whenever the text is committed (e.g. user presses enter) */
SLATE_EVENT( FOnTextCommitted, OnTextCommitted )
/** Called whenever the text is changed programmatically or interactively by the user */
SLATE_EVENT( FOnVerifyTextChanged, OnVerifyTextChanged )
/** This will add a next and previous button to your search box */
SLATE_EVENT( FOnSearch, OnSearch )
/** Whether to select all text when the user clicks to give focus on the widget */
SLATE_ATTRIBUTE( bool, SelectAllTextWhenFocused )
/** Minimum width that a text block should be */
SLATE_ATTRIBUTE( float, MinDesiredWidth )
/** Whether the SearchBox should delay notifying listeners of text changed events until the user is done typing */
SLATE_ATTRIBUTE( bool, DelayChangeNotificationsWhileTyping )
/** If we're delaying change notifications how many seconds should we wait? */
SLATE_ATTRIBUTE( float, DelayChangeNotificationsWhileTypingSeconds )
/** Callback delegate to have first chance handling of the OnKeyDown event */
SLATE_EVENT(FOnKeyDown, OnKeyDownHandler)
/** Optional callback to allow for special functionality to be invoked when the search glass button is clicked */
SLATE_EVENT(FOnClicked, OnSearchGlassClicked)
SLATE_END_ARGS()
SLATE_API void Construct( const FArguments& InArgs );
/** Get the current selection */
SLATE_API FTextSelection GetSelection() const;
/** Select a block of text */
SLATE_API void SelectText(const FTextLocation& InSelectionStart, const FTextLocation& InCursorLocation);
private:
/** Callback for changes in the editable text box. */
void HandleTextChanged(const FText& NewText);
/** Callback for committing changes in the editable text box. */
void HandleTextCommitted(const FText& NewText, ETextCommit::Type CommitType);
private:
/** Fires the text changed delegate on a delay */
EActiveTimerReturnType TriggerOnTextChanged( double InCurrentTime, float InDeltaTime, FText NewText );
/** Gets the display text for the current search results. */
FText GetSearchResultText() const;
/** @return should we show the search result navigation buttons. */
EVisibility GetSearchResultNavigationButtonVisibility() const;
/** @return should we show the X to clear search? */
EVisibility GetXVisibility() const;
/** @return should we show the search results text. */
EVisibility GetSearchResultDataVisibility() const;
/** @return should we show the is searching throbber. */
EVisibility GetIsSearchingThrobberVisibility() const;
/** @return should we show the search glass icon? */
EVisibility GetSearchGlassVisibility() const;
FReply OnClickedSearch(SSearchBox::SearchDirection Direction);
/** Invoked when user clicks the X*/
FReply OnClearSearch();
/** Invoked to get the font to use for the editable text box */
FSlateFontInfo GetWidgetFont() const;
private:
/** Handle to the active trigger text changed timer */
TWeakPtr<FActiveTimerHandle> ActiveTimerHandle;
/** Delegate that is invoked when the user does next or previous */
FOnSearch OnSearchDelegate;
/** Delegate that is invoked when the text changes */
FOnTextChanged OnTextChangedDelegate;
/** Delegate that is invoked when the text is committed */
FOnTextCommitted OnTextCommittedDelegate;
/** Whether the SearchBox should delay notifying listeners of text changed events until the user is done typing */
TAttribute< bool > DelayChangeNotificationsWhileTyping;
/** If we're delaying change notifications how many seconds should we wait? */
TAttribute< float > DelayChangeNotificationsWhileTypingSeconds;
/** Fonts that specify how to render search text when inactive, and active */
FSlateFontInfo ActiveFont, InactiveFont;
/** Optional search result data to be shown in the search bar. */
TAttribute<TOptional<FSearchResultData>> SearchResultData;
/** Whether or not an external search is currently running. */
TAttribute<bool> bIsSearching;
};
#undef LOCTEXT_NAMESPACE