.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;
}
效果如下: