笔记_Slate部分知识点/编译器扩展部分_世界大纲中物体右键添加自定义操作_对文件栏文件右键进行操作_添加一个Actor detail面板属性_自定义映射变量

20 篇文章 5 订阅

零散知识点

//菜单分隔符
	Builder.AddMenuSeparator();

	//子菜单
	Builder.AddSubMenu(
		LOCTEXT("OOO","JJJJ"),
		LOCTEXT("CCCC","KKKK"),
		FNewMenuDelegate::CreateRaw	(this,&FMyToolModule::SubPullDownBar)
	);

	//图片Slate
	Builder.AddWidget(
			SNew(SImage),
			LOCTEXT("SImageO","ImageJK")
	);

	//输入框
	Builder.AddEditableText(
	LOCTEXT("EditableText","EditableTextJK"),
	LOCTEXT("EditableTextO","EditableTextJK1"),
	FSlateIcon(),
	LOCTEXT("Demo","DemoJK")
	);
	
	//搜索
	Builder.AddSearchWidget();

	//子菜单自定义Widget(Slate)
	Builder.AddWrapperSubMenu(
	LOCTEXT("WrapperSubMenu","WrapperSubMenuJK"),
	LOCTEXT("WrapperSubMenuO","WrapperSubMenuJK1"),
			FOnGetContent::CreateStatic<TSharedPtr<FUICommandList>>	(&FTest::MakeNewWidget,PluginCommands),
		FSlateIcon()
	);
	//自定义方法如下:
	TSharedRef<SWidget> FTest::MakeNewWidget	(TSharedPtr<FUICommandList> Plu)
	{
		return SNew(SImage);
	}	

对世界大纲中的物体,右键进行一些操作

1.先绑定方法

{
{
		auto& MenuButtonArray =  LevelEditorModule.GetAllLevelViewportContextMenuExtenders();
		MenuButtonArray.Add(FLevelEditorModule::FLevelViewportMenuExtender_SelectedActors::CreateRaw(this,&FMyToolModule::SelectCueAS));
		MyDeleHandel = MenuButtonArray.Last().GetHandle();
}
}

2.具体方法如下

TSharedRef<FExtender> FMyToolModule::SelectCueAS(const TSharedRef<FUICommandList> MyCommandList,
	const TArray<AActor*> AllActor)
{
	TSharedRef<FExtender> Extender = MakeShareable(new FExtender);
	EdtorPrint(FString::Printf(TEXT("Actor Num = %d"),AllActor.Num()));
	
	if (AllActor.Num()>0)
	{
		//获取Level
		FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
		TSharedPtr<FUICommandList>LevelCommand = LevelEditorModule.GetGlobalLevelEditorActions();
		Extender->AddMenuExtension("ActorControl",EExtensionHook::After,LevelCommand,FMenuExtensionDelegate::CreateRaw(this,&FMyToolModule::AddSelectButton));

	}
	return Extender;
}

3.绑定样式,样式如下

 

//Actor选择扩展
void FMyToolModule::AddSelectButton(FMenuBuilder& Builder)
{
	Builder.AddMenuEntry(FMyToolCommands::Get().PluginAction);
	//菜单分隔符
	Builder.AddMenuSeparator();
	
	Builder.AddSubMenu(
	LOCTEXT("OK_ONE", "just a task"),
	LOCTEXT("OK_TWO", "just a task button"),
		FNewMenuDelegate::CreateRaw(this,&FMyToolModule::SubPullDownBar)
	);
}	

对文件栏中文件右键进行一些操作

方法与上面类似

1.先绑定方法

{
		FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
		auto& Cont =  ContentBrowserModule.GetAllPathViewContextMenuExtenders();
		Cont.Add(FContentBrowserMenuExtender_SelectedPaths::CreateRaw(this,&FMyToolModule::GetPathFromEditor));
	//此处需要换成FContentBrowserModule并且需要在build中添加该模块
	//"ContentBrowser"
}

2.具体方法实现

