summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-10-23 13:08:43 +0800
committerchai <chaifix@163.com>2020-10-23 13:08:43 +0800
commitb82da95b5181ac8bbae38efb13e950d5e88a4caa (patch)
tree48a6f3269276484bbc7cfc95f0651f40a2176aa1 /Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs
parent917e9e0b320775634dc2e710f7deac74fd0822f0 (diff)
*移动amplify shader editor到third party目录
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs445
1 files changed, 445 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs
new file mode 100644
index 00000000..2826d02c
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs
@@ -0,0 +1,445 @@
+// Amplify Shader Editor - Visual Shader Editing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+
+using UnityEngine;
+using UnityEditor;
+
+namespace AmplifyShaderEditor
+{
+ public enum MenuAnchor
+ {
+ TOP_LEFT = 0,
+ TOP_CENTER,
+ TOP_RIGHT,
+ MIDDLE_LEFT,
+ MIDDLE_CENTER,
+ MIDDLE_RIGHT,
+ BOTTOM_LEFT,
+ BOTTOM_CENTER,
+ BOTTOM_RIGHT,
+ NONE
+ }
+
+ public enum MenuAutoSize
+ {
+ MATCH_VERTICAL = 0,
+ MATCH_HORIZONTAL,
+ NONE
+ }
+
+ public class MenuParent
+ {
+ protected AmplifyShaderEditorWindow m_parentWindow = null;
+
+ protected const float MinimizeButtonXSpacing = 5;
+ protected const float MinimizeButtonYSpacing = 5.5f;
+ protected const float ResizeAreaWidth = 5;
+
+ protected const float MinimizeCollisionAdjust = 5;
+
+ protected GUIStyle m_style;
+ protected GUIContent m_content;
+ protected Rect m_maximizedArea;
+ protected Rect m_transformedArea;
+ protected Rect m_resizeArea;
+ protected MenuAnchor m_anchor;
+ protected MenuAutoSize m_autoSize;
+ protected bool m_isActive = true;
+ protected bool m_isMaximized = true;
+
+ protected bool m_lockOnMinimize = false;
+ protected bool m_preLockState = false;
+
+ protected Rect m_minimizedArea;
+ protected Rect m_minimizeButtonPos;
+ protected float m_realWidth;
+ protected GUIStyle m_empty = new GUIStyle();
+
+ protected float m_resizeDelta;
+
+ protected bool m_isResizing = false;
+ protected bool m_resizable = false;
+ protected GUIStyle m_resizeAreaStyle;
+ protected bool m_isMouseInside = false;
+ protected Vector2 m_currentScrollPos;
+ public MenuParent( AmplifyShaderEditorWindow parentWindow, float x, float y, float width, float height, string name, MenuAnchor anchor = MenuAnchor.NONE, MenuAutoSize autoSize = MenuAutoSize.NONE )
+ {
+ m_parentWindow = parentWindow;
+ m_anchor = anchor;
+ m_autoSize = autoSize;
+ m_maximizedArea = new Rect( x, y, width, height );
+ m_content = new GUIContent( GUIContent.none );
+ m_content.text = name;
+ m_transformedArea = new Rect();
+ m_resizeArea = new Rect();
+ m_resizeArea.width = ResizeAreaWidth;
+ m_resizeAreaStyle = GUIStyle.none;
+ m_currentScrollPos = Vector2.zero;
+ }
+
+ public void SetMinimizedArea( float x, float y, float width, float height )
+ {
+ m_minimizedArea = new Rect( x, y, width, height );
+ }
+
+ protected void InitDraw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId )
+ {
+ if ( m_style == null )
+ {
+ m_style = new GUIStyle( UIUtils.TextArea );
+ m_style.stretchHeight = true;
+ m_style.stretchWidth = true;
+ m_style.fontSize = ( int ) Constants.DefaultTitleFontSize;
+ m_style.fontStyle = FontStyle.Normal;
+ Texture minimizeTex = UIUtils.GetCustomStyle( CustomStyle.MaximizeButton ).normal.background;
+ m_minimizeButtonPos = new Rect( 0, 0, minimizeTex.width, minimizeTex.height );
+ }
+
+ Rect currentArea = m_isMaximized ? m_maximizedArea : m_minimizedArea;
+
+ if ( m_isMaximized )
+ {
+ if ( m_resizable )
+ {
+ if ( m_isResizing )
+ {
+ if ( m_anchor == MenuAnchor.TOP_LEFT )
+ m_resizeDelta = ( ParentWindow.CurrentEvent.mousePosition.x - m_maximizedArea.width );
+ else if ( m_anchor == MenuAnchor.TOP_RIGHT )
+ m_resizeDelta = ParentWindow.CurrentEvent.mousePosition.x - ( parentPosition.width - m_maximizedArea.width);
+ }
+ }
+
+ m_realWidth = m_maximizedArea.width;
+ if ( m_resizable )
+ {
+ if ( m_anchor == MenuAnchor.TOP_LEFT )
+ {
+ currentArea.width += m_resizeDelta;
+ m_realWidth += m_resizeDelta;
+ }
+ else if ( m_anchor == MenuAnchor.TOP_RIGHT )
+ {
+ currentArea.width -= m_resizeDelta;
+ m_realWidth -= m_resizeDelta;
+ }
+ }
+ }
+ else
+ {
+ if ( currentArea.x < 0 )
+ {
+ m_realWidth = currentArea.width + currentArea.x;
+ }
+ else if ( ( currentArea.x + currentArea.width ) > parentPosition.width )
+ {
+ m_realWidth = parentPosition.width - currentArea.x;
+ }
+ if ( m_realWidth < 0 )
+ m_realWidth = 0;
+ }
+
+ switch ( m_anchor )
+ {
+ case MenuAnchor.TOP_LEFT:
+ {
+ m_transformedArea.x = currentArea.x;
+ m_transformedArea.y = currentArea.y;
+ if ( m_isMaximized )
+ {
+ m_minimizeButtonPos.x = m_transformedArea.x + m_transformedArea.width - m_minimizeButtonPos.width - MinimizeButtonXSpacing;
+ m_minimizeButtonPos.y = m_transformedArea.y + MinimizeButtonYSpacing;
+
+ m_resizeArea.x = m_transformedArea.x + m_transformedArea.width;
+ m_resizeArea.y = m_minimizeButtonPos.y;
+ m_resizeArea.height = m_transformedArea.height;
+ }
+ else
+ {
+ float width = ( m_transformedArea.width - m_transformedArea.x );
+ m_minimizeButtonPos.x = m_transformedArea.x + width * 0.5f - m_minimizeButtonPos.width * 0.5f;
+ m_minimizeButtonPos.y = m_transformedArea.height * 0.5f - m_minimizeButtonPos.height * 0.5f;
+ }
+ }
+ break;
+ case MenuAnchor.TOP_CENTER:
+ {
+ m_transformedArea.x = parentPosition.width * 0.5f + currentArea.x;
+ m_transformedArea.y = currentArea.y;
+ }
+ break;
+ case MenuAnchor.TOP_RIGHT:
+ {
+ m_transformedArea.x = parentPosition.width - currentArea.x - currentArea.width;
+ m_transformedArea.y = currentArea.y;
+ if ( m_isMaximized )
+ {
+ m_minimizeButtonPos.x = m_transformedArea.x + MinimizeButtonXSpacing;
+ m_minimizeButtonPos.y = m_transformedArea.y + MinimizeButtonYSpacing;
+
+ m_resizeArea.x = m_transformedArea.x - ResizeAreaWidth;
+ m_resizeArea.y = m_minimizeButtonPos.y;
+ m_resizeArea.height = m_transformedArea.height;
+ }
+ else
+ {
+ float width = ( parentPosition.width - m_transformedArea.x );
+ m_minimizeButtonPos.x = m_transformedArea.x + width * 0.5f - m_minimizeButtonPos.width * 0.5f;
+ m_minimizeButtonPos.y = m_transformedArea.height * 0.5f - m_minimizeButtonPos.height * 0.5f;
+ }
+ }
+ break;
+ case MenuAnchor.MIDDLE_LEFT:
+ {
+ m_transformedArea.x = currentArea.x;
+ m_transformedArea.y = parentPosition.height * 0.5f + currentArea.y;
+ }
+ break;
+ case MenuAnchor.MIDDLE_CENTER:
+ {
+ m_transformedArea.x = parentPosition.width * 0.5f + currentArea.x;
+ m_transformedArea.y = parentPosition.height * 0.5f + currentArea.y;
+ }
+ break;
+ case MenuAnchor.MIDDLE_RIGHT:
+ {
+ m_transformedArea.x = parentPosition.width - currentArea.x - currentArea.width;
+ m_transformedArea.y = parentPosition.height * 0.5f + currentArea.y;
+ }
+ break;
+ case MenuAnchor.BOTTOM_LEFT:
+ {
+ m_transformedArea.x = currentArea.x;
+ m_transformedArea.y = parentPosition.height - currentArea.y - currentArea.height;
+ }
+ break;
+ case MenuAnchor.BOTTOM_CENTER:
+ {
+ m_transformedArea.x = parentPosition.width * 0.5f + currentArea.x;
+ m_transformedArea.y = parentPosition.height - currentArea.y - currentArea.height;
+ }
+ break;
+ case MenuAnchor.BOTTOM_RIGHT:
+ {
+ m_transformedArea.x = parentPosition.width - currentArea.x - currentArea.width;
+ m_transformedArea.y = parentPosition.height - currentArea.y - currentArea.height;
+ }
+ break;
+
+ case MenuAnchor.NONE:
+ {
+ m_transformedArea.x = currentArea.x;
+ m_transformedArea.y = currentArea.y;
+ }
+ break;
+ }
+
+ switch ( m_autoSize )
+ {
+ case MenuAutoSize.MATCH_HORIZONTAL:
+ {
+ m_transformedArea.width = parentPosition.width - m_transformedArea.x;
+ m_transformedArea.height = currentArea.height;
+ }
+ break;
+
+ case MenuAutoSize.MATCH_VERTICAL:
+ {
+ m_transformedArea.width = currentArea.width;
+ m_transformedArea.height = parentPosition.height - m_transformedArea.y;
+ }
+ break;
+ case MenuAutoSize.NONE:
+ {
+ m_transformedArea.width = currentArea.width;
+ m_transformedArea.height = currentArea.height;
+ }
+ break;
+ }
+
+ }
+ public virtual void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus )
+ {
+ InitDraw( parentPosition, mousePosition, mouseButtonId );
+ if ( ParentWindow.CurrentEvent.type == EventType.MouseDrag && ParentWindow.CurrentEvent.button > 0 /*catches both middle and right mouse button*/ )
+ {
+ m_isMouseInside = IsInside( mousePosition );
+ if ( m_isMouseInside )
+ {
+ m_currentScrollPos.x += Constants.MenuDragSpeed * ParentWindow.CurrentEvent.delta.x;
+ if ( m_currentScrollPos.x < 0 )
+ m_currentScrollPos.x = 0;
+ m_currentScrollPos.y += Constants.MenuDragSpeed * ParentWindow.CurrentEvent.delta.y;
+ if ( m_currentScrollPos.y < 0 )
+ m_currentScrollPos.y = 0;
+
+ }
+ }
+ }
+
+ public void PostDraw()
+ {
+ if ( !m_isMaximized )
+ {
+ m_transformedArea.height = 35;
+ GUI.Label( m_transformedArea, m_content, m_style );
+ }
+
+ Color colorBuffer = GUI.color;
+ GUI.color = EditorGUIUtility.isProSkin ? Color.white : Color.black;
+ bool guiEnabledBuffer = GUI.enabled;
+ GUI.enabled = !m_lockOnMinimize;
+ Rect buttonArea = m_minimizeButtonPos;
+
+ buttonArea.x -= MinimizeCollisionAdjust;
+ buttonArea.width += 2 * MinimizeCollisionAdjust;
+
+ buttonArea.y -= MinimizeCollisionAdjust;
+ buttonArea.height += 2 * MinimizeCollisionAdjust;
+
+ if ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.Repaint )
+ GUI.Label( m_minimizeButtonPos, string.Empty, UIUtils.GetCustomStyle( m_isMaximized ? CustomStyle.MinimizeButton : CustomStyle.MaximizeButton ) );
+
+ if( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown && buttonArea.Contains( m_parentWindow.CameraDrawInfo.MousePosition ) )
+ //if ( GUI.Button( buttonArea, string.Empty, m_empty ) )
+ {
+ m_isMaximized = !m_isMaximized;
+ m_resizeDelta = 0;
+ }
+
+ if ( m_resizable && m_isMaximized )
+ {
+ EditorGUIUtility.AddCursorRect( m_resizeArea, MouseCursor.ResizeHorizontal );
+ if ( !m_isResizing && GUI.RepeatButton( m_resizeArea, string.Empty, m_resizeAreaStyle ) )
+ {
+ m_isResizing = true;
+ }
+ else
+ {
+ if ( m_isResizing )
+ {
+ if ( ParentWindow.CurrentEvent.isMouse && ParentWindow.CurrentEvent.type != EventType.MouseDrag )
+ {
+ m_isResizing = false;
+ }
+ }
+ }
+
+ if ( m_realWidth < buttonArea.width )
+ {
+ // Auto-minimize
+ m_isMaximized = false;
+ m_resizeDelta = 0;
+ m_isResizing = false;
+ }
+ else
+ {
+ float halfSizeWindow = 0.5f * ParentWindow.position.width;
+ if ( m_realWidth > halfSizeWindow )
+ {
+ m_realWidth = 0.5f * ParentWindow.position.width;
+ if ( m_resizeDelta > 0 )
+ {
+ m_resizeDelta = m_realWidth - m_maximizedArea.width;
+ }
+ else
+ {
+ m_resizeDelta = m_maximizedArea.width - m_realWidth;
+ }
+ }
+ }
+ }
+
+ GUI.enabled = guiEnabledBuffer;
+ GUI.color = colorBuffer;
+
+ }
+
+ public void OnLostFocus()
+ {
+ if ( m_isResizing )
+ {
+ m_isResizing = false;
+ }
+ }
+
+ virtual public void Destroy()
+ {
+ m_empty = null;
+ m_resizeAreaStyle = null;
+ }
+
+ public float InitialX
+ {
+ get { return m_maximizedArea.x; }
+ set { m_maximizedArea.x = value; }
+ }
+
+ public float Width
+ {
+ get { return m_maximizedArea.width; }
+ set { m_maximizedArea.width = value; }
+ }
+
+ public float RealWidth
+ {
+ get { return m_realWidth; }
+ }
+ public float Height
+ {
+ get { return m_maximizedArea.height; }
+ set { m_maximizedArea.height = value; }
+ }
+
+ public Rect Size
+ {
+ get { return m_maximizedArea; }
+ }
+
+ public virtual bool IsInside( Vector2 position )
+ {
+ if ( !m_isActive )
+ return false;
+
+ return m_transformedArea.Contains( position );
+ }
+
+ public bool IsMaximized
+ {
+ get { return m_isMaximized; }
+ set { m_isMaximized = value; }
+ }
+
+ public Rect TransformedArea
+ {
+ get { return m_transformedArea; }
+ }
+
+ public bool Resizable { set { m_resizable = value; } }
+ public bool IsResizing { get { return m_isResizing; } }
+ public bool LockOnMinimize
+ {
+ set
+ {
+ if ( m_lockOnMinimize == value )
+ return;
+
+ m_lockOnMinimize = value;
+ if ( value )
+ {
+ m_preLockState = m_isMaximized;
+ m_isMaximized = false;
+ }
+ else
+ {
+ m_isMaximized = m_preLockState;
+ }
+ }
+ }
+ public bool IsActive
+ {
+ get { return m_isActive; }
+ }
+ public AmplifyShaderEditorWindow ParentWindow { get { return m_parentWindow; } set { m_parentWindow = value; } }
+ }
+}