Example #1
0
        public override bool BeforeGUI(ref Rect position, ref SerializedProperty property, ref GUIContent label, ref bool includeChildren, bool visible)
        {
            m_SavedIndentLevel = EditorGUI.indentLevel;
            if (!IsVisible())
            {
                return(visible);
            }
            if (!visible)
            {
                return(false);
            }
            if (Event.current.type == EventType.Layout)
            {
                return(visible);
            }

            var text    = label.text;
            var image   = label.image;
            var tooltip = label.tooltip;

            var rect = position.indent(indented);

            var data = m_Data.Get(property.propertyPath);

            GetProperties(data.properties);

            int index = -1;

            if (indentChildren)
            {
                EditorGUI.indentLevel++;
            }
            InGroupAttribute.Add(m_Name);
            foreach (var cell in rect.VerticalDistribute(spacing, data.rowHeights))
            {
                if (index < 0)
                {
                    position = cell;
                }
                else if (data.properties[index] != null && cell.height > 0)
                {
                    EditorGUI.PropertyField(cell.Height(data.propertyHeights[index]), data.properties[index], null, true);
                }
                index++;
            }
            InGroupAttribute.Remove(m_Name);

            label.text    = text;
            label.image   = image;
            label.tooltip = tooltip;
            return(position.height > 0);
        }
        public override float GetHeight(SerializedProperty property, GUIContent label, float height)
        {
            if (!IsVisible())
            {
                return(height);
            }

            var data = m_Data.Get(property.propertyPath);

            data.height = height;
            GetProperties(data.properties);
            data.propertyHeights.Clear();

            var widths = m_Widths.AsEnumerable();
            int diff   = data.properties.Count + 1 - m_Widths.Length;

            if (diff > 0)
            {
                widths = widths.Concat(Enumerable.Repeat(-1f, diff));
            }
            widths = widths.Take(data.properties.Count + 1);

            int index = -1;

            InGroupAttribute.Add(m_Name);
            float result = 0;

            foreach (var width in widths)
            {
                if (index < 0 && width != 0)
                {
                    result = Mathf.Max(data.height, result);
                }
                if (index >= 0)
                {
                    height = data.properties[index] == null ? 0 : EditorGUI.GetPropertyHeight(data.properties[index], null, true);
                    if (height < 0)
                    {
                        height = 0;
                    }
                    data.propertyHeights.Add(height);
                    if (width != 0)
                    {
                        result = Mathf.Max(height, result);
                    }
                }
                index++;
            }
            InGroupAttribute.Remove(m_Name);
            result = Mathf.Max(0, result);
            return(result);
        }
Example #3
0
        public static void Draw(Rect position, SerializedObject serializedObject, bool indent, List <float> propertyHeights = null)
        {
            if (Event.current.type == EventType.Layout)
            {
                return;
            }

            var rect        = new Rect(position);
            int indentLevel = EditorGUI.indentLevel;

            int index = 0;

            serializedObject.Update();
            var  iterator = serializedObject.GetIterator();
            bool enter    = true;

            InGroupAttribute.Push();
            while (iterator.NextVisible(enter))
            {
                enter = false;
                if (iterator.propertyPath.Equals("m_Script"))
                {
                    continue;
                }
                EditorGUI.indentLevel = indentLevel + (indent ? 1 : 0);
                if (propertyHeights != null)
                {
                    rect.height = propertyHeights[index];
                }
                else
                {
                    rect.height = EditorGUI.GetPropertyHeight(iterator, null, true);
                }
                if (rect.height > 0)
                {
                    EditorGUI.PropertyField(rect, iterator, null, true);
                    rect = rect.MoveDown(2);
                }
                index++;
            }
            InGroupAttribute.Pop();
            serializedObject.ApplyModifiedProperties();

            EditorGUI.indentLevel = indentLevel;
        }
