Example #1
0
        // -------------------------------------------------------- @HoverWidth
        // -- Animate the width of target element to desired value on hover  --
        // --------------------------------------------------------------------
        public static void HoverWidth(this VisualElement target, float initialWidth = 0f, float desiredWidth = 100f, int duration = 1000, Action hoverCallback = null,
                                      Action leaveCallback = null,
                                      bool afterAnimation  = false)
        {
            initialWidth = initialWidth == 0f ? target.resolvedStyle.width : initialWidth;
            var enterAnim = new ValueAnimation <StyleValues>();
            var leaveAnim = new ValueAnimation <StyleValues>();

            void MouseEnter()
            {
                enterAnim = afterAnimation
                    ? target.AnimateWidth(initialWidth, desiredWidth, duration, callback: hoverCallback)
                    : target.AnimateWidth(initialWidth, desiredWidth, duration);
            } // @formatter:off

            void MouseLeave()
            {
                leaveAnim = target.AnimateWidth(desiredWidth, initialWidth, duration, easing: Easy.EaseInOutQuint);
            }                                                                                                                         // @formatter:on

            target.RegisterCallback <MouseOverEvent>(evt =>
            {
                if (enterAnim.isRunning)
                {
                    enterAnim.Stop();
                }
                if (leaveAnim.isRunning)
                {
                    leaveAnim.Stop();
                }
                MouseEnter();
                if (!afterAnimation)
                {
                    hoverCallback?.Invoke();
                }
                evt.StopPropagation();
            });

            target.RegisterCallback <MouseLeaveEvent>(evt =>
            {
                if (enterAnim.isRunning)
                {
                    enterAnim.Stop();
                }
                if (leaveAnim.isRunning)
                {
                    leaveAnim.Stop();
                }
                MouseLeave();
                // leaveCallback?.Invoke();
                evt.StopPropagation();
                target.schedule.Execute(leaveCallback).StartingIn(duration);
            });
        }
        // -------------------------------------------------------- @HoverWidth
        // -- Animate the width of target element to desired value on hover  --
        // --------------------------------------------------------------------
        public static AnimatedItems <MouseOverEvent, MouseOutEvent> HoverWidth(
            this VisualElement target, float initialWidth = 0f, float desiredWidth = 100f, int duration = 1000, Action hoverCallback = null,
            Action leaveCallback       = null,
            bool afterAnimation        = false,
            bool includeChildren       = true,
            bool stopPropagation       = true,
            TrickleDown useTrickleDown = TrickleDown.NoTrickleDown)
        {
            initialWidth = initialWidth == 0f ? target.resolvedStyle.width : initialWidth;
            var enterAnim = new ValueAnimation <StyleValues>();
            var leaveAnim = new ValueAnimation <StyleValues>();

            enterAnim = afterAnimation
                ? target.AnimateWidth(initialWidth, desiredWidth, duration, callback: hoverCallback)
                : target.AnimateWidth(initialWidth, desiredWidth, duration);
            enterAnim.KeepAlive();

            leaveAnim = target.AnimateWidth(desiredWidth, initialWidth, duration, easing: Easy.EaseInOutQuint);
            leaveAnim.KeepAlive();

            void MouseEnter()
            {
                enterAnim.Start();
            } // @formatter:off

            void MouseLeave()
            {
                leaveAnim.Start();
            }                                        // @formatter:on

            EventCallback <MouseOverEvent> mouseOverEvent = evt =>
            {
                if (enterAnim.isRunning)
                {
                    enterAnim.Stop();
                }
                if (leaveAnim.isRunning)
                {
                    leaveAnim.Stop();
                }
                MouseEnter();
                if (!afterAnimation)
                {
                    hoverCallback?.Invoke();
                }
                if (stopPropagation)
                {
                    evt.StopPropagation();
                }
            };

            EventCallback <MouseOutEvent> mouseOutEvent = evt =>
            {
                if (enterAnim.isRunning)
                {
                    enterAnim.Stop();
                }
                if (leaveAnim.isRunning)
                {
                    leaveAnim.Stop();
                }
                MouseLeave();
                if (stopPropagation)
                {
                    evt.StopPropagation();
                }
                target.schedule.Execute(leaveCallback).StartingIn(duration);
            };

            target.RegisterCallback(mouseOverEvent, includeChildren, useTrickleDown);
            target.RegisterCallback(mouseOutEvent, includeChildren, useTrickleDown);

            return(new AnimatedItems <MouseOverEvent, MouseOutEvent>(target)
            {
                AnimatedItemList = new List <ValueAnimation <StyleValues> > {
                    enterAnim, leaveAnim
                },
                EventCallbacks = (mouseOverEvent, mouseOutEvent)
            });