Rich text style "inheritance"

It is possible using C++, you need to:

  • extend FRichTextDecorator
  • override Supports & CreateDecoratorText
  • extend URichTextBlockDecorator
  • override CreateDecorator
  • Add your created class to Decorator Classes property of the RichText

Example for coloring text green with tag <profit>200€</>.


// header.h
#pragma once

#include "CoreMinimal.h"
#include "Components/RichTextBlockDecorator.h"
#include "ProfitMoneyAmountRichTextDecorator.generated.h"

UCLASS()
class DUKES_API UProfitMoneyAmountRichTextDecorator : public URichTextBlockDecorator
{
	GENERATED_BODY()

public:
	UProfitMoneyAmountRichTextDecorator(const FObjectInitializer& ObjectInitializer);

	virtual TSharedPtr<ITextDecorator> CreateDecorator(URichTextBlock* InOwner) override;

};

// content.cpp
#include "ProfitMoneyAmountRichTextDecorator.h"

class FProfitMoneyAmountRichTextDecorator : public FRichTextDecorator
{
private:
	UProfitMoneyAmountRichTextDecorator* Decorator;
	
public:
	FProfitMoneyAmountRichTextDecorator(URichTextBlock* InOwner, UProfitMoneyAmountRichTextDecorator* InDecorator)
		: FRichTextDecorator(InOwner)
		, Decorator(InDecorator)
	{
	}

	virtual bool Supports(const FTextRunParseResults& RunInfo, const FString& Text) const override
	{
		if (RunInfo.Name == TEXT("profit"))
		{
			return true;
		}
		return false;
	}

	virtual void CreateDecoratorText(const FTextRunInfo& RunInfo, FTextBlockStyle& InOutTextStyle, FString& InOutString) const override
	{
		InOutTextStyle.SetColorAndOpacity(FSlateColor(FLinearColor(0.0f, 0.7f, 0.0f)));
		InOutString += *RunInfo.Content.ToString();
	}
};

UProfitMoneyAmountRichTextDecorator::UProfitMoneyAmountRichTextDecorator(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
}

TSharedPtr<ITextDecorator> UProfitMoneyAmountRichTextDecorator::CreateDecorator(URichTextBlock* InOwner)
{
	return MakeShareable(new FProfitMoneyAmountRichTextDecorator(InOwner, this));
}


It probably makes sense to only create one of these, then you could even build your own “class” system using tag metadata.
For reference see: Unreals Example FRichInlineImage class

More info here: https://www.unrealengine.com/de/tech-blog/advanced-text-styling-with-rich-text-block

1 Like