using System; using UnityEditor; using UnityEngine; namespace HIKKY.VketCloudSDK.UI.EditorWindow.GUIHelper { /// /// ウィンドウのパネルを管理するクラスです。 /// public class Pane { /// パネルの種類 private PaneType _type; /// ウィンドウ private UnityEditor.EditorWindow _window; /// ドラッグ中かどうか private bool _dragging = false; /// GUIを描画するアクション private Action _drawGUI; /// スプリッターの色 private Color _splitterColor = Color.black; /// スプリッターのテクスチャ private Texture2D _splitterTexture = new Texture2D(1, 1); /// カーソルがドラッグできる範囲を広げるためのオフセット値 private const float SplitterOffset = 5f; /// パネルの幅 public float Width { get; private set; } /// パネルの高さ public float Height { get; private set; } /// パネルの最小幅 public float MinWidth { get; private set; } /// パネルの最小高さ public float MinHeight { get; private set; } /// /// Pane クラスのインスタンスを初期化します。 /// /// パネルの種類 /// ウィンドウ /// GUIを描画するアクション /// 初期のパネルの幅 /// 初期のパネルの高さ public Pane(PaneType type, UnityEditor.EditorWindow window, Action drawGUI, float initialWidth, float initialHeight) { _type = type; _window = window; _drawGUI = drawGUI; Width = initialWidth; Height = initialHeight; MinWidth = initialWidth; MinHeight = initialHeight; _splitterTexture = new Texture2D(1, 1); _splitterTexture.SetPixel(0, 0, _splitterColor); _splitterTexture.Apply(); } /// /// パネルを描画します。 /// /// X座標 /// Y座標 /// 幅 /// 高さ /// スプリッターの矩形領域 public void Draw(float x, float y, float width, float height, Rect splitterRect) { GUI.Box(new Rect(x, y, width, height), ""); GUILayout.BeginArea(new Rect(x, y, width, height)); _drawGUI(); GUILayout.EndArea(); Rect splitterOffsetRect = DrawSplitter(splitterRect); ProcessEvents(Event.current, splitterOffsetRect); } /// /// スプリッターを描画し、カーソルが反応する領域を返します。 /// /// スプリッターの領域 /// カーソルが反応する領域 private Rect DrawSplitter(Rect splitterRect) { if (_splitterTexture == null) { _splitterTexture = new Texture2D(1, 1); _splitterTexture.SetPixel(0, 0, _splitterColor); _splitterTexture.Apply(); } GUI.DrawTexture(splitterRect, _splitterTexture); Rect verticalSplitterCursorRect = new Rect(splitterRect.x, splitterRect.y, splitterRect.width + SplitterOffset, splitterRect.height); Rect horizontalSplitterCursorRect = new Rect(splitterRect.x, splitterRect.y, splitterRect.width, splitterRect.height + SplitterOffset); EditorGUIUtility.AddCursorRect( _type == PaneType.Vertical ? verticalSplitterCursorRect : horizontalSplitterCursorRect, _type == PaneType.Vertical ? MouseCursor.ResizeHorizontal : MouseCursor.ResizeVertical ); return _type == PaneType.Vertical ? verticalSplitterCursorRect : horizontalSplitterCursorRect; } /// /// イベントを処理し、スプリッターのドラッグに応じてパネルのサイズを変更します。 /// /// GUIイベント /// スプリッターに反応するべき領域 private void ProcessEvents(Event guiEvent, Rect splitterRect) { // ドラッグが開始されたことを示すフラグを立てる。 if (guiEvent.type == EventType.MouseDown) { if (splitterRect.Contains(guiEvent.mousePosition)) { _dragging = true; } } // ドラッグが終了したことを示すフラグを下げる。 if (guiEvent.type == EventType.MouseUp) { _dragging = false; } // ドラッグ中の処理(パネルのサイズを変更し、エディタウィンドウの再描画を要求する。 if (_dragging && guiEvent.type == EventType.MouseDrag) { if (_type == PaneType.Vertical) { Width = Mathf.Clamp(guiEvent.mousePosition.x, MinWidth, _window.position.width - MinWidth); // Use MinWidth here _window.Repaint(); } else { Height = Mathf.Clamp(_window.position.height - guiEvent.mousePosition.y, MinHeight, _window.position.height - MinHeight); // Use MinHeight here _window.Repaint(); } } } } }