#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 Content) { MainWindow->CreateChildWindow(Size, Title, Content); } void FWindowManager::FrontChildWindow(TSharedPtr 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 Window = FindPluginEditor(PluginHost)) { Window->RequestDestroyWindow(); return; } OpenPluginEditor(PluginHost); } TSharedPtr FWindowManager::FindPluginEditor(FPluginHost* PluginHost) { for (const auto& Tuple : PluginEditorWindows) { if (Tuple.Value == PluginHost) { return Tuple.Key; } } return nullptr; } void FWindowManager::OnPluginWindowClosed(const TSharedRef& Window) { TSharedPtr 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 Window) { for (const auto& Tuple : PluginEditorWindows) { if (Tuple.Key == Window) return true; } return false; }