Example #1
0
        /// <summary>
        /// Perofrms a sequential, cumulative combination of all states along an animation.
        /// As an animation plays each state (keyframe) combines with the previous
        /// to create a combined state.  As the animation continues, these combined states
        /// accumulate the changes of all states before them.  Therefore, we need to pre-combine
        /// the keyframes so that when animations are played they can properly interpolate.
        ///
        /// </summary>
        public void RefreshCombinedStates(ElementSave element, bool useDefaultAsStarting = true)
        {
            StateSave previous = null;

            if (useDefaultAsStarting)
            {
                previous = element.DefaultState;
            }

            foreach (var animatedState in this.Keyframes.Where(item => !string.IsNullOrEmpty(item.StateName)))
            {
                var originalState = element.AllStates.FirstOrDefault(item => item.Name == animatedState.StateName);

                if (originalState != null)
                {
                    if (previous == null)
                    {
                        previous = originalState;
                        animatedState.CachedCumulativeState = originalState.Clone();
                    }
                    else
                    {
                        var combined = previous.Clone();
                        combined.MergeIntoThis(originalState);
                        combined.Name = originalState.Name;
                        animatedState.CachedCumulativeState = combined;

                        previous = combined;
                    }
                }
            }

            foreach (var subAnimation in this.Keyframes.Where(item => !string.IsNullOrEmpty(item.AnimationName)))
            {
                InstanceSave instance = null;

                string name = subAnimation.AnimationName;

                if (name.Contains('.'))
                {
                    int indexOfDot = name.IndexOf('.');

                    string instanceName = name.Substring(0, indexOfDot);

                    instance = element.Instances.FirstOrDefault(item => item.Name == instanceName);
                }
                if (instance == null)
                {
                    subAnimation.SubAnimationViewModel.RefreshCombinedStates(element, false);
                }
                else
                {
                    var instanceElement = Gum.Managers.ObjectFinder.Self.GetElementSave(instance);
                    if (instanceElement != null)
                    {
                        subAnimation.SubAnimationViewModel.RefreshCombinedStates(instanceElement, false);
                    }
                }
            }
        }
Example #2
0
        private static void MoveState(TreeNode nodeMoving, TreeNode targetNode)
        {
            IElement  currentElement = EditorLogic.CurrentElement;
            StateSave toAdd          = (StateSave)nodeMoving.Tag;

            IElement sourceContainer = nodeMoving.GetContainingElementTreeNode().Tag as IElement;
            IElement targetContainer = targetNode.GetContainingElementTreeNode().Tag as IElement;

            if (targetNode.IsStateCategoryNode() || targetNode.IsStateListNode())
            {
                if (sourceContainer == targetContainer)
                {
                    EditorLogic.CurrentElement.RemoveState(EditorLogic.CurrentStateSave);
                }
                else
                {
                    toAdd = toAdd.Clone();
                }

                if (targetNode.IsStateCategoryNode())
                {
                    ((StateSaveCategory)targetNode.Tag).States.Add(toAdd);
                }
                else
                {
                    targetContainer.States.Add(toAdd);
                }

                GlueCommands.Self.GenerateCodeCommands.GenerateElementCode(targetContainer);
                GlueCommands.Self.RefreshCommands.RefreshUi(targetContainer);
            }
        }
Example #3
0
        private static void PastedCopiedState()
        {
            ElementSave container      = SelectedState.Self.SelectedElement;
            var         targetCategory = SelectedState.Self.SelectedStateCategorySave;

            /////////////////////Early Out//////////////////
            if (container == null)
            {
                return;
            }
            //////////////////End Early Out////////////////

            StateSave newStateSave = mCopiedState.Clone();

            newStateSave.Variables.RemoveAll(item => item.CanOnlyBeSetInDefaultState);


            newStateSave.ParentContainer = container;

            string name = mCopiedState.Name + "Copy";


            if (targetCategory != null)
            {
                name = StringFunctions.MakeStringUnique(name, targetCategory.States.Select(item => item.Name));
                newStateSave.Name = name;

                targetCategory.States.Add(newStateSave);
            }
            else
            {
                name = StringFunctions.MakeStringUnique(name, container.States.Select(item => item.Name));
                newStateSave.Name = name;
                container.States.Add(newStateSave);
            }

            StateTreeViewManager.Self.RefreshUI(container);



            //SelectedState.Self.SelectedInstance = targetInstance;
            SelectedState.Self.SelectedStateSave = newStateSave;

            GumCommands.Self.FileCommands.TryAutoSaveElement(container);
        }
