Ejemplo n.º 1
0
        //public delegate void OverridePropertyReadOnlyDelegate( HCItemProperty itemProperty, ref bool propertyReadOnly, ref bool handled );
        //public static event OverridePropertyReadOnlyDelegate OverridePropertyReadOnly;

        public static void PerformOverridePropertyReadOnly(HCItemProperty itemProperty, ref bool?readOnly)
        //public static void PerformOverridePropertyReadOnly( HCItemProperty itemProperty, ref bool propertyReadOnly )
        {
            //var handled = false;
            OverridePropertyReadOnly?.Invoke(itemProperty, ref readOnly);
            //, ref handled );
            //if( handled )
            //	return;

            var property = itemProperty.Property;

            //Transform: Position, Rotation, Scale
            if (property.Name == "Position" || property.Name == "Rotation" || property.Name == "Scale")
            {
                var ownerType = property.Owner as Metadata.NetTypeInfo;
                if (ownerType != null && ownerType.Type == typeof(Transform))
                {
                    readOnly = false;
                    //handled = true;
                }
            }

            //array: Length
            if (property.Name == "Length")
            {
                var ownerType = property.Owner as Metadata.TypeInfo;
                if (ownerType != null && ownerType.GetNetType() == typeof(Array))                   // HCItemProperty.IsOneDimensionArray( ownerType.GetNetType() ) )
                {
                    var parentItemProperty = itemProperty.Parent as HCItemProperty;
                    if (parentItemProperty != null && !parentItemProperty.Property.ReadOnly)
                    {
                        readOnly = false;
                        //handled = true;
                    }
                }
            }

            //List, ReferenceList: Count
            if (property.Name == "Count")
            {
                var ownerType = property.Owner as Metadata.TypeInfo;
                if (ownerType != null && HCItemProperty.IsListType(ownerType.GetNetType()))
                {
                    readOnly = false;
                    //handled = true;
                }
            }
        }
Ejemplo n.º 2
0
        public static void PerformOverridePropertySetValue(HCItemProperty.PropertySetValueData data)
        {
            OverridePropertySetValue?.Invoke(data);

            var property = data.itemProperty.Property;

            //Transform: Position, Rotation, Scale
            if (data.parentItemProperty != null && ReferenceUtility.GetUnreferencedType(data.parentItemProperty.Property.Type.GetNetType()) == typeof(Transform))
            {
                for (int n = 0; n < data.itemProperty.ControlledObjects.Length; n++)
                {
                    var old = data.itemProperty.ControlledObjects[n];
                    if (property.Name == "Position")
                    {
                        data.itemProperty.ControlledObjects[n] = old.GetType().GetMethod("UpdatePosition").Invoke(old, new object[] { data.value });
                    }
                    else if (property.Name == "Rotation")
                    {
                        data.itemProperty.ControlledObjects[n] = old.GetType().GetMethod("UpdateRotation").Invoke(old, new object[] { data.value });
                    }
                    else if (property.Name == "Scale")
                    {
                        data.itemProperty.ControlledObjects[n] = old.GetType().GetMethod("UpdateScale").Invoke(old, new object[] { data.value });
                    }
                }

                data.setValueHandled = true;
            }

            //array: Length
            if (property.Name == "Length")
            {
                var ownerType = property.Owner as Metadata.TypeInfo;
                if (ownerType != null && ownerType.GetNetType() == typeof(Array))                   // HCItemProperty.IsOneDimensionArray( ownerType.GetNetType() ) )
                {
                    int newLength = (int)data.unrefValue;

                    for (int nCollectedObject = 0; nCollectedObject < data.parentItemProperty.ControlledObjects.Length; nCollectedObject++)
                    {
                        var array = (IList)ReferenceUtility.GetUnreferencedValue(data.itemProperty.ControlledObjects[nCollectedObject]);
                        if (array != null && array.Count != newLength)
                        {
                            var newArray = Array.CreateInstance(array.GetType().GetElementType(), newLength);
                            Array.Copy((Array)array, newArray, Math.Min(newLength, array.Count));

                            //!!!!multiselection. вместе undo все

                            data.parentItemProperty.SetValue(newArray, data.addUndo);
                        }
                    }

                    data.setValueHandled             = true;
                    data.addUndoHandled              = true;
                    data.updateParentPropertyHandled = true;
                }
            }

            //List: Count
            if (property.Name == "Count")
            {
                var ownerType = property.Owner as Metadata.TypeInfo;
                if (ownerType != null && HCItemProperty.IsListType(ownerType.GetNetType()))
                {
                    int newCount = (int)data.unrefValue;

                    for (int nCollectedObject = 0; nCollectedObject < data.parentItemProperty.ControlledObjects.Length; nCollectedObject++)
                    {
                        var list = (IList)ReferenceUtility.GetUnreferencedValue(data.itemProperty.ControlledObjects[nCollectedObject]);
                        if (list != null)
                        {
                            if (newCount < list.Count)
                            {
                                //remove items

                                if (!data.addUndoHandled && data.addUndo && data.itemProperty.Owner.DocumentWindow?.Document != null)
                                {
                                    //remove with undo

                                    var indexes = new List <int>();
                                    for (int n = newCount; n < list.Count; n++)
                                    {
                                        indexes.Add(n);
                                    }
                                    var undoAction = new UndoActionListAddRemove(list, indexes, false);

                                    DocumentInstance document = data.itemProperty.Owner.DocumentWindow.Document;
                                    document.UndoSystem.CommitAction(undoAction);
                                    document.Modified = true;
                                }
                                else
                                {
                                    //remove without undo
                                    while (list.Count > newCount)
                                    {
                                        list.RemoveAt(list.Count - 1);
                                    }
                                }
                            }
                            else if (newCount > list.Count)
                            {
                                //add items

                                var indexes = new List <int>();
                                for (int n = list.Count; n < newCount; n++)
                                {
                                    indexes.Add(n);
                                }

                                var elementType = list.GetType().GetGenericArguments()[0];
                                while (list.Count < newCount)
                                {
                                    object itemValue     = null;
                                    var    referenceList = list as IReferenceList;
                                    if (referenceList != null)
                                    {
                                        itemValue = Activator.CreateInstance(referenceList.GetItemType());                                          // referenceList.CreateItemValue();
                                    }
                                    else if (elementType.IsValueType)
                                    {
                                        itemValue = Activator.CreateInstance(elementType);
                                    }
                                    list.Add(itemValue);
                                }

                                //undo
                                if (!data.addUndoHandled && data.addUndo && data.itemProperty.Owner.DocumentWindow?.Document != null)
                                {
                                    var undoAction = new UndoActionListAddRemove(list, indexes, true);

                                    DocumentInstance document = data.itemProperty.Owner.DocumentWindow.Document;
                                    document.UndoSystem.CommitAction(undoAction);
                                    document.Modified = true;
                                }
                            }
                        }
                    }

                    data.setValueHandled             = true;
                    data.addUndoHandled              = true;
                    data.updateParentPropertyHandled = true;
                }
            }
        }