TSharedRef<FExtender> FMyToolModule::GetPathFromEditor(const TArray<FString>& NewPath)
{
	TSharedRef<FExtender> Extender = MakeShareable(new FExtender);
	EdtorPrint(FString::Printf(TEXT("Actor Num = %d"),NewPath.Num()));
	
	if (NewPath.Num()>0)
	{
		//获取Level
		FContentBrowserModule& BrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
	
		Extender->AddMenuExtension("NewFolder",EExtensionHook::After,PluginCommands,FMenuExtensionDelegate::CreateRaw(this,&FMyToolModule::AddSelectButton));

	}
	for (auto xx : NewPath)
	{
		EdtorPrint(xx);
	}
	return Extender;
}

绑定样式同上,不赘述


添加一个Actor detail面板属性

1.添加一个模块

"PropertyEditor"

2.创建一个自定义类xxx.h

.h
class FMyTestDetailCustom : public IDetailCustomization
{
public:

	 FMyTestDetailCustom();
	//负责映射到对象面板上
	virtual void CustomizeDetails( IDetailLayoutBuilder& DetailBuilder ) override;

	//实例化面板
	static TSharedRef< IDetailCustomization > MakeInstance();
	                  
};
	.cpp
	#define LOCTEXT_NAMESPACE "MyTestDetailCustom"
void FMyTestDetailCustom::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
	IDetailCategoryBuilder& DetailCategoryBuilderIns =  DetailBuilder.EditCategory(TEXT("CustomizeDetails"));


	DetailCategoryBuilderIns.AddCustomRow(LOCTEXT("MM","Test")).WholeRowContent()
	[
		SNew(STextBlock)
		.Text(LOCTEXT("QQ","Test"))
	];
}
TSharedRef< IDetailCustomization > FMyTestDetailCustom::MakeInstance()
{
	return MakeShareable(new FMyTestDetailCustom);
}

3.添加对应映射

//在创建的插件的.h文件中,找到PropertyEditorModule.cpp中的两个方法抄过来;
	void FPropertyEditorModule::RegisterCustomClassLayout( FName ClassName, FOnGetDetailCustomizationInstance DetailLayoutDelegate )
	void FPropertyEditorModule::RegisterCustomPropertyTypeLayout( FName PropertyTypeName, FOnGetPropertyTypeCustomizationInstance PropertyTypeLayoutDelegate, TSharedPtr<IPropertyTypeIdentifier> Identifier)
	//再定义自定义方法调用上面方法进行绑定
	void RegisterPropertyTypeCustomizations();
	void RegisterObjectCustomizations();

	//具体写法:
	void FTestDetailsModule::RegisterObjectCustomizations()
{
	RegisterCustomClassLayout("CustomizeObject",FOnGetDetailCustomizationInstance::CreateStatic(&FMyTestDetailCustom::MakeInstance));
}

void FTestDetailsModule::RegisterCustomClassLayout(FName ClassName,
	FOnGetDetailCustomizationInstance DetailLayoutDelegate)
{
	check(ClassName!= NAME_None);

	RegisteredClassNames.Add(ClassName);
	
	FPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
	PropertyModule.RegisterCustomClassLayout(ClassName,DetailLayoutDelegate);
}

