private bool CheckControlOverlap(Control_AnimationFrameItem item, double leftMarginDelta = 0.0, double widthDelta = 0.0)
        {
            Rect itemPosition = new Rect();

            itemPosition.Location = item.PointToScreen(new Point(leftMarginDelta + 0, 0));
            itemPosition.Height   = item.ActualHeight;
            itemPosition.Width    = item.ActualWidth + widthDelta;

            bool doesIntersect = false;

            foreach (var child in gridTrackItems.Children)
            {
                if (child is Control_AnimationFrameItem && (child as Control_AnimationFrameItem) != item)
                {
                    Rect childPos = new Rect();
                    childPos.Location = (child as Control_AnimationFrameItem).PointToScreen(new Point(0, 0));
                    childPos.Height   = (child as Control_AnimationFrameItem).ActualHeight;
                    childPos.Width    = (child as Control_AnimationFrameItem).ActualWidth;

                    if (itemPosition.IntersectsWith(childPos))
                    {
                        doesIntersect = true;
                        break;
                    }
                }
            }

            return(doesIntersect);
        }
        private void UpdateControls()
        {
            txtblkTrackName.Text = ContextTrack.GetName();

            if (ContextTrack.SupportedAnimationType == typeof(AnimationFilledCircle))
            {
                this.imgTrackType.Source  = new BitmapImage(new Uri(@"/Aurora;component/Resources/FreeForm_CircleFilled.png", UriKind.Relative));
                this.imgTrackType.ToolTip = "Filled Circle Track";
            }
            else if (ContextTrack.SupportedAnimationType == typeof(AnimationCircle))
            {
                this.imgTrackType.Source  = new BitmapImage(new Uri(@"/Aurora;component/Resources/FreeForm_Circle.png", UriKind.Relative));
                this.imgTrackType.ToolTip = "Circle Track";
            }
            else if (ContextTrack.SupportedAnimationType == typeof(AnimationFilledRectangle))
            {
                this.imgTrackType.Source  = new BitmapImage(new Uri(@"/Aurora;component/Resources/FreeForm_RectangleFilled.png", UriKind.Relative));
                this.imgTrackType.ToolTip = "Filled Rectangle Track";
            }
            else if (ContextTrack.SupportedAnimationType == typeof(AnimationRectangle))
            {
                this.imgTrackType.Source  = new BitmapImage(new Uri(@"/Aurora;component/Resources/FreeForm_Rectangle.png", UriKind.Relative));
                this.imgTrackType.ToolTip = "Rectangle Track";
            }
            else if (ContextTrack.SupportedAnimationType == typeof(AnimationLine))
            {
                this.imgTrackType.Source  = new BitmapImage(new Uri(@"/Aurora;component/Resources/FreeForm_Line.png", UriKind.Relative));
                this.imgTrackType.ToolTip = "Line Track";
            }
            else if (ContextTrack.SupportedAnimationType == typeof(AnimationManualColorFrame))
            {
                this.imgTrackType.Source  = new BitmapImage(new Uri(@"/Aurora;component/Resources/FreeForm_ManualColor.png", UriKind.Relative));
                this.imgTrackType.ToolTip = "Manual Color Track";
            }

            gridTrackItems.Children.Clear();

            foreach (var kvp in ContextTrack.GetAnimations())
            {
                Control_AnimationFrameItem newFrame = new Control_AnimationFrameItem()
                {
                    ContextFrame = kvp.Value, Margin = new Thickness(ConvertToLocation(kvp.Key, ContextTrack.GetShift()), 0, 0, 0), HorizontalAlignment = HorizontalAlignment.Left, Width = ConvertToLocation(kvp.Value.Duration)
                };
                newFrame.LeftSplitterDrag          += Control_AnimationFrameItem_LeftSplitterDrag;
                newFrame.RightSplitterDrag         += Control_AnimationFrameItem_RightSplitterDrag;
                newFrame.ContentSplitterDrag       += Control_AnimationFrameItem_ContentSplitterDrag;
                newFrame.CompletedDrag             += Control_AnimationFrameItem_CompletedDrag;
                newFrame.PreviewMouseDown          += Control_AnimationFrameItem_PreviewMouseDown;
                newFrame.AnimationFrameItemUpdated += Control_AnimationFrameItem_AnimationFrameItemUpdated;

                gridTrackItems.Children.Add(newFrame);
            }
        }
        private void UpdateAnimationTrack()
        {
            ContextTrack.Clear();

            foreach (var child in gridTrackItems.Children)
            {
                if (child is Control_AnimationFrameItem)
                {
                    Control_AnimationFrameItem item = (child as Control_AnimationFrameItem);

                    if (item.ContextFrame != null)
                    {
                        ContextTrack.SetFrame(ConvertToTime(item.Margin.Left, ContextTrack.GetShift()), item.ContextFrame);
                    }
                }
            }

            AnimationTrackUpdated?.Invoke(this, ContextTrack);
        }