// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. #pragma once class FOutputLogTextLayoutMarshaller; /** * A single log message for the output log, holding a message and * a style, for color and bolding of the message. */ struct FLogMessage { TSharedRef Message; FName Style; FLogMessage(const TSharedRef& NewMessage, FName NewStyle = NAME_None) : Message(NewMessage) , Style(NewStyle) { } }; /** * Console input box with command-completion support */ class SConsoleInputBox : public SCompoundWidget { public: SLATE_BEGIN_ARGS( SConsoleInputBox ) : _SuggestionListPlacement( MenuPlacement_BelowAnchor ) {} /** Where to place the suggestion list */ SLATE_ARGUMENT( EMenuPlacement, SuggestionListPlacement ) /** Called when a console command is executed */ SLATE_EVENT( FSimpleDelegate, OnConsoleCommandExecuted ) SLATE_END_ARGS() /** Protected console input box widget constructor, called by Slate */ SConsoleInputBox(); /** * Construct this widget. Called by the SNew() Slate macro. * * @param InArgs Declaration used by the SNew() macro to construct this widget */ void Construct( const FArguments& InArgs ); /** Returns the editable text box associated with this widget. Used to set focus directly. */ TSharedRef< SEditableTextBox > GetEditableTextBox() { return InputText.ToSharedRef(); } /** SWidget interface */ virtual void Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime ) override; protected: virtual bool SupportsKeyboardFocus() const override { return true; } // e.g. Tab or Key_Up virtual FReply OnKeyDown( const FGeometry& MyGeometry, const FKeyEvent& KeyEvent ) override; void OnFocusLost( const FFocusEvent& InFocusEvent ) override; /** Handles entering in a command */ void OnTextCommitted(const FText& InText, ETextCommit::Type CommitInfo); void OnTextChanged(const FText& InText); /** Makes the widget for the suggestions messages in the list view */ TSharedRef MakeSuggestionListItemWidget(TSharedPtr Message, const TSharedRef& OwnerTable); void SuggestionSelectionChanged(TSharedPtr NewValue, ESelectInfo::Type SelectInfo); void SetSuggestions(TArray& Elements, bool bInHistoryMode); void MarkActiveSuggestion(); void ClearSuggestions(); FString GetSelectionText() const; private: /** Editable text widget */ TSharedPtr< SEditableTextBox > InputText; /** history / auto completion elements */ TSharedPtr< SMenuAnchor > SuggestionBox; /** All log messages stored in this widget for the list view */ TArray< TSharedPtr > Suggestions; /** The list view for showing all log messages. Should be replaced by a full text editor */ TSharedPtr< SListView< TSharedPtr > > SuggestionListView; /** Delegate to call when a console command is executed */ FSimpleDelegate OnConsoleCommandExecuted; /** -1 if not set, otherwise index into Suggestions */ int32 SelectedSuggestion; /** to prevent recursive calls in UI callback */ bool bIgnoreUIUpdate; }; /** * Widget which holds a list view of logs of the program output * as well as a combo box for entering in new commands */ class SOutputLog : public SCompoundWidget, public FOutputDevice { public: SLATE_BEGIN_ARGS( SOutputLog ) : _Messages() {} /** All messages captured before this log window has been created */ SLATE_ARGUMENT( TArray< TSharedPtr >, Messages ) SLATE_END_ARGS() /** Destructor for output log, so we can unregister from notifications */ ~SOutputLog(); /** * Construct this widget. Called by the SNew() Slate macro. * * @param InArgs Declaration used by the SNew() macro to construct this widget */ void Construct( const FArguments& InArgs ); /** * Creates FLogMessage objects from FOutputDevice log callback * * @param V Message text * @param Verbosity Message verbosity * @param Category Message category * @param OutMessages Array to receive created FLogMessage messages * * @return true if any messages have been created, false otherwise */ static bool CreateLogMessages( const TCHAR* V, ELogVerbosity::Type Verbosity, const class FName& Category, TArray< TSharedPtr >& OutMessages ); protected: virtual void Serialize( const TCHAR* V, ELogVerbosity::Type Verbosity, const class FName& Category ) override; private: /** * Extends the context menu used by the text box */ void ExtendTextBoxMenu(FMenuBuilder& Builder); /** * Called when delete all is selected */ void OnClearLog(); /** * Called when the user scrolls the log window vertically */ void OnUserScrolled(float ScrollOffset); /** * Called to determine whether delete all is currently a valid command */ bool CanClearLog() const; /** Called when a console command is entered for this output log */ void OnConsoleCommandExecuted(); /** Request we immediately force scroll to the bottom of the log */ void RequestForceScroll(); /** Converts the array of messages into something the text box understands */ TSharedPtr< FOutputLogTextLayoutMarshaller > MessagesTextMarshaller; /** The editable text showing all log messages */ TSharedPtr< SMultiLineEditableTextBox > MessagesTextBox; /** True if the user has scrolled the window upwards */ bool bIsUserScrolled; };