コード例 #1
0
        public void ProcessDelete(IUSHierarchyItem item)
        {
            var timelineContainerItem = item as USTimelineContainerHierarchyItem;
            var timelineHierarchyItem = item as IUSTimelineHierarchyItem;

            if (timelineContainerItem)
            {
                foreach (var child in timelineContainerItem.Children.ToList())
                {
                    ProcessDelete(child);
                }

                USUndoManager.RegisterCompleteObjectUndo(this, "Remove Timeline Container");
                USUndoManager.RegisterCompleteObjectUndo(USHierarchy, "Remove Timeline Container");
                USHierarchy.RootItems.Remove(timelineContainerItem);

                var gameObjectToDestroy = timelineContainerItem.TimelineContainer.gameObject;
                USUndoManager.DestroyImmediate(timelineContainerItem);
                USUndoManager.DestroyImmediate(gameObjectToDestroy);
            }
            else if (timelineHierarchyItem)
            {
                var parent = USHierarchy.GetParentOf(timelineHierarchyItem);

                timelineHierarchyItem.RestoreBaseState();

                USUndoManager.RegisterCompleteObjectUndo(parent, "Remove Timeline");
                parent.RemoveChild(timelineHierarchyItem);

                var gameObjectToDestroy = timelineHierarchyItem.TimelineToDestroy().gameObject;
                USUndoManager.DestroyImmediate(timelineHierarchyItem);
                USUndoManager.DestroyImmediate(gameObjectToDestroy);
            }
        }
コード例 #2
0
        private void ProcessDuplicate(IUSHierarchyItem item)
        {
            var timelineContainer = item as USTimelineContainerHierarchyItem;

            if (timelineContainer != null)
            {
                var newTimelineContainer = USEditor.DuplicateTimelineContainer(timelineContainer.TimelineContainer, CurrentSequence);

                USUndoManager.RegisterCreatedObjectUndo(newTimelineContainer.gameObject, "Duplicate Timeline");

                AddNewTimelineContainer(newTimelineContainer);
            }

            var timeline = item as IUSTimelineHierarchyItem;

            if (timeline != null)
            {
                USUndoManager.RegisterCompleteObjectUndo(this, "Duplicate Timeline");
                USUndoManager.RegisterCompleteObjectUndo(USHierarchy, "Duplicate Timeline");

                var newTimeline = USEditor.DuplicateTimeline(timeline.BaseTimeline, timeline.BaseTimeline.TimelineContainer);
                USUndoManager.RegisterCreatedObjectUndo(newTimeline.gameObject, "Duplicate Timeline");

                var parent = USHierarchy.GetParentOf(item) as USTimelineContainerHierarchyItem;
                USUndoManager.RegisterCompleteObjectUndo(parent, "Duplicate Timeline");
                parent.AddTimeline(newTimeline);
            }
        }
コード例 #3
0
        public static int Sorter(IUSHierarchyItem x, IUSHierarchyItem y)
        {
            var result = x.SortOrder.CompareTo(y.SortOrder);

            if (result == 0 && x.SortName != null && y.SortName != null)
            {
                result = x.SortName.CompareTo(y.SortName);
            }

            return(result);
        }
コード例 #4
0
        private void DrawHierarchyItem(IUSHierarchyItem item, int level)
        {
            using (new Shared.GUIBeginVertical())
            {
                item.FloatingWidth = FloatingWidth;
                item.DoGUI(level);
                if (item.IsExpanded)
                {
                    // Draw all the children of the item
                    for (var i = 0; i < item.Children.Count; i++)
                    {
                        DrawHierarchyItem(item.Children[i], level + 1);
                    }
                }
            }

            if (Event.current.type == EventType.Repaint)
            {
                item.LastRect = GUILayoutUtility.GetLastRect();
            }

            var clickableRect = item.LastRect;

            clickableRect.width = FloatingWidth;
            if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && clickableRect.Contains(Event.current.mousePosition))
            {
                OnItemClicked(item);
                Event.current.Use();
            }
            if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && Event.current.clickCount == 2 && clickableRect.Contains(Event.current.mousePosition))
            {
                OnItemDoubleClicked(item);
                Event.current.Use();
            }
            if (Event.current.type == EventType.MouseDown && Event.current.button == 1 && clickableRect.Contains(Event.current.mousePosition))
            {
                OnItemContextClicked(item);
                Event.current.Use();
            }

            if (item.ForceContextClick)
            {
                OnItemContextClicked(item);
                item.ForceContextClick = false;
            }
        }
