2014-12-07 19:09:38 -05:00
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
2014-10-14 10:29:46 -04:00
# include "LogVisualizerPCH.h"
# include "Debug/ReporterGraph.h"
# include "MainFrame.h"
# include "DesktopPlatformModule.h"
# include "Json.h"
# include "Editor/UnrealEd/Classes/Editor/EditorEngine.h"
# if WITH_EDITOR
# include "Editor / UnrealEd / Public / EditorComponents.h"
# include "Editor / UnrealEd / Public / EditorReimportHandler.h"
# include "Editor / UnrealEd / Public / TexAlignTools.h"
# include "Editor / UnrealEd / Public / TickableEditorObject.h"
# include "UnrealEdClasses.h"
# include "Editor / UnrealEd / Public / Editor.h"
# include "Editor / UnrealEd / Public / EditorViewportClient.h"
# endif
# include "LogVisualizerModule.h"
# include "SLogVisualizerReport.h"
# define LOCTEXT_NAMESPACE "SLogVisualizerReport"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SLogVisualizerReport : : Construct ( const FArguments & InArgs , SLogVisualizer * InLogVisualizer , TArray < TSharedPtr < struct FActorsVisLog > > & InSelectedItems )
{
SelectedItems = InSelectedItems ;
this - > ChildSlot
[
SNew ( SScrollBox )
+ SScrollBox : : Slot ( )
[
SNew ( SBorder )
. BorderImage ( FEditorStyle : : Get ( ) . GetBrush ( " ToolPanel.GroupBorder " ) )
[
SNew ( SVerticalBox )
+ SVerticalBox : : Slot ( ) . AutoHeight ( ) . Padding ( 0 )
[
SNew ( SBorder )
. BorderImage ( FEditorStyle : : Get ( ) . GetBrush ( " Menu.Background " ) )
. Padding ( 0 )
[
SNew ( SRichTextBlock )
. Text ( this , & SLogVisualizerReport : : GenerateReportText )
. TextStyle ( FEditorStyle : : Get ( ) , " ContentBrowser.Filters.Text " )
. DecoratorStyleSet ( & FEditorStyle : : Get ( ) )
. WrapTextAt ( 800 )
. Justification ( ETextJustify : : Left )
. Margin ( FMargin ( 20 ) )
]
]
]
]
] ;
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
SLogVisualizerReport : : ~ SLogVisualizerReport ( )
{
}
FText SLogVisualizerReport : : GenerateReportText ( ) const
{
FString OutString ;
2014-10-27 08:35:45 -04:00
TArray < FVisualLogEvent > GlobalEventsStats ;
2014-10-15 11:27:46 -04:00
TMap < FString , TArray < FString > > EventToObjectsMap ;
2014-10-14 10:29:46 -04:00
for ( auto LogItem : SelectedItems )
{
2014-10-27 08:35:45 -04:00
TArray < FVisualLogEvent > AllEvents ;
2014-10-14 10:29:46 -04:00
for ( TSharedPtr < FVisualLogEntry > CurrentEntry : LogItem - > Entries )
{
2014-10-27 08:35:45 -04:00
for ( FVisualLogEvent & Event : CurrentEntry - > Events )
2014-10-14 10:29:46 -04:00
{
2014-10-27 08:35:45 -04:00
int32 Index = AllEvents . Find ( FVisualLogEvent ( Event ) ) ;
2014-10-14 10:29:46 -04:00
if ( Index ! = INDEX_NONE )
{
for ( auto & CurrentEventTag : Event . EventTags )
{
if ( AllEvents [ Index ] . EventTags . Contains ( CurrentEventTag . Key ) )
{
AllEvents [ Index ] . EventTags [ CurrentEventTag . Key ] + = CurrentEventTag . Value ;
}
else
{
AllEvents [ Index ] . EventTags . Add ( CurrentEventTag . Key , CurrentEventTag . Value ) ;
}
}
AllEvents [ Index ] . Counter + + ;
}
else
{
AllEvents . Add ( Event ) ;
}
}
}
bool bPrintNextLine = false ;
if ( AllEvents . Num ( ) > 0 )
{
OutString . Append ( FString : : Printf ( TEXT ( " %s \n " ) , * LogItem - > Name . ToString ( ) ) ) ;
}
for ( auto & CurrentEvent : AllEvents )
{
for ( auto & CurrentEventTag : CurrentEvent . EventTags )
{
2014-10-15 11:27:46 -04:00
OutString . Append ( FString : : Printf ( TEXT ( " %s with <%s> tag occurred %d times \n " ) , * CurrentEvent . Name , * CurrentEventTag . Key . ToString ( ) , CurrentEventTag . Value ) ) ;
2014-10-14 10:29:46 -04:00
}
2014-10-15 11:27:46 -04:00
OutString . Append ( FString : : Printf ( TEXT ( " %s occurred %d times \n \n " ) , * CurrentEvent . Name , CurrentEvent . Counter ) ) ;
2014-10-14 10:29:46 -04:00
2014-10-15 11:27:46 -04:00
bool bJustAdded = false ;
2014-10-27 08:35:45 -04:00
int32 Index = GlobalEventsStats . Find ( FVisualLogEvent ( CurrentEvent ) ) ;
2014-10-14 10:29:46 -04:00
if ( Index ! = INDEX_NONE )
{
GlobalEventsStats [ Index ] . Counter + = CurrentEvent . Counter ;
2014-10-15 11:27:46 -04:00
EventToObjectsMap [ CurrentEvent . Name ] . AddUnique ( LogItem - > Name . ToString ( ) ) ;
2014-10-14 10:29:46 -04:00
}
else
{
2014-10-15 11:27:46 -04:00
bJustAdded = true ;
2014-10-14 10:29:46 -04:00
GlobalEventsStats . Add ( CurrentEvent ) ;
2014-10-15 11:27:46 -04:00
EventToObjectsMap . FindOrAdd ( CurrentEvent . Name ) . Add ( LogItem - > Name . ToString ( ) ) ;
2014-10-14 10:29:46 -04:00
}
2014-10-27 08:35:45 -04:00
Index = GlobalEventsStats . Find ( FVisualLogEvent ( CurrentEvent ) ) ;
2014-10-15 11:27:46 -04:00
for ( auto & CurrentEventTag : CurrentEvent . EventTags )
2014-10-14 10:29:46 -04:00
{
2014-10-15 11:27:46 -04:00
if ( ! bJustAdded )
{
GlobalEventsStats [ Index ] . EventTags . FindOrAdd ( CurrentEventTag . Key ) + = CurrentEventTag . Value ;
}
if ( EventToObjectsMap . Contains ( CurrentEvent . Name + CurrentEventTag . Key . ToString ( ) ) )
{
EventToObjectsMap [ CurrentEvent . Name + CurrentEventTag . Key . ToString ( ) ] . AddUnique ( LogItem - > Name . ToString ( ) ) ;
}
else
{
EventToObjectsMap . FindOrAdd ( CurrentEvent . Name + CurrentEventTag . Key . ToString ( ) ) . AddUnique ( LogItem - > Name . ToString ( ) ) ;
}
2014-10-14 10:29:46 -04:00
}
}
}
2014-10-15 11:27:46 -04:00
OutString . Append ( TEXT ( " -= SUMMARY =- \n " ) ) ;
2014-10-14 10:29:46 -04:00
for ( auto & CurrentEvent : GlobalEventsStats )
{
2014-10-15 11:27:46 -04:00
OutString . Append ( FString : : Printf ( TEXT ( " %s occurred %d times by %d owners (%s) \n " ) , * CurrentEvent . Name , CurrentEvent . Counter , EventToObjectsMap . Contains ( CurrentEvent . Name ) ? EventToObjectsMap [ CurrentEvent . Name ] . Num ( ) : 0 , * CurrentEvent . UserFriendlyDesc ) ) ;
2014-10-14 10:29:46 -04:00
for ( auto & CurrentEventTag : CurrentEvent . EventTags )
{
2014-10-15 11:27:46 -04:00
const int32 ObjectsNumber = EventToObjectsMap . Contains ( CurrentEvent . Name + CurrentEventTag . Key . ToString ( ) ) ? EventToObjectsMap [ CurrentEvent . Name + CurrentEventTag . Key . ToString ( ) ] . Num ( ) : 0 ;
OutString . Append ( FString : : Printf ( TEXT ( " %s to <%s> tag occurred %d times by %d owners (average %.2f times each) \n " ) , * CurrentEvent . Name , * CurrentEventTag . Key . ToString ( ) , CurrentEventTag . Value , ObjectsNumber , ObjectsNumber > 0 ? float ( CurrentEventTag . Value ) / ObjectsNumber : - 1 ) ) ;
2014-10-14 10:29:46 -04:00
}
2014-10-15 11:27:46 -04:00
OutString . Append ( TEXT ( " \n " ) ) ;
2014-10-14 10:29:46 -04:00
}
return FText : : FromString ( OutString ) ;
}
# undef LOCTEXT_NAMESPACE