Editor/SeamlessEditorMenu.cs
using Editor;

public static class SeamlessEditorMenu
{
	[Menu( "Editor", "Seam-Less™ Material Suite/Open Suite" )]
	public static void OpenSuite()
	{
		var seamless = GetOrCreateSeamlessTextureTool();

		if ( seamless == null || !seamless.IsValid )
			return;

		var pbr = GetOrCreatePbrMapGenerator();
		pbr?.Show();

		seamless.Show();
		seamless.Focus();
		EditorWindow.DockManager.RaiseDock( seamless );
	}

	[Menu( "Editor", "Seam-Less™ Material Suite/About" )]
	public static void OpenAbout()
	{
		new SeamlessSuiteAboutDialog().Show();
	}

	[Menu( "Editor", "Seam-Less™ Material Suite/Help" )]
	public static void OpenHelp()
	{
		new SeamlessSuiteHelpDialog().Show();
	}

	private static SeamlessImageToolWindow GetOrCreateSeamlessTextureTool()
	{
		if ( SeamlessImageToolWindow.Current != null && SeamlessImageToolWindow.Current.IsValid )
			return SeamlessImageToolWindow.Current;

		return CreateSeamlessTextureTool();
	}

	private static PbrMapGeneratorWindow GetOrCreatePbrMapGenerator()
	{
		if ( PbrMapGeneratorWindow.Current != null && PbrMapGeneratorWindow.Current.IsValid )
			return PbrMapGeneratorWindow.Current;

		return CreatePbrMapGenerator();
	}

	private static SeamlessImageToolWindow CreateSeamlessTextureTool()
	{
		var sibling = PbrMapGeneratorWindow.Current;

		if ( sibling != null && sibling.IsValid )
		{
			var widget = new SeamlessImageToolWindow( EditorWindow.DockManager );
			EditorWindow.DockManager.AddDock( sibling, widget, DockArea.Inside );
			return widget;
		}

		return EditorWindow.DockManager.Create<SeamlessImageToolWindow>();
	}

	private static PbrMapGeneratorWindow CreatePbrMapGenerator()
	{
		var sibling = SeamlessImageToolWindow.Current;

		if ( sibling != null && sibling.IsValid )
		{
			var widget = new PbrMapGeneratorWindow( EditorWindow.DockManager );
			EditorWindow.DockManager.AddDock( sibling, widget, DockArea.Inside );
			return widget;
		}

		return EditorWindow.DockManager.Create<PbrMapGeneratorWindow>();
	}
}