OldBlueWater/BlueWater/Assets/Doozy/Editor/Reactor/Drawers/MoveDirectionDrawer.cs
2023-08-02 15:08:03 +09:00

171 lines
8.3 KiB
C#

// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved.
// This code can only be used under the standard Unity Asset Store End User License Agreement
// A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms
using Doozy.Editor.EditorUI;
using Doozy.Editor.EditorUI.Components;
using Doozy.Editor.UIElements;
using Doozy.Runtime.Colors;
using Doozy.Runtime.Reactor;
using Doozy.Runtime.UIElements.Extensions;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UIElements;
namespace Doozy.Editor.Reactor.Drawers
{
[CustomPropertyDrawer(typeof(MoveDirection), true)]
public class MoveDirectionDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {}
public override VisualElement CreatePropertyGUI(SerializedProperty property)
{
UnityAction<MoveDirection> action = delegate {};
var drawer = new VisualElement();
var directionEnum = new EnumField().BindToProperty(property).ResetLayout().SetStyleMinWidth(120);
var directionField = FluidField.Get(property.displayName, directionEnum).LayoutContainerResetLayout();
const int cellSize = 7;
const int cellSpacing = 3;
const int cellCornerRadius = 4;
Color normalColor = EditorColors.Default.Selection;
Color selectedColor = EditorColors.Default.TextTitle.WithAlpha(0.7f);
Color hoverColor = selectedColor.WithAlpha(0.4f);
var customTopLeft = GetElement(cellSize, cellSize, MoveDirection.CustomPosition, cellCornerRadius, 0, cellCornerRadius);
var customTopRight = GetElement(cellSize, cellSize, MoveDirection.CustomPosition, 0, cellCornerRadius, 0, cellCornerRadius);
var customBottomRight = GetElement(cellSize, cellSize, MoveDirection.CustomPosition, cellCornerRadius, 0, cellCornerRadius);
var customBottomLeft = GetElement(cellSize, cellSize, MoveDirection.CustomPosition, 0, cellCornerRadius, 0, cellCornerRadius);
var top = GetElement(cellSize * 3 + cellSpacing * 2, cellSize, MoveDirection.Top);
var bottom = GetElement(cellSize * 3 + cellSpacing * 2, cellSize, MoveDirection.Bottom);
var left = GetElement(cellSize, cellSize * 3 + cellSpacing * 2, MoveDirection.Left);
var right = GetElement(cellSize, cellSize * 3 + cellSpacing * 2, MoveDirection.Right);
var topLeft = GetElement(cellSize, cellSize, MoveDirection.TopLeft, cellCornerRadius);
var topCenter = GetElement(cellSize, cellSize, MoveDirection.TopCenter);
var topRight = GetElement(cellSize, cellSize, MoveDirection.TopRight, 0, cellCornerRadius);
var middleLeft = GetElement(cellSize, cellSize, MoveDirection.MiddleLeft);
var middleCenter = GetElement(cellSize, cellSize, MoveDirection.MiddleCenter, cellCornerRadius, cellCornerRadius, cellCornerRadius, cellCornerRadius);
var middleRight = GetElement(cellSize, cellSize, MoveDirection.MiddleRight);
var bottomLeft = GetElement(cellSize, cellSize, MoveDirection.BottomLeft, 0, 0, 0, cellCornerRadius);
var bottomCenter = GetElement(cellSize, cellSize, MoveDirection.BottomCenter);
var bottomRight = GetElement(cellSize, cellSize, MoveDirection.BottomRight, 0, 0, cellCornerRadius);
var widget = new VisualElement();
widget.AddChild
(
new VisualElement()
.SetStyleFlexDirection(FlexDirection.Row)
.AddChild(customTopLeft)
.AddChild(top.SetStyleMargins(cellSpacing, 0, cellSpacing, 0))
.AddChild(customTopRight)
)
.AddChild
(
new VisualElement()
.SetStyleMarginTop(cellSpacing)
.SetStyleFlexDirection(FlexDirection.Row)
.AddChild(left)
.AddChild
(
new VisualElement()
.SetStyleMargins(cellSpacing, 0, cellSpacing, 0)
.SetStyleFlexDirection(FlexDirection.Column)
.AddChild
(
new VisualElement()
.SetStyleFlexDirection(FlexDirection.Row)
.AddChild(topLeft)
.AddChild(topCenter.SetStyleMargins(cellSpacing, 0, cellSpacing, 0))
.AddChild(topRight)
)
.AddChild
(
new VisualElement()
.SetStyleMarginTop(cellSpacing)
.SetStyleFlexDirection(FlexDirection.Row)
.AddChild(middleLeft)
.AddChild(middleCenter.SetStyleMargins(cellSpacing, 0, cellSpacing, 0))
.AddChild(middleRight)
)
.AddChild
(
new VisualElement()
.SetStyleMarginTop(cellSpacing)
.SetStyleFlexDirection(FlexDirection.Row)
.AddChild(bottomLeft)
.AddChild(bottomCenter.SetStyleMargins(cellSpacing, 0, cellSpacing, 0))
.AddChild(bottomRight)
)
)
.AddChild(right)
)
.AddChild
(
new VisualElement()
.SetStyleMarginTop(cellSpacing)
.SetStyleFlexDirection(FlexDirection.Row)
.AddChild(customBottomLeft)
.AddChild(bottom.SetStyleMargins(cellSpacing, 0, cellSpacing, 0))
.AddChild(customBottomRight)
);
drawer.Add
(
new VisualElement()
.SetStyleFlexDirection(FlexDirection.Row)
.AddChild(widget)
.AddSpace(cellSpacing * 2, 0)
.AddChild(directionField)
);
VisualElement GetElement(int width, int height, MoveDirection moveDirection, int radiusTopLeft = 0, int radiusTopRight = 0, int radiusBottomRight = 0, int radiusBottomLeft = 0)
{
VisualElement element =
new VisualElement()
.SetStyleSize(width, height)
.SetStyleBorderRadius(radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft)
.SetTooltip(moveDirection.ToString());
element.AddManipulator(new Clickable(() =>
{
property.enumValueIndex = (int)moveDirection;
property.serializedObject.ApplyModifiedProperties();
}));
element.RegisterCallback<MouseEnterEvent>(evt => element.SetStyleBackgroundColor(hoverColor));
element.RegisterCallback<MouseLeaveEvent>(evt => element.SetStyleBackgroundColor((MoveDirection)property.enumValueIndex == moveDirection ? selectedColor : normalColor));
action += direction => element.SetStyleBackgroundColor(direction == moveDirection ? selectedColor : normalColor);
return element;
}
action.Invoke((MoveDirection)property.enumValueIndex);
directionEnum.RegisterValueChangedCallback(value =>
{
try
{
action?.Invoke((MoveDirection)value.newValue);
}
catch
{
// ignored
}
});
// action += direction => property.enumValueIndex = (int)direction;
return drawer;
}
}
}