150 lines
3.6 KiB
C#
150 lines
3.6 KiB
C#
|
using System;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.UIElements;
|
||
|
using UnityEngine.UIElements.StyleSheets;
|
||
|
|
||
|
namespace UnityEditor.ShaderGraph.Drawing
|
||
|
{
|
||
|
[Serializable]
|
||
|
internal class WindowDockingLayout
|
||
|
{
|
||
|
[SerializeField]
|
||
|
bool m_DockingLeft;
|
||
|
|
||
|
public bool dockingLeft
|
||
|
{
|
||
|
get => m_DockingLeft;
|
||
|
set => m_DockingLeft = value;
|
||
|
}
|
||
|
|
||
|
[SerializeField]
|
||
|
bool m_DockingTop;
|
||
|
|
||
|
public bool dockingTop
|
||
|
{
|
||
|
get => m_DockingTop;
|
||
|
set => m_DockingTop = value;
|
||
|
}
|
||
|
|
||
|
[SerializeField]
|
||
|
float m_VerticalOffset;
|
||
|
|
||
|
public float verticalOffset
|
||
|
{
|
||
|
get => m_VerticalOffset;
|
||
|
set => m_VerticalOffset = value;
|
||
|
}
|
||
|
|
||
|
[SerializeField]
|
||
|
float m_HorizontalOffset;
|
||
|
|
||
|
public float horizontalOffset
|
||
|
{
|
||
|
get => m_HorizontalOffset;
|
||
|
set => m_HorizontalOffset = value;
|
||
|
}
|
||
|
|
||
|
[SerializeField]
|
||
|
Vector2 m_Size;
|
||
|
|
||
|
public Vector2 size
|
||
|
{
|
||
|
get => m_Size;
|
||
|
set => m_Size = value;
|
||
|
}
|
||
|
|
||
|
public void CalculateDockingCornerAndOffset(Rect layout, Rect parentLayout)
|
||
|
{
|
||
|
Vector2 layoutCenter = new Vector2(layout.x + layout.width * .5f, layout.y + layout.height * .5f);
|
||
|
layoutCenter /= parentLayout.size;
|
||
|
|
||
|
m_DockingLeft = layoutCenter.x < .5f;
|
||
|
m_DockingTop = layoutCenter.y < .5f;
|
||
|
|
||
|
if (m_DockingLeft)
|
||
|
{
|
||
|
m_HorizontalOffset = layout.x;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_HorizontalOffset = parentLayout.width - layout.x - layout.width;
|
||
|
}
|
||
|
|
||
|
if (m_DockingTop)
|
||
|
{
|
||
|
m_VerticalOffset = layout.y;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_VerticalOffset = parentLayout.height - layout.y - layout.height;
|
||
|
}
|
||
|
|
||
|
m_Size = layout.size;
|
||
|
}
|
||
|
|
||
|
public void ClampToParentWindow()
|
||
|
{
|
||
|
m_HorizontalOffset = Mathf.Max(0f, m_HorizontalOffset);
|
||
|
m_VerticalOffset = Mathf.Max(0f, m_VerticalOffset);
|
||
|
}
|
||
|
|
||
|
public void ApplyPosition(VisualElement target)
|
||
|
{
|
||
|
if (dockingLeft)
|
||
|
{
|
||
|
target.style.right = float.NaN;
|
||
|
target.style.left = horizontalOffset;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
target.style.right = horizontalOffset;
|
||
|
target.style.left = float.NaN;
|
||
|
}
|
||
|
|
||
|
if (dockingTop)
|
||
|
{
|
||
|
target.style.bottom = float.NaN;
|
||
|
target.style.top = verticalOffset;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
target.style.top = float.NaN;
|
||
|
target.style.bottom = verticalOffset;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void ApplySize(VisualElement target)
|
||
|
{
|
||
|
target.style.width = size.x;
|
||
|
target.style.height = size.y;
|
||
|
}
|
||
|
|
||
|
public Rect GetLayout(Rect parentLayout)
|
||
|
{
|
||
|
Rect layout = new Rect();
|
||
|
|
||
|
layout.size = size;
|
||
|
|
||
|
if (dockingLeft)
|
||
|
{
|
||
|
layout.x = horizontalOffset;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
layout.x = parentLayout.width - size.x - horizontalOffset;
|
||
|
}
|
||
|
|
||
|
if (dockingTop)
|
||
|
{
|
||
|
layout.y = verticalOffset;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
layout.y = parentLayout.height - size.y - verticalOffset;
|
||
|
}
|
||
|
|
||
|
return layout;
|
||
|
}
|
||
|
}
|
||
|
}
|