Example #4
0
        public override float GetHeight(SerializedProperty property, GUIContent label, float height)
        {
            if (!IsVisible())
            {
                return(height);
            }

            Update();
            var data = m_Data.Get(property.propertyPath);

            property.GetProperties(m_Properties, data.properties);

            float toolbar = m_ToolbarSize.y;

            toolbar += m_Top + m_Bottom;
            if (toolbar < 0)
            {
                toolbar = 0;
            }

            float h = 0;

            if (m_TabIndex == 0)
            {
                h = height;
            }
            else
            {
                InGroupAttribute.Add(m_Name);
                if (data.properties[m_TabIndex - 1] != null)
                {
                    h = EditorGUI.GetPropertyHeight(data.properties[m_TabIndex - 1], null, true);
                }
                InGroupAttribute.Remove(m_Name);
            }
            data.tabHeight = h;

            return(toolbar + h);
        }
Example #5
0
        public static float GetHeight(SerializedObject serializedObject, List <float> propertyHeights = null)
        {
            float result = 0;

            if (propertyHeights != null)
            {
                propertyHeights.Clear();
            }
            serializedObject.Update();
            var  iterator = serializedObject.GetIterator();
            bool enter    = true;

            InGroupAttribute.Push();
            while (iterator.NextVisible(enter))
            {
                enter = false;
                if (iterator.propertyPath.Equals("m_Script"))
                {
                    continue;
                }
                var h = EditorGUI.GetPropertyHeight(iterator, null, true);
                if (h < 0)
                {
                    h = 0;
                }
                if (propertyHeights != null)
                {
                    propertyHeights.Add(h);
                }
                if (result > 0 && h > 0)
                {
                    result += 2;
                }
                result += h;
            }
            InGroupAttribute.Pop();
            return(Mathf.Max(0, result));
        }
Example #6
0
        public static void Draw(SerializedObject serializedObject, bool indent)
        {
            int indentLevel = EditorGUI.indentLevel;

            serializedObject.Update();
            var  iterator = serializedObject.GetIterator();
            bool enter    = true;

            InGroupAttribute.Push();
            while (iterator.NextVisible(enter))
            {
                enter = false;
                if (iterator.propertyPath.Equals("m_Script"))
                {
                    continue;
                }
                iterator.GetFieldInfos(s_FieldInfos);
                if (s_FieldInfos[s_FieldInfos.Count - 1].GetCustomAttributes(typeof(InGroupAttribute), false).Any())
                {
                    continue;
                }
                EditorGUI.indentLevel = indentLevel + (indent ? 1 : 0);
                var h = EditorGUI.GetPropertyHeight(iterator, null, true);
                if (h > 0)
                {
                    var rect = EditorGUILayout.GetControlRect(true, h);
                    if (Event.current.type != EventType.Layout)
                    {
                        EditorGUI.PropertyField(rect, iterator, null, true);
                    }
                }
            }
            InGroupAttribute.Pop();
            serializedObject.ApplyModifiedProperties();

            EditorGUI.indentLevel = indentLevel;
        }
