2016-12-08 08:52:44 -05:00
|
|
|
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
2014-08-05 09:04:35 -04:00
|
|
|
|
|
|
|
|
#include "STutorialsBrowser.h"
|
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
|
|
|
#include "Brushes/SlateDynamicImageBrush.h"
|
|
|
|
|
#include "Widgets/SOverlay.h"
|
|
|
|
|
#include "Widgets/Images/SImage.h"
|
|
|
|
|
#include "Widgets/Notifications/SProgressBar.h"
|
|
|
|
|
#include "Widgets/Text/STextBlock.h"
|
|
|
|
|
#include "Widgets/Input/SButton.h"
|
|
|
|
|
#include "Widgets/Views/SListView.h"
|
|
|
|
|
#include "EditorStyleSet.h"
|
|
|
|
|
#include "Engine/Blueprint.h"
|
|
|
|
|
#include "Engine/Texture2D.h"
|
|
|
|
|
#include "AssetData.h"
|
|
|
|
|
#include "IntroTutorials.h"
|
2014-08-05 09:04:35 -04:00
|
|
|
#include "EditorTutorial.h"
|
|
|
|
|
#include "STutorialContent.h"
|
|
|
|
|
#include "TutorialSettings.h"
|
|
|
|
|
#include "EditorTutorialSettings.h"
|
2014-08-28 06:22:40 -04:00
|
|
|
#include "TutorialStateSettings.h"
|
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
|
|
|
#include "ARFilter.h"
|
2014-08-20 10:27:41 -04:00
|
|
|
#include "AssetRegistryModule.h"
|
2014-09-18 08:10:29 -04:00
|
|
|
#include "EngineAnalytics.h"
|
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
|
|
|
#include "AnalyticsEventAttribute.h"
|
|
|
|
|
#include "Interfaces/IAnalyticsProvider.h"
|
|
|
|
|
#include "Widgets/Input/SSearchBox.h"
|
|
|
|
|
#include "Widgets/Navigation/SBreadcrumbTrail.h"
|
2014-08-05 09:04:35 -04:00
|
|
|
|
|
|
|
|
#define LOCTEXT_NAMESPACE "TutorialsBrowser"
|
|
|
|
|
|
|
|
|
|
class FTutorialListEntry_Tutorial;
|
|
|
|
|
|
|
|
|
|
DECLARE_DELEGATE_OneParam(FOnCategorySelected, const FString& /* InCategory */);
|
|
|
|
|
|
2014-10-13 06:46:06 -04:00
|
|
|
namespace TutorialBrowserConstants
|
|
|
|
|
{
|
---- Merging with SlateDev branch ----
Introduces the concept of "Active Ticking" to allow Slate to go to sleep when there is no need to update the UI.
While asleep, Slate will skip the Tick & Paint pass for that frame entirely.
- There are TWO ways to "wake" Slate and cause a Tick/Paint pass:
1. Provide some sort of input (mouse movement, clicks, and key presses). Slate will always tick when the user is active.
- Therefore, if the logic in a given widget's Tick is only relevant in response to user action, there is no need to register an active tick.
2. Register an Active Tick. Currently this is an all-or-nothing situation, so if a single active tick needs to execute, all of Slate will be ticked.
- The purpose of an Active Tick is to allow a widget to "drive" Slate and guarantee a Tick/Paint pass in the absence of any user action.
- Examples include animation, async operations that update periodically, progress updates, loading bars, etc.
- An empty active tick is registered for viewports when they are real-time, so game project widgets are unaffected by this change and should continue to work as before.
- An Active Tick is registered by creating an FWidgetActiveTickDelegate and passing it to SWidget::RegisterActiveTick()
- There are THREE ways to unregister an active tick:
1. Return EActiveTickReturnType::StopTicking from the active tick function
2. Pass the FActiveTickHandle returned by RegisterActiveTick() to SWidget::UnregisterActiveTick()
3. Destroy the widget responsible for the active tick
- Sleeping is currently disabled, can be enabled with Slate.AllowSlateToSleep cvar
- There is currently a little buffer time during which Slate continues to tick following any input. Long-term, this is planned to be removed.
- The duration of the buffer can be adjusted using Slate.SleepBufferPostInput cvar (defaults to 1.0f)
- The FCurveSequence API has been updated to work with the active tick system
- Playing a curve sequence now requires that you pass the widget being animated by the sequence
- The active tick will automatically be registered on behalf of the widget and unregister when the sequence is complete
- GetLerpLooping() has been removed. Instead, pass true as the second param to Play() to indicate that the animation will loop. This causes the active tick to be registered indefinitely until paused or jumped to the start/end.
[CL 2391669 by Dan Hertzka in Main branch]
2014-12-17 16:07:57 -05:00
|
|
|
const float RefreshTimerInterval = 1.0f;
|
2014-10-13 06:46:06 -04:00
|
|
|
|
|
|
|
|
const float ProgressUpdateInterval = 0.5f;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
class FTutorialListEntry_Category : public ITutorialListEntry, public TSharedFromThis<FTutorialListEntry_Category>
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FTutorialListEntry_Category(FOnCategorySelected InOnCategorySelected)
|
2014-09-10 12:30:30 -04:00
|
|
|
: OnCategorySelected(InOnCategorySelected)
|
|
|
|
|
, SlateBrush(nullptr)
|
2014-08-05 09:04:35 -04:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
FTutorialListEntry_Category(const FTutorialCategory& InCategory, FOnCategorySelected InOnCategorySelected, const TAttribute<FText>& InHighlightText)
|
|
|
|
|
: Category(InCategory)
|
|
|
|
|
, OnCategorySelected(InOnCategorySelected)
|
|
|
|
|
, HighlightText(InHighlightText)
|
2014-09-10 12:30:30 -04:00
|
|
|
, SlateBrush(nullptr)
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
|
|
|
|
if(!Category.Identifier.IsEmpty())
|
|
|
|
|
{
|
|
|
|
|
int32 Index = INDEX_NONE;
|
|
|
|
|
if(Category.Identifier.FindLastChar(TEXT('.'), Index))
|
|
|
|
|
{
|
|
|
|
|
CategoryName = Category.Identifier.RightChop(Index + 1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
CategoryName = Category.Identifier;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-09-10 12:30:30 -04:00
|
|
|
|
|
|
|
|
if(Category.Texture.IsValid())
|
|
|
|
|
{
|
2015-07-23 10:49:29 -04:00
|
|
|
UTexture2D* Texture = LoadObject<UTexture2D>(nullptr, *Category.Texture.ToString());
|
2014-09-10 12:30:30 -04:00
|
|
|
if(Texture != nullptr)
|
|
|
|
|
{
|
|
|
|
|
FIntPoint TextureSize = Texture->GetImportedSize();
|
|
|
|
|
DynamicBrush = MakeShareable(new FSlateDynamicImageBrush(Texture, FVector2D((float)TextureSize.X, (float)TextureSize.Y), NAME_None));
|
|
|
|
|
SlateBrush = DynamicBrush.Get();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(SlateBrush == nullptr)
|
|
|
|
|
{
|
|
|
|
|
if(Category.Icon.Len() > 0)
|
|
|
|
|
{
|
|
|
|
|
SlateBrush = FEditorStyle::Get().GetBrush(FName(*Category.Icon));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(SlateBrush == nullptr)
|
|
|
|
|
{
|
|
|
|
|
SlateBrush = FEditorStyle::Get().GetBrush("Tutorials.Browser.DefaultTutorialIcon");
|
|
|
|
|
}
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
|
2014-08-05 18:02:04 -04:00
|
|
|
virtual ~FTutorialListEntry_Category()
|
2015-07-14 15:36:51 -04:00
|
|
|
{
|
|
|
|
|
if( DynamicBrush.IsValid() )
|
|
|
|
|
{
|
|
|
|
|
DynamicBrush->ReleaseResource();
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-08-05 18:02:04 -04:00
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
virtual TSharedRef<ITableRow> OnGenerateTutorialRow(const TSharedRef<STableViewBase>& OwnerTable) const override
|
|
|
|
|
{
|
|
|
|
|
return SNew(STableRow<TSharedPtr<ITutorialListEntry>>, OwnerTable)
|
|
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SBox)
|
|
|
|
|
.Padding(FMargin(0.0f, 2.0f))
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SButton)
|
|
|
|
|
.OnClicked(this, &FTutorialListEntry_Category::OnClicked)
|
|
|
|
|
.ButtonStyle(&FEditorStyle::Get().GetWidgetStyle<FButtonStyle>("Tutorials.Browser.Button"))
|
|
|
|
|
.ForegroundColor(FSlateColor::UseForeground())
|
|
|
|
|
.Content()
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SHorizontalBox)
|
|
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.AutoWidth()
|
2014-09-10 12:30:30 -04:00
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
.HAlign(HAlign_Center)
|
2014-10-13 06:46:06 -04:00
|
|
|
.Padding(8.0f)
|
|
|
|
|
[
|
2015-03-23 10:08:21 -04:00
|
|
|
SNew(SOverlay)
|
|
|
|
|
+ SOverlay::Slot()
|
|
|
|
|
[
|
|
|
|
|
SNew(SBox)
|
|
|
|
|
.WidthOverride(64.0f)
|
|
|
|
|
.HeightOverride(64.0f)
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
.HAlign(HAlign_Center)
|
|
|
|
|
[
|
|
|
|
|
SNew(SImage)
|
|
|
|
|
.Image(SlateBrush)
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
+ SOverlay::Slot()
|
|
|
|
|
.VAlign(VAlign_Bottom)
|
|
|
|
|
.HAlign(HAlign_Right)
|
2014-10-13 06:46:06 -04:00
|
|
|
[
|
|
|
|
|
SNew(SImage)
|
2016-01-07 11:21:22 -05:00
|
|
|
.ToolTipText(LOCTEXT("CompletedCategoryCheckToolTip", "This category has been completed"))
|
2015-03-23 10:08:21 -04:00
|
|
|
.Visibility(this, &FTutorialListEntry_Category::GetCompletedVisibility)
|
|
|
|
|
.Image(FEditorStyle::Get().GetBrush("Tutorials.Browser.Completed"))
|
2014-10-13 06:46:06 -04:00
|
|
|
]
|
|
|
|
|
]
|
2015-03-23 10:08:21 -04:00
|
|
|
+ SHorizontalBox::Slot()
|
2014-10-13 06:46:06 -04:00
|
|
|
.FillWidth(1.0f)
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
[
|
|
|
|
|
SNew(SVerticalBox)
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.AutoHeight()
|
|
|
|
|
[
|
|
|
|
|
SNew(STextBlock)
|
|
|
|
|
.Text(!Category.Title.IsEmpty() ? Category.Title : FText::FromString(CategoryName))
|
|
|
|
|
.TextStyle(&FEditorStyle::Get().GetWidgetStyle<FTextBlockStyle>("Tutorials.Browser.SummaryHeader"))
|
|
|
|
|
.HighlightText(HighlightText)
|
|
|
|
|
.HighlightColor(FEditorStyle::Get().GetColor("Tutorials.Browser.HighlightTextColor"))
|
|
|
|
|
.HighlightShape(FEditorStyle::Get().GetBrush("TextBlock.HighlightShape"))
|
|
|
|
|
]
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.FillHeight(1.0f)
|
|
|
|
|
[
|
|
|
|
|
SNew(STextBlock)
|
|
|
|
|
.AutoWrapText(true)
|
|
|
|
|
.Text(Category.Description)
|
|
|
|
|
.TextStyle(&FEditorStyle::Get().GetWidgetStyle<FTextBlockStyle>("Tutorials.Browser.SummaryText"))
|
|
|
|
|
.HighlightText(HighlightText)
|
|
|
|
|
.HighlightColor(FEditorStyle::Get().GetColor("Tutorials.Browser.HighlightTextColor"))
|
|
|
|
|
.HighlightShape(FEditorStyle::Get().GetBrush("TextBlock.HighlightShape"))
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.AutoWidth()
|
|
|
|
|
.HAlign(HAlign_Right)
|
|
|
|
|
.VAlign(VAlign_Center)
|
2014-09-10 12:30:30 -04:00
|
|
|
[
|
|
|
|
|
SNew(SImage)
|
2014-10-13 06:46:06 -04:00
|
|
|
.Visibility(this, &FTutorialListEntry_Category::OnGetArrowVisibility)
|
|
|
|
|
.Image(FEditorStyle::Get().GetBrush("Tutorials.Browser.CategoryArrow"))
|
2014-09-10 12:30:30 -04:00
|
|
|
]
|
2014-08-05 09:04:35 -04:00
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PassesFilter(const FString& InCategoryFilter, const FString& InFilter) const override
|
|
|
|
|
{
|
|
|
|
|
const FString Title = !Category.Title.IsEmpty() ? Category.Title.ToString() : CategoryName;
|
|
|
|
|
const bool bPassesFilter = InFilter.IsEmpty() || (Title.Contains(InFilter) || Category.Description.ToString().Contains(InFilter));
|
|
|
|
|
const bool bPassesCategory = InCategoryFilter.IsEmpty() || Category.Identifier.StartsWith(InCategoryFilter);
|
|
|
|
|
return bPassesFilter && bPassesCategory;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-18 16:43:17 -04:00
|
|
|
FString GetTitleString() const override
|
|
|
|
|
{
|
|
|
|
|
const FString Title = !Category.Title.IsEmpty() ? Category.Title.ToString() : CategoryName;
|
|
|
|
|
return Title;
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-02 10:16:37 -05:00
|
|
|
int32 GetSortOrder() const override
|
|
|
|
|
{
|
|
|
|
|
return Category.SortOrder;
|
|
|
|
|
}
|
2014-09-29 05:28:46 -04:00
|
|
|
|
|
|
|
|
FText GetTitleText() const override
|
|
|
|
|
{
|
|
|
|
|
return !Category.Title.IsEmpty() ? Category.Title : FText::FromString(CategoryName);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-18 16:43:17 -04:00
|
|
|
bool SortAgainst(TSharedRef<ITutorialListEntry> OtherEntry) const override
|
|
|
|
|
{
|
2015-02-02 10:16:37 -05:00
|
|
|
return (GetSortOrder() == OtherEntry->GetSortOrder()) ? (GetTitleString() > OtherEntry->GetTitleString()) : (GetSortOrder() < OtherEntry->GetSortOrder());
|
2014-09-18 16:43:17 -04:00
|
|
|
}
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
void AddSubCategory(TSharedPtr<FTutorialListEntry_Category> InSubCategory)
|
|
|
|
|
{
|
|
|
|
|
SubCategories.Add(InSubCategory);
|
|
|
|
|
}
|
|
|
|
|
|
Copying //UE4/Dev-Core to //UE4/Dev-Main (Source: //UE4/Dev-Core @ 3049602)
==========================
MAJOR FEATURES + CHANGES
==========================
Change 2946506 on 2016/04/18 by Steven.Hutton
Update to Crash Reporter buggs table to add new search fields and inclusion of packages needed for e-mail reports.
Change 3017807 on 2016/06/17 by Chris.Wood
Improved Crash Report Process folder delete code as it could sometimes fail.
[UE-30349] - Crash Report Process is leaving crashes in the landing zone that build up and block the queue
Also added logging to Slack when stop request received instead of just when stop is complete.
Change 3019367 on 2016/06/20 by Chris.Wood
Improve Crash Report Process logging to track bad reads from S3.
Also, better logging when CleanReport fails to delete folders.
Change 3019376 on 2016/06/20 by Steve.Robb
Clarification of assert message and comments which talk about 'null' TFunctions.
Tidy-up of dead code.
Change 3019409 on 2016/06/20 by Steve.Robb
New Find and FindByPredicate algorithms for finding stuff in arbitrary containers.
Change 3022658 on 2016/06/22 by Chris.Wood
Discarding duplicated crash reports earlier in read from Data Router process to avoid clashes in the landing zone (CRP v1.1.11)
[UE-30349] - Crash Report Process is leaving crashes in the landing zone that build up and block the queue
Also improved logging to Slack with better layout, fixed event ordering and counting duplicates.
Change 3022840 on 2016/06/22 by Steve.Robb
Skipped UHT attributes removed.
Change 3022907 on 2016/06/22 by Robert.Manuszewski
Fixing crash when adding a new C++ class to project
#jira UE-32333
Change 3023169 on 2016/06/22 by Steve.Robb
Checks for UTHINGs in skipped preprocessor blocks.
Fixes for skipped UTHINGs and some other parsing accidents.
#jira UE-31627
Change 3023239 on 2016/06/22 by Steve.Robb
Fix for JSON date parsing reported here: https://udn.unrealengine.com/questions/299342/fdatetime-json-serialization-bug.html
Change 3026812 on 2016/06/24 by Mieszko.Zielinski
Marked FEnvQueryInstance::AddItemData UEnvQueryItemType_Point specialization as AIMODULE_API #UE4
Change 3028235 on 2016/06/27 by Robert.Manuszewski
PR #2535: BUGFIX: FPS pop-up updates when loading new stat file (Contributed by projectgheist)
Change 3028282 on 2016/06/27 by Steve.Robb
Fix for missing UFUNCTION check in skipped preprocessor blocks.
#jira UE-31627
Change 3028284 on 2016/06/27 by Steve.Robb
Debuggability improvements and coding standards changes.
Change 3028343 on 2016/06/27 by Steve.Robb
Fix for UHT error in WEX.
#jira UE-32464
Change 3028393 on 2016/06/27 by Steve.Robb
Fix for hot reload of enums finding the old enum.
Fix to stop SPropertyEditorNumeric caching the enum flags.
#jira UE-31658
Change 3030362 on 2016/06/28 by Robert.Manuszewski
Fixing hang when cooking.
Change 3030462 on 2016/06/28 by Steve.Robb
Assert added to PackageTools::GetFilteredPackageList() to help with catching a bug reported in the wild.
#jira UE-32001
Change 3034341 on 2016/06/30 by Robert.Manuszewski
Modified crash handling code (on Windows) to handle two threads crashing at the same time properly. Previously the second crash would force the process to exit before generating the crash report.
Added 'debug twothreadsgpf' command to test the functionality.
Change 3034342 on 2016/06/30 by John.Mahoney
Fix for crash when loading an empty cached asset registry.
#jira UE-32232
Change 3035599 on 2016/07/01 by Chris.Wood
Added support for CrashType string to Crash Report Process. CRP v1.1.12
[UE-30592] - Crash Reporter should determine crash type on client and pass string to server
Also fixes problem with reports falling back on the legacy WER metadata when a crash context exists. They now only read the error message from metadata if available and keep crash context data when possible.
Added in missing crash context parameters that have been added to clients but not known by the server.
Change 3035787 on 2016/07/01 by John.Mahoney
Fix for crash when DuplicateRedirects does not contain the DependentObject when saving dependencies. It will still fall through to the assertion below, but it will now fail with a useful error message instead of a generic 'Pair != nullptr' from Map.h.
#jira UE-30189
Change 3036933 on 2016/07/04 by Steve.Robb
Proper forwarding constructor for FAsyncTask.
Change 3036938 on 2016/07/04 by Steve.Robb
Fix for CDO hot reload corrupting memory when replacing references inside structs.
#jira UE-29335
Change 3036960 on 2016/07/04 by Steve.Robb
Fix for FAnsiAllocator::ResizeAllocation when resizing to zero.
Change 3037423 on 2016/07/05 by Steve.Robb
FModuleManager::UnloadOrAbandonModuleWithCallback split into two instead of switching behavior with a bool.
Change 3037464 on 2016/07/05 by Steve.Robb
HotReload.cpp cleanup:
Deep nesting flattened.
Linear array searches replaced with maps.
FHotReloadModule::GetGameModules made into a non-member function and split into two.
Comment and coding standard fixes.
Change 3037741 on 2016/07/05 by John.Mahoney
Fix for COTF not checking the correct timestamps on startup.
#jira UE-31023
Change 3037846 on 2016/07/05 by Steve.Robb
Fix for compile button disappearing on a bad compile.
#jira UE-31575
Change 3037994 on 2016/07/05 by Steve.Robb
Static analysis fixes:
warning C6308: 'realloc' might return null pointer: assigning null pointer to 'Data', which is passed as an argument to 'realloc', will cause the original memory block to be leaked.
Change 3039186 on 2016/07/06 by Robert.Manuszewski
Enabling crash callstack logging by default.
Change 3039220 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C28159: Consider using 'InitiateSystemShutdownEx' instead of 'ExitWindowsEx'. Reason: Legacy API. Rearchitect to avoid Reboot
warning C6001: Using uninitialized memory 'UserNameLength'
warning C6001: Using uninitialized memory 'DomainNameLength'
Change 3039230 on 2016/07/06 by Steve.Robb
Fix for VC internal compiler errors.
Change 3039237 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6385: Reading invalid data from 'Path': the readable size is '400' bytes, but 'PathCurrentDepth' bytes may be read.
Change 3039287 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6509: Invalid annotation: 'return' cannot be referenced in some contexts
warning C6101: Returning uninitialized memory '*lpdwExitCode'. A successful path through the function does not set the named _Out_ parameter.
warning C6387: '_Param_(1)' could be '0': this does not adhere to the specification for the function 'IMoniker::BindToStorage'.
warning C6387: '_Param_(1)' could be '0': this does not adhere to the specification for the function 'IMoniker::BindToObject'.
warning C6031: Return value ignored: 'CoCreateInstance'.
Change 3039359 on 2016/07/06 by Graeme.Thornton
Compile error fix for FAsyncTask, courtesy of SteveR
Change 3039534 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6319: Use of the comma-operator in a tested expression causes the left argument to be ignored when it has no side-effects.
Change 3039545 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6297: Arithmetic overflow: 32-bit value is shifted, then cast to 64-bit value. Results might not be an expected value.
Change 3039578 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6263: Using _alloca in a loop: this can quickly overflow stack.
Change 3039623 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'X'
warning C6308:'realloc' might return null pointer: assigning null pointer to 'X', which is passed as an argument to 'realloc', will cause the original memory block to be leaked.
warning C6385: Reading invalid data from 'X': the readable size is 'Y' bytes, but 'Z' bytes may be read.
warning C6386: Buffer overrun while writing to 'X': the writable size is 'Y' bytes, but 'Z' bytes might be written.
warning C28182: Dereferencing NULL pointer. 'X' contains the same NULL value as 'Y' did.
Change 3039630 on 2016/07/06 by John.Mahoney
Fix for crash when spawning an actor using a template object that has instance components. UActorComponent::PostInitProperties was adding itself to the owner's InstanceComponents array, resulting in a realloc of that array and invalidating the reference that the owner's ObjectInitializer was trying to replace while instantiating that property. The new instance component will be added to the array as part of the owner's initialization anyway, so it is not necessary to do it here.
#jira UE-29123
Change 3039664 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6386: Buffer overrun while writing to 'NewKeys': the writable size is 'NewIndexSize*4' bytes, but '8' bytes might be written.
warning C6386: Buffer overrun while writing to 'NewHeapIndexes': the writable size is 'NewIndexSize*4' bytes, but '8' bytes might be written.
Change 3039673 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6011: Dereferencing NULL pointer 'v'.
Change 3039690 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'X'.
warning C6246: Local declaration of 'X' hides declaration of the same name in outer scope.
warning C6262: Function uses '121180' bytes of stack: exceeds /analyze:stacksize '81940'. Consider moving some data to heap.
warning C6263: Using _alloca in a loop: this can quickly overflow stack.
Change 3040868 on 2016/07/07 by Graeme.Thornton
Config based class stripping for server builds
Change 3040872 on 2016/07/07 by Graeme.Thornton
Remove "return false" NeedsLoadForServer functions from engine code
Change 3040997 on 2016/07/07 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'Landscape'.
warning C6011: Dereferencing NULL pointer 'rhs.Allocation.LayerInfo'.
warning C6011: Dereferencing NULL pointer 'lhs.Allocation.LayerInfo'.
Change 3041004 on 2016/07/07 by Steve.Robb
Static analysis fix: warning C6336: Arithmetic operator has precedence over question operator, use parentheses to clarify intent.
Change 3041014 on 2016/07/07 by Steve.Robb
Static analysis fix: warning C6287: Redundant code: the left and right sub-expressions are identical.
Change 3041111 on 2016/07/07 by Steve.Robb
Removal of an obsolete error message about INI file case sensitivity.
Change 3041150 on 2016/07/07 by Steve.Robb
Static analysis fix: warning C6289: Incorrect operator: mutual exclusion over || is always a non-zero constant. Did you intend to use && instead?
Change 3041274 on 2016/07/07 by Steve.Robb
Static analysis fixes: warning C6001: Using uninitialized memory 'X'.
Change 3041294 on 2016/07/07 by Chris.Wood
Fixed protocol buffer and decompression errors in Crash Report Process (v.1.1.14)
[UE-32151] - High number of crashes read from S3 by Crash Report Process are failing to unpack
Size of buffer received from S3 is incorrect for some records. Fixed read problems by using size header value instead of stream length.
Increased buffer size for decompression as this was sometimes too small.
Modified S3 reading code to look for multiple records in each downloaded file.
Change 3041472 on 2016/07/07 by Steve.Robb
Static analysis fixes:
warning C6294: Ill-defined for-loop: initial condition does not satisfy test. Loop body not executed.
warning C6201: Index '1' is out of valid index range '0' to '0' for possibly stack allocated buffer 'NewHistory.Nodes'.
Change 3043074 on 2016/07/08 by John.Mahoney
Fix for COTF incorrectly reconstructing the original asset path based on the sandbox path when the game name differs from the game folder name.
Fix for COTF GetFiles not handling absolute GameDir paths properly.
#jira UE-31023
Change 3044461 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6386: Buffer overrun while writing to 'Attributes': the writable size is '16384' bytes, but '-8' bytes might be written.
Change 3044470 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6011: Dereferencing NULL pointer 'Node.Sequence'.
Change 3044476 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6011: Dereferencing NULL pointer 'Property'.
Change 3044551 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C28182: Dereferencing NULL pointer. 'Node' contains the same NULL value as 'KeyAreaNode' did.
Change 3044664 on 2016/07/11 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'ToLandscape->SplineComponent'.
warning C28182: Dereferencing NULL pointer. 'SplinesComponent' contains the same NULL value as 'Landscape->SplineComponent' did.
warning C6011: Dereferencing NULL pointer 'Landscape->SplineComponent'.
warning C6385: Reading invalid data from 'out': the readable size is 'sizeof(kiss_fft_cpx)*Dims[0]*Dims[1]' bytes, but '16' bytes may be read.
Change 3044716 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6385: Reading invalid data from 'this->ScreenSize': the readable size is '32' bytes, but '-4' bytes may be read.
Change 3044717 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C28182: Dereferencing NULL pointer. 'Window' contains the same NULL value as 'ElementType * Window=AllWindows.FindByPredicate((*FStaticMeshEditorTest::RunTest::<lambda_46fd0093f3912289e870263afe1fcb2e>(ExpectedTitle)))' did.
This appears to be a false positive.
Change 3044787 on 2016/07/11 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'FbxObject'.
warning C28182: Dereferencing NULL pointer. 'Node' contains the same NULL value as 'RigidMeshNode' did.
warning C28182: Dereferencing NULL pointer. 'Node' contains the same NULL value as 'Result' did.
Change 3045933 on 2016/07/12 by Steve.Robb
Overloading support for TSharedPtr, TSharedRef and TWeakPtr.
Change 3045960 on 2016/07/12 by Robert.Manuszewski
Fixing a crash in Portal (and any other program that uses UObjects and GCs, with the exception of UHT) caused by classes not having their token stream assembled.
Change 3045963 on 2016/07/12 by Steve.Robb
PLATFORM_COMPILER_HAS_EXPLICIT_OPERATORS, FORCEINLINE_EXPLICIT_OPERATOR_BOOL and SAFE_BOOL_OPERATORS macros removed.
THasOperatorEquals and THasOperatorNotEquals traits moved to their own header.
Change 3045967 on 2016/07/12 by Steve.Robb
Initializer list support for TArray and TSet.
Change 3045968 on 2016/07/12 by Robert.Manuszewski
Fixing an ensure after typing 'stat dumphitches' in console.
Change 3045992 on 2016/07/12 by Robert.Manuszewski
Making sure CoreUObject headers are included for programs that don't include the engine (fixing MinidumpDiagnostics CIS failure)
Change 3047870 on 2016/07/13 by Steven.Hutton
Updated CRW to entity framework with repository models. #rb none
Change 3047871 on 2016/07/13 by Steven.Hutton
Add repository models #rb none
Change 3049468 on 2016/07/14 by Steven.Hutton
Fix broken project files. #rb none
#lockdown Nick.Penwarden
[CL 3050320 by Robert Manuszewski in Main branch]
2016-07-14 14:54:00 -04:00
|
|
|
void AddTutorial(TSharedPtr<FTutorialListEntry_Tutorial> InTutorial);
|
2014-08-05 09:04:35 -04:00
|
|
|
|
|
|
|
|
FReply OnClicked() const
|
|
|
|
|
{
|
|
|
|
|
if(SubCategories.Num() > 0 || Tutorials.Num() > 0)
|
|
|
|
|
{
|
|
|
|
|
OnCategorySelected.ExecuteIfBound(Category.Identifier);
|
|
|
|
|
}
|
|
|
|
|
return FReply::Handled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EVisibility OnGetArrowVisibility() const
|
|
|
|
|
{
|
|
|
|
|
return (SubCategories.Num() > 0 || Tutorials.Num() > 0) ? EVisibility::Visible : EVisibility::Collapsed;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-23 10:08:21 -04:00
|
|
|
EVisibility GetCompletedVisibility() const override
|
|
|
|
|
{
|
|
|
|
|
for (int32 i = 0; i < Tutorials.Num(); ++i)
|
|
|
|
|
{
|
|
|
|
|
if (Tutorials[i].IsValid() && (Tutorials[i]->GetCompletedVisibility() != EVisibility::Visible))
|
|
|
|
|
{
|
|
|
|
|
return EVisibility::Hidden;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (int32 i = 0; i < SubCategories.Num(); ++i)
|
|
|
|
|
{
|
|
|
|
|
if (SubCategories[i].IsValid() && (SubCategories[i]->GetCompletedVisibility() != EVisibility::Visible))
|
|
|
|
|
{
|
|
|
|
|
return EVisibility::Hidden;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return EVisibility::Visible;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
public:
|
|
|
|
|
/** Copy of the category info */
|
|
|
|
|
FTutorialCategory Category;
|
|
|
|
|
|
|
|
|
|
/** Parent category */
|
|
|
|
|
TWeakPtr<ITutorialListEntry> ParentCategory;
|
|
|
|
|
|
|
|
|
|
/** Sub-categories */
|
|
|
|
|
TArray<TSharedPtr<ITutorialListEntry>> SubCategories;
|
|
|
|
|
|
|
|
|
|
/** Tutorials in this category */
|
|
|
|
|
TArray<TSharedPtr<ITutorialListEntry>> Tutorials;
|
|
|
|
|
|
|
|
|
|
/** Selection delegate */
|
|
|
|
|
FOnCategorySelected OnCategorySelected;
|
|
|
|
|
|
|
|
|
|
/** Name of the category, empty if this category is at the root */
|
|
|
|
|
FString CategoryName;
|
|
|
|
|
|
|
|
|
|
/** Text to highlight */
|
|
|
|
|
TAttribute<FText> HighlightText;
|
2014-09-10 12:30:30 -04:00
|
|
|
|
|
|
|
|
/** Static brush from the editor style */
|
|
|
|
|
const FSlateBrush* SlateBrush;
|
|
|
|
|
|
|
|
|
|
/** Dynamic brush from the texture specified by the user */
|
|
|
|
|
TSharedPtr<FSlateDynamicImageBrush> DynamicBrush;
|
2014-08-05 09:04:35 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
DECLARE_DELEGATE_TwoParams(FOnTutorialSelected, UEditorTutorial* /* InTutorial */, bool /* bRestart */ );
|
|
|
|
|
|
|
|
|
|
class FTutorialListEntry_Tutorial : public ITutorialListEntry, public TSharedFromThis<FTutorialListEntry_Tutorial>
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FTutorialListEntry_Tutorial(UEditorTutorial* InTutorial, FOnTutorialSelected InOnTutorialSelected, const TAttribute<FText>& InHighlightText)
|
|
|
|
|
: Tutorial(InTutorial)
|
|
|
|
|
, OnTutorialSelected(InOnTutorialSelected)
|
|
|
|
|
, HighlightText(InHighlightText)
|
2014-09-10 12:30:30 -04:00
|
|
|
, SlateBrush(nullptr)
|
2014-10-13 06:46:06 -04:00
|
|
|
, LastUpdateTime(0.0f)
|
2014-09-10 12:30:30 -04:00
|
|
|
{
|
|
|
|
|
if(Tutorial->Texture != nullptr)
|
|
|
|
|
{
|
|
|
|
|
FIntPoint TextureSize = Tutorial->Texture->GetImportedSize();
|
|
|
|
|
DynamicBrush = MakeShareable(new FSlateDynamicImageBrush(Tutorial->Texture, FVector2D((float)TextureSize.X, (float)TextureSize.Y), NAME_None));
|
|
|
|
|
SlateBrush = DynamicBrush.Get();
|
|
|
|
|
}
|
|
|
|
|
else if(Tutorial->Icon.Len() > 0)
|
|
|
|
|
{
|
|
|
|
|
SlateBrush = FEditorStyle::Get().GetBrush(FName(*Tutorial->Icon));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(SlateBrush == nullptr)
|
|
|
|
|
{
|
|
|
|
|
SlateBrush = FEditorStyle::Get().GetBrush("Tutorials.Browser.DefaultTutorialIcon");
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-08-05 09:04:35 -04:00
|
|
|
|
2014-08-05 18:02:04 -04:00
|
|
|
virtual ~FTutorialListEntry_Tutorial()
|
2015-07-14 15:36:51 -04:00
|
|
|
{
|
|
|
|
|
if( DynamicBrush.IsValid() )
|
|
|
|
|
{
|
|
|
|
|
DynamicBrush->ReleaseResource();
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-08-05 18:02:04 -04:00
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
virtual TSharedRef<ITableRow> OnGenerateTutorialRow(const TSharedRef<STableViewBase>& OwnerTable) const override
|
|
|
|
|
{
|
2014-10-13 06:46:06 -04:00
|
|
|
CacheProgress();
|
2014-09-18 09:02:51 -04:00
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
return SNew(STableRow<TSharedPtr<ITutorialListEntry>>, OwnerTable)
|
|
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SBox)
|
|
|
|
|
.Padding(FMargin(0.0f, 2.0f))
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SAssignNew(LaunchButton, SButton)
|
|
|
|
|
.OnClicked(this, &FTutorialListEntry_Tutorial::OnClicked, false)
|
|
|
|
|
.ButtonStyle(&FEditorStyle::Get().GetWidgetStyle<FButtonStyle>("Tutorials.Browser.Button"))
|
|
|
|
|
.ForegroundColor(FSlateColor::UseForeground())
|
|
|
|
|
.Content()
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SVerticalBox)
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.AutoHeight()
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SHorizontalBox)
|
|
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.AutoWidth()
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
.HAlign(HAlign_Center)
|
|
|
|
|
.Padding(8.0f)
|
2014-09-18 09:02:51 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SOverlay)
|
|
|
|
|
+SOverlay::Slot()
|
2014-09-18 09:02:51 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SBox)
|
|
|
|
|
.WidthOverride(64.0f)
|
|
|
|
|
.HeightOverride(64.0f)
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
.HAlign(HAlign_Center)
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
|
|
|
|
SNew(SImage)
|
2014-10-13 06:46:06 -04:00
|
|
|
.Image(SlateBrush)
|
2014-08-05 09:04:35 -04:00
|
|
|
]
|
|
|
|
|
]
|
2014-10-13 06:46:06 -04:00
|
|
|
+SOverlay::Slot()
|
|
|
|
|
.VAlign(VAlign_Bottom)
|
|
|
|
|
.HAlign(HAlign_Right)
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SImage)
|
2016-01-07 11:21:22 -05:00
|
|
|
.ToolTipText(LOCTEXT("CompletedTutorialCheckToolTip", "This tutorial has been completed"))
|
2014-10-13 06:46:06 -04:00
|
|
|
.Visibility(this, &FTutorialListEntry_Tutorial::GetCompletedVisibility)
|
|
|
|
|
.Image(FEditorStyle::Get().GetBrush("Tutorials.Browser.Completed"))
|
2014-08-05 09:04:35 -04:00
|
|
|
]
|
|
|
|
|
]
|
2014-10-13 06:46:06 -04:00
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.FillWidth(1.0f)
|
|
|
|
|
.HAlign(HAlign_Fill)
|
|
|
|
|
.VAlign(VAlign_Center)
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SVerticalBox)
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.AutoHeight()
|
|
|
|
|
[
|
|
|
|
|
SNew(SHorizontalBox)
|
|
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.FillWidth(1.0f)
|
|
|
|
|
[
|
|
|
|
|
SNew(STextBlock)
|
|
|
|
|
.Text(Tutorial->Title)
|
|
|
|
|
.TextStyle(&FEditorStyle::Get().GetWidgetStyle<FTextBlockStyle>("Tutorials.Browser.SummaryHeader"))
|
|
|
|
|
.HighlightText(HighlightText)
|
|
|
|
|
.HighlightColor(FEditorStyle::Get().GetColor("Tutorials.Browser.HighlightTextColor"))
|
|
|
|
|
.HighlightShape(FEditorStyle::Get().GetBrush("TextBlock.HighlightShape"))
|
|
|
|
|
]
|
|
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.AutoWidth()
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
[
|
|
|
|
|
SNew(SButton)
|
|
|
|
|
.ToolTipText(LOCTEXT("RestartButtonToolTip", "Start this tutorial from the beginning"))
|
|
|
|
|
.Visibility(this, &FTutorialListEntry_Tutorial::GetRestartVisibility)
|
|
|
|
|
.OnClicked(this, &FTutorialListEntry_Tutorial::OnClicked, true)
|
|
|
|
|
.ButtonStyle(&FEditorStyle::Get().GetWidgetStyle<FButtonStyle>("Tutorials.Browser.Button"))
|
|
|
|
|
.Content()
|
|
|
|
|
[
|
|
|
|
|
SNew(SImage)
|
|
|
|
|
.Image(FEditorStyle::GetBrush("Tutorials.Browser.RestartButton"))
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.AutoHeight()
|
|
|
|
|
[
|
|
|
|
|
SNew(SBox)
|
|
|
|
|
.Visibility(this, &FTutorialListEntry_Tutorial::GetProgressVisibility)
|
|
|
|
|
.HeightOverride(3.0f)
|
|
|
|
|
[
|
|
|
|
|
SNew(SProgressBar)
|
|
|
|
|
.Percent(this, &FTutorialListEntry_Tutorial::GetProgress)
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.FillHeight(1.0f)
|
|
|
|
|
[
|
|
|
|
|
STutorialContent::GenerateContentWidget(Tutorial->SummaryContent, DocumentationPage, HighlightText)
|
|
|
|
|
]
|
2014-08-05 09:04:35 -04:00
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PassesFilter(const FString& InCategoryFilter, const FString& InFilter) const override
|
|
|
|
|
{
|
|
|
|
|
const bool bPassesFilter = InFilter.IsEmpty() || (Tutorial->Title.ToString().Contains(InFilter) || Tutorial->SummaryContent.Text.ToString().Contains(InFilter));
|
|
|
|
|
const bool bPassesCategory = InCategoryFilter.IsEmpty() || Tutorial->Category.StartsWith(InCategoryFilter);
|
|
|
|
|
|
|
|
|
|
return bPassesFilter && bPassesCategory;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-29 05:28:46 -04:00
|
|
|
FText GetTitleText() const override
|
|
|
|
|
{
|
|
|
|
|
return Tutorial->Title;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-18 16:43:17 -04:00
|
|
|
FString GetTitleString() const override
|
|
|
|
|
{
|
|
|
|
|
return Tutorial->Title.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-02 10:16:37 -05:00
|
|
|
int32 GetSortOrder() const override
|
|
|
|
|
{
|
|
|
|
|
return Tutorial->SortOrder;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-18 16:43:17 -04:00
|
|
|
bool SortAgainst(TSharedRef<ITutorialListEntry> OtherEntry) const override
|
|
|
|
|
{
|
2015-02-02 10:16:37 -05:00
|
|
|
return (GetSortOrder() == OtherEntry->GetSortOrder()) ? (GetTitleString() > OtherEntry->GetTitleString()) : (GetSortOrder() < OtherEntry->GetSortOrder());
|
2014-09-18 16:43:17 -04:00
|
|
|
}
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
FReply OnClicked(bool bRestart) const
|
|
|
|
|
{
|
|
|
|
|
OnTutorialSelected.ExecuteIfBound(Tutorial, bRestart);
|
|
|
|
|
|
|
|
|
|
return FReply::Handled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TOptional<float> GetProgress() const
|
|
|
|
|
{
|
2014-10-13 06:46:06 -04:00
|
|
|
CacheProgress();
|
2014-09-18 09:02:51 -04:00
|
|
|
return Progress;
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EVisibility GetProgressVisibility() const
|
|
|
|
|
{
|
|
|
|
|
if(LaunchButton->IsHovered())
|
|
|
|
|
{
|
2014-10-13 06:46:06 -04:00
|
|
|
CacheProgress();
|
2014-08-05 09:04:35 -04:00
|
|
|
return LaunchButton->IsHovered() && bHaveSeenTutorial ? EVisibility::Visible : EVisibility::Hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return EVisibility::Hidden;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-13 06:46:06 -04:00
|
|
|
EVisibility GetRestartVisibility() const
|
|
|
|
|
{
|
|
|
|
|
if(LaunchButton->IsHovered())
|
|
|
|
|
{
|
|
|
|
|
CacheProgress();
|
|
|
|
|
return LaunchButton->IsHovered() && bHaveSeenTutorial ? EVisibility::Visible : EVisibility::Collapsed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return EVisibility::Collapsed;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-23 10:08:21 -04:00
|
|
|
EVisibility GetCompletedVisibility() const override
|
2014-09-18 09:02:51 -04:00
|
|
|
{
|
2014-10-13 06:46:06 -04:00
|
|
|
CacheProgress();
|
2014-09-18 09:02:51 -04:00
|
|
|
return bHaveCompletedTutorial ? EVisibility::Visible : EVisibility::Hidden;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-13 06:46:06 -04:00
|
|
|
void CacheProgress() const
|
|
|
|
|
{
|
|
|
|
|
if(FPlatformTime::Seconds() - LastUpdateTime > TutorialBrowserConstants::ProgressUpdateInterval)
|
|
|
|
|
{
|
|
|
|
|
bHaveCompletedTutorial = GetDefault<UTutorialStateSettings>()->HaveCompletedTutorial(Tutorial);
|
|
|
|
|
bHaveSeenTutorial = false;
|
|
|
|
|
const int32 CurrentStage = GetDefault<UTutorialStateSettings>()->GetProgress(Tutorial, bHaveSeenTutorial);
|
|
|
|
|
Progress = (Tutorial->Stages.Num() > 0) ? (float)(CurrentStage + 1) / (float)Tutorial->Stages.Num() : 0.0f;
|
|
|
|
|
|
|
|
|
|
LastUpdateTime = FPlatformTime::Seconds();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
public:
|
|
|
|
|
/** Parent category */
|
|
|
|
|
TWeakPtr<ITutorialListEntry> ParentCategory;
|
|
|
|
|
|
|
|
|
|
/** Tutorial that we will launch */
|
|
|
|
|
UEditorTutorial* Tutorial;
|
|
|
|
|
|
|
|
|
|
/** Selection delegate */
|
|
|
|
|
FOnTutorialSelected OnTutorialSelected;
|
|
|
|
|
|
|
|
|
|
/** Text to highlight */
|
|
|
|
|
TAttribute<FText> HighlightText;
|
|
|
|
|
|
|
|
|
|
/** Button clicked to launch tutorial */
|
|
|
|
|
mutable TSharedPtr<SWidget> LaunchButton;
|
|
|
|
|
|
|
|
|
|
/** Documentation page reference to use if we are displaying a UDN doc */
|
|
|
|
|
mutable TSharedPtr<IDocumentationPage> DocumentationPage;
|
2014-09-10 12:30:30 -04:00
|
|
|
|
|
|
|
|
/** Static brush from the editor style */
|
|
|
|
|
const FSlateBrush* SlateBrush;
|
|
|
|
|
|
|
|
|
|
/** Dynamic brush from the texture specified by the user */
|
|
|
|
|
TSharedPtr<FSlateDynamicImageBrush> DynamicBrush;
|
2014-09-18 09:02:51 -04:00
|
|
|
|
|
|
|
|
/** Cached tutorial completion state */
|
|
|
|
|
mutable bool bHaveCompletedTutorial;
|
|
|
|
|
|
|
|
|
|
/** Cached tutorial seen state */
|
|
|
|
|
mutable bool bHaveSeenTutorial;
|
|
|
|
|
|
|
|
|
|
/** Cached tutorial progress */
|
|
|
|
|
mutable float Progress;
|
2014-10-13 06:46:06 -04:00
|
|
|
|
|
|
|
|
/** Last update time */
|
|
|
|
|
mutable float LastUpdateTime;
|
2014-08-05 09:04:35 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::Construct(const FArguments& InArgs)
|
|
|
|
|
{
|
2014-10-13 06:46:06 -04:00
|
|
|
bNeedsRefresh = false;
|
|
|
|
|
RefreshTimer = TutorialBrowserConstants::RefreshTimerInterval;
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
OnClosed = InArgs._OnClosed;
|
|
|
|
|
OnLaunchTutorial = InArgs._OnLaunchTutorial;
|
|
|
|
|
ParentWindow = InArgs._ParentWindow;
|
|
|
|
|
|
2014-10-13 06:46:06 -04:00
|
|
|
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
|
|
|
|
|
AssetRegistryModule.Get().OnAssetAdded().AddSP(this, &STutorialsBrowser::HandleAssetAdded);
|
|
|
|
|
|
2014-12-19 17:44:49 -05:00
|
|
|
RegisterActiveTimer( TutorialBrowserConstants::RefreshTimerInterval, FWidgetActiveTimerDelegate::CreateSP( this, &STutorialsBrowser::TriggerReloadTutorials ) );
|
---- Merging with SlateDev branch ----
Introduces the concept of "Active Ticking" to allow Slate to go to sleep when there is no need to update the UI.
While asleep, Slate will skip the Tick & Paint pass for that frame entirely.
- There are TWO ways to "wake" Slate and cause a Tick/Paint pass:
1. Provide some sort of input (mouse movement, clicks, and key presses). Slate will always tick when the user is active.
- Therefore, if the logic in a given widget's Tick is only relevant in response to user action, there is no need to register an active tick.
2. Register an Active Tick. Currently this is an all-or-nothing situation, so if a single active tick needs to execute, all of Slate will be ticked.
- The purpose of an Active Tick is to allow a widget to "drive" Slate and guarantee a Tick/Paint pass in the absence of any user action.
- Examples include animation, async operations that update periodically, progress updates, loading bars, etc.
- An empty active tick is registered for viewports when they are real-time, so game project widgets are unaffected by this change and should continue to work as before.
- An Active Tick is registered by creating an FWidgetActiveTickDelegate and passing it to SWidget::RegisterActiveTick()
- There are THREE ways to unregister an active tick:
1. Return EActiveTickReturnType::StopTicking from the active tick function
2. Pass the FActiveTickHandle returned by RegisterActiveTick() to SWidget::UnregisterActiveTick()
3. Destroy the widget responsible for the active tick
- Sleeping is currently disabled, can be enabled with Slate.AllowSlateToSleep cvar
- There is currently a little buffer time during which Slate continues to tick following any input. Long-term, this is planned to be removed.
- The duration of the buffer can be adjusted using Slate.SleepBufferPostInput cvar (defaults to 1.0f)
- The FCurveSequence API has been updated to work with the active tick system
- Playing a curve sequence now requires that you pass the widget being animated by the sequence
- The active tick will automatically be registered on behalf of the widget and unregister when the sequence is complete
- GetLerpLooping() has been removed. Instead, pass true as the second param to Play() to indicate that the animation will loop. This causes the active tick to be registered indefinitely until paused or jumped to the start/end.
[CL 2391669 by Dan Hertzka in Main branch]
2014-12-17 16:07:57 -05:00
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
ChildSlot
|
|
|
|
|
[
|
|
|
|
|
SNew(SVerticalBox)
|
|
|
|
|
+SVerticalBox::Slot()
|
2014-10-13 06:46:06 -04:00
|
|
|
.AutoHeight()
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
|
|
|
|
SNew(SBorder)
|
2014-10-13 06:46:06 -04:00
|
|
|
.BorderImage(FEditorStyle::Get().GetBrush("ToolPanel.GroupBorder"))
|
|
|
|
|
.Padding(5.0f)
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SHorizontalBox)
|
|
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.AutoWidth()
|
|
|
|
|
.VAlign(VAlign_Center)
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SButton)
|
|
|
|
|
.OnClicked(this, &STutorialsBrowser::OnBackButtonClicked)
|
|
|
|
|
.IsEnabled(this, &STutorialsBrowser::IsBackButtonEnabled)
|
|
|
|
|
.ButtonStyle(&FEditorStyle::Get().GetWidgetStyle<FButtonStyle>("Tutorials.Browser.BackButton"))
|
|
|
|
|
.ForegroundColor(FSlateColor::UseForeground())
|
|
|
|
|
.Content()
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SImage)
|
|
|
|
|
.Image(FEditorStyle::GetBrush("Tutorials.Browser.BackButton.Image"))
|
2014-08-05 09:04:35 -04:00
|
|
|
]
|
|
|
|
|
]
|
2014-10-13 06:46:06 -04:00
|
|
|
+SHorizontalBox::Slot()
|
|
|
|
|
.FillWidth(1.0f)
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
.Padding(2.0f, 0.0f, 0.0f, 0.0f)
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SNew(SVerticalBox)
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.AutoHeight()
|
|
|
|
|
.Padding(0.0f, 1.0f)
|
2014-08-05 09:04:35 -04:00
|
|
|
[
|
2014-10-13 06:46:06 -04:00
|
|
|
SAssignNew(BreadcrumbTrail, SBreadcrumbTrail<TSharedPtr<ITutorialListEntry>>)
|
|
|
|
|
.ButtonContentPadding(FMargin(1.0f, 1.0f))
|
|
|
|
|
.DelimiterImage(FEditorStyle::GetBrush("Tutorials.Browser.Breadcrumb"))
|
|
|
|
|
.TextStyle(FEditorStyle::Get(), "Tutorials.Browser.PathText")
|
|
|
|
|
.ShowLeadingDelimiter( true )
|
|
|
|
|
.InvertTextColorOnHover( false )
|
|
|
|
|
.OnCrumbClicked(this, &STutorialsBrowser::OnBreadcrumbClicked)
|
|
|
|
|
]
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.AutoHeight()
|
|
|
|
|
.Padding(0.0f, 1.0f)
|
|
|
|
|
[
|
|
|
|
|
SNew(SSearchBox)
|
|
|
|
|
.OnTextChanged(this, &STutorialsBrowser::OnSearchTextChanged)
|
2014-08-05 09:04:35 -04:00
|
|
|
]
|
|
|
|
|
]
|
2014-10-13 06:46:06 -04:00
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.FillHeight(1.0f)
|
|
|
|
|
.Padding(0.0f, 3.0f, 0.0f, 0.0f)
|
|
|
|
|
[
|
|
|
|
|
SNew(SVerticalBox)
|
|
|
|
|
+SVerticalBox::Slot()
|
|
|
|
|
.FillHeight(1.0f)
|
|
|
|
|
[
|
2015-06-01 11:46:50 -04:00
|
|
|
SAssignNew(TutorialList, SListView<TSharedPtr<ITutorialListEntry>>)
|
|
|
|
|
.ItemHeight(128.0f)
|
|
|
|
|
.ListItemsSource(&FilteredEntries)
|
|
|
|
|
.OnGenerateRow(this, &STutorialsBrowser::OnGenerateTutorialRow)
|
|
|
|
|
.SelectionMode(ESelectionMode::None)
|
2014-08-05 09:04:35 -04:00
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
ReloadTutorials();
|
2014-09-29 05:28:46 -04:00
|
|
|
|
|
|
|
|
RebuildCrumbs();
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
|
Copying //UE4/Dev-Core to //UE4/Dev-Main (Source: //UE4/Dev-Core @ 3049602)
==========================
MAJOR FEATURES + CHANGES
==========================
Change 2946506 on 2016/04/18 by Steven.Hutton
Update to Crash Reporter buggs table to add new search fields and inclusion of packages needed for e-mail reports.
Change 3017807 on 2016/06/17 by Chris.Wood
Improved Crash Report Process folder delete code as it could sometimes fail.
[UE-30349] - Crash Report Process is leaving crashes in the landing zone that build up and block the queue
Also added logging to Slack when stop request received instead of just when stop is complete.
Change 3019367 on 2016/06/20 by Chris.Wood
Improve Crash Report Process logging to track bad reads from S3.
Also, better logging when CleanReport fails to delete folders.
Change 3019376 on 2016/06/20 by Steve.Robb
Clarification of assert message and comments which talk about 'null' TFunctions.
Tidy-up of dead code.
Change 3019409 on 2016/06/20 by Steve.Robb
New Find and FindByPredicate algorithms for finding stuff in arbitrary containers.
Change 3022658 on 2016/06/22 by Chris.Wood
Discarding duplicated crash reports earlier in read from Data Router process to avoid clashes in the landing zone (CRP v1.1.11)
[UE-30349] - Crash Report Process is leaving crashes in the landing zone that build up and block the queue
Also improved logging to Slack with better layout, fixed event ordering and counting duplicates.
Change 3022840 on 2016/06/22 by Steve.Robb
Skipped UHT attributes removed.
Change 3022907 on 2016/06/22 by Robert.Manuszewski
Fixing crash when adding a new C++ class to project
#jira UE-32333
Change 3023169 on 2016/06/22 by Steve.Robb
Checks for UTHINGs in skipped preprocessor blocks.
Fixes for skipped UTHINGs and some other parsing accidents.
#jira UE-31627
Change 3023239 on 2016/06/22 by Steve.Robb
Fix for JSON date parsing reported here: https://udn.unrealengine.com/questions/299342/fdatetime-json-serialization-bug.html
Change 3026812 on 2016/06/24 by Mieszko.Zielinski
Marked FEnvQueryInstance::AddItemData UEnvQueryItemType_Point specialization as AIMODULE_API #UE4
Change 3028235 on 2016/06/27 by Robert.Manuszewski
PR #2535: BUGFIX: FPS pop-up updates when loading new stat file (Contributed by projectgheist)
Change 3028282 on 2016/06/27 by Steve.Robb
Fix for missing UFUNCTION check in skipped preprocessor blocks.
#jira UE-31627
Change 3028284 on 2016/06/27 by Steve.Robb
Debuggability improvements and coding standards changes.
Change 3028343 on 2016/06/27 by Steve.Robb
Fix for UHT error in WEX.
#jira UE-32464
Change 3028393 on 2016/06/27 by Steve.Robb
Fix for hot reload of enums finding the old enum.
Fix to stop SPropertyEditorNumeric caching the enum flags.
#jira UE-31658
Change 3030362 on 2016/06/28 by Robert.Manuszewski
Fixing hang when cooking.
Change 3030462 on 2016/06/28 by Steve.Robb
Assert added to PackageTools::GetFilteredPackageList() to help with catching a bug reported in the wild.
#jira UE-32001
Change 3034341 on 2016/06/30 by Robert.Manuszewski
Modified crash handling code (on Windows) to handle two threads crashing at the same time properly. Previously the second crash would force the process to exit before generating the crash report.
Added 'debug twothreadsgpf' command to test the functionality.
Change 3034342 on 2016/06/30 by John.Mahoney
Fix for crash when loading an empty cached asset registry.
#jira UE-32232
Change 3035599 on 2016/07/01 by Chris.Wood
Added support for CrashType string to Crash Report Process. CRP v1.1.12
[UE-30592] - Crash Reporter should determine crash type on client and pass string to server
Also fixes problem with reports falling back on the legacy WER metadata when a crash context exists. They now only read the error message from metadata if available and keep crash context data when possible.
Added in missing crash context parameters that have been added to clients but not known by the server.
Change 3035787 on 2016/07/01 by John.Mahoney
Fix for crash when DuplicateRedirects does not contain the DependentObject when saving dependencies. It will still fall through to the assertion below, but it will now fail with a useful error message instead of a generic 'Pair != nullptr' from Map.h.
#jira UE-30189
Change 3036933 on 2016/07/04 by Steve.Robb
Proper forwarding constructor for FAsyncTask.
Change 3036938 on 2016/07/04 by Steve.Robb
Fix for CDO hot reload corrupting memory when replacing references inside structs.
#jira UE-29335
Change 3036960 on 2016/07/04 by Steve.Robb
Fix for FAnsiAllocator::ResizeAllocation when resizing to zero.
Change 3037423 on 2016/07/05 by Steve.Robb
FModuleManager::UnloadOrAbandonModuleWithCallback split into two instead of switching behavior with a bool.
Change 3037464 on 2016/07/05 by Steve.Robb
HotReload.cpp cleanup:
Deep nesting flattened.
Linear array searches replaced with maps.
FHotReloadModule::GetGameModules made into a non-member function and split into two.
Comment and coding standard fixes.
Change 3037741 on 2016/07/05 by John.Mahoney
Fix for COTF not checking the correct timestamps on startup.
#jira UE-31023
Change 3037846 on 2016/07/05 by Steve.Robb
Fix for compile button disappearing on a bad compile.
#jira UE-31575
Change 3037994 on 2016/07/05 by Steve.Robb
Static analysis fixes:
warning C6308: 'realloc' might return null pointer: assigning null pointer to 'Data', which is passed as an argument to 'realloc', will cause the original memory block to be leaked.
Change 3039186 on 2016/07/06 by Robert.Manuszewski
Enabling crash callstack logging by default.
Change 3039220 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C28159: Consider using 'InitiateSystemShutdownEx' instead of 'ExitWindowsEx'. Reason: Legacy API. Rearchitect to avoid Reboot
warning C6001: Using uninitialized memory 'UserNameLength'
warning C6001: Using uninitialized memory 'DomainNameLength'
Change 3039230 on 2016/07/06 by Steve.Robb
Fix for VC internal compiler errors.
Change 3039237 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6385: Reading invalid data from 'Path': the readable size is '400' bytes, but 'PathCurrentDepth' bytes may be read.
Change 3039287 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6509: Invalid annotation: 'return' cannot be referenced in some contexts
warning C6101: Returning uninitialized memory '*lpdwExitCode'. A successful path through the function does not set the named _Out_ parameter.
warning C6387: '_Param_(1)' could be '0': this does not adhere to the specification for the function 'IMoniker::BindToStorage'.
warning C6387: '_Param_(1)' could be '0': this does not adhere to the specification for the function 'IMoniker::BindToObject'.
warning C6031: Return value ignored: 'CoCreateInstance'.
Change 3039359 on 2016/07/06 by Graeme.Thornton
Compile error fix for FAsyncTask, courtesy of SteveR
Change 3039534 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6319: Use of the comma-operator in a tested expression causes the left argument to be ignored when it has no side-effects.
Change 3039545 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6297: Arithmetic overflow: 32-bit value is shifted, then cast to 64-bit value. Results might not be an expected value.
Change 3039578 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6263: Using _alloca in a loop: this can quickly overflow stack.
Change 3039623 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'X'
warning C6308:'realloc' might return null pointer: assigning null pointer to 'X', which is passed as an argument to 'realloc', will cause the original memory block to be leaked.
warning C6385: Reading invalid data from 'X': the readable size is 'Y' bytes, but 'Z' bytes may be read.
warning C6386: Buffer overrun while writing to 'X': the writable size is 'Y' bytes, but 'Z' bytes might be written.
warning C28182: Dereferencing NULL pointer. 'X' contains the same NULL value as 'Y' did.
Change 3039630 on 2016/07/06 by John.Mahoney
Fix for crash when spawning an actor using a template object that has instance components. UActorComponent::PostInitProperties was adding itself to the owner's InstanceComponents array, resulting in a realloc of that array and invalidating the reference that the owner's ObjectInitializer was trying to replace while instantiating that property. The new instance component will be added to the array as part of the owner's initialization anyway, so it is not necessary to do it here.
#jira UE-29123
Change 3039664 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6386: Buffer overrun while writing to 'NewKeys': the writable size is 'NewIndexSize*4' bytes, but '8' bytes might be written.
warning C6386: Buffer overrun while writing to 'NewHeapIndexes': the writable size is 'NewIndexSize*4' bytes, but '8' bytes might be written.
Change 3039673 on 2016/07/06 by Steve.Robb
Static analysis fix: warning C6011: Dereferencing NULL pointer 'v'.
Change 3039690 on 2016/07/06 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'X'.
warning C6246: Local declaration of 'X' hides declaration of the same name in outer scope.
warning C6262: Function uses '121180' bytes of stack: exceeds /analyze:stacksize '81940'. Consider moving some data to heap.
warning C6263: Using _alloca in a loop: this can quickly overflow stack.
Change 3040868 on 2016/07/07 by Graeme.Thornton
Config based class stripping for server builds
Change 3040872 on 2016/07/07 by Graeme.Thornton
Remove "return false" NeedsLoadForServer functions from engine code
Change 3040997 on 2016/07/07 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'Landscape'.
warning C6011: Dereferencing NULL pointer 'rhs.Allocation.LayerInfo'.
warning C6011: Dereferencing NULL pointer 'lhs.Allocation.LayerInfo'.
Change 3041004 on 2016/07/07 by Steve.Robb
Static analysis fix: warning C6336: Arithmetic operator has precedence over question operator, use parentheses to clarify intent.
Change 3041014 on 2016/07/07 by Steve.Robb
Static analysis fix: warning C6287: Redundant code: the left and right sub-expressions are identical.
Change 3041111 on 2016/07/07 by Steve.Robb
Removal of an obsolete error message about INI file case sensitivity.
Change 3041150 on 2016/07/07 by Steve.Robb
Static analysis fix: warning C6289: Incorrect operator: mutual exclusion over || is always a non-zero constant. Did you intend to use && instead?
Change 3041274 on 2016/07/07 by Steve.Robb
Static analysis fixes: warning C6001: Using uninitialized memory 'X'.
Change 3041294 on 2016/07/07 by Chris.Wood
Fixed protocol buffer and decompression errors in Crash Report Process (v.1.1.14)
[UE-32151] - High number of crashes read from S3 by Crash Report Process are failing to unpack
Size of buffer received from S3 is incorrect for some records. Fixed read problems by using size header value instead of stream length.
Increased buffer size for decompression as this was sometimes too small.
Modified S3 reading code to look for multiple records in each downloaded file.
Change 3041472 on 2016/07/07 by Steve.Robb
Static analysis fixes:
warning C6294: Ill-defined for-loop: initial condition does not satisfy test. Loop body not executed.
warning C6201: Index '1' is out of valid index range '0' to '0' for possibly stack allocated buffer 'NewHistory.Nodes'.
Change 3043074 on 2016/07/08 by John.Mahoney
Fix for COTF incorrectly reconstructing the original asset path based on the sandbox path when the game name differs from the game folder name.
Fix for COTF GetFiles not handling absolute GameDir paths properly.
#jira UE-31023
Change 3044461 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6386: Buffer overrun while writing to 'Attributes': the writable size is '16384' bytes, but '-8' bytes might be written.
Change 3044470 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6011: Dereferencing NULL pointer 'Node.Sequence'.
Change 3044476 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6011: Dereferencing NULL pointer 'Property'.
Change 3044551 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C28182: Dereferencing NULL pointer. 'Node' contains the same NULL value as 'KeyAreaNode' did.
Change 3044664 on 2016/07/11 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'ToLandscape->SplineComponent'.
warning C28182: Dereferencing NULL pointer. 'SplinesComponent' contains the same NULL value as 'Landscape->SplineComponent' did.
warning C6011: Dereferencing NULL pointer 'Landscape->SplineComponent'.
warning C6385: Reading invalid data from 'out': the readable size is 'sizeof(kiss_fft_cpx)*Dims[0]*Dims[1]' bytes, but '16' bytes may be read.
Change 3044716 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C6385: Reading invalid data from 'this->ScreenSize': the readable size is '32' bytes, but '-4' bytes may be read.
Change 3044717 on 2016/07/11 by Steve.Robb
Static analysis fix: warning C28182: Dereferencing NULL pointer. 'Window' contains the same NULL value as 'ElementType * Window=AllWindows.FindByPredicate((*FStaticMeshEditorTest::RunTest::<lambda_46fd0093f3912289e870263afe1fcb2e>(ExpectedTitle)))' did.
This appears to be a false positive.
Change 3044787 on 2016/07/11 by Steve.Robb
Static analysis fixes:
warning C6011: Dereferencing NULL pointer 'FbxObject'.
warning C28182: Dereferencing NULL pointer. 'Node' contains the same NULL value as 'RigidMeshNode' did.
warning C28182: Dereferencing NULL pointer. 'Node' contains the same NULL value as 'Result' did.
Change 3045933 on 2016/07/12 by Steve.Robb
Overloading support for TSharedPtr, TSharedRef and TWeakPtr.
Change 3045960 on 2016/07/12 by Robert.Manuszewski
Fixing a crash in Portal (and any other program that uses UObjects and GCs, with the exception of UHT) caused by classes not having their token stream assembled.
Change 3045963 on 2016/07/12 by Steve.Robb
PLATFORM_COMPILER_HAS_EXPLICIT_OPERATORS, FORCEINLINE_EXPLICIT_OPERATOR_BOOL and SAFE_BOOL_OPERATORS macros removed.
THasOperatorEquals and THasOperatorNotEquals traits moved to their own header.
Change 3045967 on 2016/07/12 by Steve.Robb
Initializer list support for TArray and TSet.
Change 3045968 on 2016/07/12 by Robert.Manuszewski
Fixing an ensure after typing 'stat dumphitches' in console.
Change 3045992 on 2016/07/12 by Robert.Manuszewski
Making sure CoreUObject headers are included for programs that don't include the engine (fixing MinidumpDiagnostics CIS failure)
Change 3047870 on 2016/07/13 by Steven.Hutton
Updated CRW to entity framework with repository models. #rb none
Change 3047871 on 2016/07/13 by Steven.Hutton
Add repository models #rb none
Change 3049468 on 2016/07/14 by Steven.Hutton
Fix broken project files. #rb none
#lockdown Nick.Penwarden
[CL 3050320 by Robert Manuszewski in Main branch]
2016-07-14 14:54:00 -04:00
|
|
|
inline void FTutorialListEntry_Category::AddTutorial(TSharedPtr<FTutorialListEntry_Tutorial> InTutorial)
|
|
|
|
|
{
|
|
|
|
|
Tutorials.Add(InTutorial);
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-19 17:44:49 -05:00
|
|
|
EActiveTimerReturnType STutorialsBrowser::TriggerReloadTutorials( double InCurrentTime, float InDeltaTime )
|
2014-10-13 06:46:06 -04:00
|
|
|
{
|
---- Merging with SlateDev branch ----
Introduces the concept of "Active Ticking" to allow Slate to go to sleep when there is no need to update the UI.
While asleep, Slate will skip the Tick & Paint pass for that frame entirely.
- There are TWO ways to "wake" Slate and cause a Tick/Paint pass:
1. Provide some sort of input (mouse movement, clicks, and key presses). Slate will always tick when the user is active.
- Therefore, if the logic in a given widget's Tick is only relevant in response to user action, there is no need to register an active tick.
2. Register an Active Tick. Currently this is an all-or-nothing situation, so if a single active tick needs to execute, all of Slate will be ticked.
- The purpose of an Active Tick is to allow a widget to "drive" Slate and guarantee a Tick/Paint pass in the absence of any user action.
- Examples include animation, async operations that update periodically, progress updates, loading bars, etc.
- An empty active tick is registered for viewports when they are real-time, so game project widgets are unaffected by this change and should continue to work as before.
- An Active Tick is registered by creating an FWidgetActiveTickDelegate and passing it to SWidget::RegisterActiveTick()
- There are THREE ways to unregister an active tick:
1. Return EActiveTickReturnType::StopTicking from the active tick function
2. Pass the FActiveTickHandle returned by RegisterActiveTick() to SWidget::UnregisterActiveTick()
3. Destroy the widget responsible for the active tick
- Sleeping is currently disabled, can be enabled with Slate.AllowSlateToSleep cvar
- There is currently a little buffer time during which Slate continues to tick following any input. Long-term, this is planned to be removed.
- The duration of the buffer can be adjusted using Slate.SleepBufferPostInput cvar (defaults to 1.0f)
- The FCurveSequence API has been updated to work with the active tick system
- Playing a curve sequence now requires that you pass the widget being animated by the sequence
- The active tick will automatically be registered on behalf of the widget and unregister when the sequence is complete
- GetLerpLooping() has been removed. Instead, pass true as the second param to Play() to indicate that the animation will loop. This causes the active tick to be registered indefinitely until paused or jumped to the start/end.
[CL 2391669 by Dan Hertzka in Main branch]
2014-12-17 16:07:57 -05:00
|
|
|
if (bNeedsRefresh)
|
2014-10-13 06:46:06 -04:00
|
|
|
{
|
|
|
|
|
bNeedsRefresh = false;
|
---- Merging with SlateDev branch ----
Introduces the concept of "Active Ticking" to allow Slate to go to sleep when there is no need to update the UI.
While asleep, Slate will skip the Tick & Paint pass for that frame entirely.
- There are TWO ways to "wake" Slate and cause a Tick/Paint pass:
1. Provide some sort of input (mouse movement, clicks, and key presses). Slate will always tick when the user is active.
- Therefore, if the logic in a given widget's Tick is only relevant in response to user action, there is no need to register an active tick.
2. Register an Active Tick. Currently this is an all-or-nothing situation, so if a single active tick needs to execute, all of Slate will be ticked.
- The purpose of an Active Tick is to allow a widget to "drive" Slate and guarantee a Tick/Paint pass in the absence of any user action.
- Examples include animation, async operations that update periodically, progress updates, loading bars, etc.
- An empty active tick is registered for viewports when they are real-time, so game project widgets are unaffected by this change and should continue to work as before.
- An Active Tick is registered by creating an FWidgetActiveTickDelegate and passing it to SWidget::RegisterActiveTick()
- There are THREE ways to unregister an active tick:
1. Return EActiveTickReturnType::StopTicking from the active tick function
2. Pass the FActiveTickHandle returned by RegisterActiveTick() to SWidget::UnregisterActiveTick()
3. Destroy the widget responsible for the active tick
- Sleeping is currently disabled, can be enabled with Slate.AllowSlateToSleep cvar
- There is currently a little buffer time during which Slate continues to tick following any input. Long-term, this is planned to be removed.
- The duration of the buffer can be adjusted using Slate.SleepBufferPostInput cvar (defaults to 1.0f)
- The FCurveSequence API has been updated to work with the active tick system
- Playing a curve sequence now requires that you pass the widget being animated by the sequence
- The active tick will automatically be registered on behalf of the widget and unregister when the sequence is complete
- GetLerpLooping() has been removed. Instead, pass true as the second param to Play() to indicate that the animation will loop. This causes the active tick to be registered indefinitely until paused or jumped to the start/end.
[CL 2391669 by Dan Hertzka in Main branch]
2014-12-17 16:07:57 -05:00
|
|
|
ReloadTutorials();
|
2014-10-13 06:46:06 -04:00
|
|
|
}
|
---- Merging with SlateDev branch ----
Introduces the concept of "Active Ticking" to allow Slate to go to sleep when there is no need to update the UI.
While asleep, Slate will skip the Tick & Paint pass for that frame entirely.
- There are TWO ways to "wake" Slate and cause a Tick/Paint pass:
1. Provide some sort of input (mouse movement, clicks, and key presses). Slate will always tick when the user is active.
- Therefore, if the logic in a given widget's Tick is only relevant in response to user action, there is no need to register an active tick.
2. Register an Active Tick. Currently this is an all-or-nothing situation, so if a single active tick needs to execute, all of Slate will be ticked.
- The purpose of an Active Tick is to allow a widget to "drive" Slate and guarantee a Tick/Paint pass in the absence of any user action.
- Examples include animation, async operations that update periodically, progress updates, loading bars, etc.
- An empty active tick is registered for viewports when they are real-time, so game project widgets are unaffected by this change and should continue to work as before.
- An Active Tick is registered by creating an FWidgetActiveTickDelegate and passing it to SWidget::RegisterActiveTick()
- There are THREE ways to unregister an active tick:
1. Return EActiveTickReturnType::StopTicking from the active tick function
2. Pass the FActiveTickHandle returned by RegisterActiveTick() to SWidget::UnregisterActiveTick()
3. Destroy the widget responsible for the active tick
- Sleeping is currently disabled, can be enabled with Slate.AllowSlateToSleep cvar
- There is currently a little buffer time during which Slate continues to tick following any input. Long-term, this is planned to be removed.
- The duration of the buffer can be adjusted using Slate.SleepBufferPostInput cvar (defaults to 1.0f)
- The FCurveSequence API has been updated to work with the active tick system
- Playing a curve sequence now requires that you pass the widget being animated by the sequence
- The active tick will automatically be registered on behalf of the widget and unregister when the sequence is complete
- GetLerpLooping() has been removed. Instead, pass true as the second param to Play() to indicate that the animation will loop. This causes the active tick to be registered indefinitely until paused or jumped to the start/end.
[CL 2391669 by Dan Hertzka in Main branch]
2014-12-17 16:07:57 -05:00
|
|
|
|
2014-12-19 17:44:49 -05:00
|
|
|
return EActiveTimerReturnType::Continue;
|
2014-10-13 06:46:06 -04:00
|
|
|
}
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
void STutorialsBrowser::SetFilter(const FString& InFilter)
|
|
|
|
|
{
|
|
|
|
|
CategoryFilter = InFilter;
|
|
|
|
|
ReloadTutorials();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSharedRef<ITableRow> STutorialsBrowser::OnGenerateTutorialRow(TSharedPtr<ITutorialListEntry> InItem, const TSharedRef<STableViewBase>& OwnerTable) const
|
|
|
|
|
{
|
|
|
|
|
return InItem->OnGenerateTutorialRow(OwnerTable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> STutorialsBrowser::RebuildCategories()
|
|
|
|
|
{
|
|
|
|
|
TArray<TSharedPtr<FTutorialListEntry_Category>> Categories;
|
|
|
|
|
|
|
|
|
|
// add root category
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> RootCategory = MakeShareable(new FTutorialListEntry_Category(FOnCategorySelected::CreateSP(this, &STutorialsBrowser::OnCategorySelected)));
|
|
|
|
|
Categories.Add(RootCategory);
|
|
|
|
|
|
|
|
|
|
// rebuild categories
|
|
|
|
|
for(const auto& TutorialCategory : GetDefault<UTutorialSettings>()->Categories)
|
|
|
|
|
{
|
|
|
|
|
Categories.Add(MakeShareable(new FTutorialListEntry_Category(TutorialCategory, FOnCategorySelected::CreateSP(this, &STutorialsBrowser::OnCategorySelected), TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateSP(this, &STutorialsBrowser::GetSearchText)))));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(const auto& TutorialCategory : GetDefault<UEditorTutorialSettings>()->Categories)
|
|
|
|
|
{
|
|
|
|
|
Categories.Add(MakeShareable(new FTutorialListEntry_Category(TutorialCategory, FOnCategorySelected::CreateSP(this, &STutorialsBrowser::OnCategorySelected), TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateSP(this, &STutorialsBrowser::GetSearchText)))));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(auto& Category : Categories)
|
|
|
|
|
{
|
|
|
|
|
// Figure out which base category this category belongs in
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> ParentCategory = RootCategory;
|
|
|
|
|
const FString& CategoryPath = Category->Category.Identifier;
|
|
|
|
|
|
|
|
|
|
// We're expecting the category string to be in the "A.B.C" format. We'll split up the string here and form
|
|
|
|
|
// a proper hierarchy in the UI
|
|
|
|
|
TArray< FString > SplitCategories;
|
2015-03-02 15:51:37 -05:00
|
|
|
CategoryPath.ParseIntoArray( SplitCategories, TEXT( "." ), true /* bCullEmpty */ );
|
2014-08-05 09:04:35 -04:00
|
|
|
|
|
|
|
|
FString CurrentCategoryPath;
|
|
|
|
|
|
|
|
|
|
// Make sure all of the categories exist
|
|
|
|
|
for(const auto& SplitCategory : SplitCategories)
|
|
|
|
|
{
|
|
|
|
|
// Locate this category at the level we're at in the hierarchy
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> FoundCategory = NULL;
|
|
|
|
|
TArray< TSharedPtr<ITutorialListEntry> >& TestCategoryList = ParentCategory.IsValid() ? ParentCategory->SubCategories : RootCategory->SubCategories;
|
|
|
|
|
for(auto& TestCategory : TestCategoryList)
|
|
|
|
|
{
|
|
|
|
|
if( StaticCastSharedPtr<FTutorialListEntry_Category>(TestCategory)->CategoryName == SplitCategory )
|
|
|
|
|
{
|
|
|
|
|
// Found it!
|
|
|
|
|
FoundCategory = StaticCastSharedPtr<FTutorialListEntry_Category>(TestCategory);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!CurrentCategoryPath.IsEmpty())
|
|
|
|
|
{
|
|
|
|
|
CurrentCategoryPath += TEXT(".");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CurrentCategoryPath += SplitCategory;
|
|
|
|
|
|
|
|
|
|
if( !FoundCategory.IsValid() )
|
|
|
|
|
{
|
|
|
|
|
// OK, this is a new category name for us, so add it now!
|
|
|
|
|
if(CategoryPath == CurrentCategoryPath)
|
|
|
|
|
{
|
|
|
|
|
FoundCategory = Category;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FTutorialCategory InterveningCategory;
|
|
|
|
|
InterveningCategory.Identifier = CurrentCategoryPath;
|
|
|
|
|
FoundCategory = MakeShareable(new FTutorialListEntry_Category(InterveningCategory, FOnCategorySelected::CreateSP(this, &STutorialsBrowser::OnCategorySelected), TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateSP(this, &STutorialsBrowser::GetSearchText))));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FoundCategory->ParentCategory = ParentCategory;
|
|
|
|
|
TestCategoryList.Add( FoundCategory );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Descend the hierarchy for the next category
|
|
|
|
|
ParentCategory = FoundCategory;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return RootCategory;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::RebuildTutorials(TSharedPtr<FTutorialListEntry_Category> InRootCategory)
|
|
|
|
|
{
|
|
|
|
|
TArray<TSharedPtr<FTutorialListEntry_Tutorial>> Tutorials;
|
|
|
|
|
|
2015-01-24 15:00:16 -05:00
|
|
|
//Ensure that tutorials are loaded into the asset registry before making a list of them.
|
2014-08-20 10:27:41 -04:00
|
|
|
FAssetRegistryModule& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
|
2014-08-05 09:04:35 -04:00
|
|
|
|
2015-01-24 15:00:16 -05:00
|
|
|
// rebuild tutorials
|
2014-08-20 10:27:41 -04:00
|
|
|
FARFilter Filter;
|
|
|
|
|
Filter.ClassNames.Add(UBlueprint::StaticClass()->GetFName());
|
|
|
|
|
Filter.bRecursiveClasses = true;
|
2015-07-07 09:52:55 -04:00
|
|
|
Filter.TagsAndValues.Add(TEXT("NativeParentClass"), FString::Printf(TEXT("%s'%s'"), *UClass::StaticClass()->GetName(), *UEditorTutorial::StaticClass()->GetPathName()));
|
2014-08-20 10:27:41 -04:00
|
|
|
Filter.TagsAndValues.Add(TEXT("ParentClass"), FString::Printf(TEXT("%s'%s'"), *UClass::StaticClass()->GetName(), *UEditorTutorial::StaticClass()->GetPathName()));
|
|
|
|
|
|
|
|
|
|
TArray<FAssetData> AssetData;
|
|
|
|
|
AssetRegistry.Get().GetAssets(Filter, AssetData);
|
|
|
|
|
|
|
|
|
|
for (const auto& TutorialAsset : AssetData)
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
2014-08-20 10:27:41 -04:00
|
|
|
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *TutorialAsset.ObjectPath.ToString());
|
2014-09-22 09:42:03 -04:00
|
|
|
if (Blueprint && Blueprint->GeneratedClass && Blueprint->BlueprintType == BPTYPE_Normal)
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
2014-09-22 09:42:03 -04:00
|
|
|
UEditorTutorial* Tutorial = Blueprint->GeneratedClass->GetDefaultObject<UEditorTutorial>();
|
|
|
|
|
if(!Tutorial->bHideInBrowser)
|
|
|
|
|
{
|
|
|
|
|
Tutorials.Add(MakeShareable(new FTutorialListEntry_Tutorial(Tutorial, FOnTutorialSelected::CreateSP(this, &STutorialsBrowser::OnTutorialSelected), TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateSP(this, &STutorialsBrowser::GetSearchText)))));
|
|
|
|
|
}
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// add tutorials to categories
|
|
|
|
|
for(const auto& Tutorial : Tutorials)
|
|
|
|
|
{
|
|
|
|
|
// Figure out which base category this tutorial belongs in
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> CategoryForTutorial = InRootCategory;
|
|
|
|
|
const FString& CategoryPath = Tutorial->Tutorial->Category;
|
|
|
|
|
|
|
|
|
|
// We're expecting the category string to be in the "A.B.C" format. We'll split up the string here and form
|
|
|
|
|
// a proper hierarchy in the UI
|
|
|
|
|
TArray< FString > SplitCategories;
|
2015-03-02 15:51:37 -05:00
|
|
|
CategoryPath.ParseIntoArray( SplitCategories, TEXT( "." ), true /* bCullEmpty */ );
|
2014-08-05 09:04:35 -04:00
|
|
|
|
|
|
|
|
FString CurrentCategoryPath;
|
|
|
|
|
|
|
|
|
|
// Make sure all of the categories exist
|
|
|
|
|
for(const auto& SplitCategory : SplitCategories)
|
|
|
|
|
{
|
|
|
|
|
// Locate this category at the level we're at in the hierarchy
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> FoundCategory = NULL;
|
|
|
|
|
TArray< TSharedPtr<ITutorialListEntry> >& TestCategoryList = CategoryForTutorial.IsValid() ? CategoryForTutorial->SubCategories : InRootCategory->SubCategories;
|
|
|
|
|
for(auto& TestCategory : TestCategoryList)
|
|
|
|
|
{
|
|
|
|
|
if( StaticCastSharedPtr<FTutorialListEntry_Category>(TestCategory)->CategoryName == SplitCategory )
|
|
|
|
|
{
|
|
|
|
|
// Found it!
|
|
|
|
|
FoundCategory = StaticCastSharedPtr<FTutorialListEntry_Category>(TestCategory);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!CurrentCategoryPath.IsEmpty())
|
|
|
|
|
{
|
|
|
|
|
CurrentCategoryPath += TEXT(".");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CurrentCategoryPath += SplitCategory;
|
|
|
|
|
|
|
|
|
|
if( !FoundCategory.IsValid() )
|
|
|
|
|
{
|
|
|
|
|
// OK, this is a new category name for us, so add it now!
|
|
|
|
|
FTutorialCategory InterveningCategory;
|
|
|
|
|
InterveningCategory.Identifier = CurrentCategoryPath;
|
|
|
|
|
|
|
|
|
|
FoundCategory = MakeShareable(new FTutorialListEntry_Category(InterveningCategory, FOnCategorySelected::CreateSP(this, &STutorialsBrowser::OnCategorySelected), TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateSP(this, &STutorialsBrowser::GetSearchText))));
|
|
|
|
|
FoundCategory->ParentCategory = CategoryForTutorial;
|
|
|
|
|
TestCategoryList.Add( FoundCategory );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Descend the hierarchy for the next category
|
|
|
|
|
CategoryForTutorial = FoundCategory;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Tutorial->ParentCategory = CategoryForTutorial;
|
|
|
|
|
CategoryForTutorial->AddTutorial( Tutorial );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::ReloadTutorials()
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> RootCategory = RebuildCategories();
|
|
|
|
|
RebuildTutorials(RootCategory);
|
|
|
|
|
RootEntry = RootCategory;
|
|
|
|
|
|
|
|
|
|
// now filter & arrange available tutorials
|
|
|
|
|
FilterTutorials();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FReply STutorialsBrowser::OnCloseButtonClicked()
|
|
|
|
|
{
|
|
|
|
|
OnClosed.ExecuteIfBound();
|
|
|
|
|
return FReply::Handled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FReply STutorialsBrowser::OnBackButtonClicked()
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> CurrentCategory = FindCategory_Recursive(RootEntry);
|
|
|
|
|
if(CurrentCategory.IsValid() && CurrentCategory->ParentCategory.IsValid())
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> PinnedParentCategory = StaticCastSharedPtr<FTutorialListEntry_Category>(CurrentCategory->ParentCategory.Pin());
|
|
|
|
|
if(PinnedParentCategory.IsValid())
|
|
|
|
|
{
|
|
|
|
|
NavigationFilter = PinnedParentCategory->Category.Identifier;
|
|
|
|
|
FilterTutorials();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-29 05:28:46 -04:00
|
|
|
RebuildCrumbs();
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
return FReply::Handled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool STutorialsBrowser::IsBackButtonEnabled() const
|
|
|
|
|
{
|
|
|
|
|
if(CurrentCategoryPtr.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return CurrentCategoryPtr.Pin()->ParentCategory.IsValid();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::OnTutorialSelected(UEditorTutorial* InTutorial, bool bRestart)
|
|
|
|
|
{
|
2015-01-28 10:52:33 -05:00
|
|
|
if (InTutorial != nullptr)
|
2014-09-18 08:10:29 -04:00
|
|
|
{
|
2015-01-28 10:52:33 -05:00
|
|
|
if (FEngineAnalytics::IsAvailable())
|
|
|
|
|
{
|
|
|
|
|
TArray<FAnalyticsEventAttribute> EventAttributes;
|
|
|
|
|
EventAttributes.Add(FAnalyticsEventAttribute(TEXT("Restarted"), bRestart));
|
|
|
|
|
EventAttributes.Add(FAnalyticsEventAttribute(TEXT("TutorialAsset"), FIntroTutorials::AnalyticsEventNameFromTutorial(InTutorial)));
|
2014-09-18 08:10:29 -04:00
|
|
|
|
2015-01-28 10:52:33 -05:00
|
|
|
FEngineAnalytics::GetProvider().RecordEvent(TEXT("Rocket.Tutorials.LaunchedFromBrowser"), EventAttributes);
|
|
|
|
|
}
|
|
|
|
|
//Close the tutorial browser so it doesn't get in the way of the actual tutorial.
|
|
|
|
|
if (OnLaunchTutorial.IsBound())
|
|
|
|
|
{
|
|
|
|
|
FIntroTutorials& IntroTutorials = FModuleManager::GetModuleChecked<FIntroTutorials>(TEXT("IntroTutorials"));
|
|
|
|
|
IntroTutorials.DismissTutorialBrowser();
|
|
|
|
|
}
|
2014-09-18 08:10:29 -04:00
|
|
|
}
|
2015-04-02 16:56:18 -04:00
|
|
|
OnLaunchTutorial.ExecuteIfBound(InTutorial, bRestart ? IIntroTutorials::ETutorialStartType::TST_RESTART : IIntroTutorials::ETutorialStartType::TST_CONTINUE, ParentWindow, FSimpleDelegate(), FSimpleDelegate());
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::OnCategorySelected(const FString& InCategory)
|
|
|
|
|
{
|
|
|
|
|
NavigationFilter = InCategory;
|
|
|
|
|
FilterTutorials();
|
2014-09-29 05:28:46 -04:00
|
|
|
|
|
|
|
|
RebuildCrumbs();
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::FilterTutorials()
|
|
|
|
|
{
|
|
|
|
|
FilteredEntries.Empty();
|
|
|
|
|
|
2014-09-29 06:54:17 -04:00
|
|
|
if(SearchFilter.IsEmpty())
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
2014-09-29 06:54:17 -04:00
|
|
|
TSharedPtr<FTutorialListEntry_Category> CurrentCategory = FindCategory_Recursive(RootEntry);
|
2014-08-05 09:04:35 -04:00
|
|
|
|
2014-09-29 06:54:17 -04:00
|
|
|
if(CurrentCategory.IsValid())
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
2014-09-29 06:54:17 -04:00
|
|
|
for(const auto& SubCategory : CurrentCategory->SubCategories)
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
2014-09-29 06:54:17 -04:00
|
|
|
if(SubCategory->PassesFilter(CategoryFilter, SearchFilter.ToString()))
|
|
|
|
|
{
|
|
|
|
|
FilteredEntries.Add(SubCategory);
|
|
|
|
|
}
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
|
2014-09-29 06:54:17 -04:00
|
|
|
for(const auto& Tutorial : CurrentCategory->Tutorials)
|
|
|
|
|
{
|
|
|
|
|
if(Tutorial->PassesFilter(CategoryFilter, SearchFilter.ToString()))
|
|
|
|
|
{
|
|
|
|
|
FilteredEntries.Add(Tutorial);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CurrentCategoryPtr = CurrentCategory;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
struct Local
|
|
|
|
|
{
|
|
|
|
|
static void AddSubCategory_Recursive(const FString& InCategoryFilter, const FString& InSearchFilter, TSharedPtr<FTutorialListEntry_Category> InCategory, TArray<TSharedPtr<ITutorialListEntry>>& InOutFilteredEntries)
|
|
|
|
|
{
|
|
|
|
|
if(InCategory.IsValid())
|
|
|
|
|
{
|
|
|
|
|
for(const auto& SubCategory : InCategory->SubCategories)
|
|
|
|
|
{
|
|
|
|
|
if(SubCategory->PassesFilter(InCategoryFilter, InSearchFilter))
|
|
|
|
|
{
|
|
|
|
|
InOutFilteredEntries.Add(SubCategory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddSubCategory_Recursive(InCategoryFilter, InSearchFilter, StaticCastSharedPtr<FTutorialListEntry_Category>(SubCategory), InOutFilteredEntries);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(const auto& Tutorial : InCategory->Tutorials)
|
|
|
|
|
{
|
|
|
|
|
if(Tutorial->PassesFilter(InCategoryFilter, InSearchFilter))
|
|
|
|
|
{
|
|
|
|
|
InOutFilteredEntries.Add(Tutorial);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> CurrentCategory = FindCategory_Recursive(RootEntry);
|
|
|
|
|
if(CurrentCategory.IsValid())
|
|
|
|
|
{
|
|
|
|
|
Local::AddSubCategory_Recursive(CategoryFilter, SearchFilter.ToString(), CurrentCategory, FilteredEntries);
|
|
|
|
|
CurrentCategoryPtr = CurrentCategory;
|
|
|
|
|
}
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
|
2014-09-18 16:43:17 -04:00
|
|
|
FilteredEntries.Sort(
|
|
|
|
|
[](TSharedPtr<ITutorialListEntry> EntryA, TSharedPtr<ITutorialListEntry> EntryB)->bool
|
|
|
|
|
{
|
|
|
|
|
if(EntryA.IsValid() && EntryB.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return EntryA->SortAgainst(EntryB.ToSharedRef());
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2014-08-05 09:04:35 -04:00
|
|
|
TutorialList->RequestListRefresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> STutorialsBrowser::FindCategory_Recursive(TSharedPtr<FTutorialListEntry_Category> InCategory) const
|
|
|
|
|
{
|
2014-09-29 05:28:46 -04:00
|
|
|
if(InCategory.IsValid())
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
2014-09-29 05:28:46 -04:00
|
|
|
if(InCategory->Category.Identifier == NavigationFilter)
|
2014-08-05 09:04:35 -04:00
|
|
|
{
|
2014-09-29 05:28:46 -04:00
|
|
|
return InCategory;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(const auto& Category : InCategory->SubCategories)
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> TestCategory = FindCategory_Recursive(StaticCastSharedPtr<FTutorialListEntry_Category>(Category));
|
|
|
|
|
if(TestCategory.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return TestCategory;
|
|
|
|
|
}
|
2014-08-05 09:04:35 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TSharedPtr<FTutorialListEntry_Category>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::OnSearchTextChanged(const FText& InText)
|
|
|
|
|
{
|
|
|
|
|
SearchFilter = InText;
|
|
|
|
|
FilterTutorials();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FText STutorialsBrowser::GetSearchText() const
|
|
|
|
|
{
|
|
|
|
|
return SearchFilter;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-29 05:28:46 -04:00
|
|
|
void STutorialsBrowser::OnBreadcrumbClicked(const TSharedPtr<ITutorialListEntry>& InEntry)
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<ITutorialListEntry> ClickedEntry = InEntry;
|
|
|
|
|
|
|
|
|
|
if(ClickedEntry.IsValid())
|
|
|
|
|
{
|
|
|
|
|
NavigationFilter = StaticCastSharedPtr<FTutorialListEntry_Category>(ClickedEntry)->Category.Identifier;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
NavigationFilter.Empty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RebuildCrumbs();
|
|
|
|
|
|
|
|
|
|
FilterTutorials();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void STutorialsBrowser::RebuildCrumbs()
|
|
|
|
|
{
|
|
|
|
|
BreadcrumbTrail->ClearCrumbs();
|
|
|
|
|
|
|
|
|
|
// rebuild crumbs to this point
|
|
|
|
|
TArray<TSharedPtr<FTutorialListEntry_Category>> Entries;
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> CurrentCategory = FindCategory_Recursive(RootEntry);
|
|
|
|
|
if(CurrentCategory.IsValid())
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> Category = StaticCastSharedPtr<FTutorialListEntry_Category>(CurrentCategory);
|
|
|
|
|
while(Category.IsValid())
|
|
|
|
|
{
|
|
|
|
|
Entries.Add(Category);
|
|
|
|
|
if(Category->ParentCategory.IsValid())
|
|
|
|
|
{
|
|
|
|
|
Category = StaticCastSharedPtr<FTutorialListEntry_Category>(Category->ParentCategory.Pin());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int32 Index = Entries.Num() - 1; Index >= 0; Index--)
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FTutorialListEntry_Category> Entry = Entries[Index];
|
|
|
|
|
if(RootEntry == Entry)
|
|
|
|
|
{
|
|
|
|
|
BreadcrumbTrail->PushCrumb(LOCTEXT("PathRoot", "Tutorials"), TSharedPtr<ITutorialListEntry>());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
BreadcrumbTrail->PushCrumb(Entry->GetTitleText(), Entry);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-13 06:46:06 -04:00
|
|
|
void STutorialsBrowser::HandleAssetAdded(const FAssetData& InAssetData)
|
|
|
|
|
{
|
|
|
|
|
if(InAssetData.AssetClass == UBlueprint::StaticClass()->GetFName())
|
|
|
|
|
{
|
Copying //UE4/Dev-Editor to //UE4/Dev-Main (Source: //UE4/Dev-Editor @ 2973866)
#lockdown Nick.Penwarden
==========================
MAJOR FEATURES + CHANGES
==========================
Change 2937390 on 2016/04/07 by Cody.Albert
#jira UE-29211
Fixed slider to properly bubble unhandled OnKeyDown events
Change 2939672 on 2016/04/11 by Richard.TalbotWatkin
Made a change to how file check out notifications work. Now the dirty package state is processed at the end of every tick, meaning that packages which are dirtied and then cleaned again are not processed. This fixes an issue where a number of child blueprints were flagged as needing checkout when a parent blueprint was compiled. This also allows multiple packages which are dirtied at the same time to be treated as one transaction.
#jira UE-29193 - "Files need check-out" prompt spams Blueprint users
Change 2939686 on 2016/04/11 by Richard.TalbotWatkin
A number of further improvements to mesh vertex color painting:
* Lower LODs are now automatically fixed up for instances which were created in a previous bugged version of the engine.
* Since lower LODs cannot currently have their vertex colors edited, their vertex colors are always derived from LOD0.
* Fixed a bug when building lower LODs so that vertices in neighboring octree nodes are considered when looking for the nearest vertex from LOD0 which corresponds.
* Fixed issue where static meshes with imported LODs would not have the lower LODs' override colors set when "Copy instance vertex colors to source mesh" was used (static meshes with generated LODs were always getting correct override colors).
#jira UE-28563 - Incorrectly displayed LOD VertexColor until paint mode is selected
Change 2939906 on 2016/04/11 by Nick.Darnell
Automation - Adding several enhancements to the automation framework and improving the UI.
* Tests in the UI now have a link to the source and line where they orginate.
* There's now a general purpose latent lambda command you can use to run arbitrary code latently.
* Added Inlined AddCommand for regular and networked commands to the base automation class, to avoid the use of the macro, which prevents breakpoints from working in lambda code.
* Front end now has better column displays offering more room to the test name
* Changed several events to the automation controller to multicast delegates so that many could hook them.
* The UI now refreshes the selection after tests finish so that the output log updates.
Change 2939908 on 2016/04/11 by Nick.Darnell
Automation - The editor import/export tests are now a complex test and actually sperate out all the tests that can be run, some trickiness was required on the filenames so that they didn't expand into more child tests in the UI. (replacing .'s with _'s)
Change 2940028 on 2016/04/11 by Nick.Darnell
Automation - Removing the search box from the toolbar. It's now inlined above the test tree. Tweaking the padding to make it look more other windows and make everything not look so squished. Recursive expansion now works on tests.
Change 2940066 on 2016/04/11 by Nick.Darnell
Automation - Moving the filter group dropdown out of the toolbar and onto the line with the search box above the treeview - additional tweaks to it.
Change 2940092 on 2016/04/11 by Jamie.Dale
PR #2248: Datatable select next row (Contributed by FineRedMist)
Change 2940093 on 2016/04/11 by Jamie.Dale
PR #2248: Datatable select next row (Contributed by FineRedMist)
Change 2940157 on 2016/04/11 by Jamie.Dale
Fixing FTextTest due to some changes made to how currency is formatted
Change 2940694 on 2016/04/12 by Richard.TalbotWatkin
Fixed issue where vertex override colors were not being propagated correctly for generated lower LODs.
#jira UE-29360 - Override Colors not propagated correctly to generated lower LODs
Change 2942379 on 2016/04/13 by Richard.TalbotWatkin
Fixed issue where entering PIE while selecting an actor in Mesh Paint mode could lead to a MeshPaintStaticMeshAdapter holding onto an invalid pointer to an old mesh component, and causing a crash upon leaving the mode. This can happen because, when loading a new streaming level, the proxy actor can be selected when starting PIE, which will subsequently be added to the tool's internal lists. This needs to be added as a GC reference so that it can be NULLed when forcibly destroyed.
#jira UE-29345 - Crash occurs exiting the editor after enabling mesh paint mode and PIEing
Change 2942947 on 2016/04/13 by Richard.TalbotWatkin
Fixed crash when pasting a material function call node from one project to another in which it is not defined.
#jira UE-27087 - Crash when pasting MaterialFunctionCall expressions into the material editor between projects
Change 2943452 on 2016/04/14 by Richard.TalbotWatkin
Updated F4 debug key binding to match what's in ShowFlags.cpp
PR #2197 (contributed by mfortin-bhvr)
Change 2943824 on 2016/04/14 by Alexis.Matte
#jira UE-29090
Make sure we cannot open the color picker when a property is edit const
Change 2943841 on 2016/04/14 by Alexis.Matte
#jira UE-28924
tooltip was add for every hierarchy import option
Change 2943927 on 2016/04/14 by Alexis.Matte
#jira UE-29423
Add Obj support for scene importer
Github PR #2272
Change 2943967 on 2016/04/14 by Richard.TalbotWatkin
Added relevant fields from FBodyInstance to the FoliageType customizations.
#jira UE-20138 - FoliageType has a FBodyInstance but only shows Collision Presets and not other FBodyInstance properties
Change 2948397 on 2016/04/19 by Andrew.Rodham
Moved FSlateIcon definition to SlateCore
It was previously declared as SLATE_API, despite its header residing inside SlateCore. Reviewed by Jamie Dale.
Change 2948805 on 2016/04/19 by Andrew.Rodham
Editor: Deprecated FName UEdGraphNode::GetPaletteIcon(FLinearColor&); in favor of FSlateIcon UEdGraphNode::GetIconAndTint(FLinearColor&); to allow for icons in external style sets to be used.
- Previously, all icons were assumed to reside within FEditorStyle, which is not the case and would create broken icons in the graph editor. All relevant code has been updated to use FSlateIcon structures instead of a simple name.
- This change required a significant overhaul to FClassIconFinder to support FSlateIcons. To keep the API clean, FSlateIconFinder now deals with FSlateIcon class icon finding operations, and FClassIconFinder for the most part just adds actor specific logic.
#jira UE-26502
Change 2950658 on 2016/04/20 by Alexis.Matte
#jira UE-24333
Skinxx workflow, we now output an error if there is mix of material with skinxx and some with no skinxx suffix
Change 2950663 on 2016/04/20 by Alexis.Matte
#jira UE-29582
When exporting to fbx we have to export each material instance as one fbx material
Change 2951240 on 2016/04/21 by Alexis.Matte
#jira UE-28473
Make sure light are render properly after importing a fbx scene
Change 2951421 on 2016/04/21 by Alexis.Matte
#jira UE-29773
fbx skeletalmesh import now support mesh hierarchy
Change 2955873 on 2016/04/26 by Richard.TalbotWatkin
PR #2225: Fix working package directory from the launch profiles (Contributed by projectgheist)
Change 2955965 on 2016/04/26 by Nick.Darnell
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 2956717 on 2016/04/26 by Andrew.Rodham
Editor: World Outliner now correctly calls ProcessEditDelete on editor modes that have asked to process delete operations
#jira UE-26968
Change 2956822 on 2016/04/26 by Andrew.Rodham
Editor: Fixed actors not being removed from the scene outliner when they are added and removed on the same frame
#jira UE-7777
Change 2956931 on 2016/04/26 by Nick.Darnell
New Module - UATHelper - Moving the UAT launching code from the MainFrame module into a reusable module other modules can trigger.
Change 2956932 on 2016/04/26 by Nick.Darnell
Plugins - Now allowing you to package a plugin from the plugin browsing view. Still work in progress.
Change 2957164 on 2016/04/26 by Nick.Darnell
Hot Reload - Fixing hot reload, it no longer creates a temporary copy of the module manager. Making the copy constructor private on the module manager to prevent this in the future.
Change 2957165 on 2016/04/26 by Nick.Darnell
Fixing the Editor Mode plugin sample, it no longer provides a bad starting example for where to create your widgets.
#jira UE-28456
Change 2957510 on 2016/04/27 by Nick.Darnell
PR #2198: Git Plugin implement the Sync operation to update local files using the git pull --rebase command (Contributed by SRombauts)
#jira UE-28763
Change 2957511 on 2016/04/27 by Andrew.Rodham
Editor: Make favorites button on details panel non-focusable
- This was preventing users being able to tab between value fields on the details panel
Change 2957610 on 2016/04/27 by Nick.Darnell
PR #1836: Git plugin: make initial commit when initializing new project (Contributed by SRombauts)
#jira UE-24190
Change 2957667 on 2016/04/27 by Jamie.Dale
Fixed crash that could happen in FTextLayout::GetLineViewIndexForTextLocation if passed a bad location
#jira OR-18634
Change 2958035 on 2016/04/27 by Nick.Darnell
Fixing the DesignerRebuild flag detection so that we can just refresh the slate widget without recreating the preview UObject, which causes the destruction of the details panel, and the slate widget recreation was the only part that was required.
Change 2958272 on 2016/04/27 by Jamie.Dale
Added FAssetData::GetTagValue to handle getting asset tag values in a type-correct way
This allows type-conversion using LexicalConversion, and also has specializations for FString, FText, and FName.
#jira UE-12096
Change 2958348 on 2016/04/27 by Jamie.Dale
PR #2282: Slate font shutdown order fix (Contributed by FineRedMist)
Change 2958352 on 2016/04/27 by Jamie.Dale
Fixed the subtitle manager updating the wrong list of subtitles
#jira UE-29511
Change 2958390 on 2016/04/27 by Jamie.Dale
Removed some old placement-new style array insertions
Change 2959360 on 2016/04/28 by Richard.TalbotWatkin
Fixed potential crash when mesh painting actors whose geometry adapters are no longer registered.
#jira UE-29615 - [CrashReport] UE4Editor_MeshPaint!FEdModeMeshPaint::DoPaint() [meshpaintedmode.cpp:1127]
Change 2959724 on 2016/04/28 by Cody.Albert
Merging hardware survey gating logic from 4.10
#jira UE-28666
Change 2959807 on 2016/04/28 by Cody.Albert
Removed deprecated function call
#jira UE-28666
Change 2959894 on 2016/04/28 by Cody.Albert
Fix for scroll offset being clamped by content size, not scroll max
#jira UE-20676
Change 2960048 on 2016/04/28 by Jamie.Dale
Added FAssetData::GetTagValueRef to go along with FAssetData::GetTagValue
#jira UE-12096
Change 2960782 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2960885 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2961170 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2961171 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2961173 on 2016/04/29 by Jamie.Dale
Removed some inline duplication on the specialized template functions
#jira UE-12096
Change 2963124 on 2016/05/02 by Jamie.Dale
FExternalDragOperation can now contain both text and file data at the same time
This better mirrors what the OS level drag-and-drop operations are capable of, and some applications will actually give you both bits of data at the same time.
#jira UE-26585
Change 2963175 on 2016/05/02 by Jamie.Dale
Updated some font editor tooltips to be more descriptive
#jira UE-17429
Change 2963290 on 2016/05/02 by Jamie.Dale
The Localise UAT command can now be run with a null localisation provider
Change 2963305 on 2016/05/02 by Jamie.Dale
Fixed minor typo
Change 2963402 on 2016/05/02 by Jamie.Dale
Cleaned up all the current localization key conflicts and warnings from gathering Engine code
#jira UE-25833
Change 2963415 on 2016/05/02 by Jamie.Dale
Rephrased a message that could generate a CIS warning
#jira UE-25833
Change 2964184 on 2016/05/03 by Jamie.Dale
Fixed duplicate "Font" entry in asset picker menu
This was caused by PropertyCustomizationHelpers::GetNewAssetFactoriesForClasses using CanCreateNew rather than ShouldShowInNewMenu, as UFont has two factories, but one is supposed to be hidden from the UI.
We also now make sure the factories are sorted by display name before being shown in the UI.
#jira UE-24903
Change 2966108 on 2016/05/04 by Nick.Darnell
Engine - Rearranging the order of ELoadingPhase's enums so that they match the loading order of modules.
Change 2966113 on 2016/05/04 by Nick.Darnell
[Engine Loop Change] UEngine now defines a Start() function, that subclasses can use to start game related things after initialization of the engine. This is done so that after the Init() call on UEngine, we can then perform a module load for the ELoadingPhase::PostEngineInit phase of loading, then inform the UEngine that it's time to start the game. Therefore, UGameEngine now tells the GameInstance to Start during this phase now.
Change 2966121 on 2016/05/04 by Jamie.Dale
Config writing improvements when dealing with property values
This updates FConfigFile::ShouldExportQuotedString to make sure that a property value containing any characters that FParse::LineExtended will consume when parsing back in the config file (such as { and }, or a trailing \) cause the string to be quoted.
This also adds FConfigFile::GenerateExportedPropertyLine to generate the INI key->value lines in a consistent and correctly escaped way, and makes sure that everything that writes out lines to a config file uses it.
FConfigCacheIni::SetString and FConfigCacheIni::SetText have been updated to update the value even if it only differs by case.
UObject::SaveConfig and UObject::LoadConfig have had some code whitespace fix-up (from a bad merge).
Change 2966122 on 2016/05/04 by Jamie.Dale
Added a setting to control dialogue wave audio filenames
Change 2966481 on 2016/05/04 by Jamie.Dale
PR #2336: BUGFIX: Selection of objects in the Content browser from WorldSettings (Contributed by projectgheist)
Change 2966887 on 2016/05/04 by Jamie.Dale
PR #2336: BUGFIX: Selection of objects in the Content browser from WorldSettings (Contributed by projectgheist)
Change 2967488 on 2016/05/05 by Ben.Marsh
Changes to support packaging plugins from the editor.
* UBT now has an option to explicitly disable hot-reloading in any circumstances.
* When running with -module arguments for a monolithic target, UBT will no longer try to relink the executable in source builds (so it's possible to compile plugin libs outside of an installed engine build without having already built UE4Game).
* When packaging, a temporary host project is always generated in the output directory to avoid invalidating intermediates in the source directory.
* An empty Config\FilterPlugin.ini file is written out with instructions on how to list additional files to package if it is not already present.
Change 2967947 on 2016/05/05 by Nick.Darnell
PR #2358: Properly display Mip Level Count and Format for UTexture2DDynamic Textures (Contributed by Allegorithmic)
#jira UE-30371
Change 2968333 on 2016/05/05 by Jamie.Dale
Fixed MultiLine not working with arrays of string or text properties
- The detail customizations for FString and FText properties now read the meta-data off the correct property.
- The UDS editor now lets you set the "MultiLine" meta-data on arrays of FString and FText properties.
- Fixed changing the "MultiLine" flag on a UDS property not rebuilding the default value editor.
- Fixed the default values panel in the UDS editor having a title area.
#jira UE-30392
Change 2968999 on 2016/05/06 by Jamie.Dale
Fixed infinite loop in the editor if a directory that is being watched is deleted
#jira UE-30172
Change 2969105 on 2016/05/06 by Richard.TalbotWatkin
Fixed issue where opening a submenu while the parent menu had a text box focused would lead to a crash. The graph node comment text widget now only dismisses all menus if the text commit info implies that it was committed by some user action.
#jira UE-29086 - Crash When Typing a Node Comment and Hovering Over the Alignment Option
Change 2969440 on 2016/05/06 by Jamie.Dale
Significant performance improvements when pasting a large amount of text
#jira UE-19712
Change 2969619 on 2016/05/06 by Andrew.Rodham
Auto-reimport is now disabled inside an editor running in unattended mode
Change 2969621 on 2016/05/06 by Jamie.Dale
Added the ability to override the subtitle used on a dialogue wave
This is useful for effort sounds, plus some other cases, such as characters speaking in a foreign language not known to the player.
#jira UETOOL-795
Change 2970588 on 2016/05/09 by Chris.Wood
Fix typo in operator expression in UEndUserSettings::SetSendAnonymousUsageDataToEpic()
[UE-26958] - GitHub 2056 : Fixing typo in the operator
#2056
Change 2971151 on 2016/05/09 by Chris.Wood
Logging ensure fails as errors. Automated tests with ensure fails will be unsuccessful.
[UE-19579] - If an ensure() fails within an automated test, the test can still show a positive result.
[UE-26575] - GitHub 2030 : Add error-severity message to log on ensure.
PR #2030
Change 2971267 on 2016/05/09 by Alexis.Matte
Wrong parameter when calling GetImportOptions
#jira UE-30299
Change 2972073 on 2016/05/10 by Richard.TalbotWatkin
Fixed UModel methods which make surfaces as modified.
#jira UE-28831 - Unable to undo material placement on BSP
Change 2972329 on 2016/05/10 by Nick.Darnell
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 2972887 on 2016/05/10 by Alexis.Matte
#jira UE-30167
We now import the geometric transform also when we uncheck the absolute transform in the vertex.
Change 2973664 on 2016/05/11 by Nick.Darnell
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 2973717 on 2016/05/11 by Nick.Darnell
Fixing compiler issues from main merge.
#jira UE-30590
Change 2973846 on 2016/05/11 by Jamie.Dale
Exposed FConfigValue::ExpandValue and added FConfigValue::CollapseValue
These are both static and can be used to expand or collapse the macros used in our config files (mostly when dealing with paths), in code that has to deal with the config system, but isn't internal to the config system (mostly things that deal with default configs outside of UObjects).
The old non-static version of FConfigValue::ExpandValue is now FConfigValue::ExpandValueInternal, which just calls FConfigValue::ExpandValue on SavedValue and ExpandedValue.
This also changes some code that was using FString.Replace to use FString.ReplaceInline. This reduces allocations, and also allows us to avoid another string comparison to see whether the strings are identical (as ReplaceInline returns the number of replacements that were made).
Change 2973847 on 2016/05/11 by Jamie.Dale
Changing the loading phase in the localization dashboard now writes to the default config
#jira UE-30482
Change 2973866 on 2016/05/11 by Jamie.Dale
Deprecated some functions that were taking an unused position.
These unused parameters caused confusion and lead to UE-30276. The old versions have been deprecated, and new versions without those parameters have been added. Existing code has been updated to call the non-deprecated version.
- FViewportFrame::ResizeFrame
- FSceneViewport::ResizeFrame
- FSceneViewport::ResizeViewport
[CL 2973886 by Nick Darnell in Main branch]
2016-05-11 11:05:13 -04:00
|
|
|
const FString ParentClassPath = InAssetData.GetTagValueRef<FString>("ParentClass");
|
|
|
|
|
if(!ParentClassPath.IsEmpty())
|
2014-10-13 06:46:06 -04:00
|
|
|
{
|
Copying //UE4/Dev-Editor to //UE4/Dev-Main (Source: //UE4/Dev-Editor @ 2973866)
#lockdown Nick.Penwarden
==========================
MAJOR FEATURES + CHANGES
==========================
Change 2937390 on 2016/04/07 by Cody.Albert
#jira UE-29211
Fixed slider to properly bubble unhandled OnKeyDown events
Change 2939672 on 2016/04/11 by Richard.TalbotWatkin
Made a change to how file check out notifications work. Now the dirty package state is processed at the end of every tick, meaning that packages which are dirtied and then cleaned again are not processed. This fixes an issue where a number of child blueprints were flagged as needing checkout when a parent blueprint was compiled. This also allows multiple packages which are dirtied at the same time to be treated as one transaction.
#jira UE-29193 - "Files need check-out" prompt spams Blueprint users
Change 2939686 on 2016/04/11 by Richard.TalbotWatkin
A number of further improvements to mesh vertex color painting:
* Lower LODs are now automatically fixed up for instances which were created in a previous bugged version of the engine.
* Since lower LODs cannot currently have their vertex colors edited, their vertex colors are always derived from LOD0.
* Fixed a bug when building lower LODs so that vertices in neighboring octree nodes are considered when looking for the nearest vertex from LOD0 which corresponds.
* Fixed issue where static meshes with imported LODs would not have the lower LODs' override colors set when "Copy instance vertex colors to source mesh" was used (static meshes with generated LODs were always getting correct override colors).
#jira UE-28563 - Incorrectly displayed LOD VertexColor until paint mode is selected
Change 2939906 on 2016/04/11 by Nick.Darnell
Automation - Adding several enhancements to the automation framework and improving the UI.
* Tests in the UI now have a link to the source and line where they orginate.
* There's now a general purpose latent lambda command you can use to run arbitrary code latently.
* Added Inlined AddCommand for regular and networked commands to the base automation class, to avoid the use of the macro, which prevents breakpoints from working in lambda code.
* Front end now has better column displays offering more room to the test name
* Changed several events to the automation controller to multicast delegates so that many could hook them.
* The UI now refreshes the selection after tests finish so that the output log updates.
Change 2939908 on 2016/04/11 by Nick.Darnell
Automation - The editor import/export tests are now a complex test and actually sperate out all the tests that can be run, some trickiness was required on the filenames so that they didn't expand into more child tests in the UI. (replacing .'s with _'s)
Change 2940028 on 2016/04/11 by Nick.Darnell
Automation - Removing the search box from the toolbar. It's now inlined above the test tree. Tweaking the padding to make it look more other windows and make everything not look so squished. Recursive expansion now works on tests.
Change 2940066 on 2016/04/11 by Nick.Darnell
Automation - Moving the filter group dropdown out of the toolbar and onto the line with the search box above the treeview - additional tweaks to it.
Change 2940092 on 2016/04/11 by Jamie.Dale
PR #2248: Datatable select next row (Contributed by FineRedMist)
Change 2940093 on 2016/04/11 by Jamie.Dale
PR #2248: Datatable select next row (Contributed by FineRedMist)
Change 2940157 on 2016/04/11 by Jamie.Dale
Fixing FTextTest due to some changes made to how currency is formatted
Change 2940694 on 2016/04/12 by Richard.TalbotWatkin
Fixed issue where vertex override colors were not being propagated correctly for generated lower LODs.
#jira UE-29360 - Override Colors not propagated correctly to generated lower LODs
Change 2942379 on 2016/04/13 by Richard.TalbotWatkin
Fixed issue where entering PIE while selecting an actor in Mesh Paint mode could lead to a MeshPaintStaticMeshAdapter holding onto an invalid pointer to an old mesh component, and causing a crash upon leaving the mode. This can happen because, when loading a new streaming level, the proxy actor can be selected when starting PIE, which will subsequently be added to the tool's internal lists. This needs to be added as a GC reference so that it can be NULLed when forcibly destroyed.
#jira UE-29345 - Crash occurs exiting the editor after enabling mesh paint mode and PIEing
Change 2942947 on 2016/04/13 by Richard.TalbotWatkin
Fixed crash when pasting a material function call node from one project to another in which it is not defined.
#jira UE-27087 - Crash when pasting MaterialFunctionCall expressions into the material editor between projects
Change 2943452 on 2016/04/14 by Richard.TalbotWatkin
Updated F4 debug key binding to match what's in ShowFlags.cpp
PR #2197 (contributed by mfortin-bhvr)
Change 2943824 on 2016/04/14 by Alexis.Matte
#jira UE-29090
Make sure we cannot open the color picker when a property is edit const
Change 2943841 on 2016/04/14 by Alexis.Matte
#jira UE-28924
tooltip was add for every hierarchy import option
Change 2943927 on 2016/04/14 by Alexis.Matte
#jira UE-29423
Add Obj support for scene importer
Github PR #2272
Change 2943967 on 2016/04/14 by Richard.TalbotWatkin
Added relevant fields from FBodyInstance to the FoliageType customizations.
#jira UE-20138 - FoliageType has a FBodyInstance but only shows Collision Presets and not other FBodyInstance properties
Change 2948397 on 2016/04/19 by Andrew.Rodham
Moved FSlateIcon definition to SlateCore
It was previously declared as SLATE_API, despite its header residing inside SlateCore. Reviewed by Jamie Dale.
Change 2948805 on 2016/04/19 by Andrew.Rodham
Editor: Deprecated FName UEdGraphNode::GetPaletteIcon(FLinearColor&); in favor of FSlateIcon UEdGraphNode::GetIconAndTint(FLinearColor&); to allow for icons in external style sets to be used.
- Previously, all icons were assumed to reside within FEditorStyle, which is not the case and would create broken icons in the graph editor. All relevant code has been updated to use FSlateIcon structures instead of a simple name.
- This change required a significant overhaul to FClassIconFinder to support FSlateIcons. To keep the API clean, FSlateIconFinder now deals with FSlateIcon class icon finding operations, and FClassIconFinder for the most part just adds actor specific logic.
#jira UE-26502
Change 2950658 on 2016/04/20 by Alexis.Matte
#jira UE-24333
Skinxx workflow, we now output an error if there is mix of material with skinxx and some with no skinxx suffix
Change 2950663 on 2016/04/20 by Alexis.Matte
#jira UE-29582
When exporting to fbx we have to export each material instance as one fbx material
Change 2951240 on 2016/04/21 by Alexis.Matte
#jira UE-28473
Make sure light are render properly after importing a fbx scene
Change 2951421 on 2016/04/21 by Alexis.Matte
#jira UE-29773
fbx skeletalmesh import now support mesh hierarchy
Change 2955873 on 2016/04/26 by Richard.TalbotWatkin
PR #2225: Fix working package directory from the launch profiles (Contributed by projectgheist)
Change 2955965 on 2016/04/26 by Nick.Darnell
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 2956717 on 2016/04/26 by Andrew.Rodham
Editor: World Outliner now correctly calls ProcessEditDelete on editor modes that have asked to process delete operations
#jira UE-26968
Change 2956822 on 2016/04/26 by Andrew.Rodham
Editor: Fixed actors not being removed from the scene outliner when they are added and removed on the same frame
#jira UE-7777
Change 2956931 on 2016/04/26 by Nick.Darnell
New Module - UATHelper - Moving the UAT launching code from the MainFrame module into a reusable module other modules can trigger.
Change 2956932 on 2016/04/26 by Nick.Darnell
Plugins - Now allowing you to package a plugin from the plugin browsing view. Still work in progress.
Change 2957164 on 2016/04/26 by Nick.Darnell
Hot Reload - Fixing hot reload, it no longer creates a temporary copy of the module manager. Making the copy constructor private on the module manager to prevent this in the future.
Change 2957165 on 2016/04/26 by Nick.Darnell
Fixing the Editor Mode plugin sample, it no longer provides a bad starting example for where to create your widgets.
#jira UE-28456
Change 2957510 on 2016/04/27 by Nick.Darnell
PR #2198: Git Plugin implement the Sync operation to update local files using the git pull --rebase command (Contributed by SRombauts)
#jira UE-28763
Change 2957511 on 2016/04/27 by Andrew.Rodham
Editor: Make favorites button on details panel non-focusable
- This was preventing users being able to tab between value fields on the details panel
Change 2957610 on 2016/04/27 by Nick.Darnell
PR #1836: Git plugin: make initial commit when initializing new project (Contributed by SRombauts)
#jira UE-24190
Change 2957667 on 2016/04/27 by Jamie.Dale
Fixed crash that could happen in FTextLayout::GetLineViewIndexForTextLocation if passed a bad location
#jira OR-18634
Change 2958035 on 2016/04/27 by Nick.Darnell
Fixing the DesignerRebuild flag detection so that we can just refresh the slate widget without recreating the preview UObject, which causes the destruction of the details panel, and the slate widget recreation was the only part that was required.
Change 2958272 on 2016/04/27 by Jamie.Dale
Added FAssetData::GetTagValue to handle getting asset tag values in a type-correct way
This allows type-conversion using LexicalConversion, and also has specializations for FString, FText, and FName.
#jira UE-12096
Change 2958348 on 2016/04/27 by Jamie.Dale
PR #2282: Slate font shutdown order fix (Contributed by FineRedMist)
Change 2958352 on 2016/04/27 by Jamie.Dale
Fixed the subtitle manager updating the wrong list of subtitles
#jira UE-29511
Change 2958390 on 2016/04/27 by Jamie.Dale
Removed some old placement-new style array insertions
Change 2959360 on 2016/04/28 by Richard.TalbotWatkin
Fixed potential crash when mesh painting actors whose geometry adapters are no longer registered.
#jira UE-29615 - [CrashReport] UE4Editor_MeshPaint!FEdModeMeshPaint::DoPaint() [meshpaintedmode.cpp:1127]
Change 2959724 on 2016/04/28 by Cody.Albert
Merging hardware survey gating logic from 4.10
#jira UE-28666
Change 2959807 on 2016/04/28 by Cody.Albert
Removed deprecated function call
#jira UE-28666
Change 2959894 on 2016/04/28 by Cody.Albert
Fix for scroll offset being clamped by content size, not scroll max
#jira UE-20676
Change 2960048 on 2016/04/28 by Jamie.Dale
Added FAssetData::GetTagValueRef to go along with FAssetData::GetTagValue
#jira UE-12096
Change 2960782 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2960885 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2961170 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2961171 on 2016/04/29 by Jamie.Dale
Updating code to use the new FText aware asset registry tag functions
#jira UE-12096
Change 2961173 on 2016/04/29 by Jamie.Dale
Removed some inline duplication on the specialized template functions
#jira UE-12096
Change 2963124 on 2016/05/02 by Jamie.Dale
FExternalDragOperation can now contain both text and file data at the same time
This better mirrors what the OS level drag-and-drop operations are capable of, and some applications will actually give you both bits of data at the same time.
#jira UE-26585
Change 2963175 on 2016/05/02 by Jamie.Dale
Updated some font editor tooltips to be more descriptive
#jira UE-17429
Change 2963290 on 2016/05/02 by Jamie.Dale
The Localise UAT command can now be run with a null localisation provider
Change 2963305 on 2016/05/02 by Jamie.Dale
Fixed minor typo
Change 2963402 on 2016/05/02 by Jamie.Dale
Cleaned up all the current localization key conflicts and warnings from gathering Engine code
#jira UE-25833
Change 2963415 on 2016/05/02 by Jamie.Dale
Rephrased a message that could generate a CIS warning
#jira UE-25833
Change 2964184 on 2016/05/03 by Jamie.Dale
Fixed duplicate "Font" entry in asset picker menu
This was caused by PropertyCustomizationHelpers::GetNewAssetFactoriesForClasses using CanCreateNew rather than ShouldShowInNewMenu, as UFont has two factories, but one is supposed to be hidden from the UI.
We also now make sure the factories are sorted by display name before being shown in the UI.
#jira UE-24903
Change 2966108 on 2016/05/04 by Nick.Darnell
Engine - Rearranging the order of ELoadingPhase's enums so that they match the loading order of modules.
Change 2966113 on 2016/05/04 by Nick.Darnell
[Engine Loop Change] UEngine now defines a Start() function, that subclasses can use to start game related things after initialization of the engine. This is done so that after the Init() call on UEngine, we can then perform a module load for the ELoadingPhase::PostEngineInit phase of loading, then inform the UEngine that it's time to start the game. Therefore, UGameEngine now tells the GameInstance to Start during this phase now.
Change 2966121 on 2016/05/04 by Jamie.Dale
Config writing improvements when dealing with property values
This updates FConfigFile::ShouldExportQuotedString to make sure that a property value containing any characters that FParse::LineExtended will consume when parsing back in the config file (such as { and }, or a trailing \) cause the string to be quoted.
This also adds FConfigFile::GenerateExportedPropertyLine to generate the INI key->value lines in a consistent and correctly escaped way, and makes sure that everything that writes out lines to a config file uses it.
FConfigCacheIni::SetString and FConfigCacheIni::SetText have been updated to update the value even if it only differs by case.
UObject::SaveConfig and UObject::LoadConfig have had some code whitespace fix-up (from a bad merge).
Change 2966122 on 2016/05/04 by Jamie.Dale
Added a setting to control dialogue wave audio filenames
Change 2966481 on 2016/05/04 by Jamie.Dale
PR #2336: BUGFIX: Selection of objects in the Content browser from WorldSettings (Contributed by projectgheist)
Change 2966887 on 2016/05/04 by Jamie.Dale
PR #2336: BUGFIX: Selection of objects in the Content browser from WorldSettings (Contributed by projectgheist)
Change 2967488 on 2016/05/05 by Ben.Marsh
Changes to support packaging plugins from the editor.
* UBT now has an option to explicitly disable hot-reloading in any circumstances.
* When running with -module arguments for a monolithic target, UBT will no longer try to relink the executable in source builds (so it's possible to compile plugin libs outside of an installed engine build without having already built UE4Game).
* When packaging, a temporary host project is always generated in the output directory to avoid invalidating intermediates in the source directory.
* An empty Config\FilterPlugin.ini file is written out with instructions on how to list additional files to package if it is not already present.
Change 2967947 on 2016/05/05 by Nick.Darnell
PR #2358: Properly display Mip Level Count and Format for UTexture2DDynamic Textures (Contributed by Allegorithmic)
#jira UE-30371
Change 2968333 on 2016/05/05 by Jamie.Dale
Fixed MultiLine not working with arrays of string or text properties
- The detail customizations for FString and FText properties now read the meta-data off the correct property.
- The UDS editor now lets you set the "MultiLine" meta-data on arrays of FString and FText properties.
- Fixed changing the "MultiLine" flag on a UDS property not rebuilding the default value editor.
- Fixed the default values panel in the UDS editor having a title area.
#jira UE-30392
Change 2968999 on 2016/05/06 by Jamie.Dale
Fixed infinite loop in the editor if a directory that is being watched is deleted
#jira UE-30172
Change 2969105 on 2016/05/06 by Richard.TalbotWatkin
Fixed issue where opening a submenu while the parent menu had a text box focused would lead to a crash. The graph node comment text widget now only dismisses all menus if the text commit info implies that it was committed by some user action.
#jira UE-29086 - Crash When Typing a Node Comment and Hovering Over the Alignment Option
Change 2969440 on 2016/05/06 by Jamie.Dale
Significant performance improvements when pasting a large amount of text
#jira UE-19712
Change 2969619 on 2016/05/06 by Andrew.Rodham
Auto-reimport is now disabled inside an editor running in unattended mode
Change 2969621 on 2016/05/06 by Jamie.Dale
Added the ability to override the subtitle used on a dialogue wave
This is useful for effort sounds, plus some other cases, such as characters speaking in a foreign language not known to the player.
#jira UETOOL-795
Change 2970588 on 2016/05/09 by Chris.Wood
Fix typo in operator expression in UEndUserSettings::SetSendAnonymousUsageDataToEpic()
[UE-26958] - GitHub 2056 : Fixing typo in the operator
#2056
Change 2971151 on 2016/05/09 by Chris.Wood
Logging ensure fails as errors. Automated tests with ensure fails will be unsuccessful.
[UE-19579] - If an ensure() fails within an automated test, the test can still show a positive result.
[UE-26575] - GitHub 2030 : Add error-severity message to log on ensure.
PR #2030
Change 2971267 on 2016/05/09 by Alexis.Matte
Wrong parameter when calling GetImportOptions
#jira UE-30299
Change 2972073 on 2016/05/10 by Richard.TalbotWatkin
Fixed UModel methods which make surfaces as modified.
#jira UE-28831 - Unable to undo material placement on BSP
Change 2972329 on 2016/05/10 by Nick.Darnell
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 2972887 on 2016/05/10 by Alexis.Matte
#jira UE-30167
We now import the geometric transform also when we uncheck the absolute transform in the vertex.
Change 2973664 on 2016/05/11 by Nick.Darnell
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 2973717 on 2016/05/11 by Nick.Darnell
Fixing compiler issues from main merge.
#jira UE-30590
Change 2973846 on 2016/05/11 by Jamie.Dale
Exposed FConfigValue::ExpandValue and added FConfigValue::CollapseValue
These are both static and can be used to expand or collapse the macros used in our config files (mostly when dealing with paths), in code that has to deal with the config system, but isn't internal to the config system (mostly things that deal with default configs outside of UObjects).
The old non-static version of FConfigValue::ExpandValue is now FConfigValue::ExpandValueInternal, which just calls FConfigValue::ExpandValue on SavedValue and ExpandedValue.
This also changes some code that was using FString.Replace to use FString.ReplaceInline. This reduces allocations, and also allows us to avoid another string comparison to see whether the strings are identical (as ReplaceInline returns the number of replacements that were made).
Change 2973847 on 2016/05/11 by Jamie.Dale
Changing the loading phase in the localization dashboard now writes to the default config
#jira UE-30482
Change 2973866 on 2016/05/11 by Jamie.Dale
Deprecated some functions that were taking an unused position.
These unused parameters caused confusion and lead to UE-30276. The old versions have been deprecated, and new versions without those parameters have been added. Existing code has been updated to call the non-deprecated version.
- FViewportFrame::ResizeFrame
- FSceneViewport::ResizeFrame
- FSceneViewport::ResizeViewport
[CL 2973886 by Nick Darnell in Main branch]
2016-05-11 11:05:13 -04:00
|
|
|
UClass* ParentClass = FindObject<UClass>(NULL, *ParentClassPath);
|
2014-10-13 06:46:06 -04:00
|
|
|
if(ParentClass == UEditorTutorial::StaticClass())
|
|
|
|
|
{
|
|
|
|
|
bNeedsRefresh = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
|
|
|
#undef LOCTEXT_NAMESPACE
|