void FTestDetailsModule::RegisterCustomPropertyTypeLayout(FName PropertyTypeName,
	FOnGetPropertyTypeCustomizationInstance PropertyTypeLayoutDelegate)
{
	check(PropertyTypeName != NAME_None);

	RegisteredPropertyTypes.Add(PropertyTypeName);
	
	FPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
	PropertyModule.RegisterCustomPropertyTypeLayout(PropertyTypeName,PropertyTypeLayoutDelegate);
}
	//绑定好了之后找到StartupModule()进行调用
	//先获取实例,然后调用上面写好的方法,并更新映射
	void FTestDetailsModule::StartupModule()
{
	FPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
	
	RegisterPropertyTypeCustomizations();
	RegisterObjectCustomizations();
	
	PropertyModule.NotifyCustomizationModuleChanged();//更新映射
}
	//因为绑定后你还得解绑,所以我们先创建两个变量来保存相关内容
	.h:
	private:
	TSet< FName > RegisteredClassNames;
	TSet< FName > RegisteredPropertyTypes;
	.cpp
	//解绑:
	void FTestDetailsModule::ShutdownModule()
{
	if (FModuleManager::Get().IsModuleLoaded("PropertyEditor"))
	{
		FPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
		
		for (auto It = RegisteredClassNames.CreateIterator();It;++It)
		{
			if (It->IsValid())
			{
				PropertyModule.UnregisterCustomClassLayout(*It);
			}
		}

		for (auto It = RegisteredPropertyTypes.CreateIterator();It;++It)
		{
			if (It->IsValid())
			{
				PropertyModule.UnregisterCustomPropertyTypeLayout(*It);
			}
		}
		
	}
}
	//这样就完成了基础的映射到UObject 对象的处理

自定义映射变量

1.创建一个Struct结构体文件

USTRUCT(BlueprintType)
struct TESTDETAILS_API FStructVariable
{
	GENERATED_USTRUCT_BODY()
	

	
};

2.创建一个StructVariableDetail文件,继承并抄过来对应方法

struct TESTDETAILS_API FStructVariableDetail:public IPropertyTypeCustomization
{
	
public:
	virtual void CustomizeHeader( TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils )override;
	
	virtual void CustomizeChildren( TSharedRef<IPropertyHandle> PropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils ) override;


	//实例化面板
	static TSharedRef< IPropertyTypeCustomization > MakeInstance();
	                  
};
.cpp具体方法实现
void FStructVariableDetail::CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow& HeaderRow,
                                      IPropertyTypeCustomizationUtils& CustomizationUtils)
{
	HeaderRow
	.NameContent()
	[
	PropertyHandle->CreatePropertyNameWidget()
	]
	.ValueContent()
	.MinDesiredWidth(125.0f)
	.MaxDesiredWidth(325.0f)
	[
		SNew(SImage)
	];
}

void FStructVariableDetail::CustomizeChildren(TSharedRef<IPropertyHandle> PropertyHandle,
	IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils)
{
	
}

TSharedRef<IPropertyTypeCustomization> FStructVariableDetail::MakeInstance()
{
	return MakeShareable(new FStructVariableDetail);
}
	

3.最后映射到之前的方法中,也就是TestDetails.cpp文件中
 

void FTestDetailsModule::RegisterPropertyTypeCustomizations()
{
    RegisterCustomPropertyTypeLayout("StructVariable",FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FStructVariableDetail::MakeInstance));
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要为Slate插件添加一个外部按钮以在构造器打开页面,您需要执行以下步骤: 1. 创建一个React组件来表示您的按钮。这个组件应该接受一个onClick prop,当按钮被点击时会被调用。 2. 在Slate构造器,使用withToolbar插件包装您的编辑器组件。withToolbar插件允许您自定义工具,以添加自己的按钮。 3. 在withToolbar插件的配置对象添加一个自定义的按钮。这个配置对象应该包含一个按钮的图标、提示文本和点击处理程序。点击处理程序应该调用您的React组件的onClick prop。 4. 在您的React组件的onClick prop,使用window.open()方法打开您需要的页面。您可以使用URL参数来传递数据。 以下是一个示例代码片段,展示如何实现这个功能: ```js import React from 'react'; import { withToolbar } from '@slate-editor/with-toolbar'; // 1. 定义一个按钮组件 const MyButton = ({ onClick }) => { return ( <button onClick={onClick}> My Button </button> ); }; // 2. 使用withToolbar包装编辑器组件 const MyEditor = withToolbar({ // 3. 添加一个自定义按钮 buttons: [ { icon: 'my-icon', title: 'My Button', onClick: (editor) => { // 4. 在按钮被点击时打开一个页面 window.open('https://example.com/my-page'); }, component: MyButton, }, ], })(MySlateEditor); export default MyEditor; ``` 请注意,这只是一个示例代码片段,具体实现可能因您的具体需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值