コード例 #5
0
        private void OnItemClicked(IUSHierarchyItem item)
        {
            var timelineContainerItem = item as USTimelineContainerHierarchyItem;

            if (timelineContainerItem != null && !USRuntimeUtility.HasObserverTimeline(timelineContainerItem.TimelineContainer.transform))
            {
                EditorGUIUtility.PingObject(timelineContainerItem.TimelineContainer.AffectedObject);
                Selection.activeGameObject = timelineContainerItem.TimelineContainer.AffectedObject.gameObject;
                Selection.activeTransform  = timelineContainerItem.TimelineContainer.AffectedObject;
            }

            var timelineHierarchyItem = item as IUSTimelineHierarchyItem;

            if (timelineHierarchyItem)
            {
                EditorGUIUtility.PingObject(timelineHierarchyItem.PingableObject);
                Selection.activeTransform = timelineHierarchyItem.PingableObject;
            }
        }
コード例 #6
0
        private void GetISelectableContainers(IUSHierarchyItem item, ref List <ISelectableContainer> iSelectableContainers)
        {
            if (!item.IsISelectable())
            {
                return;
            }

            var containers = item.GetISelectableContainers();

            if (containers != null && containers.Count > 0)
            {
                iSelectableContainers.AddRange(containers);
            }

            for (var i = 0; i < item.Children.Count; i++)
            {
                GetISelectableContainers(item.Children[i], ref iSelectableContainers);
            }
        }
コード例 #7
0
        public IUSHierarchyItem GetParentOfChild(IUSHierarchyItem parent, IUSHierarchyItem item)
        {
            if (parent.Children.Contains(item))
            {
                return(parent);
            }

            IUSHierarchyItem itemsParent = null;

            for (var i = 0; i < parent.Children.Count; i++)
            {
                itemsParent = GetParentOfChild(parent.Children[i], item);
                if (itemsParent != null)
                {
                    break;
                }
            }

            return(null);
        }
コード例 #8
0
        public IUSHierarchyItem GetParentOf(IUSHierarchyItem item)
        {
            if (RootItems.Contains(item))
            {
                return(null);
            }

            IUSHierarchyItem itemsParent = null;

            for (var i = 0; i < RootItems.Count; i++)
            {
                itemsParent = GetParentOfChild(RootItems[i], item);
                if (itemsParent != null)
                {
                    break;
                }
            }

            return(itemsParent);
        }