Example #4
0
        private void PastedCopiedState()
        {
            ElementSave container = SelectedState.Self.SelectedElement;

            /////////////////////Early Out//////////////////
            if (container == null)
            {
                return;
            }
            //////////////////End Early Out////////////////

            if (container.Categories.Count != 0)
            {
                MessageBox.Show("Pasting into elements with state categories may cause unexpected results.  Please complain on codeplex!");
            }


            StateSave newStateSave = mCopiedState.Clone();

            newStateSave.Variables.RemoveAll(item => item.CanOnlyBeSetInDefaultState);


            newStateSave.ParentContainer = container;

            string name = mCopiedState.Name + "Copy";

            name = StringFunctions.MakeStringUnique(name, container.States.Select(item => item.Name));

            newStateSave.Name = name;

            container.States.Add(newStateSave);

            StateTreeViewManager.Self.RefreshUI(container);



            //SelectedState.Self.SelectedInstance = targetInstance;
            SelectedState.Self.SelectedStateSave = newStateSave;

            GumCommands.Self.FileCommands.TryAutoSaveElement(container);
        }
        private static bool AddAndModifyVariablesAccordingToDefault(ElementSave elementSave, StateSave defaultState)
        {
            bool wasModified = false;

            // Use States and not AllStates because we want to make sure we
            // have a default state.
            if (elementSave.States.Count == 0 && defaultState != null)
            {
                StateSave stateToAdd = defaultState.Clone();
                elementSave.States.Add(stateToAdd);
                wasModified = true;
            }
            else if (elementSave.States.Count != 0 && defaultState != null)
            {
                // Replacing the default state:
                // Update March 16, 2012
                // Used to replace but realized
                // it's better to not replace but
                // instead add variables that are not
                // already there.  That way when the user
                // switches types the old information isn't
                // lost.
                //elementSave.States[0] = replacement;
                StateSave stateForNewType = defaultState.Clone();

                foreach (VariableSave variableSave in stateForNewType.Variables)
                {
                    VariableSave existingVariable = elementSave.DefaultState.GetVariableSave(variableSave.Name);

                    if (existingVariable == null)
                    {
                        wasModified = true;
                        elementSave.DefaultState.Variables.Add(variableSave.Clone());
                    }
                    else
                    {
                        // All of these properties are only relevant to the
                        // editor so we don't want to mark the object as modified
                        // when these properties are set.
                        existingVariable.Category = variableSave.Category;
#if !WINDOWS_8 && !UWP
                        existingVariable.CustomTypeConverter = variableSave.CustomTypeConverter;
#endif
                        existingVariable.ExcludedValuesForEnum.Clear();
                        existingVariable.ExcludedValuesForEnum.AddRange(variableSave.ExcludedValuesForEnum);

                        // let's fix any values that may be incorrectly set from types
                        if (existingVariable.Type == "float" && existingVariable.Value != null && (existingVariable.Value is float) == false)
                        {
                            float asFloat = 0.0f;
                            try
                            {
                                asFloat = (float)System.Convert.ChangeType(existingVariable.Value, typeof(float));
                            }
                            catch
                            {
                                // do nothing, we'll fall back to 0
                            }

                            existingVariable.Value = asFloat;
                            wasModified            = true;
                        }
                    }
                }

                // We also need to add any VariableListSaves here
                foreach (VariableListSave variableList in stateForNewType.VariableLists)
                {
                    VariableListSave existingList = elementSave.DefaultState.GetVariableListSave(variableList.Name);

                    if (existingList == null)
                    {
                        wasModified = true;
                        // this type doesn't have this list yet, so let's add it
                        elementSave.DefaultState.VariableLists.Add(variableList.Clone());
                    }
                    else
                    {
                        // See the VariableSave section on why we don't set
                        // wasModified = true here
                        existingList.Category = variableList.Category;
                    }
                }

                foreach (var stateSaveCategory in elementSave.Categories)
                {
                    VariableSave foundVariable = elementSave.DefaultState.Variables.FirstOrDefault(item => item.Name == stateSaveCategory.Name + "State");

                    if (foundVariable == null)
                    {
                        elementSave.DefaultState.Variables.Add(new VariableSave()
                        {
                            Name  = stateSaveCategory.Name + "State",
                            Type  = "string",
                            Value = null
#if GUM
                            ,
                            CustomTypeConverter = new Gum.PropertyGridHelpers.Converters.AvailableStatesConverter(stateSaveCategory.Name)
#endif
                        });
                    }
                    else
                    {
#if GUM
                        foundVariable.CustomTypeConverter = new Gum.PropertyGridHelpers.Converters.AvailableStatesConverter(stateSaveCategory.Name);
#endif
                    }
                }

                VariableSaveSorter vss = new VariableSaveSorter();
                vss.ListOrderToMatch = defaultState.Variables;


                elementSave.DefaultState.Variables.Sort(vss);
            }
            else
            {
                // Let's give it an empty state so that it doesn't cause runtime problems
                // Nevermind, this causes problelms in Gum, and it should be okay to pass a null state here
                //elementSave.States.Add(new StateSave());
            }

            return(wasModified);
        }