232 lines
8.1 KiB
Markdown
232 lines
8.1 KiB
Markdown
|
# ToolTip
|
|||
|
|
|||
|
- **功能描述:** 在Meta里提供一个提示文本,覆盖代码注释里的文本
|
|||
|
- **使用位置:** Any
|
|||
|
- **引擎模块:** Development
|
|||
|
- **元数据类型:** string="abc"
|
|||
|
- **关联项:** [ShortTooltip](../ShortTooltip.md)
|
|||
|
- **常用程度:** ★★★
|
|||
|
|
|||
|
## 测试代码:
|
|||
|
|
|||
|
```cpp
|
|||
|
// This is a ToolTip out of Class.There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
UCLASS(BlueprintType, Blueprintable, meta = (ToolTip = "This is a ToolTip within Class. There're so so so so so so so many words I want to say, but here's too narrow."))
|
|||
|
class INSIDER_API UMyClass_ToolTip :public UObject
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
public:
|
|||
|
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "This is a ToolTip within Property.There're so so so so so so so many words I want to say, but here's too narrow."))
|
|||
|
float MyFloat_WithToolTip;
|
|||
|
|
|||
|
UPROPERTY(BlueprintReadWrite, EditAnywhere)
|
|||
|
FString MyString;
|
|||
|
|
|||
|
UFUNCTION(BlueprintCallable, meta = (ToolTip = "This is a ToolTip within Function.There're so so so so so so so many words I want to say, but here's too narrow."))
|
|||
|
void MyFunc_WithToolTip() {}
|
|||
|
|
|||
|
UFUNCTION(BlueprintCallable)
|
|||
|
void MyFunc() {}
|
|||
|
};
|
|||
|
|
|||
|
// This is a ToolTip out of Class.There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
UCLASS(BlueprintType, Blueprintable, meta = (ToolTip = "This is a ToolTip within Class. There're so so so so so so so many words I want to say, but here's too narrow.", ShortToolTip = "This is a ShortToolTip within Class."))
|
|||
|
class INSIDER_API UMyClass_WithAllToolTip :public UObject
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
public:
|
|||
|
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "This is a ToolTip within Property."))
|
|||
|
float MyFloat_WithToolTip;
|
|||
|
|
|||
|
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "This is a ToolTip within Property. There're so so so so so so so many words I want to say, but here's too narrow.\nThis is a new line.",ShortToolTip = "This is a ShortToolTip within Property."))
|
|||
|
float MyFloat_WithAllToolTip;
|
|||
|
|
|||
|
UPROPERTY(BlueprintReadWrite, EditAnywhere)
|
|||
|
FString MyString;
|
|||
|
|
|||
|
UFUNCTION(BlueprintCallable, meta = (ToolTip = "This is a ToolTip within Function. There're so so so so so so so many words I want to say, but here's too narrow.",ShortToolTip = "This is a ShortToolTip within Function."))
|
|||
|
void MyFunc_WithAllToolTip() {}
|
|||
|
|
|||
|
UFUNCTION(BlueprintCallable, meta = (ToolTip = "This is a ToolTip within Function."))
|
|||
|
void MyFunc_WithToolTip() {}
|
|||
|
};
|
|||
|
|
|||
|
// This is a ToolTip out of Class.There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
UCLASS(BlueprintType, Blueprintable)
|
|||
|
class INSIDER_API UMyClass_ToolTip_TypeA :public UObject
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
* This is a ToolTip out of Class.
|
|||
|
* There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
* Please read this tooltip before you use this class.
|
|||
|
*/
|
|||
|
UCLASS(BlueprintType, Blueprintable)
|
|||
|
class INSIDER_API UMyClass_ToolTip_TypeB :public UObject
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
};
|
|||
|
```
|
|||
|
|
|||
|
## 测试效果:
|
|||
|
|
|||
|
在选取父类时候的提示:
|
|||
|
|
|||
|
可以发现,如果提供了ToolTip,就会覆盖掉代码注释里的注释。同时也可以发现在下图中,提示的文本过长超过了选项框。这时如果提供了ShortToolTip,则会在父类选取器中显示ShortToolTip中的文本,从而简洁一点显示。在很多别的地方也同样应用这个规则,比如(该类型)变量上的提示,或者在选择变量类型的时候。
|
|||
|
|
|||
|

