コード例 #1
0
        private void UpdateMediaQueries(SerializedProperty declaration)
        {
            var mediaQueries = declaration.FindPropertyRelative("MediaQueries");

            var oldCount = mediaQueries.arraySize;
            List <SerializedProperty> oldProps = new List <SerializedProperty>();

            for (int i = 0; i < oldCount; i++)
            {
                var prop = mediaQueries.GetArrayElementAtIndex(i);
                oldProps.Add(prop);
            }

            List <string> newQueryIDs = new List <string>();

            StringBuilder sb = new StringBuilder();

            foreach (MediaQuery query in MediaQueries)
            {
                var id = query.Name;
                newQueryIDs.Add(id);
                sb.AppendLine(id);
            }

            // Remove non-existing (reverse loop)
            for (int i = mediaQueries.arraySize - 1; i >= 0; i--)
            {
                var query = mediaQueries.GetArrayElementAtIndex(i).FindPropertyRelative("Name").stringValue;
                if (!newQueryIDs.Contains(query))
                {
                    mediaQueries.DeleteArrayElementAtIndex(i);
                }
            }

            //Debug.Log("New size after deletion: " + properties.arraySize);

            // walk through new properties
            // if no corresponding property found in the old serialized array:
            // 1) make room for the property
            // 2) copy new name and type
            var newCount = MediaQueries.Count;

            for (int i = 0; i < newCount; i++)
            {
                var name = MediaQueries[i].Name;
                var type = MediaQueries[i].Type;

                bool shouldInsertOrAddNewElement = i > mediaQueries.arraySize - 1;

                if (!shouldInsertOrAddNewElement)
                {
                    string oldQueryId = mediaQueries.GetArrayElementAtIndex(i).FindPropertyRelative("Name").stringValue;
                    if (oldQueryId != name)
                    {
                        shouldInsertOrAddNewElement = true;
                    }
                }

                if (shouldInsertOrAddNewElement)
                {
                    if (i == mediaQueries.arraySize)
                    {
                        mediaQueries.arraySize++;
                    }
                    else
                    {
                        mediaQueries.InsertArrayElementAtIndex(i);
                    }

                    //Debug.Log("  --> " + properties.arraySize);

                    var prop = mediaQueries.GetArrayElementAtIndex(i);

                    prop.FindPropertyRelative("Name").stringValue = name;

                    // apply type, value etc.
                    SerializedPropertyHelper.Apply(prop, MediaQueries[i]);
                }
            }
        }
コード例 #2
0
        private void UpdateProperties(SerializedProperty declaration)
        {
            var properties = declaration.FindPropertyRelative("Properties");
            var oldCount   = properties.arraySize;
            List <SerializedProperty> oldProps = new List <SerializedProperty>();

            for (int i = 0; i < oldCount; i++)
            {
                SerializedProperty prop = properties.GetArrayElementAtIndex(i);
                oldProps.Add(prop);
            }

            List <string> newPropertyNames = new List <string>();

            StringBuilder sb = new StringBuilder();

            foreach (StyleProperty styleProperty in StyleProperties)
            {
                var name = styleProperty.Name;
                newPropertyNames.Add(name);
                sb.AppendLine(name);
            }

            // Remove non-existing (reverse loop)
            for (int i = properties.arraySize - 1; i >= 0; i--)
            {
                var propName = properties.GetArrayElementAtIndex(i).FindPropertyRelative("Name").stringValue;
                if (!newPropertyNames.Contains(propName))
                {
                    properties.DeleteArrayElementAtIndex(i);
                }
            }

            //Debug.Log("New size after deletion: " + properties.arraySize);

            // walk through new properties
            // if no corresponding property found in the old serialized array:
            // 1) make room for the property
            // 2) copy new name and type
            var newCount = StyleProperties.Count;

            for (int i = 0; i < newCount; i++)
            {
                var name = StyleProperties[i].Name;

                bool shouldInsertOrAddNewElement = i > properties.arraySize - 1;

                if (!shouldInsertOrAddNewElement)
                {
                    string oldPropName = properties.GetArrayElementAtIndex(i).FindPropertyRelative("Name").stringValue;
                    if (oldPropName != name)
                    {
                        shouldInsertOrAddNewElement = true;
                    }
                }

                if (shouldInsertOrAddNewElement)
                {
                    if (i == properties.arraySize)
                    {
                        properties.arraySize++;
                    }
                    else
                    {
                        properties.InsertArrayElementAtIndex(i);
                    }

                    //Debug.Log("  --> " + properties.arraySize);

                    var prop = properties.GetArrayElementAtIndex(i);

                    prop.FindPropertyRelative("Name").stringValue = name;

                    SerializedPropertyHelper.Apply(prop, StyleProperties[i]);
                }
            }
        }