diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs | 445 |
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; } } + } +} |