You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#ttp 330039 EDITOR: Platform-agnostic editor code depends on Windows-only VSAccessor headers #detail Source code access is now extensible via plugins, so any new editors can be easily added. #add Added SourceCodeAccess module that routes access via plugins. #change Moved much of the old VSAccessor code into a new VisualStudioSourceCodeAccess plugin. #add Added a counterpart XCode plugin & migrated the code from FSourceCodeNavigation (Applescript etc.) into there. #remove Removed applescript for XCode access (it is now done via code). #remove Removed source code access functionality from platform layer. #add Added details customization for source code access settings, so users can choose their own accessor. #remove Removed dependencies on VSAccessor. #change Changed API in SWidget to not require building a string to be parsed, instead this acesses and forwards filenames & line numbers. #extra Tested on Mac by Mark S. reviewed by Andrew.Brown [CL 2048697 by Thomas Sarkanen in Main branch]
134 lines
4.7 KiB
C++
134 lines
4.7 KiB
C++
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "SourceCodeAccessPrivatePCH.h"
|
|
#include "Runtime/Core/Public/Features/IModularFeatures.h"
|
|
#include "SourceCodeAccessModule.h"
|
|
#include "SourceCodeAccessSettings.h"
|
|
#include "Settings.h"
|
|
#include "SourceCodeAccess.generated.inl"
|
|
|
|
IMPLEMENT_MODULE( FSourceCodeAccessModule, SourceCodeAccess );
|
|
|
|
#define LOCTEXT_NAMESPACE "SourceCodeAccessModule"
|
|
|
|
static FName SourceCodeAccessorFeatureName(TEXT("SourceCodeAccessor"));
|
|
|
|
FSourceCodeAccessModule::FSourceCodeAccessModule()
|
|
: CurrentSourceCodeAccessor(nullptr)
|
|
{
|
|
}
|
|
|
|
void FSourceCodeAccessModule::StartupModule()
|
|
{
|
|
GetMutableDefault<USourceCodeAccessSettings>()->LoadConfig();
|
|
|
|
// Register to check for source control features
|
|
IModularFeatures::Get().OnModularFeatureRegistered().AddRaw(this, &FSourceCodeAccessModule::HandleModularFeatureRegistered);
|
|
|
|
// bind default accessor to editor
|
|
IModularFeatures::Get().RegisterModularFeature(SourceCodeAccessorFeatureName, &DefaultSourceCodeAccessor);
|
|
|
|
// Register to display our settings
|
|
ISettingsModule* SettingsModule = ISettingsModule::Get();
|
|
if (SettingsModule != nullptr)
|
|
{
|
|
SettingsModule->RegisterSettings("Editor", "General", "Source Code",
|
|
LOCTEXT("TargetSettingsName", "Source Code"),
|
|
LOCTEXT("TargetSettingsDescription", "Control how the editor accesses source code."),
|
|
GetMutableDefault<USourceCodeAccessSettings>()
|
|
);
|
|
}
|
|
}
|
|
|
|
void FSourceCodeAccessModule::ShutdownModule()
|
|
{
|
|
// Unregister our settings
|
|
ISettingsModule* SettingsModule = ISettingsModule::Get();
|
|
if (SettingsModule != nullptr)
|
|
{
|
|
SettingsModule->UnregisterSettings("Editor", "General", "Source Code");
|
|
}
|
|
|
|
// unbind default provider from editor
|
|
IModularFeatures::Get().UnregisterModularFeature(SourceCodeAccessorFeatureName, &DefaultSourceCodeAccessor);
|
|
|
|
// we don't care about modular features any more
|
|
IModularFeatures::Get().OnModularFeatureRegistered().RemoveAll(this);
|
|
}
|
|
|
|
bool FSourceCodeAccessModule::CanAccessSourceCode() const
|
|
{
|
|
return CurrentSourceCodeAccessor->CanAccessSourceCode();
|
|
}
|
|
|
|
ISourceCodeAccessor& FSourceCodeAccessModule::GetAccessor() const
|
|
{
|
|
return *CurrentSourceCodeAccessor;
|
|
}
|
|
|
|
void FSourceCodeAccessModule::SetAccessor(const FName& InName)
|
|
{
|
|
const int32 FeatureCount = IModularFeatures::Get().GetModularFeatureImplementationCount(SourceCodeAccessorFeatureName);
|
|
for(int32 FeatureIndex = 0; FeatureIndex < FeatureCount; FeatureIndex++)
|
|
{
|
|
IModularFeature* Feature = IModularFeatures::Get().GetModularFeatureImplementation(SourceCodeAccessorFeatureName, FeatureIndex);
|
|
check(Feature);
|
|
|
|
ISourceCodeAccessor& Accessor = *static_cast<ISourceCodeAccessor*>(Feature);
|
|
if(InName == Accessor.GetFName())
|
|
{
|
|
CurrentSourceCodeAccessor = static_cast<ISourceCodeAccessor*>(Feature);
|
|
FSlateApplication::Get().SetWidgetReflectorSourceAccessDelegate( FAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::OpenFileAtLine ) );
|
|
FSlateApplication::Get().SetWidgetReflectorQuerySourceAccessDelegate( FQueryAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::CanAccessSourceCode ) );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
FLaunchingCodeAccessor& FSourceCodeAccessModule::OnLaunchingCodeAccessor()
|
|
{
|
|
return LaunchingCodeAccessorDelegate;
|
|
}
|
|
|
|
FDoneLaunchingCodeAccessor& FSourceCodeAccessModule::OnDoneLaunchingCodeAccessor()
|
|
{
|
|
return DoneLaunchingCodeAccessorDelegate;
|
|
}
|
|
|
|
FLaunchCodeAccessorDeferred& FSourceCodeAccessModule::OnLaunchCodeAccessorDeferred()
|
|
{
|
|
return LaunchCodeAccessorDeferredDelegate;
|
|
}
|
|
|
|
FOpenFileFailed& FSourceCodeAccessModule::OnOpenFileFailed()
|
|
{
|
|
return OpenFileFailedDelegate;
|
|
}
|
|
|
|
void FSourceCodeAccessModule::HandleModularFeatureRegistered(const FName& Type)
|
|
{
|
|
if(Type == SourceCodeAccessorFeatureName)
|
|
{
|
|
CurrentSourceCodeAccessor = &DefaultSourceCodeAccessor;
|
|
|
|
const FString PreferredAccessor = GetDefault<USourceCodeAccessSettings>()->PreferredAccessor;
|
|
|
|
const int32 FeatureCount = IModularFeatures::Get().GetModularFeatureImplementationCount(Type);
|
|
for(int32 FeatureIndex = 0; FeatureIndex < FeatureCount; FeatureIndex++)
|
|
{
|
|
IModularFeature* Feature = IModularFeatures::Get().GetModularFeatureImplementation(Type, FeatureIndex);
|
|
check(Feature);
|
|
|
|
ISourceCodeAccessor& Accessor = *static_cast<ISourceCodeAccessor*>(Feature);
|
|
if(PreferredAccessor == Accessor.GetFName().ToString())
|
|
{
|
|
CurrentSourceCodeAccessor = static_cast<ISourceCodeAccessor*>(Feature);
|
|
FSlateApplication::Get().SetWidgetReflectorSourceAccessDelegate( FAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::OpenFileAtLine ) );
|
|
FSlateApplication::Get().SetWidgetReflectorQuerySourceAccessDelegate( FQueryAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::CanAccessSourceCode ) );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#undef LOCTEXT_NAMESPACE |