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();
}
}
}
}
}