Files
UnrealEngineUWP/Engine/Source/Developer/OutputLog/Private/SOutputLog.h
Jamie Dale 22f0534844 Removed Tick() from SOutputLog
It wasn't actually needed as we're able to perform the scroll immediately in all cases we need to, rather than wait until the next Tick().

#codereview Max.Preussner

[CL 2306688 by Jamie Dale in Main branch]
2014-09-23 06:03:13 -04:00

191 lines
5.1 KiB
C++

// Copyright 1998-2014 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<FString> Message;
FName Style;
FLogMessage(const TSharedRef<FString>& 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 { return true; }
// e.g. Tab or Key_Up
virtual FReply OnKeyDown( const FGeometry& MyGeometry, const FKeyboardEvent& KeyboardEvent );
void OnKeyboardFocusLost( const FKeyboardFocusEvent& InKeyboardFocusEvent );
/** 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<ITableRow> MakeSuggestionListItemWidget(TSharedPtr<FString> Message, const TSharedRef<STableViewBase>& OwnerTable);
void SuggestionSelectionChanged(TSharedPtr<FString> NewValue, ESelectInfo::Type SelectInfo);
void SetSuggestions(TArray<FString>& 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<FString> > Suggestions;
/** The list view for showing all log messages. Should be replaced by a full text editor */
TSharedPtr< SListView< TSharedPtr<FString> > > 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<FLogMessage> >, 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<FLogMessage> >& 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 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;
};