U++ Slate动态控制Slot

.h:

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "ModuleManager.h"
#include <Private/Framework/MultiBox/SEditableTextBlock.h>
#include <SEditableTextBox.h>

class FToolBarBuilder;
class FMenuBuilder;

class FHeritationModule : public IModuleInterface
{
public:

	/** IModuleInterface implementation */
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;
	
	/** This function will be bound to Command (by default it will bring up plugin window) */
	void PluginButtonClicked();
	
private:

	SHorizontalBox::FSlot* boxController;
	TSharedPtr<SEditableTextBox> editText;

	void AddToolbarExtension(FToolBarBuilder& Builder);
	void AddMenuExtension(FMenuBuilder& Builder);

	FReply clickFunc();

	TSharedRef<class SDockTab> OnSpawnPluginTab(const class FSpawnTabArgs& SpawnTabArgs);

private:
	TSharedPtr<class FUICommandList> PluginCommands;
};

.cpp:

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#include "Heritation.h"
#include "HeritationStyle.h"
#include "HeritationCommands.h"
#include "LevelEditor.h"
#include "Widgets/Docking/SDockTab.h"
#include "Widgets/Layout/SBox.h"
#include "Widgets/Text/STextBlock.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"

static const FName HeritationTabName("Heritation");

#define LOCTEXT_NAMESPACE "FHeritationModule"

void FHeritationModule::StartupModule()
{
	// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
	
	FHeritationStyle::Initialize();
	FHeritationStyle::ReloadTextures();

	FHeritationCommands::Register();
	
	PluginCommands = MakeShareable(new FUICommandList);

	PluginCommands->MapAction(
		FHeritationCommands::Get().OpenPluginWindow,
		FExecuteAction::CreateRaw(this, &FHeritationModule::PluginButtonClicked),
		FCanExecuteAction());
		
	FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
	
	{
		TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender());
		MenuExtender->AddMenuExtension("WindowLayout", EExtensionHook::After, PluginCommands, FMenuExtensionDelegate::CreateRaw(this, &FHeritationModule::AddMenuExtension));

		LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
	}
	
	{
		TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);
		ToolbarExtender->AddToolBarExtension("Settings", EExtensionHook::After, PluginCommands, FToolBarExtensionDelegate::CreateRaw(this, &FHeritationModule::AddToolbarExtension));
		
		LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(ToolbarExtender);
	}
	
	FGlobalTabmanager::Get()->RegisterNomadTabSpawner(HeritationTabName, FOnSpawnTab::CreateRaw(this, &FHeritationModule::OnSpawnPluginTab))
		.SetDisplayName(LOCTEXT("FHeritationTabTitle", "Heritation"))
		.SetMenuType(ETabSpawnerMenuType::Hidden);
}

void FHeritationModule::ShutdownModule()
{
	// This function may be called during shutdown to clean up your module.  For modules that support dynamic reloading,
	// we call this function before unloading the module.
	FHeritationStyle::Shutdown();

	FHeritationCommands::Unregister();

	FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(HeritationTabName);
}

TSharedRef<SDockTab> FHeritationModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{
	FText WidgetText = FText::Format(
		LOCTEXT("WindowWidgetText", "Add code to {0} in {1} to override this window's contents"),
		FText::FromString(TEXT("FHeritationModule::OnSpawnPluginTab")),
		FText::FromString(TEXT("Heritation.cpp"))
		);

	return SNew(SDockTab)
		.TabRole(ETabRole::NomadTab)
		[
			SNew(SVerticalBox)
				+ SVerticalBox::Slot()
				[
					SNew(SHorizontalBox)
						+ SHorizontalBox::Slot().HAlign(HAlign_Center).Expose(boxController)
						[
							SNew(SImage).Image(FHeritationStyle::Get().GetBrush("ImageWJL"))
						]
				]
				+ SVerticalBox::Slot().Padding(0, 50, 0, 0).HAlign(HAlign_Center).AutoHeight()
				[
					SAssignNew(editText, SEditableTextBox).HintText(LOCTEXT("Location", "位置"))
				]
				+ SVerticalBox::Slot().AutoHeight().Padding(0, 20, 0, 0).HAlign(HAlign_Center)
				[
					SNew(SButton).OnClicked(FOnClicked::CreateRaw(this, &FHeritationModule::clickFunc)).Text(LOCTEXT("ensure", "确认"))
				]
		];
}

