Skip to content

Commit

Permalink
New Feature: subsystem metadata properties
Browse files Browse the repository at this point in the history
- SBColor: custom name color in list
- SBTooltip: custom label displayed in tooltip box
- SBOwnerName: custom owner name source (as more handy replacement of OnGetSubsystemOwnerName)

New feature: subsystem color settings ( #16 ) moved to configuration page. Off by default.
  • Loading branch information
aquanox committed Jul 3, 2024
1 parent 14c4124 commit 5047ad9
Show file tree
Hide file tree
Showing 23 changed files with 388 additions and 165 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "Model/Column/SubsystemBrowserColumn_Module.h"

#include "SubsystemBrowserSettings.h"
#include "UI/SubsystemTableItem.h"

#define LOCTEXT_NAMESPACE "SubsystemBrowser"
Expand All @@ -18,17 +19,30 @@ FText FSubsystemDynamicColumn_Module::ExtractText(TSharedRef<const ISubsystemTre
{
if (const FSubsystemTreeSubsystemItem* SubsystemItem = Item->GetAsSubsystemDescriptor())
{
return FText::FromString(SubsystemItem->ShortPackage);
return FText::FromString(SubsystemItem->ModuleName);
}

return FText::GetEmpty();
}

FSlateColor FSubsystemDynamicColumn_Module::ExtractColor(TSharedRef<const ISubsystemTreeItem> Item) const
{
const USubsystemBrowserSettings* Settings = USubsystemBrowserSettings::Get();
if (Settings->IsColoringEnabled() && !Item->IsStale() && !Item->IsSelected())
{
if (const FSubsystemTreeSubsystemItem* SubsystemItem = Item->GetAsSubsystemDescriptor())
{
return USubsystemBrowserSettings::Get()->GetModuleColor(SubsystemItem->IsGameModule());
}
}
return Super::ExtractColor(Item);
}

void FSubsystemDynamicColumn_Module::PopulateSearchStrings(const ISubsystemTreeItem& Item, TArray<FString>& OutSearchStrings) const
{
if (const FSubsystemTreeSubsystemItem* SubsystemItem = Item.GetAsSubsystemDescriptor())
{
OutSearchStrings.Add(SubsystemItem->ShortPackage);
OutSearchStrings.Add(SubsystemItem->ModuleName);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct FSubsystemDynamicColumn_Module : public FSubsystemDynamicTextColumn
virtual bool IsVisibleByDefault() const override { return true; }

virtual FText ExtractText(TSharedRef<const ISubsystemTreeItem> Item) const override;
virtual FSlateColor ExtractColor(TSharedRef<const ISubsystemTreeItem> Item) const override;
virtual FText ExtractTooltipText(TSharedRef<const ISubsystemTreeItem> Item) const override { return FText::GetEmpty(); }
virtual void PopulateSearchStrings(const ISubsystemTreeItem& Item, TArray<FString>& OutSearchStrings) const override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "Model/Column/SubsystemBrowserColumn_Name.h"

#include "SubsystemBrowserSettings.h"
#include "UI/SubsystemTableItem.h"
#include "Widgets/Images/SImage.h"
#include "Widgets/Text/STextBlock.h"
Expand Down Expand Up @@ -66,9 +67,16 @@ FText FSubsystemDynamicColumn_Name::ExtractText(TSharedRef<const ISubsystemTreeI

FSlateColor FSubsystemDynamicColumn_Name::ExtractColor(TSharedRef<const ISubsystemTreeItem> Item) const
{
if (Item->IsStale())
const USubsystemBrowserSettings* Settings = USubsystemBrowserSettings::Get();
if (Settings->IsColoringEnabled() && !Item->IsStale() && !Item->IsSelected())
{
return FSlateColor::UseSubduedForeground();
if (const FSubsystemTreeSubsystemItem* SubsystemItem = Item->GetAsSubsystemDescriptor())
{
if (SubsystemItem->UserColor.IsSet())
{
return SubsystemItem->UserColor.GetValue();
}
}
}
return Super::ExtractColor(Item);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/SubsystemBrowser/Model/SubsystemBrowserCategory.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ struct SUBSYSTEMBROWSER_API FSubsystemCategory : public TSharedFromThis<FSubsyst

virtual bool IsVisibleByDefault() const { return true; }

/* Select subsystems for the respected category */
/* Select subsystems for this category */
virtual void Select(UWorld* InContext, TArray<UObject*>& OutData) const = 0;
};

Expand Down
19 changes: 5 additions & 14 deletions Source/SubsystemBrowser/Model/SubsystemBrowserColumn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ TSharedPtr<SWidget> FSubsystemDynamicTextColumn::GenerateColumnWidget(TSharedRef
[
SNew(STextBlock)
.Font(this, &FSubsystemDynamicTextColumn::ExtractFont, Item)
.ColorAndOpacity(this, &FSubsystemDynamicTextColumn::ExtractColorIfEnabled, Item)
.ColorAndOpacity(this, &FSubsystemDynamicTextColumn::ExtractColor, Item)
.Text(this, &FSubsystemDynamicTextColumn::ExtractText, Item)
.ToolTipText(this, &FSubsystemDynamicTextColumn::ExtractTooltipText, Item)
.HighlightText(TableRow->HighlightText)
Expand All @@ -68,27 +68,18 @@ FText FSubsystemDynamicTextColumn::ExtractTooltipText(TSharedRef<const ISubsyste

FSlateColor FSubsystemDynamicTextColumn::ExtractColor(TSharedRef<const ISubsystemTreeItem> Item) const
{
const USubsystemBrowserSettings* Settings = USubsystemBrowserSettings::Get();
if (Item->IsStale())
{
return FSlateColor::UseSubduedForeground();
return Settings->GetStaleColor();
}
if (Item->IsGameModule() && !Item->IsSelected())
if (Item->IsSelected())
{
return FLinearColor(0.4f, 0.4f, 1.0f);
return Settings->GetSelectedColor();
}

return FSlateColor::UseForeground();
}

FSlateColor FSubsystemDynamicTextColumn::ExtractColorIfEnabled(TSharedRef<const ISubsystemTreeItem> Item) const
{
if (USubsystemBrowserSettings::Get()->IsColoringEnabled())
{
return ExtractColor(Item);
}
return Item->IsStale() ? FSlateColor::UseSubduedForeground() : FSlateColor::UseForeground();
}

FSlateFontInfo FSubsystemDynamicTextColumn::ExtractFont(TSharedRef<const ISubsystemTreeItem> Item) const
{
return FStyleHelper::GetFontStyle("WorldBrowser.LabelFont");
Expand Down
2 changes: 0 additions & 2 deletions Source/SubsystemBrowser/Model/SubsystemBrowserColumn.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,6 @@ struct SUBSYSTEMBROWSER_API FSubsystemDynamicTextColumn : public FSubsystemDynam
virtual FText ExtractTooltipText(TSharedRef<const ISubsystemTreeItem> Item) const;
/* get color and opacity of text for specified item */
virtual FSlateColor ExtractColor(TSharedRef<const ISubsystemTreeItem> Item) const;
/* internal */
FSlateColor ExtractColorIfEnabled(TSharedRef<const ISubsystemTreeItem> Item) const;
/* get font of text for specified item */
virtual FSlateFontInfo ExtractFont(TSharedRef<const ISubsystemTreeItem> Item) const;
/* text columns support sorting by default */
Expand Down
66 changes: 34 additions & 32 deletions Source/SubsystemBrowser/Model/SubsystemBrowserDescriptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include "Model/SubsystemBrowserDescriptor.h"

#include "SourceCodeNavigation.h"
#include "SubsystemBrowserFlags.h"
#include "SubsystemBrowserSettings.h"
#include "SubsystemBrowserModule.h"
#include "SubsystemBrowserUtils.h"
#include "ToolMenu.h"
Expand All @@ -23,13 +23,6 @@ FSubsystemTreeCategoryItem::FSubsystemTreeCategoryItem(TSharedRef<FSubsystemMode
Model = InModel;
}

TArray<UObject*> FSubsystemTreeCategoryItem::Select(UWorld* InContext) const
{
TArray<UObject*> Result;
Data->Select(InContext,Result);
return Result;
}

void FSubsystemTreeCategoryItem::GenerateTooltip(FSubsystemTableItemTooltipBuilder& TooltipBuilder) const
{
TArray<SubsystemTreeItemPtr> Subsystems;
Expand All @@ -52,47 +45,52 @@ FSubsystemTreeSubsystemItem::FSubsystemTreeSubsystemItem(TSharedRef<FSubsystemMo
UClass* const InClass = Instance->GetClass();
Class = InClass;

// save data needed to display so hotreload or other things won't crash editor or disaster happen
// maybe let each column allocate some kind of struct to hold it for own usage?
DisplayName = InClass->GetDisplayNameText();
ClassName = InClass->GetFName();

Package = InClass->GetOuterUPackage()->GetName();
ShortPackage = FPackageName::GetShortName(Package);
LongPackage = FString::Printf(TEXT("%s.%s"), *Package, *ClassName.ToString());
if (!FSubsystemBrowserUtils::GetModuleDetailsForClass(InClass, ModuleName, bIsGameModuleClass))
{
ModuleName = FPackageName::GetShortName(Package);
bIsGameModuleClass = false;
}

ScriptName = FString::Printf(TEXT("/Script/%s.%s"), *ModuleName, *ClassName.ToString());

if (InClass->HasAnyClassFlags(CLASS_Config) && !InClass->ClassConfigName.IsNone())
{
bConfigExportable = true;
bIsDefaultConfig = InClass->HasAnyClassFlags(CLASS_DefaultConfig);
bIsGlobalUserConfig = InClass->HasAnyClassFlags(CLASS_GlobalUserConfig);
ConfigName = InClass->ClassConfigName;
}

bIsGameModuleClass = FSubsystemBrowserUtils::IsGameModuleClass(InClass);

FSubsystemBrowserUtils::CollectSourceFiles(InClass, SourceFilePaths);

if (FSubsystemBrowserModule::OnGetSubsystemOwnerName.IsBound())
OwnerName = FSubsystemBrowserUtils::GetSubsystemOwnerName(Instance);

if (FSubsystemBrowserUtils::GetPluginDetailsForClass(InClass, PluginName, PluginDisplayName))
{
OwnerName = FSubsystemBrowserModule::OnGetSubsystemOwnerName.Execute(Instance);
bIsPluginClass = true;
}
else

PropertyStats = FSubsystemBrowserUtils::GetClassFieldStats(InClass);

TOptional<FString> UserColorValue = FSubsystemBrowserUtils::GetMetadataHierarchical(InClass, FSubsystemBrowserUserMeta::MD_SBColor);
if (UserColorValue.IsSet())
{
OwnerName = FSubsystemBrowserUtils::GetDefaultSubsystemOwnerName(Instance);
FLinearColor Value(ForceInit);
if (Value.InitFromString(*UserColorValue))
{
UserColor = Value;
}
}

TSharedPtr<IPlugin> Plugin = FSubsystemBrowserUtils::GetPluginForClass(InClass);
if (Plugin.IsValid())
TOptional<FString> UserTooltipValue = FSubsystemBrowserUtils::GetMetadataHierarchical(InClass, FSubsystemBrowserUserMeta::MD_SBTooltip);
if (UserTooltipValue.IsSet())
{
bIsPluginClass = true;
PluginName = Plugin->GetName();
#if UE_VERSION_OLDER_THAN(4, 26, 0)
PluginDisplayName = Plugin->GetName();
#else
PluginDisplayName = Plugin->GetFriendlyName();
#endif
UserTooltip = UserTooltipValue;
}

PropertyStats = FSubsystemBrowserUtils::GetClassFieldStats(InClass);
}

bool FSubsystemTreeSubsystemItem::IsSelected() const
Expand All @@ -109,7 +107,7 @@ void FSubsystemTreeSubsystemItem::GenerateTooltip(FSubsystemTableItemTooltipBuil
{
//TooltipBuilder.AddPrimary(LOCTEXT("SubsystemTooltipItem_Path", "Path"), FText::FromString(LongPackage));
TooltipBuilder.AddPrimary(LOCTEXT("SubsystemTooltipItem_Class", "Class"), FText::FromName(ClassName));
TooltipBuilder.AddPrimary(LOCTEXT("SubsystemTooltipItem_Module", "Module"), FText::FromString(ShortPackage));
TooltipBuilder.AddPrimary(LOCTEXT("SubsystemTooltipItem_Module", "Module"), FText::FromString(ModuleName));
if (IsPluginModule())
{
TooltipBuilder.AddPrimary(LOCTEXT("SubsystemTooltipItem_Plugin", "Plugin"), FText::FromString(PluginDisplayName));
Expand All @@ -127,6 +125,10 @@ void FSubsystemTreeSubsystemItem::GenerateTooltip(FSubsystemTableItemTooltipBuil
TooltipBuilder.AddPrimary(LOCTEXT("SubsystemTooltipItem_PropsEditable", "Num Editable Properties"), FText::AsNumber(PropertyStats.NumEditable));
TooltipBuilder.AddPrimary(LOCTEXT("SubsystemTooltipItem_PropsConfig", "Num Config Properties"), FText::AsNumber(PropertyStats.NumConfig));

if (UserTooltip.IsSet())
{
TooltipBuilder.SetUserTooltip(FText::FromString(UserTooltip.GetValue()));
}
}

void FSubsystemTreeSubsystemItem::GenerateContextMenu(UToolMenu* MenuBuilder) const
Expand Down Expand Up @@ -184,7 +186,7 @@ void FSubsystemTreeSubsystemItem::GenerateContextMenu(UToolMenu* MenuBuilder) co
{
if (Self.IsValid())
{
FSubsystemBrowserUtils::SetClipboardText(Self.Pin()->ShortPackage);
FSubsystemBrowserUtils::SetClipboardText(Self.Pin()->ModuleName);
}
})
)
Expand All @@ -198,7 +200,7 @@ void FSubsystemTreeSubsystemItem::GenerateContextMenu(UToolMenu* MenuBuilder) co
{
if (Self.IsValid())
{
FSubsystemBrowserUtils::SetClipboardText(Self.Pin()->LongPackage);
FSubsystemBrowserUtils::SetClipboardText(Self.Pin()->ScriptName);
}
})
)
Expand Down
31 changes: 22 additions & 9 deletions Source/SubsystemBrowser/Model/SubsystemBrowserDescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "SubsystemBrowserUtils.h"
#include "Model/SubsystemBrowserCategory.h"
#include "Misc/TextFilter.h"
#include "Misc/Optional.h"

class FSubsystemModel;
struct ISubsystemTreeItem;
Expand All @@ -16,7 +17,7 @@ using SubsystemTreeItemPtr = TSharedPtr<ISubsystemTreeItem>;
using SubsystemTreeItemConstPtr = TSharedPtr<const ISubsystemTreeItem>;

/*
* Abstract subsystem tree item node
* Node base class for Subsystem TreeView
*/
struct SUBSYSTEMBROWSER_API ISubsystemTreeItem : public TSharedFromThis<ISubsystemTreeItem>
{
Expand Down Expand Up @@ -59,7 +60,7 @@ struct SUBSYSTEMBROWSER_API ISubsystemTreeItem : public TSharedFromThis<ISubsyst
};

/**
* Category node
* Node representing a Subsystem Category in TreeView
*/
struct SUBSYSTEMBROWSER_API FSubsystemTreeCategoryItem final : public ISubsystemTreeItem
{
Expand All @@ -74,38 +75,52 @@ struct SUBSYSTEMBROWSER_API FSubsystemTreeCategoryItem final : public ISubsystem
virtual bool CanHaveChildren() const override { return true; }
virtual FSubsystemTreeCategoryItem* GetAsCategoryDescriptor() const override { return const_cast<FSubsystemTreeCategoryItem*>(this); }

TArray<UObject*> Select(UWorld* InContext) const;

virtual void GenerateTooltip(class FSubsystemTableItemTooltipBuilder& TooltipBuilder) const override;
};

/**
* Subsystem node
* Node representing a Subsystem in TreeView
*/
struct SUBSYSTEMBROWSER_API FSubsystemTreeSubsystemItem final : public ISubsystemTreeItem
{
TWeakObjectPtr<UObject> Subsystem;
TWeakObjectPtr<UClass> Class;

// Friendly display name (Class Name)
FText DisplayName;
// Subsystem class name (ClassName)
FName ClassName;
// Subsystem package name (/Script/ModuleName)
FString Package;
FString LongPackage;
FString ShortPackage;
// Full package name (/Script/ModuleName.ClassName)
FString ScriptName;
// Short module name (ModuleName)
FString ModuleName;
// Config category name (Class specifier value of UCLASS)
FName ConfigName;

// Owning object name for LocalPlayerSS and similar
FString OwnerName;

// List of source locations associated with subsystem class
TArray<FString> SourceFilePaths;

// Detected plugin name that this subsystem is part of
FString PluginName;
// Friendly name of plugin
FString PluginDisplayName;

// Optional user color override
TOptional<FLinearColor> UserColor;
// Optional user extra tooltip text
TOptional<FString> UserTooltip;

using FClassPropertyCounts = FSubsystemBrowserUtils::FClassFieldStats;
FClassPropertyCounts PropertyStats;

bool bConfigExportable = false;
bool bIsDefaultConfig = false;
bool bIsGlobalUserConfig = false;
bool bIsGameModuleClass = false;
bool bIsPluginClass = false;

Expand All @@ -128,6 +143,4 @@ struct SUBSYSTEMBROWSER_API FSubsystemTreeSubsystemItem final : public ISubsyste
virtual void GenerateTooltip(class FSubsystemTableItemTooltipBuilder& TooltipBuilder) const override;
virtual void GenerateContextMenu(class UToolMenu* MenuBuilder) const override;

protected:

};
4 changes: 3 additions & 1 deletion Source/SubsystemBrowser/Model/SubsystemBrowserModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,9 @@ void FSubsystemModel::PopulateSubsystems()
{
const FSubsystemTreeCategoryItem* AsCategory = Category->GetAsCategoryDescriptor();

for (UObject* Impl : AsCategory->Select(LocalWorld))
TArray<UObject*> Result;
AsCategory->Data->Select(LocalWorld, Result);
for (UObject* Impl : Result)
{
auto Descriptor = MakeShared<FSubsystemTreeSubsystemItem>(SharedThis(this), Category, Impl);

Expand Down
Loading

0 comments on commit 5047ad9

Please sign in to comment.