コード例 #9
0
        private void ProcessDuplicateToSequence(IUSHierarchyItem item, USSequencer sequence)
        {
            var affectedObject    = default(Transform);
            var timelineContainer = item as USTimelineContainerHierarchyItem;
            var timeline          = item as IUSTimelineHierarchyItem;

            if (timelineContainer != null)
            {
                affectedObject = timelineContainer.TimelineContainer.AffectedObject;
            }
            if (timeline != null)
            {
                affectedObject = timeline.BaseTimeline.AffectedObject;
            }

            if (timelineContainer && USRuntimeUtility.HasTimelineContainerWithAffectedObject(sequence, affectedObject))
            {
                EditorUtility.DisplayDialog("Cannot continue", string.Format("The sequence {0} already has timelines for the object {1}", sequence.name, affectedObject.name), "Ok");
                return;
            }

            if (timelineContainer)
            {
                var newTimelineContainer = USEditor.DuplicateTimelineContainer(timelineContainer.TimelineContainer, sequence);

                USUndoManager.RegisterCreatedObjectUndo(newTimelineContainer.gameObject, "Duplicate Timeline");
            }

            if (timeline)
            {
                var newTimelineContainer = sequence.GetTimelineContainerFor(timeline.BaseTimeline.AffectedObject);
                if (newTimelineContainer == null)
                {
                    newTimelineContainer = sequence.CreateNewTimelineContainer(timeline.BaseTimeline.AffectedObject);
                    USUndoManager.RegisterCreatedObjectUndo(newTimelineContainer.gameObject, "Duplicate Timeline");
                }
                var newTimeline = USEditor.DuplicateTimeline(timeline.BaseTimeline, newTimelineContainer);

                USUndoManager.RegisterCreatedObjectUndo(newTimeline.gameObject, "Duplicate Timeline");
            }
        }
コード例 #10
0
        public void SetupWithTimelineContainer(USTimelineContainer timelineContainer)
        {
            TimelineContainer = timelineContainer;
            var timelines = TimelineContainer.Timelines;

            if (TimelineContainer.Timelines.Count() > Children.Count)
            {
                var notInBoth = timelines.Where(
                    (timeline) => !Children.Any(
                        (item) =>
                        ((item is IUSTimelineHierarchyItem) && (item as IUSTimelineHierarchyItem).IsForThisTimeline(timeline))
                        )
                    );

                foreach (var extraTimeline in notInBoth)
                {
                    IUSHierarchyItem hierarchyItem = null;

                    var customKeyValuePairs = USEditorUtility.CustomTimelineAttributes;
                    foreach (var customKeyValuePair in customKeyValuePairs)
                    {
                        if (extraTimeline.GetType() == customKeyValuePair.Key.InspectedType)
                        {
                            hierarchyItem = CreateInstance(customKeyValuePair.Value) as IUSHierarchyItem;

                            // This is here to capture the change in USTimelineBase BaseTimeline on the IUSTimelineHierarchyItem that occurse during initialize
                            USUndoManager.RegisterCompleteObjectUndo(hierarchyItem, "Add New Timeline");

                            hierarchyItem.Initialize(extraTimeline);
                        }
                    }

                    AddChild(hierarchyItem);
                }
            }
        }
