Files
UnrealEngineUWP/Engine/Source/Developer/OutputLog/Private/SOutputLog.h
Dmitriy Dyomin ed69c79ff7 Device output log window, currently implemented only for Android. Hidden under editor experimental settings
#jira UEMOB-39
#codereview Jack.Porter

[CL 2710794 by Dmitriy Dyomin in Main branch]
2015-09-30 03:39:09 -04:00

233 lines
6.6 KiB
C++

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "BaseTextLayoutMarshaller.h"
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:
DECLARE_DELEGATE_OneParam(FExecuteConsoleCommand, const FString& /*ExecCommand*/)
SLATE_BEGIN_ARGS( SConsoleInputBox )
: _SuggestionListPlacement( MenuPlacement_BelowAnchor )
{}
/** Where to place the suggestion list */
SLATE_ARGUMENT( EMenuPlacement, SuggestionListPlacement )
/** Custom executor for console command, will be used when bound */
SLATE_EVENT( FExecuteConsoleCommand, ConsoleCommandCustomExec)
/** 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 OnPreviewKeyDown( 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<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;
/** Delegate to call to execute console command */
FExecuteConsoleCommand ConsoleCommandCustomExec;
/** -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;
protected:
/**
* 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;
};
/** Output log text marshaller to convert an array of FLogMessages into styled lines to be consumed by an FTextLayout */
class FOutputLogTextLayoutMarshaller : public FBaseTextLayoutMarshaller
{
public:
static TSharedRef< FOutputLogTextLayoutMarshaller > Create(TArray< TSharedPtr<FLogMessage> > InMessages);
virtual ~FOutputLogTextLayoutMarshaller();
// ITextLayoutMarshaller
virtual void SetText(const FString& SourceString, FTextLayout& TargetTextLayout) override;
virtual void GetText(FString& TargetString, const FTextLayout& SourceTextLayout) override;
bool AppendMessage(const TCHAR* InText, const ELogVerbosity::Type InVerbosity, const FName& InCategory);
void ClearMessages();
int32 GetNumMessages() const;
protected:
FOutputLogTextLayoutMarshaller(TArray< TSharedPtr<FLogMessage> > InMessages);
void AppendMessageToTextLayout(const TSharedPtr<FLogMessage>& Message);
/** All log messages to show in the text box */
TArray< TSharedPtr<FLogMessage> > Messages;
FTextLayout* TextLayout;
};