2019-12-26 15:32:37 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2014-03-14 14:13:41 -04:00
# include "SourceControlModule.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 "Features/IModularFeatures.h"
2014-03-14 14:13:41 -04:00
# include "SSourceControlLogin.h"
Copying //UE4/Dev-Enterprise to //UE4/Dev-Main (Source: //UE4/Dev-Enterprise @ 3972172)
#lockdown Nick.Penwarden
#rb none
============================
MAJOR FEATURES & CHANGES
============================
Change 3821754 by Jamie.Dale
[Python] Class property conversion now goes through NativizeClass/PythonizeClass
This allows it to coerce from Python wrapped object types
Change 3833107 by Patrick.Boutot
Added functions to fill an existing DataTable from an existing CSV/JSON file.
Change 3835044 by Aaron.Carlisle
Exposure for asset_import_data (editor property) and it's functions: extract_filenames and get_first_filename.
Change 3835466 by Patrick.Boutot
Hide function from Python that need special compile command to be executed by the VM.
Change 3839237 by Jamie.Dale
Added a way to inspect the full chain of properties that are currently being serialized by an archive
You used to only have access to the leaf-most property, and while you could use its outer chain to inspect other properties within the same object/struct, you couldn't always get the full chain (eg, if you had an object containing a struct).
Change 3839974 by Jamie.Dale
Make sure that SerializedProperty is copied correctly, as SetSerializedPropertyChain may set it to something else
Change 3842311 by Jamie.Dale
Fixing potential null level assert
Change 3842313 by Jamie.Dale
Updated settings editor to handle external properties
Change 3842316 by Jamie.Dale
Allowing a console command to be given to GEditor/GEngine even if there's a player
CL# 1848982 said it was to prevent multiple execution of stat commands, however that no longer seems to be an issue.
Change 3842867 by Jamie.Dale
Added a way to generate diffs from editor transactions
The notifications from these diffs are send to UObject::PostTransacted and FCoreUObjectDelegates::OnObjectTransacted.
These notifications are typically generated when a transaction is "finalized", but can also be generated from "snapshots" (eg, to trap nodes being dragged in the world). They're also generated from normal undo/redo events.
Change 3844428 by Patrick.Boutot
Move the SetMaterial code from the StaticMeshEditor to StaticMesh to be reusable by script.
Change 3845966 by Jamie.Dale
Added support for minimal game RPC worlds
These can be created in the editor and engine and exist to allow RPC communication via Unreal Networking in a way that is sandboxed from any other worlds that may be loaded (like the main game world)
Change 3848844 by Patrick.Boutot
Expose EComponentMobility to blueprint.
Change 3854616 by Patrick.Boutot
Add Custom way time step the engine loop. Will be used by the Synchronization of media for enterprise.
Change 3856650 by Jamie.Dale
Fixed a bug where transaction finalization could miss changes since the last snapshot
Change 3864951 by Patrick.Boutot
Fix ghost asset in Content Browser when an asset is added and renamed before the RecentlyAddedAssets list had a chance to be processed.
Change 3867158 by JeanMichel.Dignard
UBT
- Added the ability for dll programs to export symbols.
#jira UEENT-541
Change 3872342 by Jamie.Dale
Merging static analysis fixes from 4.19
Change 3879305 by Jamie.Dale
Improved the processing of py files from exec commands
The old logic used to just test if the entire command was a .py file. The new logic extracts out the first token and sees if that's a .py file, and if it is, treats the remaining data as extra arguments.
Change 3879306 by Jamie.Dale
Added a minimal commandlet for invoking Python scripts
Change 3881631 by Jamie.Dale
Added basic RTTI to Python meta-data types
Change 3885384 by Jamie.Dale
[Python] Prevent glue code using reserved names
Change 3888957 by Patrick.Boutot
In MediaPlayer, only create a PlayerFacade & Playlist when it's not a ClassDefaultObject.
The MediaPlayerFacade is a MediaTickable. That trigger the tick thread to be awake even if there is no Media playing.
Change 3888961 by Patrick.Boutot
Fix FInterval::IsValid return type.
Change 3888980 by Patrick.Boutot
Modification to Media and MediaAsset to support MediaSmith. The TInterval<int64> will be changed into TTinterval<FTimespan> UEENT-947. MediaSampleQueue's critical section will be change into an atomic operation UEENT-948.
Change 3889165 by Patrick.Boutot
Fix build. Missing include for Timespan. Introduce with CL 3888980.
Change 3889261 by Jamie.Dale
[Python] Fixing some more name conflicts in generated code
Change 3889504 by Darren.Pegg
Add option to change PreferredPixelFormat
Change 3891193 by Patrick.Boutot
Fix build. Missing include for Interval. Introduce with CL 3888980.
Change 3897108 by Patrick.Boutot
TTinterval use it own traits. Create a Interval traits for Timespan.
#jira UEENT-947
Change 3899669 by Jamie.Dale
Fixed Functions sometimes being exposed to Python as if they were Structs
Change 3900692 by Jamie.Dale
Removed some boilerplate associated with wrapping a basic type to Python
You can now derive from TPyWrapperBasic to wrap a type that is simply a value copied into Python (see FPyWrapperName and FPyWrapperText for an example)
Change 3901066 by conan.reis
UE4 editor script bindings (Cobra) and helper functions for version control
- exposed SourceControl class with common source control methods and associated SourceControlState structure
- commands have smart file strings that can convert from any of fully qualified path, relative path, long package name, asset path or export text path (often stored on clipboard)
- commands store any errors in a shared error text object which is optionally printed to the error log
- renamed some calls across the UE4 codebase to USourceControlHelpers::CheckOutOrAddFile() from USourceControlHelpers::CheckOutFile()
- included Python test script for source control commands including that auto-creates test files as needed and passes various types of files to test as command line arguments. Any unexpected results displays error messages.
Change 3901388 by Jamie.Dale
Minimal Slate hooks for Python
Change 3901456 by Jamie.Dale
Added missing file
Change 3901549 by Jamie.Dale
Removing some more Windows defines that were causing build issues
Change 3904518 by conan.reis
Source Control
- ensured that "check if modified" flag is set whenver getting source control state in USourceControlHelpers::QueryFileState() which was needed when using Perforce source control provider
Change 3905612 by Francis.Hurteau
Optimize RemoveDuplicates somewhat using a TSet
#jira UEENT-217
Change 3912626 by Jamie.Dale
Fixed ShouldExcludeDerivedClasses option not working
RecursiveClassesExclusionSet requires a base ClassNames entry to operate on when filtering.
Change 3917739 by Jamie.Dale
Output Log suggestions list is now clamped to the work area width of the monitor that hosts the widget
Change 3917744 by Jamie.Dale
Changed generated code to reference the UProperty and UFunction directly, rather than constantly look them up by name
Names were originally used because UHT couldn't access the objects when it registered the glue code, but now that we generate at runtime via reflection, we already have the relevant objects available, and caching them the glue structs helps performance at both generation time and runtime.
Change 3918832 by Jamie.Dale
Removed field iteration from Python function calls
We now cache the input and output parameters for all function calls (methods, get/set, and delegates) and use this rather than iterate the struct fields.
Change 3920648 by Patrick.Boutot
Remove the bottom right part of the windows border of the grabbed frame when in the editor. Tested in the standalone, windowed and full screen.
Add option to request a FlushOnDraw on the viewport. Flushing in SDI output flow decreases the performance by ~10ms. SDI output is synchronized and the engine tick follows that synchronization.
Change 3921396 by Jamie.Dale
Split up the generated type data to correspond to the type being wrapped
A lot of types can just use the minimal set, but classes and structs have some extra data.
Change 3921619 by conan.reis
- add delegate to FSourceControlWindows::ChoosePackagesToCheckin() that gives info for result, result description, files added, files checked in and flag indicating whether files were checked out again.
- also added result info to FSourceControlWindows::PromptForCheckin()
#jira UE-55255
Change 3921624 by conan.reis
Removed Source Control common files from pre compiled header
- main changes are in UnrealEdPrivatePCH.h, UnrealEdSharedPCH.h, SouceControlWindows.h and the added SouceControlWindows.cpp
- remaining files have includes changed to accomodate
Change 3921958 by conan.reis
Fix attempt for incude file dependency needed by some build configurations (likely PCH disabled) caused by CL3921619
Change 3922740 by conan.reis
Included SourceControlOperations.h and SourceControlHelpers.h back in ISourceControlProvider.h though it does not need them since other files that were including ISourceControlProvider.h have come to expect their inclusion.
They were previously removed in CL3921624
Change 3923375 by Jamie.Dale
Added optimized FString <-> icu::UnicodeString conversion for platforms using UTF-16 native strings
Change 3926547 by Jamie.Dale
Added support for struct method "hoisting"
This allows you to tag a helper function that takes a struct as its first argument with the ScriptMethod meta-data (optionally providing a new name) to "hoist" that helper function to be a method of the struct it operates on when wrapped for Python.
Change 3927050 by conan.reis
Source control - ensured that ISourceControlProvider::Execute(FConnect, EConcurrency, FSourceControlOperationComplete) delegate is called on initial connection even if it fails immediately. Modified Perforce, Git and Subversion source control providers
#JIRA UE-55256
Change 3929268 by conan.reis
- fixed case in Perforce source control code where the server available flag was set even when the server was not successfully connected
- removed Perforce error message about file folders outside of the workspace client mappings
- clarified comments for ISourceControlProvider::IsEnabled() and ISourceControlModule::IsEnabled()
#JIRA UE-55254
Change 3931024 by Rex.Hill
Expose FBX and Texture import to python
Change 3931273 by Rex.Hill
Hide re-import slate notification pop-up during python automated asset import
Change 3931368 by Jamie.Dale
Stopped bools coercing to numeric types in Python nativization
Change 3931374 by Jamie.Dale
Added support for struct math operator "hoisting"
This allows you to tag a helper function that takes a struct as its first argument with the ScriptMathOp meta-data (providing a potentially semi-colon separated list of operators to map to) to "hoist" that helper function to be a math operator of the struct it operates on when wrapped for Python.
Change 3932586 by Rex.Hill
Removed file read into unused memory buffer during Fbx import
Change 3934308 by Jamie.Dale
Added a public interface for the Python plugin
Very basic, just lets you query if Python is compiled in, and lets you execute Python commands like you would via the Output Log.
Change 3935088 by conan.reis
- Added info/warning and error message storage to all the source control operation structures so additional information can be made available.
- Added ISourceControlOperation::GetResultInfo() which returns the modified control structures (mentioned above) with appended info/warning messages and error messages and implemented its use in all source control operations in Perforce, Git and Subversion.
#JIRA UE-55257
Change 3936668 by Rex.Hill
#jira UE-55985
Avoid re-allocation of memory buffer holding file bytes during asset import
Change 3940596 by Rex.Hill
#jira UE-55989 Optimize skeletal mesh import performance scaling
Overlapping vertex check was O (N^2)
100k vertex mesh took ~15 seconds to perform overlap step now takes 0.023 seconds
Change 3942629 by Rex.Hill
#jira UE-55995 Read fbx file only once during import
Fixes a memory leak of FbxScene and reduces wait time during import.
Change 3942884 by Rex.Hill
Python asset import can now customize destination asset name
Change 3946278 by Jamie.Dale
Added stricter conversion for math operator arguments
PyConversion now returns FPyConversionResult rather than bool, which will tell you not only whether a conversion succeeded or failed, but also whether type coercion was applied during the conversion.
This allows the operator stack evaluation to run a first pass looking for an exact argument match, before falling back to a coerced match if available. This allows operators to apply correctly to coerced types (eg, int vs float overloads).
Change 3948455 by Jamie.Dale
Added generic Tick function to FPythonScriptPlugin
This can also handle init logic for after the engine is fully initialized
Change 3948888 by Jamie.Dale
Added settings for the Python plugin
You can now define start-up scripts to execute once the engine is initialized, additional system paths for Python, and whether you want to enable developer mode (which will enable things like deprecation warnings).
Change 3948982 by Jamie.Dale
Fixed Python 3 build error caused by CObject being removed in Python 3.2
Change 3949614 by Francis.Hurteau
Create a camera cut track from the camera switcher camera index animation curve when importing a fbx in sequencer
#jira UEENT-1053
Change 3950829 by Rex.Hill
Update error message to be more specific when ENGINE_API keyword is found before 'static' keyword for a UFUNCTION
Change 3953452 by Jamie.Dale
Fixed some dependencies
Change 3953645 by Jamie.Dale
Fixed Python parameter packing treating bool output paramers as potential return values
void GetState(bool& OutState) would have previously triggered the code for packing output for a function that returns a bool.
Change 3953850 by Jamie.Dale
Fixed doc string generation for a function with multiple output paramters and no return value
Change 3954279 by Jamie.Dale
Initial support for exposing deprecated properties and functions to Python
This handles properties and functions that are directly deprecated. We still need to handle the cases where they're renamed and a redirector is left.
Change 3954922 by Rex.Hill
Expose UnloadPackages to python
Change 3955209 by Jamie.Dale
Initial support for exposing deprecated classes to Python
Change 3955248 by Jamie.Dale
Added a way to load Unreal modules via Python
unreal.load_module("modulename")
Change 3955561 by Rex.Hill
Expose asset export to python
Change 3956068 by Rex.Hill
Linux compile fix.
Change 3960449 by Rex.Hill
Fix automated test using bCombineMeshes
Change 3960495 by Patrick.Boutot
Add a temporary menu to show the MetaData of an asset.
The menu will need to be updated to have a look and feel of the Detail View and support edition at one point.
Change 3961599 by Rex.Hill
Reduced peak memory during import of meshes related to duplicate vertex tracking
Change 3962104 by Rex.Hill
Disable import mesh overlapping corners memory optimization to because it can change uv generation
Change 3962507 by Rex.Hill
Fix uv generation
Change 3965285 by Rex.Hill
Add support for FBX export as ASCII
#jira UE-56465
Change 3965287 by Rex.Hill
Forgotten file, fbx export as ascii
Change 3966772 by Simon.Tourangeau
Fix MaterialExpressionFunctions for ExternalTexture support
Change 3967014 by Jamie.Dale
Added a way to get the CDO in Python
Wrapped objects now have a get_default_object class method
Change 3967151 by Jamie.Dale
Added stats to track Python generation time
Change 3968006 by Simon.Therriault
Media Samples
- Removed Locks and Min/Max SampleTime from queues
- Added methods to fetch NextSampleTime and SampleCount in queues
- Added MediaSource base class for players that want to be time synchronized
#jira UEENT-948
Change 3969119 by Patrick.Boutot
Add delay functionnality to MediaPlayer to delay the frame by some time. It will allow more than one player to be start at the same time, played at the same frame but offset in relation to each other.
[CL 3972277 by Simon Tourangeau in Main branch]
2018-03-29 13:32:35 -04:00
# include "SourceControlOperations.h"
# include "SourceControlHelpers.h"
2021-08-31 15:12:47 -04:00
# include "SourceControlAssetDataCache.h"
2022-10-03 20:38:09 -04:00
# include "SourceControlFileStatusMonitor.h"
2023-03-14 07:39:31 -04:00
# include "SourceControlCVars.h"
2022-02-10 19:07:07 -05:00
# include "Misc/Paths.h"
2014-03-14 14:13:41 -04:00
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
# if SOURCE_CONTROL_WITH_SLATE
# include "Widgets/DeclarativeSyntaxSupport.h"
# include "Widgets/SWindow.h"
# include "Widgets/Layout/SBox.h"
# include "Framework/Docking/TabManager.h"
# include "Framework/Application/SlateApplication.h"
# endif
2015-04-02 07:42:21 -04:00
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
# if WITH_UNREAL_DEVELOPER_TOOLS
# include "MessageLogModule.h"
# endif
# if WITH_EDITOR
2024-06-25 10:55:58 -04:00
# include "Editor.h"
2022-09-11 18:32:18 -04:00
# include "EngineAnalytics.h"
# include "Interfaces/IAnalyticsProvider.h"
2014-03-14 14:13:41 -04:00
# endif
DEFINE_LOG_CATEGORY ( LogSourceControl ) ;
# define LOCTEXT_NAMESPACE "SourceControl"
2014-08-05 10:29:53 -04:00
static const FName SourceControlFeatureName ( " SourceControl " ) ;
2014-03-14 14:13:41 -04:00
namespace SourceControlConstants
{
/** The maximum number of file/directory status requests we should dispatch in a tick */
const int32 MaxStatusDispatchesPerTick = 64 ;
/** The interval at which we refresh a file's state */
const FTimespan StateRefreshInterval = FTimespan : : FromMinutes ( 5.0 ) ;
}
FSourceControlModule : : FSourceControlModule ( )
: CurrentSourceControlProvider ( NULL )
, bTemporarilyDisabled ( false )
{
}
void FSourceControlModule : : StartupModule ( )
{
// load our settings
SourceControlSettings . LoadSettings ( ) ;
// Register to check for source control features
IModularFeatures : : Get ( ) . OnModularFeatureRegistered ( ) . AddRaw ( this , & FSourceControlModule : : HandleModularFeatureRegistered ) ;
2014-08-05 10:29:53 -04:00
IModularFeatures : : Get ( ) . OnModularFeatureUnregistered ( ) . AddRaw ( this , & FSourceControlModule : : HandleModularFeatureUnregistered ) ;
2014-03-14 14:13:41 -04:00
// bind default provider to editor
2014-08-05 10:29:53 -04:00
IModularFeatures : : Get ( ) . RegisterModularFeature ( SourceControlFeatureName , & DefaultSourceControlProvider ) ;
2014-03-14 14:13:41 -04:00
# if WITH_UNREAL_DEVELOPER_TOOLS
// create a message log for source control to use
FMessageLogModule & MessageLogModule = FModuleManager : : LoadModuleChecked < FMessageLogModule > ( " MessageLog " ) ;
2022-11-23 11:57:50 -05:00
MessageLogModule . RegisterLogListing ( " SourceControl " , LOCTEXT ( " SourceControlLogLabel " , " Revision Control " ) ) ;
2014-03-14 14:13:41 -04:00
# endif
2021-08-31 15:12:47 -04:00
AssetDataCache . Startup ( ) ;
2022-10-03 20:38:09 -04:00
2024-06-25 10:55:58 -04:00
# if WITH_EDITOR
FEditorDelegates : : OnAssetsCanDelete . AddRaw ( this , & FSourceControlModule : : OnAssetsCanDelete ) ;
# endif
2022-10-03 20:38:09 -04:00
SourceControlFileStatusMonitor = MakeShared < FSourceControlFileStatusMonitor > ( ) ;
2014-03-14 14:13:41 -04:00
}
void FSourceControlModule : : ShutdownModule ( )
{
2021-08-31 15:12:47 -04:00
AssetDataCache . Shutdown ( ) ;
2014-03-14 14:13:41 -04:00
// close the current provider
GetProvider ( ) . Close ( ) ;
# if WITH_UNREAL_DEVELOPER_TOOLS
// unregister message log
if ( FModuleManager : : Get ( ) . IsModuleLoaded ( " MessageLog " ) )
{
FMessageLogModule & MessageLogModule = FModuleManager : : LoadModuleChecked < FMessageLogModule > ( " MessageLog " ) ;
MessageLogModule . UnregisterLogListing ( " SourceControl " ) ;
}
# endif
// unbind default provider from editor
2014-08-05 10:29:53 -04:00
IModularFeatures : : Get ( ) . UnregisterModularFeature ( SourceControlFeatureName , & DefaultSourceControlProvider ) ;
2014-03-14 14:13:41 -04:00
// we don't care about modular features any more
IModularFeatures : : Get ( ) . OnModularFeatureRegistered ( ) . RemoveAll ( this ) ;
2014-08-05 10:29:53 -04:00
IModularFeatures : : Get ( ) . OnModularFeatureUnregistered ( ) . RemoveAll ( this ) ;
2022-10-03 20:38:09 -04:00
2024-06-25 10:55:58 -04:00
# if WITH_EDITOR
FEditorDelegates : : OnAssetsCanDelete . RemoveAll ( this ) ;
# endif
2022-10-03 20:38:09 -04:00
SourceControlFileStatusMonitor . Reset ( ) ;
2014-03-14 14:13:41 -04:00
}
void FSourceControlModule : : SaveSettings ( )
{
SourceControlSettings . SaveSettings ( ) ;
}
void FSourceControlModule : : ShowLoginDialog ( const FSourceControlLoginClosed & InOnSourceControlLoginClosed , ELoginWindowMode : : Type InLoginWindowMode , EOnLoginWindowStartup : : Type InOnLoginWindowStartup )
{
2014-08-13 17:39:56 -04:00
# if SOURCE_CONTROL_WITH_SLATE
2021-08-31 15:12:47 -04:00
// Avoid continue running tasks while the dialog is displayed. Any change in textboxes could affect the connection status.
AssetDataCache . OnSourceControlDialogShown ( ) ;
2014-03-14 14:13:41 -04:00
// Get Active Provider Name
ActiveProviderName = GetProvider ( ) . GetName ( ) . ToString ( ) ;
2023-03-14 07:39:31 -04:00
// if we are forcing a modal dialog, change the preference now
ELoginWindowMode : : Type LoginWindowMode = InLoginWindowMode ;
if ( SourceControlCVars : : CVarSourceControlEnableLoginDialogModal . GetValueOnAnyThread ( ) )
{
LoginWindowMode = ELoginWindowMode : : Modal ;
}
2014-03-14 14:13:41 -04:00
// if we are showing a modal version of the dialog & a modeless version already exists, we must destroy the modeless dialog first
2023-03-14 07:39:31 -04:00
if ( LoginWindowMode = = ELoginWindowMode : : Modal & & SourceControlLoginPtr . IsValid ( ) )
2014-03-14 14:13:41 -04:00
{
// unhook the delegate so it doesn't fire in this case
SourceControlLoginWindowPtr - > SetOnWindowClosed ( FOnWindowClosed ( ) ) ;
SourceControlLoginWindowPtr - > RequestDestroyWindow ( ) ;
SourceControlLoginWindowPtr = NULL ;
SourceControlLoginPtr = NULL ;
}
if ( SourceControlLoginWindowPtr . IsValid ( ) )
{
SourceControlLoginWindowPtr - > BringToFront ( ) ;
}
else
{
// set provider to 'none'.
// When we open the window, we turn off the fact that source control is available, this solves issues that are present with
// being a three state modeless system (Accepted settings, disabled, and not yet decided).
if ( InOnLoginWindowStartup = = EOnLoginWindowStartup : : ResetProviderToNone )
{
SetProvider ( " None " ) ;
}
// temporarily disable access to source control features
bTemporarilyDisabled = true ;
// Create the window
SourceControlLoginWindowPtr = SNew ( SWindow )
2022-11-23 11:57:50 -05:00
. Title ( LOCTEXT ( " SourceControlLoginTitle " , " Revision Control Login " ) )
2021-01-25 11:45:57 -04:00
. HasCloseButton ( true )
2014-03-14 14:13:41 -04:00
. SupportsMaximize ( false )
. SupportsMinimize ( false )
. SizingRule ( ESizingRule : : Autosized ) ;
// Set the closed callback
SourceControlLoginWindowPtr - > SetOnWindowClosed ( FOnWindowClosed : : CreateRaw ( this , & FSourceControlModule : : OnSourceControlDialogClosed ) ) ;
// Setup the content for the created login window.
SourceControlLoginWindowPtr - > SetContent (
2014-04-23 16:38:19 -04:00
SAssignNew ( SourceControlLoginPtr , SSourceControlLogin )
. ParentWindow ( SourceControlLoginWindowPtr )
. OnSourceControlLoginClosed ( InOnSourceControlLoginClosed )
2014-03-14 14:13:41 -04:00
) ;
TSharedPtr < SWindow > RootWindow = FGlobalTabmanager : : Get ( ) - > GetRootWindow ( ) ;
if ( RootWindow . IsValid ( ) )
{
2023-03-14 07:39:31 -04:00
if ( LoginWindowMode = = ELoginWindowMode : : Modal )
2014-03-14 14:13:41 -04:00
{
FSlateApplication : : Get ( ) . AddModalWindow ( SourceControlLoginWindowPtr . ToSharedRef ( ) , RootWindow ) ;
}
else
{
FSlateApplication : : Get ( ) . AddWindowAsNativeChild ( SourceControlLoginWindowPtr . ToSharedRef ( ) , RootWindow . ToSharedRef ( ) ) ;
}
}
else
{
2023-03-14 07:39:31 -04:00
if ( LoginWindowMode = = ELoginWindowMode : : Modal )
2014-10-08 09:58:56 -04:00
{
FSlateApplication : : Get ( ) . AddModalWindow ( SourceControlLoginWindowPtr . ToSharedRef ( ) , RootWindow ) ;
}
else
{
FSlateApplication : : Get ( ) . AddWindow ( SourceControlLoginWindowPtr . ToSharedRef ( ) ) ;
}
2014-03-14 14:13:41 -04:00
}
}
2014-08-13 17:39:56 -04:00
# else
STUBBED ( " FSourceControlModule::ShowLoginDialog - no Slate " ) ;
# endif // SOURCE_CONTROL_WITH_SLATE
2014-03-14 14:13:41 -04:00
}
void FSourceControlModule : : OnSourceControlDialogClosed ( const TSharedRef < SWindow > & InWindow )
{
SourceControlLoginWindowPtr = NULL ;
SourceControlLoginPtr = NULL ;
bTemporarilyDisabled = false ;
# if WITH_EDITOR
FString NewProvider = CurrentSourceControlProvider - > GetName ( ) . ToString ( ) ;
if ( FEngineAnalytics : : IsAvailable ( ) & & ! ActiveProviderName . Equals ( NewProvider , ESearchCase : : IgnoreCase ) )
{
FEngineAnalytics : : GetProvider ( ) . RecordEvent ( TEXT ( " Editor.Usage.SourceControl " ) , TEXT ( " Provider " ) , NewProvider ) ;
ActiveProviderName = NewProvider ;
}
# endif
2021-08-31 15:12:47 -04:00
AssetDataCache . OnSourceControlDialogClosed ( ) ;
2014-03-14 14:13:41 -04:00
}
void FSourceControlModule : : InitializeSourceControlProviders ( )
{
2014-08-05 10:29:53 -04:00
int32 SourceControlCount = IModularFeatures : : Get ( ) . GetModularFeatureImplementationCount ( SourceControlFeatureName ) ;
2014-03-14 14:13:41 -04:00
if ( SourceControlCount > 0 )
{
FString PreferredSourceControlProvider = SourceControlSettings . GetProvider ( ) ;
2014-08-05 10:29:53 -04:00
TArray < ISourceControlProvider * > Providers = IModularFeatures : : Get ( ) . GetModularFeatureImplementations < ISourceControlProvider > ( SourceControlFeatureName ) ;
2014-03-14 14:13:41 -04:00
for ( auto It ( Providers . CreateIterator ( ) ) ; It ; It + + )
{
ISourceControlProvider * Provider = * It ;
if ( PreferredSourceControlProvider = = Provider - > GetName ( ) . ToString ( ) )
{
CurrentSourceControlProvider = Provider ;
break ;
}
}
// no provider found of this name, default to the first one
if ( CurrentSourceControlProvider = = NULL )
{
CurrentSourceControlProvider = & DefaultSourceControlProvider ;
}
}
check ( CurrentSourceControlProvider ) ;
CurrentSourceControlProvider - > Init ( false ) ; // Don't force a connection here, as its synchronous. Let the user establish a connection.
}
Copying //UE4/Dev-Editor to //UE4/Dev-Main (Source: //UE4/Dev-Editor @ 3082391)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3051464 on 2016/07/15 by Nick.Darnell
Regression Testing - Several upgrades to the functional testing system, better tracking of failure cases, some source line failure detection, trying to make it easier to run a specific test on a map. Some UI improvements, easier access to the automation system. Lots more refactoring to come, lots of improvements are still needed in transmitting screenshots and just generally building a automation report we could dump from the build machines.
Change 3051465 on 2016/07/15 by Nick.Darnell
Adding the "Engine Test" project our one stop shope for running automation tests in the engine to try and reduce regressions.
Change 3051847 on 2016/07/15 by Matt.Kuhlenschmidt
Fixed material editor viewport messages being blocked by viewport toolbar
Change 3052025 on 2016/07/15 by Nick.Darnell
Moving the placement mode hooks out of functional testing module, moving them into the editor automation module.
Change 3053508 on 2016/07/18 by Stephan.Jiang
Copy,Cut,Paste tracks, not for mastertracks yet.
#UE-31808
Change 3054723 on 2016/07/18 by Stephan.Jiang
Small fixes for typo & comments
Change 3055996 on 2016/07/19 by Trung.Le
PIE: No longer auto resume game in PIE on focus received
Change 3056106 on 2016/07/19 by Trung.Le
Back out changelist 3055996. Build break.
Change 3056108 on 2016/07/19 by Stephan.Jiang
Updating "SoundConcurrency" asseticon
Change 3056389 on 2016/07/19 by Trung.Le
PIE: No longer auto resume game in PIE on focus received
#jira UE-33339
Change 3056396 on 2016/07/19 by Matt.Kuhlenschmidt
More perf selection improvements:
- Static meshes now go through the static draw path when rendered for selection outline instead of just rendering using the dynamic path
Change 3056758 on 2016/07/19 by Stephan.Jiang
Update SelectedWidgets in WidgetblueprintEditor to match the selected tracks in sequencer.
Change 3057519 on 2016/07/20 by Matt.Kuhlenschmidt
Another fix for selecting lots of objects taking forever. This one is due to repeated Modify calls if there are groups in the selection. Each group actor selected iterates through each object selected during USelection::Modify!
Change 3057635 on 2016/07/20 by Stephan.Jiang
Updating visual logger icon UI
Change 3057645 on 2016/07/20 by Richard.TalbotWatkin
Fixed single player PIE so the window position is correctly fetched and saved, even when running a dedicated server. This does not interfere with stored positions for multiple PIE, which uses ULevelEditorPlaySettings::MultipleInstancePositions.
#jira UE-33416 - New Editor PIE window does not center to screen when running with a dedicated server
Change 3057868 on 2016/07/20 by Richard.TalbotWatkin
Spline component improvements, both tools and runtime:
- SplineComponentVisualizer now works within the Blueprint editor. This works via a generic extension added to the base ComponentVisualizer class which correctly propagates modified properties from the preview actor to the archetype, and then on to any instances whose properties are at the default value.
- The above feature required a breaking change to USplineComponent - namely, the three FInterpCurve properties have been collected together into a struct and added as a single property. This is so that changes to the length of one of the FInterpCurves marks all three as dirty and needing rebuilding.
- Added a custom version for SplineComponent and provded serialization fixes.
- Added a details customization to SplineComponent to hide the raw FInterpCurve properties.
- Added a custom detail builder category which polls the SplineComponentVisualizer each tick and provides numerical editing for spline points which are selected in the visualizer.
- Relaxed the limitation that SplineComponent keys need to have an increment of 1.0. Now any SplineComponent key can be set. The details customization enforces that the sequence remains strictly ascending.
- Allowed an explicit loop point to be specified for closed splines.
- Allowed discontinuous splines by no longer forcing the ArriveTangent and LeaveTangent to be equal.
- Added some new Blueprintable methods for building splines with an FSplinePoint struct, which allows all of a spline point's properties to be specified, and added to the FInterpCurves sorted by the input key.
- Fixed the logic which determines whether the UCS has modified the spline curves.
- Added UActorComponent::RemoveUCSModifiedProperties, which allows a component to remove any properties from the cached list which it doesn't want to be considered as 'modified'. This is used to distinguish the case of properties preserved by the SplineInstanceDataCache from those genuinely modified by the UCS.
- Fixed "Apply Instance Changes to Blueprint" so that edited spline data can be applied to the archetype.
- Fixed some issues with the spline component visualizer to make it generate appropriate up vectors if scale and rotation are enabled.
#jira UETOOL-766 - Spline tool improvements
#jira UE-33049 - Transform widget visible in blueprint viewport when editing spline points in editor viewport
#jira UE-9062 - Spline editing: It would be nice to be able to type in a specific value for a point
#jira UE-7476 - Add ability to edit SplineComponent in BP editor (not just instance in level)
#jira UE-13082 - Users would like a snapping feature for splines
#jira UE-13568 - Additional Spline Component Functionality
#jira UE-17822 - It would be useful to be able to update a bp spline layout from the editor viewport.
Change 3057895 on 2016/07/20 by Richard.TalbotWatkin
Mesh paint bugfixes and improvements.
Changes to RerunConstructionScript so that OnObjectsReplaced is called correctly on all components, whether they have been created by the SCS or the UCS. Previously, components created by the UCS were not being handled, and components created by the SCS were not always being matched. Now a serialized index is maintained for UCS-created objects, which is matched after the construction scripts have been executed.
This will fix issues with the mesh paint tool, and any other editor tool which hooks into the OnObjectsReplaced callback in order to update its internal cache of component pointers, for example, the component visualizer render list.
#jira UE-33010 - Crash changing mesh paint material in blueprint, then changing to a different mode tab
#jira UE-32279 - Editor crashes when reselecting a mesh in paint mode
#jira UE-31763 - [CrashReport] UE4Editor_MeshPaint!FMulticastDelegateBase<FWeakObjectPtr>::RemoveAll() [multicastdelegatebase.h:75]
#jira UE-30661 - Vertex Painting changes collision complexity if the asset is saved while vertex painting
Change 3057966 on 2016/07/20 by Richard.TalbotWatkin
Renamed IsEditingArchetype to IsVisualizingArchetype in the ComponentVisualizer API.
#jira UE-33049 - Transform widget visible in blueprint viewport when editing spline points in editor viewport
Change 3058009 on 2016/07/20 by Richard.TalbotWatkin
Fixed build failure due to changes to FComponentVisualizer API, as of CL 3057868.
Change 3058047 on 2016/07/20 by Stephan.Jiang
Fixing error on previous CL: 3056758
(extra qualification)
Change 3058266 on 2016/07/20 by Nick.Darnell
Automation - Work continues on automation integrating some ideas form a licensee. Continuing to work on the usability aspects, I've made it possible for tests to provide custom open commands, as well as have complex subclasses that do different things. The functional tests now have a custom open command they emit that makes it so clicking on a test opens not the C++ location where the functional test macro lives, but instead the map, AND focuses the functional test actor.
Change 3058282 on 2016/07/20 by Matt.Kuhlenschmidt
PR #2611: Fix spurious component diff when properties are in subcategories (Contributed by CA-ADuran)
Change 3059214 on 2016/07/21 by Richard.TalbotWatkin
Further fixes to visualizers following Component Visualizer API change.
Change 3059260 on 2016/07/21 by Richard.TalbotWatkin
Template specialization not allowed in class scope, but Visual Studio allows it anyway. Fixed for clang.
Change 3059543 on 2016/07/21 by Stephan.Jiang
Changeing level details icon
Change 3059732 on 2016/07/21 by Stephan.Jiang
Directional Light icon update
Change 3060095 on 2016/07/21 by Stephan.Jiang
Directional Light editor icon asset changed
Change 3060129 on 2016/07/21 by Nick.Darnell
Automation - The session browser now attempts to select the app instance if no other thing is selected when it refreshes. This is to try and make it easier to use when you first bring it up and nothing is selected when most of the time you're going to use it on your own instance.
Change 3061735 on 2016/07/22 by Stephan.Jiang
Improve UMG replace with in HierarchyView function
#UE-33582
Change 3062059 on 2016/07/22 by Stephan.Jiang
Strip off "b" in propertyname in replace with function for tracks.
Change 3062146 on 2016/07/22 by Stephan.Jiang
checkin with CL: 3061735
Change 3062182 on 2016/07/22 by Stephan.Jiang
Change both animation bindings' widget name when renameing the widget so the slot content is still valid
Change 3062257 on 2016/07/22 by Stephan.Jiang
comments
Change 3062381 on 2016/07/22 by Nick.Darnell
Build - Adding #undef LOCTEXT_NAMESPACE to try and fix the build.
Change 3062924 on 2016/07/25 by Chris.Wood
Fix a crash in CrashReportClient that happens when the CrashReportReceiver is not responding to pings and there are no PendingReportDirectories.
This is a change in the UE4 stream depot based on a fix in the Fortnite stream depot -> JIRA FORT-27570
Change 3063017 on 2016/07/25 by Matt.Kuhlenschmidt
PR #2618: DebuggerCommand not recording PlayLocationString (Contributed by ungalyant)
Change 3063021 on 2016/07/25 by Matt.Kuhlenschmidt
PR #2619: added a search box to ModuleUI (Contributed by straymist)
Change 3063084 on 2016/07/25 by Matt.Kuhlenschmidt
Fix "YesToAll" when deleting referenced actors overriding the "YesToAll" state for other referenced messages.
https://jira.ol.epicgames.net/browse/UE-33651
#jira UE-33651
Change 3063091 on 2016/07/25 by Alex.Delesky
#jira UE-32949 - Truncating the hue inside the theme color block tooltip to only display whole numbers, to match how the color picker displays the hue value inside the hue scrubber.
Change 3063388 on 2016/07/25 by Matt.Kuhlenschmidt
Selection Perf:
- Fix large FName creation time when selecting thousands of objects
Change 3063568 on 2016/07/25 by Matt.Kuhlenschmidt
Selection Perf:
- Modified how USelection stores classes. Classes are now in a TSet and can be accessed efficiently using IsClassSelected. The old unused way of checking if a selection has a class by iterating through them is deprecated
- USelection no longer directly checks if an item is already selected with a costly n^2 search. The check is done by using the already existing UObject selected annotation
- Object property nodes no longer perform an n^2 check for object uniqueness when objects are added to details panels. This is now left up to the caller to avoid
- Eliminated useless work on FObjectPropertyNode::GetReadAddressUncached. If a read address list is not passed in we'll not attempt to the work to populate it
- Removed expensive checking for brush actors when any actor is selected
Change 3063749 on 2016/07/25 by Stephan.Jiang
Disallow naming the widgetanimation to the same name with a override function in uuserwidget, because it will trigger a breakpoint in Rename()
#jira UE-33711
Change 3064585 on 2016/07/26 by Matt.Kuhlenschmidt
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 3064612 on 2016/07/26 by Alex.Delesky
#jira UE-33712 - Deleting many assets at once will now batch SourceControl commands rather than executing one for each asset.
Change 3064647 on 2016/07/26 by Alexis.Matte
#jira UE-33274 dont hash the same file over and over when importing multiple asset from one fbx file.
Change 3064739 on 2016/07/26 by Matt.Kuhlenschmidt
Fixed typo
Change 3064795 on 2016/07/26 by Jamie.Dale
Fixed typo in FLocalizationModule::GetLocalizationTargetByName
#jira UE-32961
Change 3066461 on 2016/07/27 by Jamie.Dale
Enabled stable localization keys
Change 3066463 on 2016/07/27 by Jamie.Dale
Set "Build Engine Localization" to upload all cultures to ensure we don't lose translation due to the archive keying changes
Change 3066467 on 2016/07/27 by Jamie.Dale
Updated internationalization archives to store translations per-identity
This allows translators to translate each instance of a piece of text based upon their context, rather than requiring a content producer to go back and give the entry a unique namespace. It also allows us to optionally compile out-of-date translations, as they are now mapped to their source identity (namespace + key) rather than their source text.
Major changes:
- Added FLocTextHelper. This acts as a high-level API for uncompiled localized text, and replaces all the old ad-hoc loading/saving of manifests and archives, ensuring that everything is consistently using source control, and that older archives can be upgraded correctly to the new format. It also takes care of some of the quirks of our archives, such as native translations. All major localization commandlets have been updated to use FLocTextHelper.
- Moved FTextLocalizationResourceGenerator from Core to Internationalization. This also allows IJsonInternationalizationManifestSerializer and IJsonInternationalizationArchiveSerializer to be removed, and for FJsonInternationalizationManifestSerializer and FJsonInternationalizationArchiveSerializer to have all their functions become static.
- FTextLocalizationResourceGenerator being moved from Core meant that FTextLocalizationManager::LoadFromManifestAndArchives was also removed. This functionality is now handled by FTextLocalizationResourceGenerator::GenerateAndUpdateLiveEntriesFromConfig.
- The RepairLocalizationData commandlet has been removed. This existed to fix a change that pre-dated 4.0 so no such data should exist in the wild, and the commandlet couldn't be updated to work with the new API (we handle format upgrades in-place now).
- Removed FInternationalizationArchive::FindEntryBySource as it is no-longer safe to use. All existing code has been updated to use FInternationalizationArchive::FindEntryByKey instead.
Workflow changes:
- Archive conditioning now only adds new entries if they don't exist in the archive. This allows us to persist any existing translations, even if they're for old source text (caveat: native archives still update existing entries if the source is changed).
- PO export now sets the msgctx for each entry to be "namespace,key", rather than only doing it when the entry had key meta-data.
- PO import will now update both the source and translation stored in the archive to match the current PO data. This is the primary method by which stale source->translation pairs are updated.
- LocRes compilation may now optionally compile stale translations. There's an option controlling this (defaulted to off) that can be changed via the Localization Dashboard (or added to an existing config file).
Format changes:
- The archive version was bumped to 2.
- Archive entries now use the "Key" entry to store the key from the source text. Previously this "Key" entry was used to store the key meta-data, but that now exists within a "MetaData" sub-object. Loading handles this correctly based upon the archive version.
#jira UETOOL-897
#jira UETOOL-898
#jira UE-29481
Change 3066487 on 2016/07/27 by Matt.Kuhlenschmidt
Attempt to fix linux compilation
Change 3066504 on 2016/07/27 by Matt.Kuhlenschmidt
Fixed data tables with structs crashing due to recent editor selection optimizations
Change 3066886 on 2016/07/27 by Jamie.Dale
Added required data to accurately detect TZ (needed for DST)
#jira UE-28511
Change 3067122 on 2016/07/27 by Jamie.Dale
Added AsTime, AsDateTime, and AsDate overrides to BP to let you format a UTC time in a given timezone (default is the local timezone).
Previously you could only format times using the "invariant" timezone, which assumed that the time was already specified in the correct timezone for display.
Change 3067227 on 2016/07/27 by Jamie.Dale
Added a test to verify that the ICU timezone is set correctly to produce local time (including DST)
Change 3067313 on 2016/07/27 by Richard.TalbotWatkin
Fixed SplineComponent constructor so that old assets (prior to the property changes) load correctly if they had properties at default values.
#jira UE-33669 - Crash in Dev-Editor
Change 3067736 on 2016/07/27 by Stephan.Jiang
Border changes for experimental classes warning
Change 3067769 on 2016/07/27 by Stephan.Jiang
HERE BE DRAGONS
for experimental class warning
#UE-33780
Change 3068192 on 2016/07/28 by Alexis.Matte
#jira UE-33586 make sure we remove any false warning when running fbx automation test.
Change 3068264 on 2016/07/28 by Jamie.Dale
Removed some code that was no longer needed and could cause a crash
#jira UE-33342
Change 3068293 on 2016/07/28 by Alex.Delesky
#jira UE-33620 - Comments on constant and parameter nodes in the Material Editor will now persist when converting them.
Change 3068481 on 2016/07/28 by Stephan.Jiang
Adding Options to show/hide soft & hard references & dependencies in References Viewer
#jira UE-33746
Change 3068585 on 2016/07/28 by Richard.TalbotWatkin
Fix to Spline Mesh collision building so that geometry does not default to being auto-inflated in PhysX.
Change 3068701 on 2016/07/28 by Matt.Kuhlenschmidt
Fixed some issues with the selected classes not updating when objects are deselected
Change 3069335 on 2016/07/28 by Jamie.Dale
Fixed unintended error when trying to load a manifest/archive that didn't exist
Fixed a warning when trying to load a PO file that didn't exist
Change 3069408 on 2016/07/28 by Alex.Delesky
#jira UE-33429 - The editor should no longer hit an ensure if the user attempts to drop a tab into a tab well before the tab well has a chance to acknowledge its been dragged into a tab well.
Change 3069878 on 2016/07/29 by Jamie.Dale
Fixed include casing
#jira UE-33910
Change 3071807 on 2016/08/01 by Matt.Kuhlenschmidt
PR #2654: Fix the spell'ing of "diff'ing" and "diff'd". (Contributed by geary)
Change 3071813 on 2016/08/01 by Jamie.Dale
Fixed include casing
#jira UE-33936
Change 3072043 on 2016/08/01 by Jamie.Dale
Fixed FText formatting of pre-Gregorian dates
We now convert to an ICU UDate via an ICU GregorianCalendar, as UE4 and ICU have a different time scale for pre-Gregorian dates.
#jira UE-14504
Change 3072066 on 2016/08/01 by Jamie.Dale
PR #2590: FEATURE: Collapse/expand folders in the outliner (Contributed by projectgheist)
Change 3072149 on 2016/08/01 by Jamie.Dale
We no longer use the editor culture when running with -game
Change 3072169 on 2016/08/01 by Richard.TalbotWatkin
A couple of changes to the BSP code:
* Fixed longstanding issue where sometimes BSP geometry is not rebuilt correctly after editing it. This was due to poly normals not being recalculated after translating vertices in Geometry Mode.
* Fixed corruption to FPoly::iLink as it is overloaded to have two meanings: when building BSP, it represents the surface index of the next coplanar surface (and adding a new BSP node uses this to determine whether a new surface needs to be added or not). In other operations it represents an FPoly index, in general this is used more in editor geometry operations. This fixes various crashes which arose from rebuilding BSP resulting in invalid FPoly indices.
#jira UE-12157 - BSP brushes break when non-standard subtractive bsp brushes are used
#jira UE-32087 - Crash occurs when creating Static Mesh from Trigger Volume
Change 3072221 on 2016/08/01 by Jamie.Dale
Fixed "Launch On" not providing the correct cultures to StartCookByTheBookInEditor
#jira UE-33001
Change 3073389 on 2016/08/02 by Matt.Kuhlenschmidt
Added ability to vsync the editor. Disabled by default. Set r.VSyncEditor to 1 to enable it.
Reimplemented this change from the siggraph demo stream
Change 3073396 on 2016/08/02 by Matt.Kuhlenschmidt
Removed unused code as suggested by a pull request
Change 3073750 on 2016/08/02 by Richard.TalbotWatkin
Fixed formatting (broken in CL 3057895) in anticipation of merge from Main.
Change 3073789 on 2016/08/02 by Jamie.Dale
Added a way to mark text in text properties as culture invariant
This allows you to flag properties containing text that doesn't need to be gathered.
#jira UE-33713
Change 3073825 on 2016/08/02 by Stephan.Jiang
Material Editor: Highligh all Nodes connect to an input.
#jira UE-32502
Change 3073947 on 2016/08/02 by Stephan.Jiang
UMG Project settings to show/hide different classes and categories in Palette view.
--under Project Settings ->Editor->UMG Editor
Change 3074012 on 2016/08/02 by Stephan.Jiang
Minor changes and comments for CL: 3073947
Change 3074029 on 2016/08/02 by Jamie.Dale
Deleting folders in the Content Browser now removes the folder from disk
#jira UE-24303
Change 3074054 on 2016/08/02 by Matt.Kuhlenschmidt
Added missing stats to track pooled vertex and index buffer cpu memory
A new slate allocator was added to track memory usage for this case.
Change 3074056 on 2016/08/02 by Matt.Kuhlenschmidt
Renamed a few slate stats for consistency
Change 3074810 on 2016/08/02 by Matt.Kuhlenschmidt
Moved geometry cache asset type to the animation category. It is not a basic asset type
Change 3074826 on 2016/08/02 by Matt.Kuhlenschmidt
Fix a few padding and sizing issues
Change 3075322 on 2016/08/03 by Matt.Kuhlenschmidt
Settings UI improvements
* Added the ability to search through all settings at once
* Settings files which are not checked out are no longer grayed out. The editor now attempts to check out the file automatically if connected to source control and if that fails it marks the settings file writiable so it can save the setting properly
-------
* This change adds a refactor to the details panel to support multiple top level objects existing in the details panel at once instead of combining all passed in objects to a single common base class. This is disabled by default but can be turned on setting bAllowMultipleTopLevelObjects to true in FDetailsViewArgs when creating a details panel.
* Each top level object in a details panel will get their own customization instance. This made it necessary to deprecate a IDetailsView::GetBaseClass since there is no longer guaranteed to be one base class.
*Details panels can have their own customization for each "root object header" in order to customize the look of having multiple top level objects in the details panel.
Change 3075369 on 2016/08/03 by Matt.Kuhlenschmidt
Removed FBX scene as a top level option in asset filter menu in the content browser.
Change 3075556 on 2016/08/03 by Matt.Kuhlenschmidt
Mac warning fix
Change 3075603 on 2016/08/03 by Nick.Darnell
Adding two new plugins to engine, one for editor and one for runtime based testing. Currently the only consumer of these plugins is going to be the EngineTest project.
Change 3075605 on 2016/08/03 by Nick.Darnell
Functional Testing - Continued work on cleanup, reorganization, trying to improve the workflow for using the session browser.
Change 3076084 on 2016/08/03 by Jamie.Dale
Added basic support for localizing plugins
You can now localize plugins! There's no localization dashboard integration for this so it has to be done manually.
You need to define the localization targets your plugin uses in its .uplugin file, eg)
"LocalizationTargets": [
{
"Name": "Paper2D",
"LoadingPolicy": "Always"
}
]
"Name" should match a localization config under the Config/Localization folder for your plugin. These configs are set-up the same as any other localization config.
"LoadingPolicy" may be one of Never, Always, Editor, Game, PropertyNames, or ToolTips. This allows you to control under what conditions your localizations should be loaded (eg, if your plugin has both game and editor data, you can separate the editor data off into its own localization target that's only loaded by the editor).
UAT has been updated to support gathering from plugins. You can use the "IncludePlugins" flag to have it gather all plugins, or you can specify a whitelist of plugins to gather as an argument to "IncludePlugins", or alternatively, may blacklist certain plugins via "ExcludePlugins". It can now also support out-of-source gathering via the "UEProjectRoot" argument (previously it assumed that everything would be under the UE4 install/checkout directory).
UAT has been updated to support staging plugin LocRes files. It will stage any plugin targets that are enabled for a game/client build, and are also from a plugin that's enabled for your project.
#jira UE-4217
Change 3076123 on 2016/08/03 by Stephan.Jiang
Extend "Select all input nodes" function to general blueprint editor
Change 3077103 on 2016/08/04 by Jamie.Dale
Added support for underlined text rendering (including with drop-shadows)
FTextBlockStyle can now specify a brush to use to draw an underline for text (a suitable default would be "DefaultTextUnderline" from FCoreStyle). When a brush is specified here, we inject FSlateTextUnderlineLineHighlighter highlights into the text layout to draw the underline under the relevant pieces of text, using the correct color, position, and thickness.
FSlateFontCache::GetUnderlineMetrics and FSlateFontRenderer::GetUnderlineMetrics have been added to handle getting the underline metrics (which are slightly different to the baseline).
This change also adds FTextLayout::RemoveRunRenderer and FTextLayout::RemoveLineHighlight to fix some bad assumptions that FSlateEditableTextLayout and FTextBlockLayout were making about ownership of run renderers and line highlighters that could cause them to remove instances they didn't own (such as the new underline highlighter) when updating things like the cursor position or highlight.
Change 3077842 on 2016/08/04 by Jamie.Dale
Fixed fallout from API changes
Change 3077999 on 2016/08/04 by Jamie.Dale
Ensured that BULKDATA_SingleUse is only set by UFontBulkData::Serialize when loading
This prevents it being incorrectly set by other operations, such as counting memory used by font data.
#jira UE-34252
Change 3078000 on 2016/08/04 by Trung.Le
Categories VREditor-specific UMG widget assets as "VR Editor"
#jira UE-34134
Change 3078056 on 2016/08/04 by Nick.Darnell
Build - Fixing a mac compiler warning, reodering constructor initializers.
Change 3078813 on 2016/08/05 by Nick.Darnell
Reorganizing editor tests, establishing plugins in the EditorTest project that will house the tests.
Change 3078818 on 2016/08/05 by Nick.Darnell
Additional rename and cleanup associated with test moving.
Change 3078819 on 2016/08/05 by Nick.Darnell
Removing the Oculus performance automation test, not running, and was unclaimed.
Change 3078842 on 2016/08/05 by Nick.Darnell
Continued reorganizing tests.
Change 3078897 on 2016/08/05 by Nick.Darnell
Additional changes to get some moved tests compiling
Change 3079157 on 2016/08/05 by Nick.Darnell
Making it possible to browse provider names thorugh the source control module interface.
Change 3079176 on 2016/08/05 by Stephan.Jiang
Add shortcut Ctrl+Shift+Space to rotate through different viewport options
#jira UE-34140
Change 3079208 on 2016/08/05 by Stephan.Jiang
Fix new animation name check in UMG
Change 3079278 on 2016/08/05 by Nick.Darnell
Fixing the build
Change 3080555 on 2016/08/08 by Matt.Kuhlenschmidt
Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
Change 3081155 on 2016/08/08 by Nick.Darnell
Fixing some issues with the editor tests / runtime tests under certain build configs.
Change 3081243 on 2016/08/08 by Stephan.Jiang
Add gesture in LevelViewport to switch between Top/Bottom...etc.
Change 3082226 on 2016/08/09 by Matt.Kuhlenschmidt
Work around animations not playing in paragon due to bsp rebuilds (UE-34391)
Change 3082254 on 2016/08/09 by Stephan.Jiang
DragTool_ViewportChange init changes
[CL 3082411 by Matt Kuhlenschmidt in Main branch]
2016-08-09 11:28:56 -04:00
void FSourceControlModule : : GetProviderNames ( TArray < FName > & OutProviderNames )
{
OutProviderNames . Reset ( ) ;
int32 ProviderCount = GetNumSourceControlProviders ( ) ;
for ( int32 ProviderIndex = 0 ; ProviderIndex < ProviderCount ; ProviderIndex + + )
{
FName ProviderName = GetSourceControlProviderName ( ProviderIndex ) ;
OutProviderNames . Add ( ProviderName ) ;
}
}
2014-03-14 14:13:41 -04:00
void FSourceControlModule : : Tick ( )
2022-09-01 12:40:50 -04:00
{
if ( CurrentSourceControlProvider ! = nullptr )
2014-03-14 14:13:41 -04:00
{
2015-06-11 08:24:31 -04:00
ISourceControlProvider & Provider = GetProvider ( ) ;
// tick the provider, so any operation results can be read back
Provider . Tick ( ) ;
2021-08-31 15:12:47 -04:00
AssetDataCache . Tick ( ) ;
2015-06-11 08:24:31 -04:00
// don't allow background status updates when temporarily disabled for login
2022-09-01 12:40:50 -04:00
if ( ! bTemporarilyDisabled )
2014-03-14 14:13:41 -04:00
{
2015-06-11 08:24:31 -04:00
// check for any pending dispatches
2022-09-01 12:40:50 -04:00
if ( PendingStatusUpdateFiles . Num ( ) > 0 )
2014-03-14 14:13:41 -04:00
{
2015-06-11 08:24:31 -04:00
// grab a batch of files
TArray < FString > FilesToDispatch ;
2022-09-01 12:40:50 -04:00
FilesToDispatch . Reserve ( SourceControlConstants : : MaxStatusDispatchesPerTick ) ;
for ( const FString & Filename : PendingStatusUpdateFiles )
2014-03-14 14:13:41 -04:00
{
2015-06-11 08:24:31 -04:00
if ( FilesToDispatch . Num ( ) > = SourceControlConstants : : MaxStatusDispatchesPerTick )
{
break ;
}
2022-09-01 12:40:50 -04:00
FilesToDispatch . Add ( Filename ) ;
2014-03-14 14:13:41 -04:00
}
2022-09-01 12:40:50 -04:00
if ( FilesToDispatch . Num ( ) > 0 )
2015-06-11 08:24:31 -04:00
{
// remove the files we are dispatching so we don't try again
PendingStatusUpdateFiles . RemoveAt ( 0 , FilesToDispatch . Num ( ) ) ;
2014-03-14 14:13:41 -04:00
2015-06-11 08:24:31 -04:00
// dispatch update
Provider . Execute ( ISourceControlOperation : : Create < FUpdateStatus > ( ) , FilesToDispatch , EConcurrency : : Asynchronous ) ;
}
2014-03-14 14:13:41 -04:00
}
}
}
}
void FSourceControlModule : : QueueStatusUpdate ( const TArray < UPackage * > & InPackages )
{
2022-09-01 12:40:50 -04:00
if ( IsEnabled ( ) )
2014-03-14 14:13:41 -04:00
{
2022-09-01 12:40:50 -04:00
for ( UPackage * Package : InPackages )
2014-03-14 14:13:41 -04:00
{
2022-09-01 12:40:50 -04:00
QueueStatusUpdate ( Package ) ;
2014-03-14 14:13:41 -04:00
}
}
}
void FSourceControlModule : : QueueStatusUpdate ( const TArray < FString > & InFilenames )
{
2022-09-01 12:40:50 -04:00
if ( IsEnabled ( ) )
2014-03-14 14:13:41 -04:00
{
2022-09-01 12:40:50 -04:00
for ( const FString & Filename : InFilenames )
2014-03-14 14:13:41 -04:00
{
2022-09-01 12:40:50 -04:00
QueueStatusUpdate ( Filename ) ;
2014-03-14 14:13:41 -04:00
}
}
}
void FSourceControlModule : : QueueStatusUpdate ( UPackage * InPackage )
{
2022-09-01 12:40:50 -04:00
if ( IsEnabled ( ) )
2014-03-14 14:13:41 -04:00
{
QueueStatusUpdate ( SourceControlHelpers : : PackageFilename ( InPackage ) ) ;
}
}
void FSourceControlModule : : QueueStatusUpdate ( const FString & InFilename )
{
2022-09-01 12:40:50 -04:00
if ( IsEnabled ( ) )
2014-03-14 14:13:41 -04:00
{
TSharedPtr < ISourceControlState , ESPMode : : ThreadSafe > SourceControlState = GetProvider ( ) . GetState ( InFilename , EStateCacheUsage : : Use ) ;
2022-09-01 12:40:50 -04:00
if ( SourceControlState . IsValid ( ) )
2014-03-14 14:13:41 -04:00
{
2014-04-23 19:31:56 -04:00
FTimespan TimeSinceLastUpdate = FDateTime : : Now ( ) - SourceControlState - > GetTimeStamp ( ) ;
2022-09-01 12:40:50 -04:00
if ( TimeSinceLastUpdate > SourceControlConstants : : StateRefreshInterval )
2014-04-23 19:31:56 -04:00
{
PendingStatusUpdateFiles . AddUnique ( InFilename ) ;
}
2014-03-14 14:13:41 -04:00
}
}
}
bool FSourceControlModule : : IsEnabled ( ) const
{
return ! bTemporarilyDisabled & & GetProvider ( ) . IsEnabled ( ) ;
}
ISourceControlProvider & FSourceControlModule : : GetProvider ( ) const
{
return * CurrentSourceControlProvider ;
}
2022-03-09 07:10:46 -05:00
TUniquePtr < ISourceControlProvider > FSourceControlModule : : CreateProvider ( const FName & ProviderName , const FStringView & OwnerName , const FSourceControlInitSettings & InitialSettings ) const
{
TArray < ISourceControlProvider * > Providers = IModularFeatures : : Get ( ) . GetModularFeatureImplementations < ISourceControlProvider > ( SourceControlFeatureName ) ;
for ( const ISourceControlProvider * DefaultProvider : Providers )
{
if ( DefaultProvider - > GetName ( ) = = ProviderName )
{
return DefaultProvider - > Create ( OwnerName , InitialSettings ) ;
}
}
// Provider was not found
return TUniquePtr < ISourceControlProvider > ( ) ;
}
2021-08-31 15:12:47 -04:00
FSourceControlAssetDataCache & FSourceControlModule : : GetAssetDataCache ( )
{
return AssetDataCache ;
}
2014-03-14 14:13:41 -04:00
void FSourceControlModule : : SetProvider ( const FName & InName )
{
2014-08-05 10:29:53 -04:00
TArray < ISourceControlProvider * > Providers = IModularFeatures : : Get ( ) . GetModularFeatureImplementations < ISourceControlProvider > ( SourceControlFeatureName ) ;
2014-03-14 14:13:41 -04:00
for ( auto It ( Providers . CreateIterator ( ) ) ; It ; It + + )
{
ISourceControlProvider * Provider = * It ;
if ( InName = = Provider - > GetName ( ) )
{
SetCurrentSourceControlProvider ( * Provider ) ;
return ;
}
}
2022-11-23 11:57:50 -05:00
UE_LOG ( LogSourceControl , Fatal , TEXT ( " Tried to set unknown revision control provider: %s " ) , * InName . ToString ( ) ) ;
2014-03-14 14:13:41 -04:00
}
void FSourceControlModule : : ClearCurrentSourceControlProvider ( )
{
2015-07-03 12:45:48 -04:00
if ( ! CurrentSourceControlProvider | | CurrentSourceControlProvider ! = & DefaultSourceControlProvider )
2014-03-14 14:13:41 -04:00
{
2015-07-03 12:45:48 -04:00
ISourceControlProvider * OldSourceControlProvider = CurrentSourceControlProvider ;
if ( CurrentSourceControlProvider )
{
CurrentSourceControlProvider - > Close ( ) ;
}
2014-03-14 14:13:41 -04:00
CurrentSourceControlProvider = & DefaultSourceControlProvider ;
2015-07-03 12:45:48 -04:00
if ( OldSourceControlProvider )
{
OnSourceControlProviderChanged . Broadcast ( * OldSourceControlProvider , * CurrentSourceControlProvider ) ;
}
2014-03-14 14:13:41 -04:00
}
}
int32 FSourceControlModule : : GetNumSourceControlProviders ( )
{
2014-08-05 10:29:53 -04:00
return IModularFeatures : : Get ( ) . GetModularFeatureImplementationCount ( SourceControlFeatureName ) ;
2014-03-14 14:13:41 -04:00
}
void FSourceControlModule : : SetCurrentSourceControlProvider ( int32 ProviderIndex )
{
2014-08-05 10:29:53 -04:00
TArray < ISourceControlProvider * > Providers = IModularFeatures : : Get ( ) . GetModularFeatureImplementations < ISourceControlProvider > ( SourceControlFeatureName ) ;
2014-03-14 14:13:41 -04:00
check ( Providers . IsValidIndex ( ProviderIndex ) ) ;
SetCurrentSourceControlProvider ( * Providers [ ProviderIndex ] ) ;
}
void FSourceControlModule : : SetCurrentSourceControlProvider ( ISourceControlProvider & InProvider )
{
// see if we are switching or not
if ( & InProvider = = CurrentSourceControlProvider )
{
return ;
}
ClearCurrentSourceControlProvider ( ) ;
2015-07-03 12:45:48 -04:00
ISourceControlProvider * OldSourceControlProvider = CurrentSourceControlProvider ;
2014-03-14 14:13:41 -04:00
CurrentSourceControlProvider = & InProvider ;
CurrentSourceControlProvider - > Init ( false ) ; // Don't force a connection here, as its synchronous. Let the user establish a connection.
SourceControlSettings . SetProvider ( CurrentSourceControlProvider - > GetName ( ) . ToString ( ) ) ;
SaveSettings ( ) ;
2015-07-03 12:45:48 -04:00
if ( OldSourceControlProvider )
{
OnSourceControlProviderChanged . Broadcast ( * OldSourceControlProvider , * CurrentSourceControlProvider ) ;
}
2014-03-14 14:13:41 -04:00
}
FName FSourceControlModule : : GetSourceControlProviderName ( int32 ProviderIndex )
{
2014-08-05 10:29:53 -04:00
TArray < ISourceControlProvider * > Providers = IModularFeatures : : Get ( ) . GetModularFeatureImplementations < ISourceControlProvider > ( SourceControlFeatureName ) ;
2014-03-14 14:13:41 -04:00
check ( Providers . IsValidIndex ( ProviderIndex ) ) ;
return Providers [ ProviderIndex ] - > GetName ( ) ;
}
TSharedPtr < class SSourceControlLogin > FSourceControlModule : : GetLoginWidget ( ) const
{
return SourceControlLoginPtr ;
}
2014-08-05 10:29:53 -04:00
void FSourceControlModule : : HandleModularFeatureRegistered ( const FName & Type , IModularFeature * ModularFeature )
2014-03-14 14:13:41 -04:00
{
2014-08-05 10:29:53 -04:00
if ( Type = = SourceControlFeatureName )
2014-03-14 14:13:41 -04:00
{
InitializeSourceControlProviders ( ) ;
}
}
2014-08-05 10:29:53 -04:00
void FSourceControlModule : : HandleModularFeatureUnregistered ( const FName & Type , IModularFeature * ModularFeature )
{
if ( Type = = SourceControlFeatureName & & CurrentSourceControlProvider = = static_cast < ISourceControlProvider * > ( ModularFeature ) )
{
ClearCurrentSourceControlProvider ( ) ;
}
}
2024-06-25 10:55:58 -04:00
# if WITH_EDITOR
void FSourceControlModule : : OnAssetsCanDelete ( const TArray < UObject * > & InObjects , FCanDeleteAssetResult & OutCanDeleteAssetResult ) const
{
ISourceControlProvider & SourceControlProvider = GetProvider ( ) ;
if ( IsEnabled ( ) & & SourceControlProvider . IsAvailable ( ) )
{
TArray < FString > PackagesNames ;
PackagesNames . Reserve ( InObjects . Num ( ) ) ;
for ( UObject * Object : InObjects )
{
if ( Object )
{
if ( UPackage * ObjectPackage = Object - > GetPackage ( ) )
{
FString PackageFilename ;
if ( FPackageName : : DoesPackageExist ( ObjectPackage - > GetName ( ) , & PackageFilename ) )
{
PackagesNames . Add ( PackageFilename ) ;
}
}
}
}
TArray < FSourceControlStateRef > PackageSCCStates ;
if ( PackagesNames . Num ( ) )
{
SourceControlProvider . GetState ( PackagesNames , PackageSCCStates , EStateCacheUsage : : ForceUpdate ) ;
}
for ( const FSourceControlStateRef & SCCState : PackageSCCStates )
{
if ( SCCState - > IsSourceControlled ( ) )
{
if ( ! SCCState - > CanDelete ( ) )
{
OutCanDeleteAssetResult . Set ( false ) ;
UE_LOG ( LogSourceControl , Warning , TEXT ( " Asset(s) can't be deleted because at least one is currently checked out by another user and/or not at latest. " ) ) ;
return ;
}
}
}
}
}
# endif
2014-03-14 14:13:41 -04:00
bool FSourceControlModule : : GetUseGlobalSettings ( ) const
{
return SourceControlSettings . GetUseGlobalSettings ( ) ;
}
void FSourceControlModule : : SetUseGlobalSettings ( bool bIsUseGlobalSettings )
{
SourceControlSettings . SetUseGlobalSettings ( bIsUseGlobalSettings ) ;
// force the user to re-log in
ShowLoginDialog ( FSourceControlLoginClosed ( ) , ELoginWindowMode : : Modeless , EOnLoginWindowStartup : : PreserveProvider ) ;
}
2024-03-22 10:11:07 -04:00
FSourceControlProviderChanging & FSourceControlModule : : GetSourceControlProviderChanging ( )
{
return OnSourceControlProviderChanging ;
}
2015-07-03 12:45:48 -04:00
FDelegateHandle FSourceControlModule : : RegisterProviderChanged ( const FSourceControlProviderChanged : : FDelegate & SourceControlProviderChanged )
{
return OnSourceControlProviderChanged . Add ( SourceControlProviderChanged ) ;
}
void FSourceControlModule : : UnregisterProviderChanged ( FDelegateHandle Handle )
{
OnSourceControlProviderChanged . Remove ( Handle ) ;
}
2021-02-04 11:50:49 -04:00
void FSourceControlModule : : RegisterPreSubmitDataValidation ( const FSourceControlPreSubmitDataValidationDelegate & PreSubmitDataValidationDelegate )
{
OnSourceControlPreSubmitDataValidation = PreSubmitDataValidationDelegate ;
}
void FSourceControlModule : : UnregisterPreSubmitDataValidation ( )
{
OnSourceControlPreSubmitDataValidation = FSourceControlPreSubmitDataValidationDelegate ( ) ;
}
FSourceControlPreSubmitDataValidationDelegate FSourceControlModule : : GetRegisteredPreSubmitDataValidation ( )
{
return OnSourceControlPreSubmitDataValidation ;
}
2021-10-27 15:14:40 -04:00
FDelegateHandle FSourceControlModule : : RegisterPreSubmitFinalize ( const FSourceControlPreSubmitFinalizeDelegate : : FDelegate & Delegate )
{
return OnPresubmitFinalize . Add ( Delegate ) ;
}
void FSourceControlModule : : UnregisterPreSubmitFinalize ( FDelegateHandle Handle )
{
OnPresubmitFinalize . Remove ( Handle ) ;
}
const FSourceControlPreSubmitFinalizeDelegate & FSourceControlModule : : GetOnPreSubmitFinalize ( ) const
{
return OnPresubmitFinalize ;
}
2022-02-10 17:08:14 -05:00
FDelegateHandle FSourceControlModule : : RegisterFilesDeleted ( const FSourceControlFilesDeletedDelegate : : FDelegate & InDelegate )
{
return OnFilesDeleted . Add ( InDelegate ) ;
}
void FSourceControlModule : : UnregisterFilesDeleted ( FDelegateHandle InHandle )
{
OnFilesDeleted . Remove ( InHandle ) ;
}
const FSourceControlFilesDeletedDelegate & FSourceControlModule : : GetOnFilesDeleted ( ) const
{
return OnFilesDeleted ;
}
2024-06-05 12:05:35 -04:00
void FSourceControlModule : : RegisterCustomProjectsDelegate ( FSourceControlCustomProjectsDelegate InCustomProjectsDelegate )
{
CustomProjectsDelegate = MoveTemp ( InCustomProjectsDelegate ) ;
}
void FSourceControlModule : : UnregisterCustomProjectsDelegate ( )
{
CustomProjectsDelegate = FSourceControlCustomProjectsDelegate ( ) ;
}
TArray < FSourceControlProjectInfo > FSourceControlModule : : GetCustomProjects ( ) const
{
return CustomProjectsDelegate . IsBound ( ) ? CustomProjectsDelegate . Execute ( ) : TArray < FSourceControlProjectInfo > ( ) ;
}
FString FSourceControlModule : : GetSourceControlProjectDir ( ) const
{
{
TArray < FSourceControlProjectInfo > CustomProjects = GetCustomProjects ( ) ;
if ( ! CustomProjects . IsEmpty ( ) )
{
return CustomProjects [ 0 ] . ProjectDirectory ;
}
}
PRAGMA_DISABLE_DEPRECATION_WARNINGS
if ( SourceControlProjectDirDelegate . IsBound ( ) )
{
FString ProjectDir = SourceControlProjectDirDelegate . Execute ( ) ;
if ( ! ProjectDir . IsEmpty ( ) )
{
return ProjectDir ;
}
}
PRAGMA_ENABLE_DEPRECATION_WARNINGS
return FPaths : : ProjectDir ( ) ;
}
PRAGMA_DISABLE_DEPRECATION_WARNINGS
2022-02-10 19:07:07 -05:00
void FSourceControlModule : : RegisterSourceControlProjectDirDelegate ( const FSourceControlProjectDirDelegate & InSourceControlProjectDirDelegate )
{
SourceControlProjectDirDelegate = InSourceControlProjectDirDelegate ;
}
void FSourceControlModule : : UnregisterSourceControlProjectDirDelegate ( )
{
SourceControlProjectDirDelegate = FSourceControlProjectDirDelegate ( ) ;
}
2022-10-18 13:16:32 -04:00
bool FSourceControlModule : : UsesCustomProjectDir ( ) const
{
2024-06-05 12:05:35 -04:00
if ( CustomProjectsDelegate . IsBound ( ) )
{
TArray < FSourceControlProjectInfo > Projects = CustomProjectsDelegate . Execute ( ) ;
if ( ! Projects . IsEmpty ( ) )
{
return true ;
}
}
else if ( SourceControlProjectDirDelegate . IsBound ( ) )
2022-10-18 13:16:32 -04:00
{
FString ProjectDir = SourceControlProjectDirDelegate . Execute ( ) ;
if ( ! ProjectDir . IsEmpty ( ) )
{
return true ;
}
}
return false ;
}
2024-06-05 12:05:35 -04:00
PRAGMA_ENABLE_DEPRECATION_WARNINGS
2022-10-18 13:16:32 -04:00
2022-10-03 20:38:09 -04:00
FSourceControlFileStatusMonitor & FSourceControlModule : : GetSourceControlFileStatusMonitor ( )
{
return * SourceControlFileStatusMonitor ;
}
2014-03-14 14:13:41 -04:00
IMPLEMENT_MODULE ( FSourceControlModule , SourceControl ) ;
# undef LOCTEXT_NAMESPACE