diff options
| author | Andrew Lee <alee14498@protonmail.com> | 2020-04-19 17:19:32 -0400 |
|---|---|---|
| committer | Andrew Lee <alee14498@protonmail.com> | 2020-04-19 17:19:32 -0400 |
| commit | c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78 (patch) | |
| tree | ee4d51c7c1d633e11f46453ef1edd3c77c4ef9f7 /Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Utils/EditModeRippleUtils.cs | |
| download | Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.gz Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.bz2 Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.zip | |
Inital commit
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Utils/EditModeRippleUtils.cs')
| -rw-r--r-- | Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Utils/EditModeRippleUtils.cs | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Utils/EditModeRippleUtils.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Utils/EditModeRippleUtils.cs new file mode 100644 index 0000000..a705fc6 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Utils/EditModeRippleUtils.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine.Timeline; + +namespace UnityEditor.Timeline +{ + static class EditModeRippleUtils + { + public static void Insert(IEnumerable<ItemsPerTrack> itemsGroups) + { + var start = double.MaxValue; + var end = double.MinValue; + + foreach (var itemsGroup in itemsGroups) + { + start = Math.Min(start, itemsGroup.items.Min(c => c.start)); + end = Math.Max(end, itemsGroup.items.Max(c => c.end)); + } + + var offset = 0.0; + var discreteStart = (DiscreteTime)start; + var discreteEnd = (DiscreteTime)end; + var itemTypes = ItemsUtils.GetItemTypes(itemsGroups); + var siblingsToRipple = new List<ITimelineItem>(); + + foreach (var itemsGroup in itemsGroups) + { + //can only ripple items of the same type as those selected + siblingsToRipple.AddRange(ItemsUtils.GetItemsExcept(itemsGroup.targetTrack, itemsGroup.items).Where(i => itemTypes.Contains(i.GetType()))); + foreach (var item in siblingsToRipple) + { + var discreteItemStart = (DiscreteTime)item.start; + var discreteItemEnd = (DiscreteTime)item.end; + + if ((discreteItemStart < discreteStart && discreteItemEnd > discreteStart) || (discreteItemStart >= discreteStart && discreteItemStart < discreteEnd)) + offset = Math.Max(offset, end - item.start); + } + } + + if (offset > 0.0) + { + foreach (var sibling in siblingsToRipple) + { + if ((DiscreteTime)sibling.end > (DiscreteTime)start) + sibling.start += offset; + } + } + } + + public static void Remove(IEnumerable<ItemsPerTrack> itemsGroups) + { + foreach (var itemsGroup in itemsGroups) + Remove(itemsGroup.targetTrack, itemsGroup.items); + } + + static void Remove(TrackAsset track, IEnumerable<ITimelineItem> items) + { + if (track == null) return; + + //can only ripple items of the same type as those selected + var itemTypes = ItemsUtils.GetItemTypes(items); + var siblingsToRipple = ItemsUtils.GetItemsExcept(track, items) + .Where(i => itemTypes.Contains(i.GetType())) + .OrderBy(c => c.start) + .ToArray(); + + var orderedItems = items + .OrderBy(c => c.start) + .ToArray(); + + var cumulativeOffset = 0.0; + + foreach (var item in orderedItems) + { + var offset = item.end - item.start; + var start = item.start - cumulativeOffset; + var end = item.end - cumulativeOffset; + + var nextItem = siblingsToRipple.FirstOrDefault(c => (DiscreteTime)c.start > (DiscreteTime)start && (DiscreteTime)c.start < (DiscreteTime)end); + if (nextItem != null) + { + offset -= end - nextItem.start; + } + + var prevItem = siblingsToRipple.FirstOrDefault(c => (DiscreteTime)c.end > (DiscreteTime)start && (DiscreteTime)c.end < (DiscreteTime)end); + if (prevItem != null) + { + offset -= prevItem.end - start; + } + + if (offset <= 0.0) + continue; + + cumulativeOffset += offset; + + for (int i = siblingsToRipple.Length - 1; i >= 0; --i) + { + var c = siblingsToRipple[i]; + if ((DiscreteTime)c.start < (DiscreteTime)start) + break; + + c.start = c.start - offset; + } + } + } + } +} |