|
|||
|
|
|||
|
## 原理代码:
|
|||
|
|
|||
|
在源码里有FField和UField,普通的属性是FField,而像UClass是继承于UField,因此要注意FField::GetToolTipText的bShortTooltip一直是false,而UField::GetToolTipText则会传true。
|
|||
|
|
|||
|
```cpp
|
|||
|
FText FField::GetToolTipText(bool bShortTooltip) const
|
|||
|
{
|
|||
|
bool bFoundShortTooltip = false;
|
|||
|
static const FName NAME_Tooltip(TEXT("Tooltip"));
|
|||
|
static const FName NAME_ShortTooltip(TEXT("ShortTooltip"));
|
|||
|
FText LocalizedToolTip;
|
|||
|
FString NativeToolTip;
|
|||
|
|
|||
|
if (bShortTooltip)
|
|||
|
{
|
|||
|
NativeToolTip = GetMetaData(NAME_ShortTooltip);
|
|||
|
if (NativeToolTip.IsEmpty())
|
|||
|
{
|
|||
|
NativeToolTip = GetMetaData(NAME_Tooltip);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bFoundShortTooltip = true;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
NativeToolTip = GetMetaData(NAME_Tooltip);
|
|||
|
}
|
|||
|
|
|||
|
const FString Namespace = bFoundShortTooltip ? TEXT("UObjectShortTooltips") : TEXT("UObjectToolTips");
|
|||
|
const FString Key = GetFullGroupName(false);
|
|||
|
if (!FText::FindText(Namespace, Key, /*OUT*/LocalizedToolTip, &NativeToolTip))
|
|||
|
{
|
|||
|
if (!NativeToolTip.IsEmpty())
|
|||
|
{
|
|||
|
static const FString DoxygenSee(TEXT("@see"));
|
|||
|
static const FString TooltipSee(TEXT("See:"));
|
|||
|
if (NativeToolTip.ReplaceInline(*DoxygenSee, *TooltipSee) > 0)
|
|||
|
{
|
|||
|
NativeToolTip.TrimEndInline();
|
|||
|
}
|
|||
|
}
|
|||
|
LocalizedToolTip = FText::FromString(NativeToolTip);
|
|||
|
}
|
|||
|
|
|||
|
return LocalizedToolTip;
|
|||
|
}
|
|||
|
|
|||
|
FText UField::GetToolTipText(bool bShortTooltip) const
|
|||
|
{
|
|||
|
bool bFoundShortTooltip = false;
|
|||
|
static const FName NAME_Tooltip(TEXT("Tooltip"));
|
|||
|
static const FName NAME_ShortTooltip(TEXT("ShortTooltip"));
|
|||
|
FText LocalizedToolTip;
|
|||
|
FString NativeToolTip;
|
|||
|
|
|||
|
if (bShortTooltip)
|
|||
|
{
|
|||
|
NativeToolTip = GetMetaData(NAME_ShortTooltip);
|
|||
|
if (NativeToolTip.IsEmpty())
|
|||
|
{
|
|||
|
NativeToolTip = GetMetaData(NAME_Tooltip);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bFoundShortTooltip = true;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
NativeToolTip = GetMetaData(NAME_Tooltip);
|
|||
|
}
|
|||
|
|
|||
|
const FString Namespace = bFoundShortTooltip ? TEXT("UObjectShortTooltips") : TEXT("UObjectToolTips");
|
|||
|
const FString Key = GetFullGroupName(false);
|
|||
|
if ( !FText::FindText( Namespace, Key, /*OUT*/LocalizedToolTip, &NativeToolTip ) )
|
|||
|
{
|
|||
|
if (NativeToolTip.IsEmpty())
|
|||
|
{
|
|||
|
NativeToolTip = FName::NameToDisplayString(FDisplayNameHelper::Get(*this), false);
|
|||
|
}
|
|||
|
else if (!bShortTooltip && IsNative())
|
|||
|
{
|
|||
|
FormatNativeToolTip(NativeToolTip, true);
|
|||
|
}
|
|||
|
LocalizedToolTip = FText::FromString(NativeToolTip);
|
|||
|
}
|
|||
|
|
|||
|
return LocalizedToolTip;
|
|||
|
}
|
|||
|
|
|||
|
//在类型选择器中优先选择ShortTooltip
|
|||
|
FText FClassPickerDefaults::GetDescription() const
|
|||
|
{
|
|||
|
FText Result = LOCTEXT("NullClass", "(null class)");
|
|||
|
|
|||
|
if (UClass* ItemClass = LoadClass<UObject>(NULL, *ClassName, NULL, LOAD_None, NULL))
|
|||
|
{
|
|||
|
Result = ItemClass->GetToolTipText(/*bShortTooltip=*/ true);
|
|||
|
}
|
|||
|
|
|||
|
return Result;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
但对于Property和Function,在显示的时候,都只会显示ToolTip,并不会应用ShortToolTip
|
|||
|
|
|||
|
变量和函数:
|
|||
|
|
|||
|

|
|||
|
|
|||
|

|
|||
|
|
|||
|
其他需要注意的是,代码里注释的文本也会当作ToolTip。支持//和/**/这两种格式。如果在ToolTip中想换行,可以直接加/n就可以。
|
|||
|
|
|||
|
```cpp
|
|||
|
/*
|
|||
|
(BlueprintType = true, Comment = // This is a ToolTip out of Class.There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
, IncludePath = Any/ToolTip_Test.h, IsBlueprintBase = true, ModuleRelativePath = Any/ToolTip_Test.h, ToolTip = This is a ToolTip out of Class.There're so so so so so so so many words I want to say, but here's too narrow.)
|
|||
|
*/
|
|||
|
|
|||
|
// This is a ToolTip out of Class.There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
UCLASS(BlueprintType, Blueprintable)
|
|||
|
class INSIDER_API UMyClass_ToolTip_TypeA :public UObject
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
};
|
|||
|
|
|||
|
//[MyClass_ToolTip_TypeB Class->Struct->Field->Object /Script/Insider.MyClass_ToolTip_TypeB]
|
|||
|
//(BlueprintType = true, Comment = /**
|
|||
|
//* This is a ToolTip out of Class.
|
|||
|
//* There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
//* Please read this tooltip before you use this class.
|
|||
|
//*/, IncludePath = Any/ToolTip_Test.h, IsBlueprintBase = true, ModuleRelativePath = Any/ToolTip_Test.h, ToolTip = This is a ToolTip out of Class.
|
|||
|
//There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
//Please read this tooltip before you use this class.)
|
|||
|
|
|||
|
/**
|
|||
|
* This is a ToolTip out of Class.
|
|||
|
* There're so so so so so so so many words I want to say, but here's too narrow.
|
|||
|
* Please read this tooltip before you use this class.
|
|||
|
*/
|
|||
|
UCLASS(BlueprintType, Blueprintable)
|
|||
|
class INSIDER_API UMyClass_ToolTip_TypeB :public UObject
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
};
|
|||
|
|
|||
|
UCLASS(BlueprintType, Blueprintable, meta = (ToolTip = "This is a ToolTip within Class. There're so so so so so so so many words I want to say, but here's too narrow.\nThis is a new line.", ShortToolTip = "This is a ShortToolTip within Class."))
|
|||
|
```
|