using UnityEditor; using UnityEngine; namespace Amanotes { internal class ProjectCP : EditorWindow { private static ProjectCP _window; private int selectedTab; private ProjectTab projectTab; private DevModeTab packagesTab; private FlagTab flagTab; private LogTab logTab; private PresetTab presetTab; private BuildTab buildTab; private RuntimeOverlay runtimeOverlay; private static readonly string[] tabNames = { "Project", "Packages", "Flag", "Log", "Preset" }; [MenuItem("Window/AmaDev")] private static void ShowWindow() { if (_window != null) return; _window = CreateInstance(); _window.titleContent = new GUIContent("AmaDev", AssetPreview.GetMiniTypeThumbnail(typeof(SceneAsset)), "AmaDev Project Control Panel"); _window.wantsMouseMove = true; _window.Show(); } private void EnsureTabs() { if (packagesTab != null) return; projectTab = new ProjectTab(); packagesTab = new DevModeTab(); flagTab = new FlagTab(); logTab = new LogTab(); presetTab = new PresetTab(); buildTab = new BuildTab(); runtimeOverlay = new RuntimeOverlay(); LocalPackagesTab.onPackageChanged = () => packagesTab.Refresh(); } public void OnGUI() { EnsureTabs(); projectTab.DrawHeader(); if (EditorApplication.isPlayingOrWillChangePlaymode) { runtimeOverlay.OnGUI(); return; } selectedTab = GUILayout.Toolbar(selectedTab, tabNames, GUILayout.Height(24)); EditorGUILayout.Space(); switch (selectedTab) { case 0: DrawClippedTab(projectTab.OnGUI); break; case 1: DrawClippedTab(packagesTab.OnGUI); break; case 2: DrawClippedTab(flagTab.OnGUI); break; case 3: DrawClippedTab(logTab.OnGUI); break; case 4: DrawClippedTab(presetTab.OnGUI); break; } if (Event.current.type == EventType.MouseMove) Repaint(); } private void DrawClippedTab(System.Action drawContent) { float usedY = GUILayoutUtility.GetLastRect().yMax; float winH = position.height; float listH = winH - usedY; float winW = position.width; var listRect = new Rect(0, usedY, winW, listH); GUI.BeginClip(listRect); GUILayout.BeginArea(new Rect(0, 0, winW, listH)); drawContent(); GUILayout.EndArea(); GUI.EndClip(); GUILayoutUtility.GetRect(winW, listH); } } }