Example #7
0
        public override bool BeforeGUI(ref Rect position, ref SerializedProperty property, ref GUIContent label, ref bool includeChildren, bool visible)
        {
            if (!IsVisible())
            {
                return(visible);
            }
            if (!visible)
            {
                return(false);
            }
            if (Event.current.type == EventType.Layout)
            {
                return(visible);
            }

            Update();
            var data = m_Data.Get(property.propertyPath);

            property.GetProperties(m_Properties, data.properties);

            var indent = position.indent(indented);
            var rect   = new Rect(indent);

            rect.xMin  += m_Left;
            rect.xMax  -= m_Right;
            rect.y     += m_Top;
            rect.height = m_ToolbarSize.y;
            GUI.Label(rect, GUIContent.none, m_Style2);

            rect = new Rect(indent);
            float width = 0;

            if (this.width < 0)
            {
                width = m_ToolbarSize.x;
            }
            else if (this.width <= 1)
            {
                width = indent.width * this.width;
            }
            else
            {
                width = this.width;
            }
            rect.width  = width;
            rect.y     += m_Top;
            rect.height = m_ToolbarSize.y;

            if (alignment == TextAlignment.Right)
            {
                rect.xMin = indent.xMax - rect.width;
                rect.xMax = indent.xMax;
            }
            else if (alignment == TextAlignment.Center)
            {
                rect.x += (indent.width - rect.width) / 2;
            }
            rect.xMin += m_Left;
            rect.xMax -= m_Right;

            var tab = (int)m_ButtonGroup.Draw(rect, m_TabIndex, m_Contents.Length);

            float toolbar = m_ToolbarSize.y + m_Top + m_Bottom;

            if (toolbar < 0)
            {
                toolbar = 0;
            }
            position.yMin += toolbar;

            if (m_TabIndex > 0)
            {
                InGroupAttribute.Add(m_Name);
                if (data.properties[m_TabIndex - 1] != null)
                {
                    EditorGUI.PropertyField(position.Height(data.tabHeight), data.properties[m_TabIndex - 1], null, true);
                }
                InGroupAttribute.Remove(m_Name);
            }

            var result = m_TabIndex == 0;

            m_TabIndex = tab;
            return(result);
        }
        public override bool BeforeGUI(ref Rect position, ref SerializedProperty property, ref GUIContent label, ref bool includeChildren, bool visible)
        {
            if (!IsVisible())
            {
                return(visible);
            }
            if (!visible)
            {
                return(false);
            }
            if (Event.current.type == EventType.Layout)
            {
                return(visible);
            }

            var text    = label.text;
            var image   = label.image;
            var tooltip = label.tooltip;

            var content = m_Content;

            if (title == null)
            {
                content.text = text;
            }
            if (icon == null)
            {
                content.image = image;
            }
            if (tooltip == null)
            {
                content.tooltip = tooltip;
            }
            Rect rect;

            if (prefix)
            {
                rect = EditorGUI.PrefixLabel(position, content, m_Style);
            }
            else
            {
                rect = indented ? EditorGUI.IndentedRect(position) : new Rect(position);
            }

            var data = m_Data.Get(property.propertyPath);

            var widths = m_Widths.AsEnumerable();
            int diff   = data.properties.Count + 1 - m_Widths.Length;

            if (diff > 0)
            {
                widths = widths.Concat(Enumerable.Repeat(-1f, diff));
            }
            widths = widths.Take(data.properties.Count + 1);

            int index       = -1;
            var indentLevel = EditorGUI.indentLevel;

            EditorGUI.indentLevel = 0;
            InGroupAttribute.Add(m_Name);
            foreach (var cell in rect.HorizontalDistribute(spacing, widths))
            {
                if (index < 0)
                {
                    position = cell.Height(data.height);
                }
                else if (data.properties[index] != null && cell.width > 0)
                {
                    var h = data.propertyHeights[index];
                    EditorGUI.PropertyField(cell.Height(h), data.properties[index], null, true);
                }
                index++;
            }
            InGroupAttribute.Remove(m_Name);
            EditorGUI.indentLevel = indentLevel;

            label.text    = text;
            label.image   = image;
            label.tooltip = tooltip;
            return(position.width > 0);
        }
Example #9
0
        public override float GetHeight(SerializedProperty property, GUIContent label, float height)
        {
            if (!IsVisible())
            {
                return(height);
            }

            var data = m_Data.Get(property.propertyPath);

            GetProperties(data.properties);
            data.propertyHeights.Clear();
            data.rowHeights.Clear();

            var heights = m_Heights.AsEnumerable();
            int diff    = data.properties.Count + 1 - m_Heights.Length;

            if (diff > 0)
            {
                heights = heights.Concat(Enumerable.Repeat(-1f, diff));
            }
            heights = heights.Take(data.properties.Count + 1);

            int   index  = -1;
            float result = 0;

            InGroupAttribute.Add(m_Name);
            foreach (var h in heights)
            {
                if (index < 0)
                {
                    height = h >= 0 ? h : height;
                }
                else
                {
                    var propertyHeight = data.properties[index] == null ? 0 : EditorGUI.GetPropertyHeight(data.properties[index], null, true);
                    data.propertyHeights.Add(propertyHeight);

                    if (h >= 0)
                    {
                        height = h;
                    }
                    else
                    {
                        height = propertyHeight;
                    }
                }

                if (height < 0)
                {
                    height = 0;
                }
                data.rowHeights.Add(height);
                if (result > 0 && height > 0)
                {
                    result += spacing;
                }
                result += height;
                index++;
            }
            InGroupAttribute.Remove(m_Name);
            return(result);
        }