You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
166 lines
5.2 KiB
C++
166 lines
5.2 KiB
C++
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
|
|
|
|
#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;
|
|
TArray<FVisualLogEntry::FLogEvent> GlobalEventsStats;
|
|
TMap<FString, TArray<FString> > EventToObjectsMap;
|
|
|
|
|
|
for (auto LogItem : SelectedItems)
|
|
{
|
|
TArray<FVisualLogEntry::FLogEvent> AllEvents;
|
|
|
|
for (TSharedPtr<FVisualLogEntry> CurrentEntry : LogItem->Entries)
|
|
{
|
|
for (FVisualLogEntry::FLogEvent& Event : CurrentEntry->Events)
|
|
{
|
|
int32 Index = AllEvents.Find(FVisualLogEntry::FLogEvent(Event));
|
|
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)
|
|
{
|
|
OutString.Append(FString::Printf(TEXT(" %s with <%s> tag occurred %d times\n"), *CurrentEvent.Name, *CurrentEventTag.Key.ToString(), CurrentEventTag.Value));
|
|
}
|
|
OutString.Append( FString::Printf(TEXT(" %s occurred %d times\n\n"), *CurrentEvent.Name, CurrentEvent.Counter) );
|
|
|
|
bool bJustAdded = false;
|
|
int32 Index = GlobalEventsStats.Find(FVisualLogEntry::FLogEvent(CurrentEvent));
|
|
if (Index != INDEX_NONE)
|
|
{
|
|
GlobalEventsStats[Index].Counter += CurrentEvent.Counter;
|
|
EventToObjectsMap[CurrentEvent.Name] .AddUnique(LogItem->Name.ToString());
|
|
}
|
|
else
|
|
{
|
|
bJustAdded = true;
|
|
GlobalEventsStats.Add(CurrentEvent);
|
|
EventToObjectsMap.FindOrAdd(CurrentEvent.Name).Add(LogItem->Name.ToString());
|
|
}
|
|
|
|
Index = GlobalEventsStats.Find(FVisualLogEntry::FLogEvent(CurrentEvent));
|
|
for (auto& CurrentEventTag : CurrentEvent.EventTags)
|
|
{
|
|
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());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
OutString.Append(TEXT("-= SUMMARY =-\n"));
|
|
|
|
for (auto& CurrentEvent : GlobalEventsStats)
|
|
{
|
|
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));
|
|
for (auto& CurrentEventTag : CurrentEvent.EventTags)
|
|
{
|
|
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));
|
|
}
|
|
OutString.Append(TEXT("\n"));
|
|
}
|
|
|
|
return FText::FromString(OutString);
|
|
}
|
|
|
|
|
|
#undef LOCTEXT_NAMESPACE
|