AronaSlate/Source/Arona/UI/Widget/WindowManager.cpp
2024-01-25 11:21:15 +08:00

119 lines
2.8 KiB
C++

#include "WindowManager.h"
#include "SChildWindow.h"
#include "MainWindow.h"
#include "UI/Style/AronaStyle.h"
#include "SlateApplication.h"
#include "SWindow.h"
#include "PluginHost/PluginHost.h"
void FWindowManager::Init()
{
FAronaStyle::Initialize();
FAronaStyle::ReloadTextures();
MainWindow = new FMainWindow();
MainWindow->Init();
}
void FWindowManager::Release()
{
delete MainWindow;
PluginEditorWindows.Empty();
FAronaStyle::Shutdown();
}
void FWindowManager::CreateChildWindow(FVector2D Size, FString Title, TSharedRef<IChildWindow> Content)
{
MainWindow->CreateChildWindow(Size, Title, Content);
}
void FWindowManager::FrontChildWindow(TSharedPtr<SChildWindow> ChildWindow)
{
MainWindow->FrontChildWindow(ChildWindow);
}
void FWindowManager::OpenPluginEditor(FPluginHost* PluginHost)
{
auto PluginWindow = SNew(SWindow)
.UseOSWindowBorder(true)
.Title(FText::FromString(PluginHost->Name))
.SupportsMaximize(false)
.SupportsMinimize(false)
.SizingRule(ESizingRule::FixedSize)
.AutoCenter(EAutoCenter::PreferredWorkArea)
.IsTopmostWindow(true)
.FocusWhenFirstShown(true)
.IsPopupWindow(true)
.MinWidth(1)
.MinHeight(1)
.RenderSlate(false);
FSlateApplication::Get().AddWindow(PluginWindow);
PluginHost->OpenEditor(PluginWindow->GetNativeWindow()->GetOSWindowHandle());
PluginWindow->Resize(PluginHost->GetEditorSize());
PluginWindow->GetOnWindowClosedEvent().AddRaw(this, &FWindowManager::OnPluginWindowClosed);
PluginEditorWindows.Add(PluginWindow.ToSharedPtr(), PluginHost);
FWindowInfo* Info = PluginEditorWindowInfos.Find(PluginHost);
if (Info)
{
PluginWindow->MoveWindowTo(Info->Pos);
}
}
void FWindowManager::ClosePluginEditor(FPluginHost* PluginHost)
{
if (auto Window = FindPluginEditor(PluginHost))
{
Window->RequestDestroyWindow();
}
}
void FWindowManager::TogglePluginEditor(FPluginHost* PluginHost)
{
if (const TSharedPtr<SWindow> Window = FindPluginEditor(PluginHost))
{
Window->RequestDestroyWindow();
return;
}
OpenPluginEditor(PluginHost);
}
TSharedPtr<SWindow> FWindowManager::FindPluginEditor(FPluginHost* PluginHost)
{
for (const auto& Tuple : PluginEditorWindows)
{
if (Tuple.Value == PluginHost)
{
return Tuple.Key;
}
}
return nullptr;
}
void FWindowManager::OnPluginWindowClosed(const TSharedRef<SWindow>& Window)
{
TSharedPtr<SWindow> Ptr = Window.ToSharedPtr();
FPluginHost** Host = PluginEditorWindows.Find(Ptr);
if (!Host)
return;
(*Host)->CloseEditor();
PluginEditorWindows.Remove(Ptr);
FWindowInfo& Info = PluginEditorWindowInfos.FindOrAdd(*Host);
Info.Pos = Window->GetPositionInScreen();
Info.Size = Window->GetClientSizeInScreen();
}
bool FWindowManager::HasPluginEditor(TSharedPtr<SWindow> Window)
{
for (const auto& Tuple : PluginEditorWindows)
{
if (Tuple.Key == Window)
return true;
}
return false;
}