void FHeritationModule::PluginButtonClicked()
{
	FGlobalTabmanager::Get()->InvokeTab(HeritationTabName);
}

void FHeritationModule::AddMenuExtension(FMenuBuilder& Builder)
{
	Builder.AddMenuEntry(FHeritationCommands::Get().OpenPluginWindow);
}

FReply FHeritationModule::clickFunc()
{
	FString tempVal = editText->GetText().ToString();
	if (tempVal == TEXT("左")) {
		boxController->HAlign(HAlign_Left);
	}
	else if (tempVal == TEXT("右")) {
		boxController->HAlign(HAlign_Right);
	}
	else if (tempVal == TEXT("中")) {
		boxController->HAlign(HAlign_Center);
	}
	else if (tempVal == TEXT("全屏")) {
		boxController->HAlign(HAlign_Fill);
	}


	return FReply::Handled();
}

void FHeritationModule::AddToolbarExtension(FToolBarBuilder& Builder)
{
	Builder.AddToolBarButton(FHeritationCommands::Get().OpenPluginWindow);
}

#undef LOCTEXT_NAMESPACE
	
IMPLEMENT_MODULE(FHeritationModule, Heritation)

style.cpp:

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#include "HeritationStyle.h"
#include "Styling/SlateStyleRegistry.h"
#include "Framework/Application/SlateApplication.h"
#include "SlateGameResources.h"
#include "IPluginManager.h"

TSharedPtr< FSlateStyleSet > FHeritationStyle::StyleInstance = NULL;

void FHeritationStyle::Initialize()
{
	if (!StyleInstance.IsValid())
	{
		StyleInstance = Create();
		FSlateStyleRegistry::RegisterSlateStyle(*StyleInstance);
	}
}

void FHeritationStyle::Shutdown()
{
	FSlateStyleRegistry::UnRegisterSlateStyle(*StyleInstance);
	ensure(StyleInstance.IsUnique());
	StyleInstance.Reset();
}

FName FHeritationStyle::GetStyleSetName()
{
	static FName StyleSetName(TEXT("HeritationStyle"));
	return StyleSetName;
}

#define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )
#define BOX_BRUSH( RelativePath, ... ) FSlateBoxBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )
#define BORDER_BRUSH( RelativePath, ... ) FSlateBorderBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )
#define TTF_FONT( RelativePath, ... ) FSlateFontInfo( Style->RootToContentDir( RelativePath, TEXT(".ttf") ), __VA_ARGS__ )
#define OTF_FONT( RelativePath, ... ) FSlateFontInfo( Style->RootToContentDir( RelativePath, TEXT(".otf") ), __VA_ARGS__ )

const FVector2D Icon16x16(16.0f, 16.0f);
const FVector2D Icon20x20(20.0f, 20.0f);
const FVector2D Icon40x40(40.0f, 40.0f);

TSharedRef< FSlateStyleSet > FHeritationStyle::Create()
{
	TSharedRef< FSlateStyleSet > Style = MakeShareable(new FSlateStyleSet("HeritationStyle"));
	Style->SetContentRoot(IPluginManager::Get().FindPlugin("Heritation")->GetBaseDir() / TEXT("Resources"));

	Style->Set("Heritation.OpenPluginWindow", new IMAGE_BRUSH(TEXT("ButtonIcon_40x"), Icon40x40));

	Style->Set("ImageWJL", new IMAGE_BRUSH(TEXT("LYD"), FVector2D(100, 100)));

	return Style;
}

#undef IMAGE_BRUSH
#undef BOX_BRUSH
#undef BORDER_BRUSH
#undef TTF_FONT
#undef OTF_FONT

void FHeritationStyle::ReloadTextures()
{
	if (FSlateApplication::IsInitialized())
	{
		FSlateApplication::Get().GetRenderer()->ReloadTextureResources();
	}
}

const ISlateStyle& FHeritationStyle::Get()
{
	return *StyleInstance;
}

效果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值