コード例 #11
0
        private void OnItemContextClicked(IUSHierarchyItem item)
        {
            var timelineContainerItem = item as USTimelineContainerHierarchyItem;
            var timelineHierarchyItem = item as IUSTimelineHierarchyItem;
            var contextMenu           = new GenericMenu();

            var canContextClickTimelineContainer = !timelineContainerItem || USEditorUtility.CanContextClickTimelineContainer(timelineContainerItem.TimelineContainer);

            if (!canContextClickTimelineContainer)
            {
                return;
            }

            var canContextClickTimeline = !timelineHierarchyItem || USEditorUtility.CanContextClickTimeline(timelineHierarchyItem.BaseTimeline);

            if (!canContextClickTimeline)
            {
                return;
            }

            if (timelineHierarchyItem || timelineContainerItem)
            {
                contextMenu.AddItem(new GUIContent("Remove"), false, () => ProcessDelete(item));
            }

            // if we context click on a hierarchy container, always allow the duplication
            var isDuplicateEnabled = timelineContainerItem != null ? true :false;

            // If we context click on a hierarchy item, we need to make sure we can duplicate that item.
            if (timelineHierarchyItem)
            {
                var customAttribute = timelineHierarchyItem.GetType().GetCustomAttributes(typeof(USCustomTimelineHierarchyItem), true).FirstOrDefault() as USCustomTimelineHierarchyItem;
                if (customAttribute != default(USCustomTimelineHierarchyItem))
                {
                    if (customAttribute.CanBeManuallyAddToSequence && customAttribute.MaxNumberPerSequence > 1)
                    {
                        isDuplicateEnabled = true;
                    }
                }
                else
                {
                    isDuplicateEnabled = true;
                }
            }

            if (isDuplicateEnabled)
            {
                contextMenu.AddSeparator("Copy To/This Sequence");
                contextMenu.AddItem(new GUIContent("Copy To/Duplicate"), false, () => ProcessDuplicate(item));
                contextMenu.AddSeparator("Copy To/Other Sequences");
            }
            else
            {
                contextMenu.AddDisabledItem(new GUIContent("Copy To/This Sequence"));
            }

            var sequences        = FindObjectsOfType(typeof(USSequencer)) as USSequencer[];
            var orderedSequences = sequences.OrderBy(sequence => sequence.name).Where(sequence => sequence != CurrentSequence);

            foreach (var sequence in orderedSequences)
            {
                contextMenu.AddItem(new GUIContent(string.Format("{0}/{1}", "Copy To", sequence.name)),
                                    false,
                                    (obj) => ProcessDuplicateToSequence(item, (USSequencer)obj),
                                    sequence);
            }

            if (timelineContainerItem)
            {
                var customKeyValuePairs = USEditorUtility.CustomTimelineAttributes;
                foreach (var customKeyValuePair in customKeyValuePairs)
                {
                    var customTimelineDescription = customKeyValuePair.Key;

                    if (!customTimelineDescription.CanBeManuallyAddToSequence)
                    {
                        continue;
                    }

                    if (USRuntimeUtility.GetNumberOfTimelinesOfType(customTimelineDescription.InspectedType, timelineContainerItem.TimelineContainer) >= customTimelineDescription.MaxNumberPerSequence)
                    {
                        continue;
                    }

                    contextMenu.AddItem(
                        new GUIContent(string.Format("Add Timeline/{0}", customTimelineDescription.FriendlyName)),
                        false,
                        (obj) => { AddNewTimeline((obj as object[])[0] as USTimelineContainerHierarchyItem, (obj as object[])[1] as USCustomTimelineHierarchyItem); },
                        new object[] { timelineContainerItem, customTimelineDescription }
                        );
                }
            }

            item.AddContextItems(contextMenu);

            if (timelineContainerItem != null &&
                (timelineContainerItem.TimelineContainer.AffectedObject == null ||
                 (Selection.activeGameObject != null &&
                  Selection.activeObject != timelineContainerItem.TimelineContainer.AffectedObject.gameObject)))
            {
                if (Selection.activeGameObject != null)
                {
                    contextMenu.AddItem(
                        new GUIContent(string.Format("Update Affected Object : {0}", Selection.activeGameObject.name)),
                        false,
                        () => UpdateAffectedObject(timelineContainerItem, Selection.activeGameObject));
                }
            }


            contextMenu.ShowAsContext();
        }
コード例 #12
0
 /// <summary>
 /// Removes a child and DOES NOT sort the hierarchy.
 /// </summary>
 /// <param name="child">Child.</param>
 public void RemoveChild(IUSHierarchyItem child)
 {
     Children.Remove(child);
 }
コード例 #13
0
 /// <summary>
 /// Adds a child item and sorts the hierarchy
 /// </summary>
 /// <param name="child">Child.</param>
 public void AddChild(IUSHierarchyItem child)
 {
     Children.Add(child);
     Children.Sort(Sorter);
 }
コード例 #14
0
 public void RemoveHierarchyItemFromRoot(IUSHierarchyItem hierarchyItem)
 {
     RootItems.Remove(hierarchyItem);
 }
コード例 #15
0
 public void AddHierarchyItemToRoot(IUSHierarchyItem hierarchyItem)
 {
     RootItems.Add(hierarchyItem);
     RootItems.Sort(IUSHierarchyItem.Sorter);
 }