119 lines
2.8 KiB
C++
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;
|
|
}
|